***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