MakePython Audio
Contents
Introduction
The MakePython Audio board uses the uDA1334 digital to analog converter (DAC), which converts I2S (not be confused with I2C) audio to an analog signal to drive speakers. The I2S Audioboard converts the digital audio signals using the I2S standard to an analog signal.
Model: MPAUDIO
Features
• NXP Low power Audio DAC: uDA1334
• Integrated digital filter plus DAC
• Supports sample frequencies from 8 to 100 kHz
• Automatic system clock versus sample rate detection
• Low power consumption
• I2S-bus and LSB-justified format compatible
• Digital de-emphasis for 44.1 kHz sampling rate
• Support Micro SD Card
• Working Temperature: -40 – 85℃
• Size: 70*32.6mm
Interface Function
①toggle switch
②toggle switch
③Audio IC:uDA1443
④D3: PWR LED
⑤microSD card
⑥D1:LED controlled by IO21
⑦audio jack(3.5mm)
Required Materials
1. Makepython ESP32
2. MakePython Audio v2.0
3. microUSB Cable
4. Speaker
5. PC
6. microSD card
System diagram
Makepython Audio can’t work alone, it need work with Makepython ESP32(Wrover).
Application
You can get Makepython ESP32(Wrover) from:
https://www.makerfabs.com/makepython-esp32.html
Note: Makepython ESP32 Wroom’s RAM is not enough for audio application, so you need Makepython ESP32(Wrover)
Usage
Warning: Don't operate when powered on in case of short circuit.
This guides help you how to use makepython Audio with Makepython ESP32 to fulfill text to speech(TTS). It’s very simple and easy to understand. It also can play music from SD card or Flash too.
Makepython ESP32(Wrover) used USB-to-UART(CP2104) to upload firmware, you can install the CP2102 driver from:
https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers
Indicator LED Status
Indicator LED | Status |
D3 | Light on when powered on, light off when powered off |
D1 | Light on when IO21 output low, light off when IO21 output High |
Project_1: Text to speech
The example uses MicroPython programming, very simple and easy to understand.
MakePython Audio board cannot work alone. It needs a microcontroller like ESP32(Wrover) to drive it. With Makepython ESP32(Wrover) and Makepython Audio, they can be directly combined to fulfill various functions about audio.
You can get MakePython ESP32 from here:
https://www.makerfabs.com/makepython-esp32.html
Hardware interface
I2S Interface | ESP32 PIN | Remark |
I2S_BCK | IO26 | |
I2S_LCK | IO25 | WS |
I2S_DIN | IO27 |
ESP32 Booting Mode:
PIN | Default | SPI Boot(Running Mode) | Download Boot(Download Mode) |
GPIO0 | Pull-up | 1 | 0 |
GPIO2 | Pull-down | Don’t care | 0 |
GPIO12(MTDI) | Pull-down | 0 | 0 |
Note: The internal LDO (VDD_SDIO) output 3.3V when GPIO12 set to LOW; the internal LDO (VDD_SDIO) output 1.8V when GPIO12 set to HIGH; so it may get fails when you downloading the firmware if you had inserted the Makepython Audio.
Step:
1. Connecting MakePython ESP32 to PC via microUSB cable.
2. Open flash_download_tools_v3.6.8,Select ESP32 DownloadTool
3. Select the related COM port, baud rate 921600,erase the ESP32 first.
Note: In my PC, there is COM272 that may different in your PC.
4. Find the firmware bin file esp32_tts.bin,address 0x1000
5. Click the START to download the firmware.
Wait until it finished.
6. Insert the ESP32 board to Makepython Audio
7. Open uPyCraft, select com port from Tools->Serial
8. Select esp32 from Tools->Board
9. Connect the Makepython ESP32 board.
10. Open main.py from File->Open, you can get the code from here: tts-test.py
11. Click DownloadAndRun Button to download the main.py file to Makepython ESP32.
Input say("hello,world") it will speech hello world.
Or also, you can update the firmware via command terminal, such as:
esptool.py --chip esp32 --port COM272 erase_flash esptool.py --chip esp32 --port COM272 write_flash --flash_mode dio -z 0x1000 esp32-tts.bin
Code Show:
from machine import I2S from machine import Pin import array import speech bck_pin = Pin(26) ws_pin = Pin(25) sdout_pin = Pin(27) audio_out = I2S(I2S.NUM0, bck=bck_pin, ws=ws_pin, sdout=sdout_pin, standard=I2S.PHILIPS, mode=I2S.MASTER_TX, dataformat=I2S.B16, channelformat=I2S.ONLY_RIGHT, samplerate=16000, dmacount=16, dmalen=512) a = bytearray(16000*8) size = speech.say('Hello, wolrld', a) audio_out.write(a[:size]) def say(text): a = bytearray(16000*8) size = speech.say(text, a) audio_out.write(a[:size]) def close(): audio_out.deinit()
Project_2: Play Sounds from micro SD card
1. Copy the taunt-16k-16bits-mono-12db.wav file to the microSD card then insert to Makepython Audio.
2. Download the play-mono-wav-from-sdcard.py file like previous.
from machine import I2S from machine import SDCard from machine import Pin #======= USER CONFIGURATION ======= WAV_FILE = 'taunt-16k-16bits-mono-12db.wav' #WAV_FILE = 'LightMusic.wav' SAMPLE_RATE_IN_HZ = 16000 #======= USER CONFIGURATION ======= bck_pin = Pin(26) ws_pin = Pin(25) sdout_pin = Pin(27) # channelformat settings: # mono WAV: channelformat=I2S.ONLY_LEFT audio_out = I2S( I2S.NUM0, bck=bck_pin, ws=ws_pin, sdout=sdout_pin, standard=I2S.PHILIPS, mode=I2S.MASTER_TX, dataformat=I2S.B16, channelformat=I2S.ONLY_LEFT, samplerate=SAMPLE_RATE_IN_HZ, dmacount=10, dmalen=512) # configure SD card # slot=2 configures SD card to use the SPI3 controller (VSPI), DMA channel = 2 # slot=3 configures SD card to use the SPI2 controller (HSPI), DMA channel = 1 sd = SDCard(slot=3, sck=Pin(18), mosi=Pin(23), miso=Pin(19), cs=Pin(22)) uos.mount(sd, "/sd") wav_file = '/sd/{}'.format(WAV_FILE) wav = open(wav_file,'rb') # advance to first byte of Data section in WAV file pos = wav.seek(44) # allocate sample arrays # memoryview used to reduce heap allocation in while loop wav_samples = bytearray(1024) wav_samples_mv = memoryview(wav_samples) print('Starting') # continuously read audio samples from the WAV file # and write them to an I2S DAC while True: try: num_read = wav.readinto(wav_samples_mv) num_written = 0 # end of WAV file? if num_read == 0: # advance to first byte of Data section pos = wav.seek(44) else: # loop until all samples are written to the I2S peripheral while num_written < num_read: num_written += audio_out.write(wav_samples_mv[num_written:num_read], timeout=0) except (KeyboardInterrupt, Exception) as e: print('caught exception {} {}'.format(type(e).__name__, e)) break wav.close() uos.umount("/sd") sd.deinit() audio_out.deinit() print('Done')
3. Reset the board, Makepython Audio will make sound.
Note that microPython firmware only support several formatted wav file. If you play your wav file without success, try a format transfer tool to 16k-16bits-mono. Or use MakePython Audio it in Arduino, here is the example.
FAQ
You can list your questions here or contact with support@makerfabs.com for technology support.