1. Selection of Whistle
The most important part of the project is the whistle. Unlike BLE, WIFI or other remote control parts, the whistle do no need any power to keep it alive. You may think they are different, but to users, it is the same. Therefore, using passive sound wave-generator like whistle is one of the key features in this project.
It would be reasonable to propose super-sonic sound wave as controller to avoid disturbance. While, the performance of hardware limit the acceptable resolution in Cortex-M0 core MCU, even M4-core MCU can do much better. And audible sound can give appropriate feedback to person who control the whistle.
In this project, the mass productive cheap plastic whistle is used.
In fact, better choice is to build one whistle by yourself. This would be easy and unable to be duplicated with unique sound-track performance.
2. Analysis of the sound wave
Then, Record the sound and analysis the wave in frequency spectrum as follows,
Repeat the sound wave catch.
It is easily to be found out that above two diagram is for same whistle in peak 2735Hz despite of different volume, -50dB via -57dB.
And the spectrum is similar. Be noted, it is not the same, since there is always difference in angle of blow, air pressure or temperature. It is obviously, the section marked in red circle is similar but not same. This give another feature in my design, there is no way Getting-Same-Blow even from same whistle. The meaning is Every recorded sound is fake.
To sum up, the whistle-blow-as-controller is always battery-free and impossible to fake. Only problem is how to balance the complexity of encryption and optimization of performance.
3. Introduction to ISD1820
As to the sound front end, ISD1820 module is used. It features analogue signal amplify, sound record and replay. The ISD1820 can drive speaker or earphone directly. Saving me from blowing each time when debugging.
4. Catch the sound in by MKR1000 board,
The analogue sound wave can transformed into digital signal by ADC function of MKR1000 board in simple arduino code.
for (int readIndex= 0; readIndex < numReadings; readIndex++){ delay(CYCLETIME); // delay fpr cycle readings[readIndex] = analogRead(inputPin); }
The analogue readings can be stored in one-dimension array in preset sample frequency by
delay(CYCLETIME);
Now, it is ready to move to next steps for sound encode.