下記サイトを参考にしてPCM5102A I2S DACによるサイン波を出力しました。
接続
ESP32 PCM5102
GP25 ー DIN
GP26 ー LCK
GP27 ー BCK
3.3V ー VIN
GND ー GND
32ビットPCM5102 DAC波形
![]() |
| CH1-L CH2-R |
参考サイト
●YouTube-よみやチャネル
高性能DAC PCM5102をESP32で使ってみる
●ESP-IDFプログラミングガイド
●ESP32でサウンドを作る – I2Sプロトコル
●ESP32のI2Sを使ったDAC出力研究
Esp32-devkitc-32e 開発ボード
●Esp32-devkitc-32e 開発ボード
※アマゾンの写真には技適マークがありますが、送られた製品は技適マーク無し(証明書無)
PCM5102A - 32ビットDAC
【H1L】(FLT) L側 ブリッジ
【H2L】(DEMP) L側 ブリッジ
【H3L】(XSMT) H側 ブリッジ
【H4L】(FMT) L側 ブリッジ
シリアルプロッタ
![]() |
| E9 (10の9乗) 青=L 赤=R |
10進符号付き整数
-2,147,483,648 ~ 2,147,483,647
ボードマネージャ
追加ボードマネージャーURLを変更
【https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json】
【esp 32】
【バージョン3.2.0】インストール
ライブラリマネージャー
●ESP32-audioI2S-master
所定のlibrariesに貼付
【i2s】
【バージョン3.2.1】インストール
ESP-IDFプログラミングガイド
ESPRESSIF バージョン3.3
プログラム Arduino IDE【ボード:ESP32 Dev Module】
#include <driver/i2s.h>
#define I2S_SAMPLE_RATE 44100
#define I2S_BUFFER_COUNT 4
#define I2S_BUFFER_SIZE 512
#define SOUND_BUFFER_SIZE 512
uint8_t sound_buffer[SOUND_BUFFER_SIZE];
// I2S 構成パラメータ指定
const i2s_port_t i2s_port = I2S_NUM_0;
const i2s_config_t i2s_config = {
.mode = (i2s_mode_t) (I2S_MODE_MASTER | I2S_MODE_TX),
.sample_rate = I2S_SAMPLE_RATE, //サンプルレート
.bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT, //32bit
.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,//ステレオ モノONLY_RIGHT
.communication_format = I2S_COMM_FORMAT_I2S, //通信方式I2S
.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, //割込みレベル1
.dma_buf_count = I2S_BUFFER_COUNT, //I2S DMAバッファ数
.dma_buf_len = I2S_BUFFER_SIZE, //I2S DMAバッファ長
.use_apll = false
};
// I2S ピン番号指定
const i2s_pin_config_t pin_config = {
.bck_io_num = 27, //BCK PCM5102
.ws_io_num = 26, //LCK
.data_out_num = 25, //DIN
.data_in_num = I2S_PIN_NO_CHANGE,
};
void setup() {
i2s_driver_install(i2s_port, &i2s_config, 0, NULL); //I2S 構成パラメータ指定
i2s_set_pin(i2s_port, &pin_config); //I2S ピン番号指定
Serial.begin(115200);
}
void loop(){
size_t transBytes = SOUND_BUFFER_SIZE;
for(uint32_t i=0; i<transBytes; i=i+8){
int32_t L_data = sin(2.0*PI*i/SOUND_BUFFER_SIZE)*32767*65536; //7fff*10000
int32_t R_data = sin(4.0*PI*i/SOUND_BUFFER_SIZE)*32767*65536;
*((int32_t *)(sound_buffer + i )) = L_data;
*((int32_t *)(sound_buffer + i+4)) = R_data;
Serial.println(L_data); //シリアルプロッタ
//Serial.println(R_data);
}
i2s_write(i2s_port,(char*)sound_buffer, I2S_BUFFER_SIZE, &transBytes, portMAX_DELAY);
}
.png)
.png)
.png)
.png)
.png)
0 件のコメント:
コメントを投稿