ラズベリーパイ - RasPi ▲factory top


基本構成を考える 2022 Jan 4-7

ラズパイを使って、生活周辺をコントロールしたり、 インターネットラジオ など ライフオーディオ の音源にしたいと考えました。 それらに必要な要素を集めると以下のような構成となります。

ACコネクタ → Left side panel 電源基板(ピンにより給電)
電源SW
ラズパイ基板 シリアルバッファ基板
シリアル出力コネクタ
DAC基板
音量ボリューム、入力切換えSW
Right side panel ← Line in アナログピンジャック
→ Line out アナログピンジャック
  ↓
  シリアルケーブル (USB Type-C コード)

ラズパイの電源は入れっぱなしを想定。 Line in(アナログテープ等)も頻繁には聞かないので入力切換えもあまりしない。 ボリューム操作は主にソフトで行う。 すなわち、手動操作のSWやボリュームがあっても基本的に触らないので、 それらをソフトウェア制御する手間は考えないことにします。

 

ネット上の情報を参考にラズパイの設定 2022 Jan 9-12

Raspberry Pi OS (32-bit) 2021-10-30 を用意します
  • Raspberry Pi OS より、Windows PC に Raspberry Pi Imager をインストール
  • microSD カードを Erase(Format)し、OS を選択しカードへ書き込む
  • そのカードをラズパイにさし Keyboard, Diaplay 等を接続し通電する
OSの初期設定をします
  • 起動したラズパイの初期設定画面に従うと、 あっという間に Linux OS が動作しました
    その昔 UNIXマシンを使っていてマシン更新の度に 設定に1日かかっていたことを思うと隔世の感です
  • user=pi, pw=**** を設定します、 ラズパイは初期状態で root pw が未設定とのことで
    $ sudo passwd root にて password を設定すると
    $ su root 出来るようになります
virtual network computing 接続を行います
  • Download VNC Viewer より Windows PC に VNC viewer をインストールします
    この接続により Windows PC 側のディスプレイやキーボードで ラズパイが操作できるようになります
  • ラズパイ側の設定
    ラズパイのスタートアイコン→設定→Raspberry Piの設定、より、 インターフェースタブの VNC を有効にします、 また画面右上のVNCアイコンより ip adr - 192.168.1.10(本機の場合)を得ます (アドレスが変わった時は HDMI と USBマウスの接続が必要になる)
  • Windows PC 側の設定
    viwer にて ip adr, user=pi, pw を入力します
  • その後 Raspberry Pi OS (32-bit) 2022-01-28 に更新あり
    この更新でVNC画面サイズが Raspberry Pi の設定で (1600x1200等)指定出来るようになりました

 

(左)食卓で USBキーボード、USBマウス、食卓テレビ(HDMI)をつなぎ 初期設定を行います
(右)VNC接続後は キーボードやディプレイなしでOK、アナログ出力から internet radio が聞けました
VNC接続で Windows PC側にラズパイの Desktop 画面が表示され操作出来ます
表示と操作だけがリモートで、インターネットラジオの音はラズパイ側から出ます

左右のサイドパネル 2022 Jan 17

アクリル製の左右のサイドパネルは アクリル屋 セミオーダー から発注しました。
アクリル見本 なども参考になります。

  • 注意点、サイズ等
  • ラズパイ基板はトップ側に SDcard が 2mm はみ出す
  • ラズパイ基板はボトム側に USBコネクタが 3mm はみ出す、 さらに将来 USB マイクを装着予定
  • アクリル屋の加工制約で ACメガネコネクタ取付穴に手作業が発生
  • H:105mm、W:59mm、D:3mm、color:ホワイト、端面:磨き仕上
    加工費含めコスト 左:\4565-、右:\2638-

左パネル:基板取付け穴4 + ACメガネコネクタ穴1(両サイドに手作業で楕円拡張した)
右パネル:基板取付け穴4 + ピンジャック穴4 ピンジャックと基板への接続コネクタを取り付けます

 

電源基板 2022 Jan 13, 24

  • AC-DC コンバータ
  • ドイツメーカー Recom Power の AC100V -> 5V 4A (20W) RAC20-05SK/ 277
  • 1次側ラインフィルター内蔵
  • ラズパイは常時通電予定なので気休めですが1次側にヒューズを入れておきます
  • 将来 液晶パネルを装着予定なのでその電源用に出力ピンを2組用意

左パネルに取り付けた電源基板(クリックで拡大) その上にラズパイ基板をスタック(クリックで拡大)

なんと、ラズパイ基板の取付穴がΦ3.2ではなくΦ3.0のようで Φ3mmのネジが通らない!ユニバーサル基板の取付穴も同じ。 しかし、どちらも薄い基板なので Φ3.2のドリルの歯を手持ちで回し簡単に拡張出来ました。

 

シリアルバッファ基板 2022 Jan 14, 24-28

制御したい周辺機器はいろいろありますが、 それぞれに(パラレルで)制御線を出すとタコ足になってしまうので、 シリアル接続で制御することにします。

シリアル制御と言えば、まず I2C が思いつき、ラズパイもI2C専用端子を持っています。 しかし、I2Cのスレーブ側を汎用ロジックで作るとなるとそれなりに煩雑です。 I2Cプロトコルはソフト(マイコン)を前提としたような、 あるいは専用IC(IP)と組み合わせて使うような感じですね。

さらにUSB接続という案もありますが、UBSも本機には機能過剰です。 ただし、シリアル接続のコードとしては USB Type-C のコードを流用します。 コネクタ付きで大量に安価に出回っていて使わない手はないです。

さて、そんなわけで、 受け側のハードウェアが最も簡単になる独自プロトコルとして考えます。 ワードパケットにアドレスとコマンドを入れ、 最終に到達するアドレスの最上位ビットを拡張ビットとすることで ワード長拡張性を持たせます。 尚、この基板は、ラズパイのI2C機能とは独立していて干渉はありません。

  • GPIOポート割当て
  • 11pin GPIO17 を SDA とし USB Type-C D+ へ
    13pin GPIO27 を SCK とし USB Type-C D- へ
    15pin GPIO22 を WCK とし USB Type-C Configuration Channel(CC)1, 2 へ

  • 送信インジケータと電源
  • 16pin GPIO23 を IND
    2pin 5V
    6pin GND

シリアルバッファ基板(クリックで拡大) ラズパイ基板の上にスタック

ラズパイ標準の Thonny Python IDE を使い各端子の動作確認だけ行っておきます
import RPi.GPIO as GPIO
from time import sleep

vpin = 11
vsleep = 1

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(vpin,GPIO.OUT)

try:
    while True:
      GPIO.output(vpin,GPIO.HIGH)
      sleep(vsleep)

except KeyboardInterrupt:
    GPIO.cleanup()

ところで、ラズパイのロジックは3.3V、一方この基板は5Vです。 この 3.3V->5V 接続問題はこちら 「5V系・3.3V系信号レベル変換」 を参考にさせていただきました。

 

PCM5102A DAC基板 2022 Jan 14, 29-30

  • PCM5102A 端子による機能選択は以下の設定です
  • FLT=0/1 アンチエイリアシングデジタルフィルタ Low - Normal latency, High - Low latency
  • DMP:0 ディエンファシスをオフ
  • SCL:0 内部PLLを使う
  • FMT:0 入力デジタル信号が I2S(Low)か左寄せ(High)か
  • XMT:1 MUTEしない
DAC、ボリューム、入力SW基板(クリックで拡大) シリアルバッファ基板の上にスタック

ラズパイの標準 I2S で PCM5102Aを駆動する為、 /boot/config.txt を編集し device tree の設定を行う。
#hdmi_drive=2		変更
hdmi_drive=1

#dtparam=audio=on	コメントアウト

#I2S 追加
dtoverlay=hifiberry-dac

  • 動作確認
  • $ lsmod
    対象名は snd_soc_rpi_simple_soundcard
    ちなみに snd_bcm2835
  • $ aplay -l
  • $ aplay hoge.wav
  • $ aplay -D (plug)hw:1,0 hoge.wav

 

完成!

オーディオコーナーに設置したラズパイ

部品リスト 2022 Jan 15-16

ソフトウェア セットアップ 2022 Feb 1-4, 8-11, 26

SSH Tera Term
ソフトウェア開発時に Windows PC側からラズパイを操作する為、 Windows PCに標準的なターミナルをインストールします。 SSH(Secure Shell) をパスワード認証で使用します。 公開鍵認証で使用する場合は こちら を参照。
  • ラズパイ側の設定
    インターフェースタブ SSH を有効に
  • Windows PC側の設定
    Tera Term 4.106 Windows (teraterm-4.106.exe) をインストール
    raspi ip=192.168.1.10, port=22, SSH2, user=pi, pw=****
  • ラズパイとWindows PC間のファイルコピー
    ラズパイからは、メニューの SSH SCP
    ラズパイへは、tera term にファイルをD&D
Apache2
普段使いではラズパイをスマホ、タブレットやPCから操作するのが便利です。 簡単に実現するにはラズパイ側にラズパイ操作の Web アプリページを用意します。 その為に Web server をインストールします。
  • $ sudo apt install apache2 インストール
  • $ sudo systemctl restart apache2 (再)起動
  • $ cat /var/log/apache2/error.log エラー確認
    $ journalctl -xe

Git
Github を使うため Git をインストールしておきます。
  • $ sudo apt-get install git
emacs
私の常用テキストエディタは emacs なのでラズパイにもインストールします。
  • $ sudo apt install emacs
  • Windows を見て適当に ~/.emacs を修正

 

参考リンク

その後の Tips


4年半連続稼働していたラズパイが突然ダウン、対応しました 2026 Jul 2

ある朝いつもと様子が違うと思えば、ラズパイが応答していません。 何が起こっているのか調べようとしましたがログインも出来ません。 ネット検索してみると、 OSが入っている「SDメモリーカードの書き込み寿命が尽きる」 という指摘が一番当たっていそうです。 ラズパイはSDメモリーカードをハードディスク代りに使っているので酷ですね。

新しい SDメモリーカードを用意し、 最初のステップである OS のインストールからやり直します。 Imager の最新版をげっとし、設定し、メモリーカードに展開し、 それをラズパイにさして電源を入れると生き返りました。 やはりSDカードが原因でした。

以前はラスパイのコンフィグレーションは起動後に行いましたが、 最近は書き込みイメージを作る段階で出来るようになっていました。

 

起動後、これまでラズパイに対して行ってきた変更や追加 (このファクトリーに記載されている内容)を全て行い、 それで、以前の状態に戻るはずでした。 ところが いざ起動してみるとウェブリモコンがうまく働きません。 この4年半の間に Python や OS がバージョンアップされ、 それに伴う、ライブラリの変更や、 Linux コマンドの変更に対応する必要がありました。 以下は OpenAI ChatGPT と相談しながら進めました。

 

Python 3.13 対応

以前のコードでは、www/cgi-bin/ に、まるっと cgi ライブラリを使っていましたが、 Python 3.13 以降では、そのライブラリが削除されていて使えません。 Chappy が言うには、「今風のやり方は、CGI自体を使わず、 WSGIやFlask/FastAPIなどのWebフレームワークを使うことです」だそうですが、 「ラズパイで簡単なWebサーバーを動かすだけなら、 フレームワークを使わずに http.server で十分です」とのことで、 今回は取り敢えず http.server で対応することにします。

Python http.server を使えば 長年使ってきた Apache2 Web Server がいらなくなる という、目から鱗です。 これにより www/cgi-bin/ 以下は無用になります。

Apache2 を停止し、自動起動を無効にします
現状の確認
pi@raspberrypi:~ $ sudo systemctl status apache2
● apache2.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/apache2.service; enabled; preset: enabled)
     Active: active (running) since Tue 2026-07-14 14:11:14 JST; 10min ago


停止
pi@raspberrypi:~ $ sudo systemctl stop apache2.service

停止の確認
pi@raspberrypi:~ $ sudo systemctl status apache2
○ apache2.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/apache2.service; enabled; preset: enabled)
     Active: inactive (dead) since Tue 2026-07-14 14:29:10 JST; 5s ago


自動起動の無効化
pi@raspberrypi:~ $ sudo systemctl disable apache2.service
Synchronizing state of apache2.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install disable apache2
Removed '/etc/systemd/system/multi-user.target.wants/apache2.service'.

無効化の確認
pi@raspberrypi:~ $ sudo systemctl status apache2
○ apache2.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/apache2.service; disabled; preset: enabled)
     Active: inactive (dead)

 

Apache2 の代りに新たに Python による http.server を www/html/web_server.py として作成します。 詳細はコードにコメントを書きましたが、 ポイントは以下です。 コード参照は GitHub へ。

Apache と Python http.server の違い
Apache Python http.server
デーモン起動 $sudo python3 server.py (sudo 起動)※1
GET リクエスト毎に cgi-bin が起動され終了する サーバーインスタンスとして常駐する
DocumentRoot "/hoge" の設定 コードで指定
DirectoryIndex index.html index.htm の設定 go_GET 関数の最初にコードで指定
ScriptAlias /cgi-bin/ "/hoge/" の設定 http.server 自体がそれに相当
AddHandler cgi-script .cgi .py の設定
元々マルチスレッド ThreadingHTTPServer を使う※2
※1 標準的な HTTP 通信で Webサーバーは ポート80 を使い、 これは特権ポートなのでルート起動
※2 Google Chrome などは HTTP リクエストが複数同時なので Threading を使い複数リクエストに対応

 

また、この変更に伴い www/html/inde.htm の XMLHttpRequest の呼出し構文が1行変更されています。

ちなみに、web サーバーが稼働するまでの間は、 Window PC からラズパイのオーディオサーバーを ソケット接続 で直接操作する windows_socket.py (GitHub) が使え、部屋の灯りを変えたり、インターネットラジオを聞いたり、 などは出来ていました。

 

Raspberry Pi OS (18 Jun 2026) 対応

インターネットラジオ試聴には、 これまで使っていた mplayer の代わりに Chappy ご推奨の ffmpeg を使うことにしました。
  • $ sudo apt install ffmpeg
  • これに伴い mplayer はインストール不要に
ボリューム調整も WirePlumber + PipeWire が標準になったそうで、 コマンド変更になりました。

OS 関連の具体な変更は audio_cerner_server.py (GitHub) 参照。