Myu
2026年3月15日日曜日
ESP32にスピーカとマイクをつけて実験
短い音の録音再生(エコー)が可能か実験してみた。今後、raspi経由でいろいろ処理を予定していますが。
配線の数が多いときは、意外とエナメル線が使いやすい。裏表に通したりしてなるべく干渉しないようにした。PCB等の発注も考えたけれど、配線の変更の可能性もあるし、それなりの料金はかかるので、最小限のユニバーサル基板にしてみた。モジュールが基板からはみ出しているところは、あとでサイズがあいそうな百均のケースに固定できないか、考えたい。
/* esp32c3+INMP441+0802A_LCD+MAX98357A******** INMP441: SD-GPIO6 L/R-Ground WS-GPIO5 SCK-GPIO4 MAX98357A: DIN-GPIO7 DBCLK-GPIO4 LRC-GPIO5 0802A: RS-GPIO0 E-GPIO1 D4-GPIO2 D5-GPIO3 D6-GPIO8 D7-GPIO9 */ #include
#include
#include
#define I2S_BCLK 4 #define I2S_LRC 5 #define I2S_DIN 6 #define I2S_DOUT 7 #define SAMPLE_RATE 16000 #define BUFFER_SIZE 256 #define RECORD_SECONDS 3 LiquidCrystal lcd(0,1,2,3,8,9); int32_t micBuffer[BUFFER_SIZE]; int16_t spkBuffer[BUFFER_SIZE]; int16_t audioBuffer[SAMPLE_RATE * RECORD_SECONDS]; bool recording=false; int recIndex=0; unsigned long lastSound=0; void setup(){ Serial.begin(115200); lcd.begin(8,2); lcd.print("READY"); i2s_config_t i2s_config = { .mode=(i2s_mode_t)(I2S_MODE_MASTER|I2S_MODE_RX|I2S_MODE_TX), .sample_rate=SAMPLE_RATE, .bits_per_sample=I2S_BITS_PER_SAMPLE_32BIT, .channel_format=I2S_CHANNEL_FMT_ONLY_LEFT, .communication_format=I2S_COMM_FORMAT_STAND_I2S, .intr_alloc_flags=0, .dma_buf_count=8, .dma_buf_len=256 }; i2s_pin_config_t pin_config = { .bck_io_num=I2S_BCLK, .ws_io_num=I2S_LRC, .data_out_num=I2S_DOUT, .data_in_num=I2S_DIN }; i2s_driver_install(I2S_NUM_0,&i2s_config,0,NULL); i2s_set_pin(I2S_NUM_0,&pin_config); i2s_set_clk(I2S_NUM_0,16000,I2S_BITS_PER_SAMPLE_32BIT,I2S_CHANNEL_MONO); } void loop(){ size_t bytesRead; i2s_read(I2S_NUM_0,micBuffer,sizeof(micBuffer),&bytesRead,portMAX_DELAY); int samples=bytesRead/4; int32_t energy=0; for(int i=0;i
>14; energy+=s*s; spkBuffer[i]=s; if(recording){ audioBuffer[recIndex++]=s; } } energy/=samples; if(!recording && energy>200000){ recording=true; recIndex=0; lastSound=millis(); lcd.clear(); lcd.print("REC"); lcd.setCursor(0,1); lcd.print("START"); } if(recording){ if(energy>200000){ lastSound=millis(); } if(millis()-lastSound>2000){ recording=false; lcd.clear(); lcd.print("SAVING"); delay(500); playAudio(); lcd.clear(); lcd.print("READY"); } } } void playAudio(){ lcd.clear(); lcd.print("PLAYING"); size_t written; for(int i=0;i
0 件のコメント:
コメントを投稿
前の投稿
ホーム
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿