大きい方のラジオをつくる - takao-t/piradio GitHub Wiki

Raspberry Pi 3Bとかを使ってつくるタイプの大きいラジオ(Pi Zero W/WHを入れても可)

Table of Contents

ここで使う材料

  • 余っている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と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です。

アンプとDAC

アンプとスピーカーをわざわざ用意するなら、USB接続のPCスピーカーを買ってバラして組み込む方が簡単といえば簡単です。ただし、USBの接続部分が横に出るという大きな欠点があるので、きれいに納めたい場合には作った方がよいです。

概要

I2S DACを左右それぞれ用に使うので2個必要になります。小型なのでバスレフユニットの隙間に押し込みます。ただしこの隙間、高さが8mmしかないのでおおきいものは入りませんから注意してください。写真を見て気付くかもしれませんが『渡り』のジャンパを接続するために、片側のDAC基板は長いアングルピンヘッダを使い、裏側を折り曲げることで2本のジャンパが挿し込めるようにしてあります。

なんでこんなことをするかというとケチくさいからです。飽きたら他のものに流用したくなるのが人情なので、直接ハンダ付けせずにジャンパで配線できるようにしているのです。もちろん、きれいにハンダ付けして仕上げてもかまいませんので、このあたりの配線はご自由に。

接続

IS2 DACとRaspberry Piの接続は次のようになります。DACは2枚ありますが信号は並列に繋ぐだけです。っと、その前に各DACの設定をステレオにし、右または左に設定しておいてください。Sparkfunのものはパターンカット1箇所とハンダジャンパが1箇所です。

I2S DACとRaspberry Piの接続
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の設定

インストールやら何やらは『普通に』やってください。

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スピーカーの音はちゃっちい(ラジオっぽい音)。

⚠️ **GitHub.com Fallback** ⚠️