TOPに戻る

CircuitPython 10行プログラミング Step5 (6) Raspberry Pi PicoのI2S出力

 audiobusioモジュールは、オーディオのディジタル入出力を扱います。S/PDIFは含まれておらず、出力はI2S、入力はPDMです。
 audiocoreモジュールは、メモリ内のデータ、wavデータを指定されたサンプリング周波数でaudioioもしくはaudiobusioモジュールの出力から音を出します。

 I2Sは、CDやディジタル配信で使われるデータを再生します。最初は、NXPのUDA1334Aを搭載したボードを使います。スイッチサイエンスでAdafruitの製品を取り扱っています。

UDA1334Aボードのおもな特徴

  • 動作電圧 3.3〜5V
  • フォーマット I2S(デフォルト)または16ビット、20ビット、または24ビットの左揃え
  • サンプリング周波数  16~100kHz
  • マスタ・クロックは入力なしでも可

接続

UDA1334Aボードの端子 Picoの端子(GPIO) 名称
Vin 3.3V 3V3(OUT)
Vo  -   -
GND GND GND
Wsel GP27 LRCK(LRSLK、WS)
Din GP28 Data
BCK GP26 BCK
SCLK   -  (MCLK)
FS0 3.3V 3V3(OUT)
MUTE   -   -
FS1 GND GND
PLL   -   -
DEEM   -   -

 I2Sのデータ・フォーマットには3種類があります。FS0、FS1の両方をGNDに落としたら「I2Sフォーマット」、上記の設定では「LSB-justified 16 bits input」になります。

sin波の出力プログラム

 sample_rateを8kHzから上げていくと音のデータはそのままなので、高音寄りになっていきます。sample_rateを96kHzにすると聞こえなくなったので、math.pi * 2をmath.pi * 20にすると、音の発生が確認できました。


import audiobusio
import audiocore
from board import *
import array
import time
import math

# Generate one period of sine wave.
length = 8000 // 440
sine_wave = array.array("H", [0] * length)
for i in range(length):
    sine_wave[i] = int(math.sin(math.pi * 2 * i / length) * (2 ** 15) + 2 ** 15)

sine_wave = audiocore.RawSample(sine_wave, sample_rate=8000)
i2s = audiobusio.I2SOut(GP26, GP27, GP28)
i2s.play(sine_wave, loop=True)
time.sleep(1)
i2s.stop()

 次は、TIのPCM5102Aを搭載したボードを使います。ebayで入手しました。

PCM5102Aボードのおもな特徴

  • 動作電圧 3.3〜5Vと思われる
  • フォーマット I2S(デフォルト)または16~32ビットの左揃え
  • サンプリング周波数  8~384kHz
  • マスタ・クロックは入力なしでも可

接続

PCM5102Aボードの端子 Picoの端子(GPIO) 名称
SCLK  - (MCLK)
BCK GP26 BCK
Din GP28 Data
LCK GP27 LRCK(LRSLK、WS)
GND GND GND
Vin 3.3V 3V3(OUT)
    -   -
FMT 3.3V 3V3(OUT)

 I2Sのデータ・フォーマットには3種類があります。FMT端子をGNDに落としたら「I2Sフォーマット」、FMT端子を3.3Vへつなぐと上記の設定の「LSB-justified input」になります。

sin波の出力プログラム

 sample_rateを上げていき、96kHzまで、音の発生を確認しました。


import audiobusio
import audiocore
from board import *
import array
import time
import math

# Generate one period of sine wave.
length = 8000 // 440
sine_wave = array.array("H", [0] * length)
for i in range(length):
    sine_wave[i] = int(math.sin(math.pi * 2 * i / length) * (2 ** 15) + 2 ** 15)

sine_wave = audiocore.RawSample(sine_wave, sample_rate=8000)
i2s = audiobusio.I2SOut(GP26, GP27, GP28)
i2s.play(sine_wave, loop=True)
time.sleep(1)
i2s.stop()

連載 CircuitPython 10行プログラミング Step5

(1) Raspberry Pi Picoの準備と動作確認

(2) Raspberry Pi Picoのdigitalio

(3) Raspberry Pi Picoのmicrocontroller

(4) Raspberry Pi Picoのアナログ入力

(5) Raspberry Pi PicoのPWM出力

(6) Raspberry Pi PicoのI2S出力

(7) Raspberry Pi PicoのI2C ① OLEDディスプレイ

(8) Raspberry Pi PicoのI2C ② 温湿度センサ

(9) Raspberry Pi PicoのI2C ③ 気圧センサ

(10) Raspberry Pi PicoのSPI ① TFTディスプレイ


連載 CircuitPython 10行プログラミング Step4

(1) Adafruit Feather nRF52840 Senseの準備 (2) Lチカ (3) 搭載センサ (4) BLE①ペリフェラル (5) BLE②セントラル


連載 CircuitPython 10行プログラミング Step3

(1) Metro M4 Express AirLift (WiFi)の準備 (2) ロータリ・エンコーダ (3) eInk/ePaper (4) Wi-Fi その1 接続 (5) Wi-Fi その2 ソケット (6) Wi-Fi その3 電圧測定 (7) 気圧センサLPS25HB (8) サーミスタ


連載 CircuitPython 10行プログラミング Step2

(1) Grand Central M4 Expressの準備 (2) グラフィック・ディスプレイOLED (3) RTC DS3231 (4) モジュール/SDメモリ (5) 複合センサ BME680 (6) ロードセル+ADS1220 (7) サーボ・モータ① (8) サーボ・モータ② (9) I2S UDA1334A (10) D-Aコンバータ


連載 CircuitPython 10行プログラミング

(1) Trinket M0の準備 (2) ディジタルI/O (3) アナログ入出力 (4) I2C 温湿度センサSi7021 (5) SPI 熱電対+MAX31855 (6) UART 距離センサTFMini (7) 1-Wire 温度DS18B20 (8) ロータリ・エンコーダ (9) 7セグメントLED (10) FANコントロール (11) UART GPS (12) I2C Lチカ MCP23017