😸
【Raspberry Pi Pico W】I2Sの使い方(micropython×Thonny)
1. はじめに
1.1 この記事について
- Raspberry Pi Pico W(以下、Pico)のI2Sを使ったサンプルプログラムを記載する
- 細かい解説というより、備忘録とプログラム+回路図のサンプル重視
- 入門・解説というより備忘録に近い
1.2 対象読者
- Picoを使ったことがある
- Thonnyを使ってPicoにプログラムを書き込み・実行ができる
- プログラム言語(特にmicropython)が多少読める、書ける
1.3 動作環境
- PC
- OS:Windows 11 Home
- プログラミング環境:Thonny(v4.1.4)
- Raspberry Pi Pico W
- ファームウェア:v1.24
2. I2Sについて
- I2S(Inter-IC Sound)とは、IC間で2チャンネルのデジタルオーディオデータをシリアル転送するための規格
- 主に以下の3本の信号線を使用して通信を行う
- WS(Word Select)・・・音声信号の左右(L/R)を区別するための信号(0=Left, 1=Right)
- SCL(Serial Clock)・・・シリアルクロック
- SD(Serial Data)・・・デジタル化された音声データのビット列を送信する線
3本の信号線の役割は、以下の図が分かりやすいです
参考:I²S - Wikipedia
ちなみに信号線の名称はメーカやデータシートによって異なっている
表形式でまとめると、こんな感じ
必須 | 名称 | Head |
---|---|---|
〇 | SCK(Serial Clock), BCLK(Bit Clock) | クロック信号 |
〇 | WS(Word Select), LRCLK(LR Clock) | 音声信号の左右(L/R)を区別するための信号 |
〇 | SD(Serial Data) | デジタル化された音声データのビット列を送信する線 |
MCLK(Master Clock), SYSCLK(System Clock) | デジタル信号の動作基準となるクロック信号 |
ちなみに
今回購入したI2Sのマイクとスピーカーアンプの場合
- (左)マイク:INMP441 → (WS, SCK, SD)
- (右)スピーカーアンプ:MAX98357A → (LRC, BCLK, SD)
う~ん、バラバラだね☆
3. 実験
I2Sのmicropythonのコードは、以下のgithubのサンプルを使用させていただきました
3.1 INMF441(マイク)で録音
サンプルコードは「record_mic_to_sdcard_blocking.py」
デフォルトではOSErrorが発生したので、sd.init_SPI()の引数の値を変更しております
(私の所持しているmicroSD card Adapter側の問題かと推測)
別途「sdcard.py」も使用するため、一緒に書き込んでおいてください
3.1.1 回路図+配線図(Fritzing)
もうブレッドボードないほうが見やすいので、なくしました
3.1.2 実際の画像
- 正常に動いていれば、「=== START RECORDING ===」の文字が表示されてから、10秒間録音されます
- 録音したデータはmicroSDカードに「mic.wav」として保存されます
開始0.35sec程度は安定しないようです
3.1.3 プログラム
私のmicroSDcard Adapterだと、77行目(sd.init_spi())にて、OSErrorが発生してしまいました
24_000_000未満の値だと正常に録音できました。
3.2 MAX98357A(DAC)でwavファイルを再生
MAX98357A(とスピーカー)を使って、wavファイルを再生してみます
事前に、リポジトリのwavフォルダにある「music-16k-16bits-mono.wav」をmicroSDカードに書き込んでおきます
3.2.1 回路図+配線図(Fritzing)
3.2.2 実際の画像
無事にwavファイルを再生することができました
3.2.3 プログラム
「play_wav_from_flash_blocking.py」「sdcard.py」を使用しました
4. まとめ
- I2Sを使った録音、wavファイルの再生をしてみた
- これで録音したデータをWi-Fi経由でAPIなどに投げれば、picoでもいろいろできそうな気がします
- I2Sの仕様をより深く理解するために、もう少しINMP441とMAX98357Aのデータシートを読み込みたい
Discussion