- キット各種完売。
- msBerryDAC改造情報
2023/08/03(木)64bit Raspberry Pi OSでターミナル動画再生サイネージ
「ラズパイでデジタルサイネージ的なもの作れない?」と依頼されたので構築したときのメモ。Xを入れずにコンソール(CUI)のみで作りましたが、結構手間取りました……。
※omxplayerは開発終了(deprecated)しているので使用しません。
概要
- Raspberry Pi OS 64bit Lite版(bullseye)
- GUI/Desktop(X Window System)不使用。
- WiFi接続。
- 起動後自動的に動画を再生する(rtspでもファイルでも)。
2021/12/24(金)ESP32 SDKのカスタムビルドを使った開発環境作り
BluetoothSerialのWindowsのCOMポート接続不良問題
※この問題は、Arduino IDEの「ESP32モジュール Ver2.0.5」、PlatformIOの「Espressif 32 Ver5.2.0」にて解決しました。
ESP32標準SDKのBluetoothには、WindowsのBluetooth 5.0以降のアダプタから接続したとき、うまく接続されない不具合があります。
BluetoothSerial(SerialBT)ですと、Windows側から接続を開始したときに
ASSERT_WARN(103 23), in lc_task.c at line 8775
というエラーが表示され、接続に失敗します。これを解決するために、SDKをリビルドし、リビルドした開発環境を構築することを目的とします。
2021/12/17(金)ESP32いじりメモ
2020/02/14(金)Raspberry Piで設定済システムをイメージ化する
Raspbian や Volumio などの設定済システムを、なるべく小さくディスクイメージ化するメモ。
お手軽に縮小する
# fdisk -l /dev/mmcblk0 Device Boot Start End Sectors Size Id Type /dev/mmcblk0p1 8192 532479 524288 256M c W95 FAT32 (LBA) /dev/mmcblk0p2 532480 15554559 15022080 7.2G 83 Linux
8GB SD に Raspbian を入れた場合こんんな感じになります。下のパーティションが root ファイルシステムです。これを縮小します。
オンラインだと面倒なので、Linuxマシンを別に用意し、そこにラズパイ用のSDを入れて編集します。
# e2fsck -f /dev/sdb2 # resize2fs -P /dev/sdb2 resize2fs 1.44.5 (15-Dec-2018) Estimated minimum size of the filesystem: 470543
ブロックサイズは4KBですので、470543ブロック×4KB=1.9GB程度まで縮小できることがわかりました。キリの良いところで2GBに縮小します。resize2fsでは限界まで縮小できないので、余裕を持って縮小後サイズを設定する必要はありません。
# resize2fs -p /dev/sdb2 2G resize2fs 1.44.5 (15-Dec-2018) Resizing the filesystem on /dev/sdd2 to 524288 (4k) blocks. The filesystem on /dev/sdd2 is now 524288 (4k) blocks long.
resize2fs は 1.5G といった指定はできません。1536Mと指定する必要があります。
ファイルシステムを縮小したらパーティションを縮小します。fdiskでパーティションを削除してから、スタートブロックを揃えてパーティションを再生成します。
# fdisk /dev/sdd Command (m for help): d Partition number (1,2, default 2): 2 Command (m for help): n Select (default p): p Partition number (2-4, default 2): 2 First sector (2048-15554559, default 2048): 532480 Last sector, +/-sectors or +/-size{K,M,G,T,P}: +2G Created a new partition 2 of type 'Linux' and of size 2 GiB. Partition #2 contains a ext4 signature. Do you want to remove the signature? [Y]es/[N]o: n Command (m for help): p Device Boot Start End Sectors Size Id Type /dev/sdd1 8192 532479 524288 256M c W95 FAT32 (LBA) /dev/sdd2 532480 4726783 4194304 2G 83 Linux
1セクタは512byteですので、「512×4194304 = 2147483648」と resize2fs の結果「524288×4096 = 2147483648」が等しいことを確認します。確認して問題なければ、最後に書き込んで終了です。
Command (m for help): w
これで縮小されたシステムがSDに構築されました。
ddでイメージ化
最後にこのSDイメージ化すれば完成です。このときは、2つめのパーティションのEndの値「4726783」に注目します。先頭からこのセクタまで保存すれば良いので、「(4726783+1)×512 = 2308MB」を保存します。
dd if=/dev/sdd of=./img.file bs=1M count=2308 status=progress
これでイメージが完成しました。
問題点
お手軽で良いのですが、ひとつ問題点がありまして、この手順では極限まで小さくしたイメージを作ることができません。出来上がったらイメージからRaspberry Piを起動するとこうなります。
$ df -h Filesystem Size Used Avail Use% Mounted on /dev/root 2.0G 1.3G 644M 66% / /dev/mmcblk0p1 253M 52M 201M 21% /boot
このように800MBほど空いている領域があるわけです。またパーティションのスタートブロックも、8192から2048に減らすことで容量を削減できます。
限界まで縮小したイメージを作成する。
- パーティション1のファイルをどこかにコピーしておく。
- パーティション2の内容をどこかに「cp -rp」でコピーしておく。
- fdiskで表示される「Disk identifier:」の値をメモしておく。*1
- fdiskで現存するパーティションを削除する。
- dosパーティション(パーティションタイプ"C"。100MB程度)とLinuxパーティションを作成する。このときのサイズは、「Used」のサイズ(コピーしたファイル全体のサイズ)を参考にする。
- 新しいディスクにコピーする場合、またはディスクを一度初期化した場合は、fdiskでDOSパーティションテーブルを作成し「Disk identifier」の値を書き換えます。fdiskで「x」「i」と入力したあと、3でメモした値を入力します。
- ファイルシステムを作成する*2。
mkdosfs -F32 -nBOOT /dev/sdd1 mkfs -t ext4 /dev/sdd2
「-nBOOT」はディスクラベルをBOOTにする設定です。DOS領域(vfat)のラベル名をBOOTにしないとラズパイが起動しません。後から変更する場合は、dosfslabelコマンドを使用します。
dosfslabel /dev/sdd1 BOOT
- 作成したパーティションをマウントしてファイルを書き戻す。ext4領域は必ず「cp -rp」でコピーする。
これで作業完了です。SDラズパイに挿入して起動することを確認します。問題なければ、上と同様の手順でイメージ化します。
注意点
DOS領域のディスクラベルを「BOOT」にすることと、「Disk identifier」の値を保つことです。
fstabやカーネル起動オプションでは「PARTUUID」によってデバイスを指定しています。PARTUUIDはファイルシステムのUUIDではなく、パーティションにつけられたUUIDです。DOSパーティションテーブル(MBR)には存在せず、gptパーティションテーブルが持つものです。
DOSパーティションにはPARTUUIDの概念はないのですが、「(Disk identifier)-(パーティション番号)」をPARTUUIDの代わりとして使用するようになっています。ですから「Disk identifier」を維持する必要があります。
パーティション領域の自動拡張
/boot領域(Windowsから見える領域)の「cmdline.txt」に「init=/usr/lib/raspi-config/init_resize.sh」をつけることで、初回起動時のパーティションの拡張を実行できます。
しかしこれだけだと、パーティションは拡張されますが、ファイルシステムは未拡張のままです。ファイルシステムの拡張は /etc/init.d/resize2fs_once というファイルで行われています。
#!/bin/sh ### BEGIN INIT INFO # Provides: resize2fs_once # Required-Start: # Required-Stop: # Default-Start: 3 # Default-Stop: # Short-Description: Resize the root filesystem to fill partition # Description: ### END INIT INFO . /lib/lsb/init-functions case "$1" in start) log_daemon_msg "Starting resize2fs_once" ROOT_DEV=$(findmnt / -o source -n) && resize2fs $ROOT_DEV && update-rc.d resize2fs_once remove && rm /etc/init.d/resize2fs_once && log_end_msg $? ;; *) echo "Usage: $0 start" >&2 exit 3 ;; esac
このファイルを作成し、実行権限をつけます。そして /etc/rc3.d/S01resize2fs_once からリンクを貼ります。
vi /etc/init.d/resize2fs_once chmod +x /etc/init.d/resize2fs_once cd /etc/rc3.d/ ln -s ../init.d/resize2fs_once S01resize2fs_once
これで初回起動時のパーティション&ファイルシステム自動拡張が有効になります。
Raspbian初回インストールメモ
/bootは、SDをWindowsから開いたときに見える中身と同一。
- /boot に ssh ファイルを置くと、sshサービスを有効化できる。
- /boot に以下のような wpa_supplicant.conf を置くと、自動で /etc/wpa_supplicant/wpa_supplicant.conf にファイルを移動してくれる(コピーではなく強制移動)。これにより無線LANに接続できる。
- 複数のネットワークに接続する場合は、networkを複数記述すれば良い。
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 country=JP network={ ssid="SSID" psk="PASSWORD" }
mjpg-streamerインストールメモ
apt-get install git cmake libjpeg-dev imagemagick git clone https://github.com/jacksonliam/mjpg-streamer.git cd mjpg-streamer/mjpg-streamer-experimental make sudo make install mjpg_streamer -o "output_http.so -w ./www" -i "input_raspicam.so -fps 60"
2017/10/08(日)Volumio2を入れてみた
さていつものラズパイ用DACですが、最新のVolumio2をちょっと入れて試してみました。
使い続けた Volumio Ver1
昔(といっても2年ぐらい前)は、オーディオ用ディストリビューションと言ってもVolumioぐらいしか認知されてなくて、事実上他に選択肢はありませんでした。
まあ色々と使いにくい点もあったのですが、カスタマイズして使っているうちにちょうどよくなってそのまま使い続けたという。
他のディストリビューションはどうにも肌に合わず、当時Volumio2のβ版は使い勝手が悪くて結局そのままという状況でしたので、一念発起して使ってみることにしました。*1
入れてみるとさすがに完成度が高く、これなら完全に乗り換えても良いですね。
外部クロック動作の確認
msBerryDACはHiFiBerry DAC+ PRO互換ですが、このPRO付きとPROなしはドライバが共通になっています。
HiFiBerry DAC+ | 外部クロックなし |
HiFiBerry DAC+ PRO | 外部クロックあり |
この判別はドライバ側で行っていて、音が鳴っていても外部クロックが正しく使われているかはソフトからでは分かりません。ドライバ側で認識方法が狂っていたりすると、外部クロックが使われずに音が再生されたり、狂ったクロック(速度)で音が再生されてしまいます。
これを確実に確認するには、発振器(やクロック)の端子にテスター等を当ててクロックがきちんと動作しているか確認するしかありません。
というわけで、最新のVolumio2で外部クロックの動作を確認しました。ついでに分かったことですが、リサンプリングをオフにしておいても、リサンプルされて48k系列のクロックで再生されているようです。
384KHz/32bit再生の確認
β版当時には存在しなかったアップサンプリングを設定して、384KHz/32bitで再生できているのか確認しました。
まずは96KHz/32bit再生から。
BCLK(ビットクロック)端子を観測しています。BCLKとは音楽データを1bit送るためのクロック信号です。96KHz/32bit再生では、
96KHz × 32bit × 2ch(L/R) = 6.144Mbit/sec
つまり 6.144MHz のBCLKが必要になります。オシロの観測画像を見ると6.144MHzの信号が出ているので、きちんと96KHz/32bitで動作していることが分かります。
続いて192KHz/32bit。
192KHz × 32bit × 2ch(L/R) = 12.288Mbit/sec
そして384KHz/32bit。
192KHz × 32bit × 2ch(L/R) = 24.576Mbit/sec
ということで、24.576MHzのBCLKが出ています。
Volumio Ver1では、msBerryDACで384再生はソフトに手を入れない限り無理だったので確認していなかったのですが、Volumio2により無事384KHz/32bit再生されていることを確認できました。
768KHz/32bitを設定したら……
Volumio2のアップサンプリングって「768KHz再生」も設定できるのです。興味そそられますよね!
もちろん試して見しまたが、無理でした(笑)。設定自体はできるし、その状態で再生もできるのですが、768KHzに設定してもBCLK=24.576MHzだったので384/32で再生されてるだけでした。
よく考えたら、載ってるクロックが24.576MHzなのでこれ以上のBCLKはどうやっても無理に決まってた(笑)*2
ssh有効化(メモ)
- http://volumio/dev/ にアクセス。
まとめ
- Volumio2は今では成熟して十分使いやすい(Ver1を使う必要はなくなった)
- ジャケット画像を勝手に拾ってくるのはなにげに便利。
- msBerryDACで384KHz/32bit再生をハードウェア的に確認した。
ちなみに、波形が鈍っているのはプローブの設定間違えたせい……。