After you soldered your headers and mics, it's time to try and get some sound in and output from your teensy devices! Here is a short how-to, partially summarizing what we did in the last online session.
- Installl Arduino IDE and Teensyduino: https://www.pjrc.com/teensy/td_download.html
- Open and program the example patch
- Connect some headphones on the audio shield's headphone out and listen! You should be able to hear a sine wave switching amplitudes.
If you are having problems connecting your teensies :( read through the following sections: - Now we want to listen to the actual piezo disc sounds. Check out the teensy web ide patches: https://www.pjrc.com/teensy/gui/
- add the following nodes from the gui:
- from "input" add "i2s"
- from "output" add "i2s"
- from "control" add "sgtl5000"
- add the following nodes from the gui:
- Click the export button to generate the setup code for your teensy and paste it in your Arduino IDE patch!
- In the setup routine of the arduino IDE you need code to choose the microphone port and audio levels. It should look more or less like this:
void setup() { // Audio connections require memory to work. For more // detailed information, see the MemoryAndCpuUsage example AudioMemory(8); // Enable the audio shield and set the output volume. sgtl5000_1.enable(); sgtl5000_1.inputSelect(AUDIO_INPUT_MIC); sgtl5000_1.micGain(36); //from 0dB 40dB sgtl5000_1.volume(0.8); // from 0.0 to 1.0 // 0.8 standard }
- Fingers crossed, press upload and compile the patch!
Now put some headphones on the teensy headphone connector and hopefully listen to some interesting piezo disc microphonic sounds (this is where the word micro-phone really comes from, it's analogous to microscope, actually).
Homework: Coding an Envelope follower
If you were successful with setting up the teensy and piezo microphone, you can make a step further and learn how to wrestle with audio data directly on the teensy!
We want to code a so called envelope follower, it tracks the peaks of our audio signal and gets the rough volume shape. With the help of the volume (~loudness) of our signal we can detect wether there is vibration on our piezo or not. In rough terms we get the volume envelope in two steps:
- Get the maximum (peak) of the signal samples seen so far. This is also called a peak hold or peak detector circuit
- Multiply this maximum with a decay factor (<1) for every new sample, or sample block (envelope follower)
This is a code snippet that illustrates how to search for the peak in a block of audio samples:
float peak=0;
// imagine that the audio block and its length (n_smps) is given to you
for (int i=0; i<n_smps; i++) {
if (block[i]>peak) {
// we remember every peak that
// is greater then we seen so far
peak = block[i];
// we write our peak hold directly
// the audio output
out_block[i]=peak;
}
}
For our envelope follower, we just decay the peak signal with every new sample by a decay factor that is slightly smaller then 1 (e.g. 0.95). To get a bit more accuracy you might want to get the absolute value of our signal before tracking the maximum.
With the help of the teensy documentation and my empty template file you should be able to grasp how this works. Basically you write your own teensy audio object by including a C++ class that is structured as documented in the link above. This class will receive a pointer to the audio input stream coming from the piezo and can do some work on it. If you have questions about the template code please ask on our signal group!