クラス I2S -- IC間サウンド(Inter-IC Sound)バスプロトコル¶
I2S は、デジタルオーディオデバイスの接続に使う同期シリアルプロトコルです。物理レベルで、バスは SCK, WS, SD の3つの回線で構成されます。I2S クラスはコントローラ操作をサポートします。ペリフェラル操作はサポートしません。
I2S クラスは現在、テクニカルプレビューとして利用できます。プレビュー期間中は、ユーザーからのフィードバックを歓迎します。このフィードバックに基づいて、I2S クラス API と実装が変更される可能性があります。
I2S オブジェクトは、次に示すようにして作成および初期化します:
from machine import I2S
from machine import Pin
# ESP32 の場合
sck_pin = Pin(14) # シリアルクロック出力
ws_pin = Pin(13) # ワードクロック出力
sd_pin = Pin(12) # シリアルデータ出力
または
# PyBoard の場合
sck_pin = Pin("Y6") # シリアルクロック出力
ws_pin = Pin("Y5") # ワードクロック出力
sd_pin = Pin("Y8") # シリアルデータ出力
audio_out = I2S(2,
sck=sck_pin, ws=ws_pin, sd=sd_pin,
mode=I2S.TX,
bits=16,
format=I2S.MONO,
rate=44100,
ibuf=20000)
audio_in = I2S(2,
sck=sck_pin, ws=ws_pin, sd=sd_pin,
mode=I2S.RX,
bits=32,
format=I2S.STEREO,
rate=22050,
ibuf=20000)
- 次の3種類の操作モードをサポートしています
ブロッキング
ノンブロッキング
非同期 I/O
ブロッキング:
num_written = audio_out.write(buf) # buf から書き出すのが終わるまでブロック
num_read = audio_in.readinto(buf) # buf への読み込むのが終わるまでブロック
ノンブロッキング:
audio_out.irq(i2s_callback) # i2s_callback is called when buf is emptied
num_written = audio_out.write(buf) # returns immediately
audio_in.irq(i2s_callback) # i2s_callback is called when buf is filled
num_read = audio_in.readinto(buf) # returns immediately
非同期 I/O
swriter = asyncio.StreamWriter(audio_out)
swriter.write(buf)
await swriter.drain()
sreader = asyncio.StreamReader(audio_in)
num_read = await sreader.readinto(buf)
WM8960 や SGTL5000 など一部のコーデックデバイスは、I2S クラスで動作させる前に別途初期化を必要とします。これらのコーデックデバイスについては別途ドライバが提供されており、音量や音声処理などを制御する方法も提供されています。これらのドライバについては以下を参照してください。
コンストラクタ¶
- class machine.I2S(id, *, sck, ws, sd, mck=None, mode, bits, format, rate, ibuf)¶
指定の id で I2S オブジェクトを構築します:
id
には I2S バスを識別するものを指定します。指定する値はボードやポートに依存します
すべてのポートで次のキーワード引数をサポートしています:
sck
にはシリアルクロックを結線するピンオブジェクトを指定しますws
にはワードセレクトを結線するピンオブジェクトを指定しますsd
にはシリアルデータを結線するピンオブジェクトを指定しますmck
はマスタークロックラインのピンオブジェクトです。マスタークロックの周波数はサンプリングレート* 256 です。mode
には受信(I2S.RX)または送信(I2S.TX)を指定します。bits
にはサンプルサイズ(ビット数)、16 または 32 を指定しますformat
にはチャネルフォーマット、I2S.STEREO または I2S.MONO を指定しますrate
にはオーディオサンプリングレート(Hz)を指定します。これはws
信号の周波数ですibuf
には内部バッファ長(バイト数)を指定します
すべてのポートで、DMA がバックグラウンドで継続的に実行され、サンプルデータが内部バッファと I2S ペリフェラルユニット間で転送されている間、ユーザーアプリケーションが他の操作を実行できるようにします。内部バッファのサイズを大きくすると、ユーザーアプリケーションがアンダーフロー(
write
メソッドなど)またはオーバーフロー(readinto
メソッドなど)の前に非 I2S 操作を実行できる時間が長くなる可能性があります。
メソッド¶
- I2S.init(sck, ...)¶
引数の説明についてはコンストラクターを参照してください
- I2S.deinit()¶
I2S バスを非初期化します
- I2S.readinto(buf)¶
buf
に指定したバッファにオーディオサンプルを読み込みます。buf
は bytearray や array のようなバッファプロトコルをサポートする必要があります。 "buf" のバイトオーダはリトルエンディアンです。ステレオフォーマットの場合、左チャンネルのサンプルが右チャンネルのサンプルよりも優先されます。モノラルフォーマットの場合、左チャンネルのサンプルデータが使われます。戻り値は読み込んだバイト数です
- I2S.write(buf)¶
buf
に含まれるオーディオサンプルを書き出します。buf
は bytearray や array のようなバッファプロトコルをサポートする必要があります。 "buf" のバイトオーダはリトルエンディアンです。ステレオフォーマットの場合、左チャンネルのサンプルが右チャンネルのサンプルよりも優先されます。モノラルフォーマットの場合、左チャンネルのサンプルデータが使われます。戻り値は書き出したバイト数です
- I2S.irq(handler)¶
コールバックを設定します。
handler
に指定したコールバック関数は、write
メソッドで buf の書き出しが完了したとき、またはreadinto
メソッドで読み込みが完了したときに呼び出されます。コールバックを設定すると、write
とreadinto
メソッドはノンブロッキング操作に変更されます。handler
は MicroPython のスケジューラのコンテキストで呼び出されます。
- static I2S.shift(*, buf, bits, shift)¶
buf
に含まれるすべてのサンプルのビット単位のシフトを行います。bits
にはサンプルサイズをビット単位で指定します。shift
には各サンプルをシフトするビット数を指定します。左シフトの場合は正、右シフトの場合は負の整数を指定します。これは通常はボリュームコントロールに使います。各ビットシフトにより、サンプルボリュームが 6dB 変化します。
定数¶
- I2S.RX¶
I2S バス初期化時に
mode
を受信にするためのものです
- I2S.TX¶
I2S バス初期化時に
mode
を送信にするためのものです
- I2S.STEREO¶
I2S バス初期化時に
format
をステレオにするためのものです
- I2S.MONO¶
I2S バス初期化時に
format
をモノラルにするためのものです