Add embedded MP3 playback test sketch

This commit is contained in:
Martin Linkwitz - NUC
2026-04-08 16:30:34 +02:00
parent 1047fa70a0
commit 3551b073d7
3 changed files with 53515 additions and 82 deletions

View File

@@ -1,82 +1,79 @@
#include <Arduino.h> #include <Arduino.h>
#include "driver/twai.h" #include <driver/i2s.h>
#include "MeyCan.h" #include <MP3DecoderHelix.h>
#include "positive_sound_mp3.h"
// https://github.com/espressif/arduino-esp32/blob/master/libraries/ESP32/examples/TWAI/TWAIreceive/TWAIreceive.ino
using namespace libhelix;
#define RX_PIN 2
#define TX_PIN 3 constexpr i2s_port_t I2S_PORT = I2S_NUM_0;
constexpr int I2S_BCLK = 6;
void DebugBlink(int d) { constexpr int I2S_LRC = 7;
pinMode(20, OUTPUT); constexpr int I2S_DIN = 5;
while (true) { constexpr float OUTPUT_GAIN = 0.35f;
digitalWrite(20, HIGH); MP3DecoderHelix mp3;
delay(d);
digitalWrite(20, LOW); bool i2s_initialized = false;
delay(d); int current_sample_rate = 0;
} int current_channels = 0;
}
void configureI2s(int sample_rate, int channels) {
bool driver_installed = false; if (!i2s_initialized) {
void setup() { i2s_config_t i2s_config = {};
Serial.begin(9600); i2s_config.mode = static_cast<i2s_mode_t>(I2S_MODE_MASTER | I2S_MODE_TX);
SPI.begin(); i2s_config.sample_rate = sample_rate;
i2s_config.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT;
// Explicit GND for LED and Input i2s_config.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT;
pinMode(21, OUTPUT); i2s_config.communication_format = I2S_COMM_FORMAT_STAND_I2S;
digitalWrite(21, LOW); i2s_config.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1;
i2s_config.dma_buf_count = 8;
// Initialize configuration structures using macro initializers i2s_config.dma_buf_len = 256;
twai_general_config_t g_config = TWAI_GENERAL_CONFIG_DEFAULT((gpio_num_t)TX_PIN, (gpio_num_t)RX_PIN, TWAI_MODE_NORMAL); i2s_config.use_apll = false;
twai_timing_config_t t_config = TWAI_TIMING_CONFIG_1MBITS(); //Look in the api-reference for other speed sets. i2s_config.tx_desc_auto_clear = true;
twai_filter_config_t f_config = TWAI_FILTER_CONFIG_ACCEPT_ALL(); i2s_config.fixed_mclk = 0;
i2s_pin_config_t pin_config = {};
if (twai_driver_install(&g_config, &t_config, &f_config) == ESP_OK) { pin_config.bck_io_num = I2S_BCLK;
Serial.println("Driver installed"); pin_config.ws_io_num = I2S_LRC;
} else { pin_config.data_out_num = I2S_DIN;
DebugBlink(100); pin_config.data_in_num = I2S_PIN_NO_CHANGE;
return;
} i2s_driver_install(I2S_PORT, &i2s_config, 0, nullptr);
i2s_set_pin(I2S_PORT, &pin_config);
i2s_zero_dma_buffer(I2S_PORT);
i2s_initialized = true;
esp_err_t e = twai_start(); }
// Start TWAI driver
if (e == ESP_OK) { if (sample_rate != current_sample_rate || channels != current_channels) {
driver_installed = true; i2s_channel_t channel_mode =
} else { channels == 1 ? I2S_CHANNEL_MONO : I2S_CHANNEL_STEREO;
DebugBlink(500); i2s_set_clk(I2S_PORT, sample_rate, I2S_BITS_PER_SAMPLE_16BIT, channel_mode);
return; current_sample_rate = sample_rate;
} current_channels = channels;
}
}
SetDevicedId(0x05, 0x1F);
void audioDataCallback(MP3FrameInfo &info, int16_t *pcm_buffer, size_t len, void *) {
SetMeyPin(1, 5); configureI2s(info.samprate, info.nChans);
SetMeyPin(2, 6);
SetMeyPin(3, 7); for (size_t i = 0; i < len; ++i) {
SetMeyPin(4, 8); pcm_buffer[i] = static_cast<int16_t>(pcm_buffer[i] * OUTPUT_GAIN);
SetMeyPin(5, 9); }
SetMeyPin(6, 10);
SetMeyPin(7, 20); size_t bytes_written = 0;
i2s_write(I2S_PORT, pcm_buffer, len * sizeof(int16_t), &bytes_written,
SetupMeyCan(8, 1, 3); portMAX_DELAY);
} }
twai_message_t frame; void setup() {
void loop() { Serial.begin(115200);
mp3.setDataCallback(audioDataCallback);
if (!driver_installed) { mp3.begin();
// Driver not installed Serial.println("MP3 playback started");
DebugBlink(2000); }
return;
} void loop() {
mp3.write(positive_sound_short_mp3, positive_sound_short_mp3_len);
CheckMeyPinsTriggered(); mp3.begin();
if (twai_receive(&frame, 0) == ESP_OK) { delay(20);
}
HandleFrame(&frame);
}
}

Binary file not shown.

File diff suppressed because it is too large Load Diff