I2S MEMS Microphone Breakout Guide Datasheet by Adafruit Industries LLC

View All Related Products | Download PDF Datasheet
m e t S V. s n: n n r a m ,0“ u r f a d a s ,1, M P 2 Son? *3 x Loci M: .r > I. ©% d2»:
Adafruit I2S MEMS Microphone Breakout
Created by lady ada
Last updated on 2019-06-07 06:59:03 PM UTC
* adafruit learning system
Overview
For many microcontrollers, adding audio input is easy with one of our analog microphone
breakouts (http://adafru.it/1063). But as you get to bigger and better microcontrollers and microcomputers, you'll find
that you don't always have an analog input, or maybe you want to avoid the noise that can seep in with an analog mic
system. Once you get past 8-bit micros, you will often find an I2S peripheral, that can take
digital audio data
in! That's
where this I2S Microphone Breakout comes in.
Instead of an analog output, there are three digital pins: Clock, Data and Word-Select. When connected to your
microcontroller/computer, the 'I2S Master' will drive the clock and word-select pins at a high frequency and read out
the data from the microphone. No analog conversion required!
© Adafruit Industries https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout Page 3 of 30
The microphone is a single mono element. You can select whether you want it to be on the Left or Right channel by
connecting the Select pin to power or ground. If you have two microphones, you can set them up to be stereo by
sharing the Clock, WS and Data lines but having one with Select to ground, and one with Select to high voltage.
This I2S MEMS microphone is bottom ported, so make sure you have the hole in the bottom facing out towards the
sounds you want to read. It's a 1.6-3.3V device only, so not for use with 5V logic (its really unlikely you'd have a 5V-
logic device with I2S anyways). Many beginner microcontroller boards
don't
have I2S, so make sure its a supported
interface before you try to wire it up! This microphone is best used with Cortex M-series chips like the Arduino Zero,
Feather M0, or single-board computers like the Raspberry Pi.
© Adafruit Industries https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout Page 4 of 30
© Adafruit Industries https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout Page 5 of 30
* adafruit learning system
Assembly
Assembly is really easy, you can use straight or 'right-angle' style headers to attach to the PCB. We'll be using the plain
straight headers included
The board comes with all surface-mount components pre-soldered. The included header strip can be soldered on for
convenient use on a breadboard or with 0.1" connectors. You can also skip this step and solder on wires.
Prepare the header strip:
Cut the strip to length if necessary. It will be easier to
solder if you insert it into a breadboard - long pins down
Add the breakout board:
Place the breakout board over the pins so that the short
pins poke through the breakout pads
Make sure the side with the components is face down, as shown in the photos in this guide!
© Adafruit Industries https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout Page 6 of 30
w-Io-uuuu nun-nann- nun-u...- -u-u-n-n-l
And Solder!
Be sure to solder all 5 pins for reliable electrical contact.
(For tips on soldering, be sure to check out our Guide to
Excellent Soldering
(https://adafru.it/aTk)
).
© Adafruit Industries https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout Page 7 of 30
You're done! Check your solder joints visually and
continue onto the next steps
© Adafruit Industries https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout Page 8 of 30
* adafrult learning system
Pinouts
Unlike most of our breakouts, this sensor has the detection element on the bottom of the PCB, so we expect you to
solder it 'upside down' with the sensor package on the bottom and the port on top!
Power Pins
3V - this is the power in pin. Technically it can be powered from as low as 1.6V to 3.6V but you'll need to make
sure your logic level matches!
GND - power and data ground
I2S Data Pins
BCLK - the bit clock, also known as the data clock or just 'clock' - comes from the I2S master to tell the
microphone its time to transmit data. This should run at 2-4 MHz but we've found you can often run it a little
slower and it'll work fine
DOUT - the data output from the mic!
LRCLK - the left/right clock, also known as WS (word select), this tells the mic when to start transmitting. When
the LRCLK is low, the left channel will transmit. When LRCLK is high, the right channel will transmit.
SEL - the channel select pin. By default this pin is low, so that it will transmit on the left channel mono. If you
connect this to high logic voltage, the microphone will instantly start transmitting on the right channel.
© Adafruit Industries https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout Page 9 of 30
* adafruit learning system 000000000000. 0 999990099 ' 0 o a vow 10.09 '0... 00900 on 0000- .o... o 00000 on... 00.0. o fritzfing
Arduino Wiring &
Test
Remember, the I2S microphone requires an I2S peripheral and won't work with chips that
don't
support it in hardware!
For this example we'll use a Feather M0, but you can also use an Arduino Zero.
Wiring
For Feather M0, Ardruino Zero and friends, use the following wiring:
GND connected GND
3.3V connected 3.3V (Feather, Zero) or VCC (MKR1000, MKRZero)
LRCLK / WS connected to pin 0 (Feather, Zero) or pin 3 (MKR1000, MKRZero)
BCLK connected to pin 1 (Feather, Zero) or pin 2 (MKR1000, MKRZero)
Data /SD connected to pin 9 (Zero) or pin A6 (MKR1000, MKRZero
You can leave Select disconnected
https://adafru.it/uya
https://adafru.it/uya
I2S Library
Luckily, there's a nice little I2S library already written for Arduinos based on the SAMD processor. Make sure you have
the most recent Arduino IDE and SAMD core. Then select the board you're using (e.g. Adafruit Feather M0) and you'll
see the I2S library examples show up in the pulldown menu
© Adafruit Industries https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout Page 10 of 30
6 muw| an...» m s H:- Cukw cw; man‘s m¢wop um? Chum-u cum; 1n Mr. mam Exlmp‘ahrAdafmn Futhev w (Nam: use Purl) as 54:0»me son My: fiamp‘fi hum Cunnm [mums mammary Simpk'nne
You could try the InputPlotter demo but this code is higher resolution:
© Adafruit Industries https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout Page 11 of 30
Upload to your Arduino Zero/Feather wired up as above, and open up the Serial Plotter
/*
This example reads audio data from an I2S microphone
breakout board, and prints out the samples to the Serial console. The
Serial Plotter built into the Arduino IDE can be used to plot the audio
data (Tools -> Serial Plotter)
Circuit:
* Arduino/Genuino Zero, MKRZero or MKR1000 board
* GND connected GND
* 3.3V connected 3.3V (Zero) or VCC (MKR1000, MKRZero)
* WS connected to pin 0 (Zero) or pin 3 (MKR1000, MKRZero)
* CLK connected to pin 1 (Zero) or pin 2 (MKR1000, MKRZero)
* SD connected to pin 9 (Zero) or pin A6 (MKR1000, MKRZero)
created 17 November 2016
by Sandeep Mistry
*/
#include <I2S.h>
void setup() {
// Open serial communications and wait for port to open:
// A baud rate of 115200 is used instead of 9600 for a faster data rate
// on non-native USB ports
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
// start I2S at 16 kHz with 32-bits per sample
if (!I2S.begin(I2S_PHILIPS_MODE, 16000, 32)) {
Serial.println("Failed to initialize I2S!");
while (1); // do nothing
}
}
void loop() {
// read a sample
int sample = I2S.read();
if ((sample == 0) || (sample == -1) ) {
return;
}
// convert to 18 bit signed
sample >>= 14;
// if it's non-zero print value to serial
Serial.println(sample);
}
© Adafruit Industries https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout Page 12 of 30
E-X ommmmmmw rrnarnrl 17 Nmmmhm— 7mm
Try blowing or whistling at the sensor to see response in real time
VU Meter Demo
Often times you don't want the actual audio data but the overall "sound pressure level". This example will take a bunch
of samples, normalize the data to be around 0, then give you the maximum difference between the waveforms for a
'volume graph'
/*
This example reads audio data from an Invensense's ICS43432 I2S microphone
breakout board, and prints out the samples to the Serial console. The
Serial Plotter built into the Arduino IDE can be used to plot the audio
data (Tools -> Serial Plotter)
Circuit:
* Arduino/Genuino Zero, MKRZero or MKR1000 board
* ICS43432:
* GND connected GND
* 3.3V connected 3.3V (Zero) or VCC (MKR1000, MKRZero)
* WS connected to pin 0 (Zero) or pin 3 (MKR1000, MKRZero)
* CLK connected to pin 1 (Zero) or pin 2 (MKR1000, MKRZero)
* SD connected to pin 9 (Zero) or pin A6 (MKR1000, MKRZero)
created 17 November 2016
© Adafruit Industries https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout Page 13 of 30
created 17 November 2016
by Sandeep Mistry
*/
#include <I2S.h>
void setup() {
// Open serial communications and wait for port to open:
// A baud rate of 115200 is used instead of 9600 for a faster data rate
// on non-native USB ports
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
// start I2S at 16 kHz with 32-bits per sample
if (!I2S.begin(I2S_PHILIPS_MODE, 16000, 32)) {
Serial.println("Failed to initialize I2S!");
while (1); // do nothing
}
}
#define SAMPLES 128 // make it a power of two for best DMA performance
void loop() {
// read a bunch of samples:
int samples[SAMPLES];
for (int i=0; i<SAMPLES; i++) {
int sample = 0;
while ((sample == 0) || (sample == -1) ) {
sample = I2S.read();
}
// convert to 18 bit signed
sample >>= 14;
samples[i] = sample;
}
// ok we hvae the samples, get the mean (avg)
float meanval = 0;
for (int i=0; i<SAMPLES; i++) {
meanval += samples[i];
}
meanval /= SAMPLES;
//Serial.print("# average: " ); Serial.println(meanval);
// subtract it from all sapmles to get a 'normalized' output
for (int i=0; i<SAMPLES; i++) {
samples[i] -= meanval;
//Serial.println(samples[i]);
}
// find the 'peak to peak' max
float maxsample, minsample;
minsample = 100000;
maxsample = -100000;
for (int i=0; i<SAMPLES; i++) {
minsample = min(minsample, samples[i]);
maxsample = max(maxsample, samples[i]);
}
Serial.println(maxsample - minsample);
© Adafruit Industries https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout Page 14 of 30
Serial.println(maxsamp1e . minsample mm mm a
Open up the serial plotter to see how making noises will create peaks!
ArduinoSound Library
For most uses, its better to have a higher-level library for managing sound. The ArduinoSound library works with I2S
mics and can do filtering, amplitude detection, etc!
Install it using the Arduino library manager
Various examples come with the library, check them out in the File->Examples->ArduinoSound sub menu
Serial.println(maxsample - minsample);
}
© Adafruit Industries https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout Page 15 of 30
@ mgigm | lllluim 1.1;) * @mmufiw an can.» Opul— cwo I Open m > W > m n A a Close cww “"M‘W ' 5m Ch” Wigwam » Sm Ax. cums-ms AdimiIMSGI)! ' mam-1mm , v.9: saw (Most-app wuimm Pml cm.» m
For example, amplitude Serial plotter will do basic amplitude plotting:
You can also do FFT spectral diagramming using SpectrumSerialPlotter. We made a small change to the example so
that all 128 bins are plotted:
© Adafruit Industries https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout Page 16 of 30
Spmmmnalpw | And I.“ _ 5k gm gun. Inch 5.1.: snemumsenzwanaw 1f (lifm-lvnx.1npnc(moln125)l ( ‘ San-I‘Pxxnclnl'i‘alled m sec in analyzu mput"): um): (1): // do nummg ) ) mm 1mm) ( // Cluck 1f 3 new analyns 1: avallable 1: lffmmlyutavnlablelll ( // zead m: new spectrum t!malyzer.:ead(:pecmm, speccmsuen // pun: am: an specmm to: (:c: 1 1 < apeccrumsue:="" 1w="" u="" serln1.pr1m:((1="" -="" sampleknbey="" 11mm;="" me="" $152th="" lzequency="" serialmzxntflpectmmlin:="" me="" spectrum="" value="" seriu.pzxnt['\r.'):="" 1="" serm.px)ntln[l:l="" "new...="">
© Adafruit Industries https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout Page 17 of 30
* adafruit learning system one... .......o.o...o.o.... fritzing
Raspberry Pi Wiring &
Test
You can add mono or stereo I2S microphones to your Raspberry Pi, too!
This will work with Raspberry Pi B+, 2, 3, Zero and any other 2x20-connector-Pi
This guide is largely based on this great git repo https://github.com/nejohnson2/rpi-i2s (https://adafru.it/vka)
Wiring For Mono Mic
Mic 3V - Pi 3.3v
Mic Gnd - Pi Gnd
Mic SEL - Pi Gnd (this is used for channel selection. Connect to 3.3 or GND)
Mic BCLK - BCM 18 (pin 12)
Mic LRCL - BCM 19 (pin 35)
Mic DOUT - BCM 20 (pin 38)
https://adafru.it/vkb
https://adafru.it/vkb
Wiring For Stereo Mic
© Adafruit Industries https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout Page 18 of 30
fritzing
https://adafru.it/vkc
https://adafru.it/vkc
Raspberry Pi i2s Configuration
Start by logging into your Raspberry Pi via a terminal, we recommend ssh so you can copy + paste the many
commands.
Turn on i2s support by editing /boot/config.txt with:
Uncomment #dtparam=i2s=on
sudo nano /boot/config.txt
© Adafruit Industries https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout Page 19 of 30
o p Ln‘ragascrua ~ . an‘ragasan/a ~ file: / ml n
Next, we'll make sure sound support is enabled in the kernel with:
Add snd-bcm2835 on its own line, to the modules file as shown below
Now reboot your pi with:
sudo nano /etc/modules
© Adafruit Industries https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout Page 20 of 30
o o o pw®raspbsrrypw ~
Once rebooted, re-log in.
Enter the following to confirm the modules are loaded
Kernel Compiling
Ok now its time for the
fun
part! You'll manually compile in i2s support.
Start by updating your Pi:
Then reboot!
Install the compilation dependencies:
Download kernel source & compile:
sudo reboot
lsmod | grep snd
sudo apt-get update
sudo apt-get install rpi-update
sudo rpi-update
sudo apt-get install git bc libncurses5-dev bison flex libssl-dev
© Adafruit Industries https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout Page 21 of 30
o o o pw®rasnbsrrypw ~
On a Pi 3 this will take many many minutes, so don't worry if its taking 15 minutes. On a Pi Zero it can take an hour or
longer!
If the script pauses at this prompt:
Just press enter to accept the default and continue.
Prepare to Compile the i2s module
Now you're ready to compile i2s support:
This may already be done - mount: debugs is already mounted - in which case keep going
If you are using Pi 3 or Pi 2 - make sure the module name is 3f203000.i2s
If you are using Pi Zero - the module name is 20203000.i2s
Run rpi-i2s-audio
Download the module, written by Paul Creaser (https://adafru.it/vkd)
sudo wget https://raw.githubusercontent.com/notro/rpi-source/master/rpi-source -O /usr/bin/rpi-source
sudo chmod +x /usr/bin/rpi-source
/usr/bin/rpi-source -q --tag-update
rpi-source --skip-gcc
Code coverage for fuzzing (KCOV) [N/y/?] (NEW)
sudo mount -t debugfs debugs /sys/kernel/debug
© Adafruit Industries https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout Page 22 of 30
Q pl©vuiphevlyplt ~/IpI-I1 "mo Gnu mm 24.5 nu Iv lawman:
Pi Zero Only
If you are using a Raspberry Pi Zero, edit my_loader.c with nano my_loader.c and change the two lines
.platform = "3f203000.i2s",
and
.name = "3f203000.i2s",
with
.platform = "20203000.i2s",
and
.name = "20203000.i2s",
If you aren't using a Pi Zero, continue on!
Compile the module with
Verify that the module was loaded:
git clone https://github.com/PaulCreaser/rpi-i2s-audio
cd rpi-i2s-audio
make -C /lib/modules/$(uname -r )/build M=$(pwd) modules
sudo insmod my_loader.ko
lsmod | grep my_loader
dmesg | tail
© Adafruit Industries https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout Page 23 of 30
Q pl©viiphevrypu ~/vp.--2 on the last line Q Wampum: ~ . . \ cl snap): card mdec 1m
Note that on the Pi 2/3 you'll see asoc-simple-card asoc-simple-card.0: snd-soc-dummy-dai <-> 3F203000.i2s
mapping ok on the last line and on Pi Zero you'll see asoc-simple-card asoc-simple-card.0: snd-soc-dummy-dai <->
20203000.i2s mapping ok
Auto-load the module on startup
Now you can set it up so the module is loaded every time you boot the Pi
And reboot!
Test & Record!
OK that was a lot of effort but now you are ready to rock!
Use the following command to list the available input devices:
you should see a snd_rpi_simple_card
sudo cp my_loader.ko /lib/modules/$(uname -r)
echo 'my_loader' | sudo tee --append /etc/modules > /dev/null
sudo depmod -a
sudo modprobe my_loader
sudo reboot
arecord -l
© Adafruit Industries https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout Page 24 of 30
o I o mayasanwm »
You can record a wav file in mono with this command:
Or, if you have two i2s mics installed, record in stereo with this command:
If all is working correctly, you should see the VU meter react at the bottom of the terminal window
Test Playback
If you have speakers hooked up to the Pi, you can play the file back directly on the device:
Or, you can copy it over to your computer for playback :), just insert your Pi's IP address below:
Adding Volume control
You can add volume control to your mine via alsamixer and alsa config. (Hat tip to RickTracer (https://adafru.it/doW))
Run sudo nano ~/.asoundrc
and put the following in:
arecord -D plughw:1 -c1 -r 48000 -f S32_LE -t wav -V mono -v file.wav
arecord -D plughw:1 -c2 -r 48000 -f S32_LE -t wav -V stereo -v file_stereo.wav
aplay file.wav
scp pi@<local-ip>:/home/pi/file.wav ~/Desktop/file.wav
© Adafruit Industries https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout Page 25 of 30
JP p‘fi'mpblnyp‘ .
Now before you can change the volume you need to use the device once (this is an alsa thing)
Run
#This section makes a reference to your I2S hardware, adjust the card name
# to what is shown in arecord -l after card x: before the name in []
#You may have to adjust channel count also but stick with default first
pcm.dmic_hw {
type hw
card sndrpisimplecar
channels 2
format S32_LE
}
#This is the software volume control, it links to the hardware above and after
# saving the .asoundrc file you can type alsamixer, press F6 to select
# your I2S mic then F4 to set the recording volume and arrow up and down
# to adjust the volume
# After adjusting the volume - go for 50 percent at first, you can do
# something like
# arecord -D dmic_sv -c2 -r 48000 -f S32_LE -t wav -V mono -v myfile.wav
pcm.dmic_sv {
type softvol
slave.pcm dmic_hw
control {
name "Boost Capture Volume"
card sndrpisimplecar
}
min_dB -3.0
max_dB 30.0
}
© Adafruit Industries https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout Page 26 of 30
,5) p‘fi'tpblvvyw . ‘ fl ,«E v w a
And cancel with ^C once it starts recording.
Now you can run alsamixer - press F6 and select the I2S simple sound card
It will complain there are no playback controls (because its for recording only).
Press F5 to change the volume.
Then you can record with the i2c mic device using
arecord -D dmic_sv -c2 -r 48000 -f S32_LE -t wav -V mono -v recording.wav
arecord -D dmic_sv -c2 -r 44100 -f S32_LE -t wav -V mono -v file.wav
© Adafruit Industries https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout Page 27 of 30
and playback with
aplay recording.wav
© Adafruit Industries https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout Page 28 of 30
* adafrult \earning system 2 3 A z 1 n D E j E wan mu anaruuxr wuusrnxzs ‘ m up: m a um: 33» s W mam; m 5‘ m ——yin,: sxaqiwu , mm w
Downloads
Files
EagleCAD PCB Files on GitHub (https://adafru.it/uyb)
Fritzing object in the Adafruit Fritzing library (https://adafru.it/aP3)
Schematic & Fab Print
© Adafruit Industries https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout Page 29 of 30
© Adafruit Industries Last Updated: 2019-06-07 06:59:03 PM UTC Page 30 of 30

Products related to this Datasheet

SPH0645LM4H I2S MICROPHONE BOARD