RaspbianからI2Sを行う方法については記事が見つかりますが、Ubuntu MATEを使ったものは見当たらなかったのでまとめました。
目標
Raspberry Pi 3 model BにUbuntu MATEを入れ、デジタルマイクSPH0645LM4HとI2S通信する。
インストール手順
-
公式ページ(https://ubuntu-mate.org/download/ )からUbuntu MATEをダウンロードし、Raspberry Pi 3 model Bに書き込む。今回使用したのは、ubuntu-mate-18.04.2-beta1-desktop-armhf+raspi-ext4.img。
-
/boot/config.txtに以下を追加で書き込む。
dtparam=i2s=on
- /etc/modulesに以下を追加で書き込む。
snd-bcm2835
- リブートする。
sudo reboot
- snd_bcm2835などのモジュールがロードされていることを確認。
lsmod | grep snd # snd_bcm2835 などが表示されるはず。
- linux imageのアップデートおよびlinux headerのインストール。
sudo apt update
sudo apt install linux-image-raspi2 # 今回インストールしたバージョン:linux-image-raspi2/bionic-updates,bionic-security,now 4.15.0.1041.39 armhf
sudo apt install linux-headers-raspi2 # 今回インストールしたバージョン:linux-headers-raspi2/bionic-updates,bionic-security,now 4.15.0.1041.39 armhf
- リブートする。
sudo reboot
- i2sをコンパイルする準備ができていることを確認。
sudo mount -t debugfs debugs /sys/kernel/debug # mount: debugs already mounted or mount point busy. などと表示されるはず。
- カーネルモジュールをmakeするためのパッケージをインストール。
git clone https://github.com/PaulCreaser/rpi-i2s-audio
cd rpi-i2s-audio
- カーネルモジュールをmakeして作成し、カーネル本体にロードする。
sudo apt install make gcc git bc libncurses5-dev bison flex libssl-dev
make -C /lib/modules/$(uname -r )/build M=$(pwd) modules
sudo insmod my_loader.ko
- audioグループに自分のユーザを追加する。
sudo adduser $USER audio
-
ユーザの追加を反映させるため、ログアウトしてログインする。
-
Raspberry Piをブートするたびに、今回作成したカーネルモジュールを自動でロードできるようにする。
cd rpi-i2s-audio
sudo cp my_loader.ko /lib/modules/$(uname -r)
echo 'my_loader' | sudo tee --append /etc/modules > /dev/null # 先ほど書いたsnd-bcm2835と改行されて書かれているか確認する。
sudo depmod -a
sudo modprobe my_loader
- リブートして設定完了。
sudo reboot
- SPH0645LM4HとRaspberry Piを配線でつなぐ。ピン接続は以下のようにする。
SPH0645LM4H | Raspberry Pi |
---|---|
3V | pin1 (3.3V) |
GND | pin6 (GND) |
BCLK | pin12 (PCM_CLK) |
DOUT | pin38 (PCM_DIN) |
LRCL | pin35 (PCM_FS) |
SEL | Not connected |
テスト
・マイクデバイスの一覧を表示し、「snd_rpi_simple_card」があることを確認。
arecord -l
・arecordというコマンドから音声を保存する。ノートPCなどで再生できればテスト成功!
arecord -D plughw:1 -c2 -r 48000 -f S32_LE -t wav -V stereo -v file_stereo.wav
・pyaudioからも読める。
import pyaudio
p = pyaudio.PyAudio()
for index in range(p.get_device_count()):
print(p.get_device_info_by_index(index)['name'])
print('')
参考
- https://tomosoft.jp/design/?p=11471
- https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout/raspberry-pi-wiring-and-test
(これらのサイトの環境はRaspbianだが自分の環境はUbuntu MATEなので、細かい違いがある)