😸

【Raspberry Pi Pico W】I2Sの使い方(micropython×Thonny)

2025/01/18に公開

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
https://en.wikipedia.org/wiki/I²S

ちなみに信号線の名称はメーカやデータシートによって異なっている
表形式でまとめると、こんな感じ

必須 名称 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のサンプルを使用させていただきました
https://github.com/miketeachman/micropython-i2s-examples

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