クラス 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 = uasyncio.StreamWriter(audio_out)
swriter.write(buf)
await swriter.drain()
sreader = uasyncio.StreamReader(audio_in)
num_read = await sreader.readinto(buf)
コンストラクタ¶
-
class
machine.I2S(id, *, sck, ws, sd, mode, bits, format, rate, ibuf)¶ 指定の id で I2S オブジェクトを構築します:
idには I2S バスを識別するものを指定します。
idはボードやポートにより変わります:- PYBv1.0/v1.1: 1つの I2S バス id=2 があります。
- PYBD-SFxW: 2つの I2S バス、id=1 と id=2 があります。
- ESP32: 2つの I2S バス、id=0 と id=1 があります。
すべてのポートで次のキーワード引数をサポートしています:
sckにはシリアルクロックを結線するピンオブジェクトを指定しますwsにはワードセレクトを結線するピンオブジェクトを指定しますsdにはシリアルデータを結線するピンオブジェクトを指定しますmodeには受信(I2S.RX)または送信(I2S.TX)を指定します。bitsにはサンプルサイズ(ビット数)、16 または 32 を指定しますformatにはチャネルフォーマット、I2S.STEREO または I2S.MONO を指定しますrateにはオーディオサンプリングレート(サンプル/秒)を指定します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 変化します。