大きい方のラジオをつくる - takao-t/piradio GitHub Wiki
Raspberry Pi 3Bとかを使ってつくるタイプの大きいラジオ(Pi Zero W/WHを入れても可)
- 余っているRaspberry Pi 2/3 B+
- Pi2だとWiFiが使えないのでUSBドングルを併用するとナイス。有線LANで使うのであればWiFIはもちろん不要。
- 液晶表示器
- 下記参照。適当なSPI接続の液晶でたぶん大丈夫です。
- ケース(キャビネット)を使う場合には入手した液晶にあわせてベゼルを作る必要があります。
- I2S DAC アンプ付
- Sparkfunのものを使いましたが、I2S接続できるDACならば他のものでもOK
- https://www.switch-science.com/catalog/4038/
- 単純なオーディオ入力のアンプ買うよりI2S DACでD級アンプ付きの方が安いというオチ
- 5cmスピーカー2個
- 家に大量に5cmのスピーカーが余っていたため
- オーディオまわりは市販のUSBスピーカーをバラして使うのが割と安上がりで簡単です。
- USBは横から挿すのでイマイチかっこよくない。
- アンプは使わない前提だと https://www.buffalo.jp/product/detail/bssp100uwh.html これをバラすとスピーカーは意外とよかった。
- アンプはIS2のアンプ付きDACを使い、スピーカーについているアンプは使わない。
- DCジャック
- DC 5VのACアダプタから電源供給用
- キャビネットの後ろ側、下のほうに円型のパネルマウントDCジャック用の穴があります。
- http://akizukidenshi.com/catalog/g/gC-06342/
- 大き目のタクトスイッチ 5個
- 作例ではこれを使っています
- https://www.switch-science.com/catalog/528/
- 適当なユニバーサル基板に着けて上面パネルに取り付けます
- ジャンパワイヤ、ヘッダピン、両面テープなど普通のご家庭にあるもの
- キャビネット
- https://www.thingiverse.com/thing:4417542
- Pi2/3を使う場合にはリアカバーに"pihole"モデルを。もしPi Zeroを使うなら穴なしで。
- ここで説明している液晶を使う場合、フロントパネルはPiTFT(2.8)用のもの(穴がちいさいほう)に2-2_のベゼルとクリップを合わせて使います。
- 作例の写真で見せているように部分毎に色を変えて出力するとオシャレになります
- キャビネットの組み立てには3x6(8本)と3x10(3本or4本)のタッピングネジが必要です。
- Raspberry Piのマウントには3x6(4本)のタッピングネジが必要です。
- 上面パネルの裏側にユニバーサル基板を付けるには3x6(4本)のタッピングネジが必要です。
そのへんで売ってるフレームバッファになるやつなら使えるのですが、スイッチサイエンスでも売っているのに気付いたので試してみました。
https://www.switch-science.com/catalog/5902/
ただし『試験的』販売だそうなので供給が終わるかもしれませんので注意してください。ILI9341を使う320x240液晶です。このタイプは割とよくあるようなのですが、ILI9341を使っていてもCSが出てないものやパラレル(Arduino用)もあるので注意してください。『ILI9341を使用しており、CSピンがありSPI接続』が条件となります。
またこの液晶は2.2"と小さいので対応するベゼルとクリップ(2-2...)を作成しておきましたので使ってください。SDカードスロットは使えません。使えるようにすればラジオの上からメディアが挿せるようにできるので面白いかもしれないのですが、後で考えます。
Raspberry Pi側も液晶側もピンが立っているのでメス-メスのジャンパワイヤーを使えば簡単に接続できます。
LCD | RasPi | 備考 |
---|---|---|
VCC | 3.3V | |
GND | GND | |
CS | CE0(24) | |
RESET | GPIO24(18) | |
DC/RS | GPIO25(22) | |
SDI/MOSI | MOSI(19) | |
SCK | SCLK(23) | |
LED | 3.3V | 説明参照 |
SDO/MISO | MISO(21) |
LCDのLEDピンは3.3Vに接続していますが、これはバックライト制御です。もしバックライトを制御したいのであれば空いているGPIOに接続します。ON/OFFするだけでなくPWMで明るさを制御することもできます。
local_settings.py に BACKLIGHT = を指定するとバックライト制御が行われます。一定時間、操作がないとバックライトを消します。
注意:Raspberry Piのカーネル 5.x以降ではGPIOのハンドリングが変わり、fbtft_deviceが外されたそうで以下の方法では動きません。workaroundも今のところ見つけていません。見つけたら教えて。 動くのは Linux raspberrypi 4.19.118-v7+ #1311 SMP Mon Apr 27 14:21:24 BST 2020 armv7l GNU/Linux までです。
(以下古い情報) 現在のRaspberry Pi OSは最初からfbtftが入っているようなので簡単に動きます。以下のコマンドを実行するとドライバがロードされ /dev/fb1 が使えるようになります。
modprobe fbtft_device name=rpi-display gpios=reset:24,dc:25 busnum=0 rotate=90
取り付け向きによってrotateを設定すると縦長とか上下逆取り付けでも対応できます。システム起動時にこれを読み込ませる方法はいくつかありますが、簡単に /etc/rc.local に書いています。
modprobe fbtft_device name=rpi-display gpios=reset:24,dc:25 busnum=0 rotate=90 <--exit 0の前に書く exit 0
ラジオが使用するフレームバッファはこれだけで十分なので、コンソールのコピー(fbcp)等は必要ありません。/dev/fb1 が使えればOKです。
アンプとスピーカーをわざわざ用意するなら、USB接続のPCスピーカーを買ってバラして組み込む方が簡単といえば簡単です。ただし、USBの接続部分が横に出るという大きな欠点があるので、きれいに納めたい場合には作った方がよいです。
I2S DACを左右それぞれ用に使うので2個必要になります。小型なのでバスレフユニットの隙間に押し込みます。ただしこの隙間、高さが8mmしかないのでおおきいものは入りませんから注意してください。写真を見て気付くかもしれませんが『渡り』のジャンパを接続するために、片側のDAC基板は長いアングルピンヘッダを使い、裏側を折り曲げることで2本のジャンパが挿し込めるようにしてあります。
なんでこんなことをするかというとケチくさいからです。飽きたら他のものに流用したくなるのが人情なので、直接ハンダ付けせずにジャンパで配線できるようにしているのです。もちろん、きれいにハンダ付けして仕上げてもかまいませんので、このあたりの配線はご自由に。
IS2 DACとRaspberry Piの接続は次のようになります。DACは2枚ありますが信号は並列に繋ぐだけです。っと、その前に各DACの設定をステレオにし、右または左に設定しておいてください。Sparkfunのものはパターンカット1箇所とハンダジャンパが1箇所です。
I2S DAC | RasPi | 備考 |
---|---|---|
VCC(2.5-5.5V) | 5V | |
GND | GND | |
SD | 接続しない | |
GAIN | 接続しない | |
DIN | DATA-OUT(40) | GPIO21 |
BCK | BCK(12) | GPIO18 |
LRCK | LRCK(35) | GPIO19 |
アンプ付きDACの電源は+5Vから取っても問題ないようです。というのもDACのピンは全部入力でHが0.6Vだそうなので3.3Vスイングで入力すれば特に問題は出ないと思います(Adafruitのものも電源は+5Vから取っています)。ある程度パワーを喰うのでRaspberry Piの3.3Vを使うよりも、直接5Vを使う方が安全そうですし。
I2S DAC自体はhifiberryで動くのですが、ものすごいポップノイズが出るので悩んでいたところ、Adafruitに良い説明がありました。
https://learn.adafruit.com/adafruit-speaker-bonnet-for-raspberry-pi/i2s-tweaks
これを真似します。まず /boot/config.txt に以下の2行を追加して再起動します。
dtoverlay=hifiberry-dac dtoverlay=i2s-mmap
次に /usr/share/alsa/alsa.conf に以下を追加します。
pcm.i2sdac { type hw card 1 } pcm.dmixer { type dmix ipc_key 1024 ipc_perm 0666 slave { pcm "i2sdac" period_time 0 period_size 1024 buffer_size 8192 rate 44100 channels 2 } } ctl.dmixer { type hw card 1 } pcm.softvol { type softvol slave.pcm "dmixer" control.name "SoftMaster" control.card 1 } ctl.softvol { type hw card 1 } pcm.!default { type plug slave.pcm "softvol" }
この設定ではIS2 DACが"2枚目"のカードになっているのに注意してください。1枚目はRaspberry Piのヘッドフォン出力です。もし、オンボードのサウンドを無効にしたのであれば hw card 1 の個所を hw card 0 に書き直してください。
以上の設定でオーディオデバイスが "softvol"、ボリューム調整デバイスは "SoftMaster" になり、piradio.pyの設定にはPirate Audioの場合と同じものが使えるようになります。
上面パネルに5個のプッシュ(タクト)スイッチを付けます。GPIO-GND間に繋ぎますが、念のためプルアップしておいてください。
取り付けはユニバーサル基板に配置すればスイッチパネルにあうようにしてありますが、レイアウトやデザインを変更したい場合にはスイッチパネル部分だけ設計しなおしてください。
このへんは手に入る材料でうまいことやってください。
インストールやら何やらは『普通に』やってください。
piradioの設定は、設定ファイル local_settings.py の以下の個所を修正します。
# オーディオ関連の設定は alsa_README.txt も参照のこと # オーディオドライバ radio_audio_driver = 'alsa' # 出力デバイス #radio_audio_device = 'plughw:CARD=Device,DEV=0' #radio_audio_device = 'plughw:CARD=ALSA,DEV=0' #radio_audio_device = 'plughw:0' radio_audio_device = 'softvol' <==オーディオ出力先をsoftvolに #radio_audio_device = 'plughw:1' # 音量調整デバイス(amixerの引数: -c0 -c1など) radio_volume_device = '-c1' <==コントローラはC1(alsaが上の設定の場合) #radio_volume_device = '-c0' # 音量調整コントローラ名 #radio_volume_ctl = 'PCM' #radio_volume_ctl = 'Headphone' radio_volume_ctl = 'SoftMaster' <==音量制御先をSoftMasterに
接続したGPIOピンにあわせて調整します。GPIOの番号は"BCM"です。
piradio.pyでもとから書かれているものはPiTFTのボタン位置と同じなので、自分の環境に応じて変更してください。
# 制御用スイッチ:GPIO番号(BCM) # 注: 使用しないスイッチはコメントアウトして変数をセットしない # 例えばTUNE_DOWNを指定しなければ合計4ボタンで実装できる # 音量調整しない場合なら最低2ボタンでも可能 # ただし再生停止ボタンは必須 # スイッチを接続したGPIO番号に書き換える class CTRL_SW: # STARTSTOP = 18 # TUNE_UP = 27 # TUNE_DOWN = 22 # VOLUME_UP = 21 # VOLUME_DOWN = 23 STARTSTOP = 6 TUNE_UP = 13 TUNE_DOWN = 12 VOLUME_UP = 20 VOLUME_DOWN = 16
このピン接続をみるとわかりますが、PiTFTとI2S DACは併用できません。PiTFT上のスイッチを使わなければできなくもないのですが。
スイッチ類のプルアップをGPIOで行う場合にはPULLUPを指定します。
class CTRL_SW: STARTSTOP = 5 TUNE_UP = 6 TUNE_DOWN = 12 VOLUME_UP = 13 VOLUME_DOWN = 16 PULLUP = 19
こんな感じで指定するとGPIOピンでプルアップ(抵抗は要りますよ)します。要するに+3.3Vピンの空きが足りない場合用。
山ほど余っていた5cmスピーカーの音はちゃっちい(ラジオっぽい音)。