***Question*** How can PicoW read MEMS digital microphone output? --- ***Answer*** *Update 2023jan11hkt2236* *0.9 Si5351 testing notes* I found Si5351 very flexible and easy to use. So I have begun reading the datasheet and trying to write a simple PicoW micropython python to test it. [![si5351 01][1]][1] (1) [I2C Programmable Any Frequency CMOS Clock Generator + VCXO Datasheet - Silicon Labs][2] (2) [Programming si5351 with the PyBoard (micropython) YouTube Tutorial][3] --- *0.8 1MHz to 3.5MHz Clock for MT40DT01* The 1MHz Clock works for MT40DT01. However it is expensive and awkward to handle. So I am looking for an alternative. The following looks good. [5351 Si5351A High Frequency Square Wave Signal Generator - AliExpress HKD21][4] --- *0.7 MT40DT01 now with external 1 MHz clock outputs something* [![mic test 0901][5]][5] [![mic test 02][6]][6] [![mic test 0903][7]][7] --- *0.6 Microphone not working because input frequency to low, < 1MHz* Earlier I used 200kHz as clock frequency but found nothing happening. I checked the datasheet and found that the minimum frequency is 1 MHz (Max 3.5MHz). Now I have a problem, because it seems that the PicoW's system timers are software timers and so could not support too many clocks at high frequency higher than 500 KHz. So ***now I need to check if an external clock > 1MHz can solve the problem***. --- *0.5 Real time test setup* mt40dt01 test program listing - https://penzu.com/p/2f213cb6 [![realtime test 01][8]][8] --- *0.4 Creating 4 PicoW system clocks, two for real time tone signals, two for MT34DT01 MEMS digital microphone clock inputs* [![mt34dt01 test 1][9]][9] [![mt34dt01 test 2][10]][10] [![mt34dt01 test 3][11]][11] --- [PicoW Mems Digi Mic v13.0 Program Listing][12] # PicoW Mems Digi Mic v16.0 - tlfong01 2023jan07hkt2138 import machine import utime from machine import Pin, Timer, RTC print('MemsDigiMicV16.0, 2023jan07hkt2138') redFreq = 20000 # DigiMic #1 Clock signal grnFreq = 4 # For troubleshooting redLed = Pin(0, Pin.OUT, value = 1) # Create Red LED object, init On grnLed = Pin(1, Pin.OUT, value = 1) # Create grn LED object, init On redTimer = Timer() # Red LED timer, callback toggleRedLed grnTimer = Timer() # Grn LED timer, callback toggleGrnLed def toggleRedLed(dummy): #ISR RedLed redLed.toggle() return def togglegrnLed(dummy): #ISR grnLed grnLed.toggle() return redTimer.init(freq = redFreq, mode = Timer.PERIODIC, callback = toggleRedLed) grnTimer.init(freq = grnFreq, mode = Timer.PERIODIC, callback = togglegrnLed) utime.sleep(10) redTimer.deinit() grnTimer.deinit() redLed.off() grnLed.off() # *** End of program *** --- *0.3 Using MT34DT01 MEMS Digital Microphone for Very simple Speech Recognition* The MP34DT01-M MEMS digital microphone datashheet says it can be used for AI applications such as speech recognition, (Ref 1). Now I am thinking of exploring the fisibility of doing very simple speech recognition, say, for a very, very small subset of audio signals, denoting doggie commands like "Sit", "Eat", "OK" etc. I read that it is practical to use Rpi python to do Alphabet reqognition of 26 handwritten patterns A to Z, using CNN (Convolutional Neural Network), for example, Glezer, Ref 2. In CNN application usually represent one visual paatern, say one alphabet, by a liner list of bits. For audio patterns, I think we can also similarly represent doggie commends "Sit", "Eat" etc, each by a list of bits. The MEMS digital microphone MP34DT01 seems ideal for our simple application. This is what will explored in the subsquent sections. (1) [MP34DT01-M MEMS audio sensor omnidirectional digital microphone - STM 2014][13] (2) [Running a Convolutional Neural Network on Raspberry PI - Marcelo Glezer, 2020oct01][14] --- *0.2 Tone Generator and Frequency Counter Schematic* [![tone gen and freq ctr][15]][15] --- *0.1 MEMS PDM Digital Microphone MT34DT01 Test Setup V0.1* [![mt34dt01 v0.2][16]][16] --- *1. Introduction.* We can connect the MEMS microphone output pin to a PicoW GPIO pin and read signal, into a list for later processing. --- *2. Simulation* For prototyping, we can simulate the microphone output signal as a GPIO output pin connected blinking LED, and use another GPIO input pin to read the blinking LED pin. --- *3. Trying Blink rates 1kHz, 2kHx, to simulate 1kHz, 2kHz tones* [![1k, 1k led blinking tones][17]][17] [![1k, 2k tones 2][18]][18] --- *4. The OP wishes to connect the MEMS digital mic output to PicoW. So now I am looking at the real thing. [![ada fruit mems digi mic][19]][19] --- *5. MP34DT01-M MEMS audio sensor omnidirectional digital microphone* (5.1) [MP34DT01-M MEMS audio sensor omnidirectional digital microphone][20] - ST (5.2) [PDM Microphont: PDM Signal Definition - ST Video][21] [![pdm interface][22]][22] --- *6. MT34DT01 MEMS Digital Microphone* [![mt34dt01 mems digi mic][23]][23] --- *9. / to continue, ...* --- ***References*** (1) [Adafruit PDM Microphone Breakout 1][24] (2) [Adafruit PDM Microphone Breakout 2][25] (3) [AliExpress Digital MP34DT01 Microphone Module Simple Pulse Density Modulation Output PDM Digital MEMS Microphone Module - HK$27][26] (4) [TaoBao MP34DT01 MEMS PDM Microphone - ¥25][27] (5) [1000 Hz Test Tone - Sonic Electronix][28] (6) [Using a Digital Microphone (MT34DT01) on STM32 - Dario Petrillo, Hackster, 2022jul14][29] --- ***Appendices*** Appendix A - MicroPython program blinking two LEDs simulating two MEMS digital microphone output signals # Pico W Blink Two LEDs - tlfong01 2023jan01hkt1941 # *** Modules *** import machine from machine import Pin, Timer # *** Configuration*** redLed = Pin(0, Pin.OUT) greenLed = Pin(1, Pin.OUT) redFreq = 2 greenFreq = 4 redTimer = Timer() greenTimer = Timer() # *** Callbacks *** def blinkRedLed(dummy): redLed.toggle() return def blinkGreenLed(dummy): greenLed.toggle() return # *** Main *** redTimer.init(freq = redFreq, mode = Timer.PERIODIC, callback = blinkRedLed) greenTimer.init(freq = greenFreq, mode = Timer.PERIODIC, callback = blinkGreenLed) # *** End of program *** --- *Appendix B - Blinking LEDs Video* [PicoW blinking two LEDS][30] --- *Appendix C - MEMS Mic, PicoW GPIO Eval Brd Setup* [![gpio eval brd][31]][31] # PicoW GPIO Input Testing v7.0 - tlfong01 2023jan02hkt1410 # *** 1.0 Modules *** import machine import utime from machine import Pin, Timer # *** 2.0 Configuration and Functions *** # 2.1 Blinking LED Configurations and Functions redFreq = 6 # Red LED blinking frequency greenFreq = 3 # Green LED blinking frequency redLed = Pin(0, Pin.OUT, value = 1) # Create Red LED object, init On greenLed = Pin(1, Pin.OUT, value = 1) # Create Green LED object, init On redTimer = Timer() # Red LED timer, callback blinkRedLed greenTimer = Timer() # Greed LED timer, callback blinkGreenLed # 2.2 Blinking LED Callbacks def blinkRedLed(dummy): redLed.toggle() return def blinkGreenLed(dummy): greenLed.toggle() return # *** 3.0 GPIO Input Configurations and Functions *** readGpioPin2 = Pin(2, Pin.IN, Pin.PULL_UP) # Create GPIO input pin object readGpioPin3 = Pin(3, Pin.IN, Pin.PULL_UP) # Create GPIO input pin object def readRedLed(): ledStatus = readGpioPin2() if ledStatus == 1: return "High" else: return "Low" def readGreenLed(): ledStatus = readGpioPin3() if ledStatus == 1: return "High" else: return "Low" def readPrintRedGreenLedStatus(): redLedStatus = readRedLed() greenLedStatus = readGreenLed() print('RedLedStatus =', redLedStatus) print('GreenLedStatus =', greenLedStatus) return ### *** 4.0 / to continue, ... *** # *** 9.0 Main *** # 9.1 Run Red/Green Timer for 2 seconds redTimer.init(freq = redFreq, mode = Timer.PERIODIC, callback = blinkRedLed) greenTimer.init(freq = greenFreq, mode = Timer.PERIODIC, callback = blinkGreenLed) utime.sleep(2) redTimer.deinit() greenTimer.deinit() # 9.2 Set/Read/Print Red/Green LED status redLed.on() greenLed.on() readPrintRedGreenLedStatus() # *** End of program *** --- [1]: https://i.sstatic.net/NQXdl.jpg [2]: https://www.digikey.com.mx/htmldatasheets/production/1763475/0/0/1/Si5351A-B-C-Datasheet.pdf [3]: https://www.youtube.com/watch?v=2cb1LLoeT-Y [4]: https://fr.aliexpress.com/item/33050185099.html?gatewayAdapt=glo2fra [5]: https://i.sstatic.net/zRyPF.jpg [6]: https://i.sstatic.net/J6qmC.jpg [7]: https://i.sstatic.net/DhW6k.jpg [8]: https://i.sstatic.net/7nZFr.jpg [9]: https://i.sstatic.net/NB6TH.jpg [10]: https://i.sstatic.net/Ci0t7.jpg [11]: https://i.sstatic.net/AzHQX.jpg [12]: https://penzu.com/p/363b494f [13]: https://datasheet.octopart.com/MP34DT01-M-STMicroelectronics-datasheet-41169337.pdf [14]: https://medium.com/swlh/running-a-convolutional-neural-network-on-raspberry-pi-4fc5bd80aa4d [15]: https://i.sstatic.net/MS0Jz.jpg [16]: https://i.sstatic.net/Di2xI.jpg [17]: https://i.sstatic.net/mofeV.jpg [18]: https://i.sstatic.net/W1qsp.jpg [19]: https://i.sstatic.net/otxJZ.jpg [20]: https://www.mouser.com/datasheet/2/389/mp34dt01-m-955068.pdf [21]: http://st-videos.s3.amazonaws.com/STM32_Microphone_Audio_Acquisition_Part2_PDM_Microphone.mp4 [22]: https://i.sstatic.net/fTW7z.jpg [23]: https://i.sstatic.net/5rfv8.jpg [24]: https://www.adafruit.com/product/4346 [25]: https://www.adafruit.com/product/2716?gclid=Cj0KCQiAtbqdBhDvARIsAGYnXBMlWo5Px8MPOsGz6mfOlcQTx8zKgi5kgOL-PCL5XbvoMZWBFNUa23UaAjYmEALw_wcB [26]: https://www.aliexpress.com/item/4001240664476.html?spm=a2g0o.productlist.main.11.391442abGc1Xty&algo_pvid=6a244fb2-b2ec-4056-9172-b6b7a664e1d8&algo_exp_id=6a244fb2-b2ec-4056-9172-b6b7a664e1d8-5&pdp_ext_f=%7B%22sku_id%22%3A%2210000015426511105%22%7D&pdp_npi=2%40dis%21HKD%2133.27%2126.32%21%21%21%21%21%40212248ba16725455499866162d0736%2110000015426511105%21sea&curPageLogUid=REzyejBWMWnE [27]: https://item.taobao.com/item.htm?_u=13thdsb1b52&id=626041686368 [28]: https://www.youtube.com/watch?v=TbPh0pmNjo8 [29]: https://www.hackster.io/dario_petrillo/using-a-digital-microphone-on-stm32-riot-os-1a3f44 [30]: https://youtu.be/SlbA8wIEvJY [31]: https://i.sstatic.net/GKznZ.jpg