Sound dan ESP32 – 1

Pendahuluan

I2S atau Inter-IC Soundm adalah type data interface untuk audio, dengan spesifikasi:

  • Data, Data-In (DIN), atau Data-Out (DOUT)
  • Clock atau bit clock (BCLK)
  • Channel select, word select (WS), atau left-right clock (LRCLK)

Interface itu sendiri standard, hanya penamaannya agak berbeda. Data line akan berisi stereo audio data untuk channel kiri (channel 0) dan kanan (channel 1).

Channel select mengindikasikan channel data mana yang sedang ditransfer. Low untuk kiri dan high untuk kanan.

Clock adalah common clock yang disediakan oleh master, yaitu pihak pengirim data.

ESP32 menyediakan dua I2S yang dapat dikonfigurasi sebagai input atau output. Ketika dikonfigurasi sebagai input, kita dapat gunakan mic untuk merekam suara yang dapat disimpan kedalam flash. Jika dikonfigurasi sebagai output, kita dapat hubungkan dengan speaker untuk menghasilkan suara.

Pada contoh project kali ini, kita gunakan MAX98357 dari Maxim sebagai I2S sound amplifier antara ESP32 dan speaker. Modul ini harganya sangat terjangkau, menggunakan 3.3V output dari ESP32 (tidak memerlukan external power source).

MAX98357 dapat menghasilkan output 3.2W untuk speaker 4ohm, yang mana cukup untuk kebutuhan project kita. Datasheet dapat dibaca di maximintegrated.com

Project akan kita bagi dalam dua tahap agar lebi mudah dipahami.

  • Bagian pertama kita definisikan partisi pada ESP32 flash dan upload file WAV sebagai data audio.
  • Bagian kedua adalah aplikasi yang akan menjalankan audio ke speaker.

Upload file sound ke flash memory

  1. Setelah PlatformIO project kita buat, buat file partitions.csv pada root folder dari project.
Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, , 0x6000,
phy_init, data, phy, , 0x1000,
factory, app, factory, , 1M,
spiffs, data, spiffs, 0x210000, 1M,

Ini adalah file untuk mendefinisikan partisi pada flash memory. Bootloader akan selalu membaca factory partion, dimana aplikasi disimpan. Sementara, file audio akan disimpan pada spiffs data partition.

partitions.csv juga berisi informasi lain seperti offset dari flash start dan ukuran dari partition. Jika offset tidak tersedia, ESP-IDF akan menghitung berdasarkan informasi dari sdkconfig dan data sizes yang disediakan pada partitions.csv.

Karena ita akan melakukan customize partisi pada flash, perlu kita tambahkan informasi file partitions.scv baik pada platformio.in dan sdkconfig.

  1. Edit platformio.ini
monitor_speed = 115200
board_build.partitions = partitions.csv

3. Buka command prompt, jalankan Python virtual environment untuk pio command-line tool. script activate.bat terletak di C:\Users\nama_account\.platformio\penv\Scripts (nama user account windows Anda)

C:\Users\nama_account\.platformio\penv\Scripts\activate
(penv)$ pio --version
PlatformIO, version 5.1.0

4. Edit sdkconfig menggunakan pio tool.

(penv)$ pio run -t menuconfig

menuconfig adalah menu-driven user interface, yang digunakan untuk edit configuration files berdasarkan Kconfig configuration system.

Tips: Jika tombol panah atas bawah tidak berfungsi, Anda dapat gunakan K dan J, atau + dan -, pada keyboard untuk navigasi naik da turun pada menuconfig.

  1. Atur nama dari partition file dengan memilih menu selecting Partition Table | Partition Table | Custom partition table CSV:

Setelah Anda pilih menu diatas, menu akan kembali ke menu sebelumnya dan otomatis file partitions.csv akan terpilih.

  1. Kembali ke top level menu (tekan esc), lalu buka menu Component Config | SPIFFS Configuration, set maximum number of partitions menjadi 5.

Lalu tekan Q untuk quit, akan diminta untuk menyimpan perubahan.

7. Berikutnya kita test apakan spiffs partition berhasil dibuat. Jalankan aplikasi dibawah. Buka file main.c, masukan code dibawah.

#include <stdio.h>
#include <sys/stat.h>
#include "esp_spiffs.h"
#include "esp_err.h"
void app_main(void)
{
    printf("Initializing SPIFFS\n");
    esp_vfs_spiffs_conf_t conf = {
    .base_path = "/spiffs",
    .partition_label = NULL,
    .max_files = 5,
    .format_if_mount_failed = true};

    esp_err_t ret = esp_vfs_spiffs_register(&conf);
    if (ret != ESP_OK)
    {
        printf("Failed to initialize SPIFFS (%s)\n", esp_err_to_name(ret));
        return;
    }

    size_t total = 0, used = 0;
    ret = esp_spiffs_info(conf.partition_label, &total, &used);
    if (ret == ESP_OK)
    {
        printf("Partition size: total: %d, used: %d\n", total, used);
    }
    else
    {
        printf("Failed to get SPIFFS partition information (%s)\n", esp_err_to_name(ret));
    }
}
  1. Setelah spiffs partition tersedia, buat data folder pada project root dan copy sound file, pada tutorial digunakan rooster.wav. Dapat download disini atau silakan gunakan file sound yang Anda inginkan.
(penv)$ mkdir data
(penv)$ copy d:\Download\rooster.wav data
  1. Generate SPIFFS image menggunakan pio tool.
(penv)$ pio run -t buildfs
  1. Upload image kedalam spiffs partition (masih menggunakan pio):
(penv)$ pio run -t uploadfs
  1. Terakhir, kita buka lagi file main.c lalu tambahkan code dibawah untuk memeriksa apakah file berhasil di simpan dalam partisi.
    struct stat st;
    if (stat("/spiffs/rooster.wav", &st) == 0)
    {
        printf(">> rooster.wav found. %ld\n", st.st_size);
    }
    else
    {
        printf(">> rooster.wav NOT found\n");
    }

12. Buka serial monitor, untuk melihat apakah sound file sudah tersedia dalam flash memory.

Initializing SPIFFS
Partition size: total: 956561, used: 100400
>> rooster.wav found. 99286

Sampai disini kita sudah berhasil membuat partisi, kemudian mengupload file sound.

Sharing is caring:

Leave a Comment