CyberBerry DAC for Raspberry-Pi Automobile Application


イントロダクション:

最近ではクルマの純正のナビやオーディオが車体とより密な関係となりエアコン制御やハンズフ リー 通話や運転アシスト機能とも融合してきて、そうそう簡単には外せないようになってきている。 その一方で音楽用メディアも様変わりして光ディスクやHDDなどの回転 系のメディアはどんどん無くなってきている。 2昔ほど前には5.25"ディスク10枚のCDチェンジャーを2台も積んで走っていた時代もあったが、もは やそのような物 は化石的存在と言ってもいいだろ う。 それに代わって重要視されてきたのがスマートフォンでのサブスクリ プション契約によるストリーミング再生や動画再生への対応であろう。 サブスクリプション契 約の多くはオフライン再生もサポートしているし、最近ではハイレゾにも対応したサービスプロバイダーも出てきたので極端な事を言えばスマートフォンで再生するコン テンツを高音質で鳴らせれば、今や車載オーディオ/ビジュアルのコンテンツほとんどが事足りてしまう時代になったと思う。

 そこで、にわかに浮上してきたのがRaspberry-Piを使ったオーディオシステムの 構築で ある。初期の頃はSoC内蔵のPLLをオーディオ再生のマスタークロックとして使っていたので、その再生音はジッターに起因するクオリティの低さを感じるものがあっ た。しかし現在ではSoCをスレーブ動作させてオーディオのクロックは安定なTCXOをDAC至近に持たせる事で本格的なオーディオ機材と張り合える再生 音を 実現したものが出てきている。 しかしその殆どが室内空間での使用を想定した仕様のために車載するとなると幾つかの解決すべき問題がある。 一番に挙げられるの が、12V単一のDC電源で動作させるのはなんとかなるとしてもエンジン始動の瞬間の電圧ドロップ対策とか逆に走行中は14Vを超える欧州車を考慮した電 源電圧の許容マージン が十分取れてるかどうか? オルタネーターの電源ノイズは聞こえないか? そしてエンジンを止めクルマを降りる際にはシステムをシャットダウンする処理をしないでいきなり 切ってしまうとOSを収納したSDカードのイ メージが頻繁に壊れてしまったり、一部が消えたりして起動できなくなってしまう事が容易に起きてしまうことであった・・・



開発プロジェクト方針:

 現在ではパワフルなCPUボードが比較的安価に手に入るようにはなったが、実際に車載するとなると幾つか解決しなくてはならない 課題がある。  小 さいとはいえLunuxマシンであるRaspberry-Piは、ROMで動いているマイコンのように用が済んだらパチンと電源切ってはいけないという事情がある。 それ と可能な限 り運転する以外の事には手間をかけたくないので、始動したら自動で電源がオンし、車を降りたら自動でシステムがシャットダウンするようにしたい。 また 不測の事態による暴走で強制的に電源を切りたい場合にも対応したいし、ソフトのバグなどでハングアツプした場合に再起動が必要な場合にも簡単に対応できるよう にしたい。

以上のことから、目標とする仕様は以下の通り

Design Key Concepts:

最小数の操作子ということで、今回は「ボタン1つ」だけで上記を実現することを目標にした。

また、最初のバージョンに限って、以下の追加機能を実験的に搭載してみた

    Features:



Hardware編/回路設計:

 Raspberry Pi 4 type Bは負荷時10Wオーバーと消費電流も多いし、資源を無駄にしないように発熱は少なくしたいので車両の+12Vから安定化し た+5Vを生 成するのにはドロップ式のレギュレーターではなく高効率なスイッチング電源を使用する必要がある、部品点数が少なくコンパクトで高効率であるためにはスイッチング周波数は 高くなくてはならない。 このような条件でピックアップしたのがTI製のICでTPS563249 (max.17V入力, 3A出力, 1.4MHzスイッチング動作) を採用した、なんとSOT23という極少パッケージでありながら動作温度範囲も広くて小型のメタルアロイインダクターが使える。

肝心のDAC回路には広く利用されている再生ソフトが標準で対応できるように市販DAC基板と互換 にすることにした。ネットを徘徊してたらHiFi Berry DAC+ proの回路図を見つけた、DACがマスターモードで動作しており要望を満たしててかつシンプルな設計だったのでこれを参考にすることにした。

 デバッグの便宜を考えてSilicon Lab製のUSB-UARTブリッジも搭載したが、利用頻度も低いしQFNのバッケージはメタルマスクを使ってリフロ−はんだでもしないと一般のアマチュア的は作りにくい ので次のバージョンでは削除してしまおうと考えている。 ちなみに今回はFusionPCBに基板とメタルマスクを発注して手作業でクリームハンダを塗布し、 アイリスオーヤマのIHP-C320-Bと いう焼肉用ホットプレートに載せてリフローハンダ付けを行った。以下にバージョン0.2の回路図を掲載する

Main Part Schematic Circuit Diagram (1of 2)


動作解説1:

BATT端子に常時電源+12Vが供給されている状態でACC電源がオン(+12V)になると、左 上のU7 (555タイマーIC) に接続されたC50にチャージする動作がはじまり数秒後にはDIS出力 がLになる、これは車載の場合キーを挿してから2秒後程度でエンジンを始動することが多いので、クランキングに伴う電源電圧のドロップが終えてしまってから Rapsberry-Piをスタートさせるように遅延して電源が入るようになっている、もしDIS出力がLになる前に(再始動などで)電源が落とされてしまっ た場合にはデイオードD8によってリトリガー動作するようになっている。 ホームユースの場合のオプションとして、ダイオードD5を搭載している場合には SW1をONにした瞬間に遅延なくRapsberry-Piに電源が供給されるようにすることでユーザーの不安感を解消している。電源回路は3系統あって一番 消費電力の高いRaspberry-Pi用の+5Vはスイッチング方式の電源で、これからデジタル系の+3.3V電源をU10のシリーズレギュレータICで生 成してシリーズレギュレータICの発熱量を削減している。DACのアナログ系の電源はSWノイズが乗るのを嫌うので外部から供給されたDC12VからU8で直 接3.3Vを生成するようにしている。 ソレノイドやアクチュエータなどのノイズ源満載の車載環境を考慮し、外部からの電源接続口にはコモンモードチョーク FL1を配している。ACC電源がHになり数秒後にDIS出力がLになるとスイッチング電源IC1が起動しRaspberry-Piに電源が供給開始される。 さ らにDACにはアナログ系/デジタル系すべての電源が同時に供給される。

もし、この電源がオンで動作している状態でSW4(RES/SHTボタン)を短く押すと GPIO26が一瞬Lに下がるだけではラズパ イの電源は 切れないが、ラズパ イはGPIO26が一瞬落ちたのを検出してシステムをリブートさせるようにソ フトウエアを構築しておく事にする。 また、SW4のボタンを長押しした場合は ラズパイがシャットダウン動作を行う。 シャットダウン完了後に再起動させたい場合にはSW4ボタンを短く押すとダイオードD11経由でSCL1の線がLに 引っ張られるのでRapsberry-Piが再起動を開始するようになっています。

J3にmicro-USBケーブルでパソコンを接続してTera-Term等のターミナルソフトを たち上げればUART経由でSoCとシリアル通信が可能となる。

ACC電源がオフになるか、もしくはSW1がOFF側に切り替えられると、直ちにミュートドライバ 出力が有効になり、それから約40秒後にRaspberry-Piを含む回路の電源が切れるので、ラズパ イは常にGPIO26を監視しておき、一定時間以上GPIO26がLになった事が検 出できたら自動でシャットダウン動作に入るようにする。

DAC Part Schematic Circuit Diagram (2of 2)

ここのDAC周辺接続はHiFi Berry DAC+ proと同じなのでVolmioやMoOde Audioなどで設定するときには同設定でイケます、シンプルな回路なので殆どイジるところが無かったのです が、唯一DACのOUTL/OUTR〜J6のRCAピンジャックの 間にあるパッシブのCRのLPF回路の段数を2段構成とし、カットオフ特性カーブをやや鋭くカットするように変更しています。
クロック用ICでY1が48kHz系のTCXO、Y2が44.1kHz系のTCXOで、これら はラズパイから独立した安定なオーディオクロックを生成するので、PLLジッターがない安定なクロックでDACが動作します。 
Q11のN-MOSFETのQ11に接続されている信号の何れでも、DACのソフトミュート機 能を起動で きるようにしています。

Schematic and PCB Design Files (Ki-CAD)

GitHubに置いたので、データが必要な方は以下のURLからクローンしてください。
CyberBerry_DAC files  (GitHub)


Software/ソフト編

Raspberry-PiのLinux側設定

電源の状態によって自動的に変化するハードはできたが、これに対応したソフト ウェアを自前で 用意しないことには目的は達成できません。 ソフト的な動作を大別すると、自動シャットダウンと、リブート動作が必要で、今回はこれを一つの制御線でコント ロールすることにします、具体的には瞬間的にL(おおよそ30mS以下)であればリブート、それ以上の時間Lレベルが持続するならば自動的にシャットダウン動 作に移行すると い う仕様にします。
 以下に使用したファーム等の環境を示す。
まずは、作成したPSUでちゃんと動作しているか確認することにします、 初期設定はRas-piを有線LANでDHCPサーバーが動作している環境に接続 し、ブラウザでhttp://moodeaudioとURLを指定します。
sshでログインして作成したボードの状況を確認するには同じドメインに接続されたパソコンから接続する場合でMac OS-Xならばターミナルを開いて以下のように打てば繋がります。

iMac:~$ ssh -l pi moodeaudio

使い慣れたエディタでなくて構わないのであれば、MoOde Audioの場合はブラウザ右上の"Configure"の画面で"Local Service"項目の一番下にある"Web SSH terminal"の「OPEN」ボタンを押すだけでターミナルのログイン画面が開きます。

pi@moode:~$ gpio -v

上記のコマンドでWiringPiのバージョンが表示されるのですがバージョン2.52以降で ないとRaspberry Pi 4には対応してないのでアップデートが必要です。 以下のようにmoodeデフォルトのパスワードを打ってログインに成功するとRaspberry-pi側のプロンプトが 表示されるのでスーパーユーザー権限で以下を実行します。

pi@moode:~$ gpio readall


 +-----+-----+---------+------+---+---Pi 4B--+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
 |   2 |   8 |   SDA.1 | ALT0 | 1 |  3 || 4  |   |      | 5v      |     |     |
 |   3 |   9 |   SCL.1 | ALT0 | 1 |  5 || 6  |   |      | 0v      |     |     |
 |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 0 | IN   | TxD     | 15  | 14  |
 |     |     |      0v |      |   |  9 || 10 | 0 | IN   | RxD     | 16  | 15  |
 |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 0 | IN   | GPIO. 1 | 1   | 18  |
 |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |
 |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  |
 |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |
 |  10 |  12 |    MOSI |   IN | 0 | 19 || 20 |   |      | 0v      |     |     |
 |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 1 | IN   | GPIO. 6 | 6   | 25  |
 |  11 |  14 |    SCLK |   IN | 0 | 23 || 24 | 1 | IN   | CE0     | 10  | 8   |
 |     |     |      0v |      |   | 25 || 26 | 1 | IN   | CE1     | 11  | 7   |
 |   0 |  30 |   SDA.0 |   IN | 1 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   |
 |   5 |  21 | GPIO.21 |   IN | 1 | 29 || 30 |   |      | 0v      |     |     |
 |   6 |  22 | GPIO.22 |   IN | 1 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  |
 |  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     |
 |  19 |  24 | GPIO.24 |   IN | 0 | 35 || 36 | 0 | IN   | GPIO.27 | 27  | 16  |
 |  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 0 | IN   | GPIO.28 | 28  | 20  |
 |     |     |      0v |      |   | 39 || 40 | 1 | IN   | GPIO.29 | 29  | 21  |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+---Pi 4B--+---+------+---------+-----+-----+
Pi3 physical (22pin) GPIO.6の「V」を読むと「1」になっている、

この状態から電源制御ボタンを押すかACC電源を落として同じようにreadallを再 実行すると...


 +-----+-----+---------+------+---+---Pi 4B--+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+

 |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
 |   2 |   8 |   SDA.1 | ALT0 | 1 |  3 || 4  |   |      | 5v      |     |     |
 |   3 |   9 |   SCL.1 | ALT0 | 1 |  5 || 6  |   |      | 0v      |     |     |
 |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 0 | IN   | TxD     | 15  | 14  |
 |     |     |      0v |      |   |  9 || 10 | 0 | IN   | RxD     | 16  | 15  |
 |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 0 | IN   | GPIO. 1 | 1   | 18  |
 |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |
 |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  |
 |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |
 |  10 |  12 |    MOSI |   IN | 0 | 19 || 20 |   |      | 0v      |     |     |
 |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |
 |  11 |  14 |    SCLK |   IN | 0 | 23 || 24 | 1 | IN   | CE0     | 10  | 8   |
 |     |     |      0v |      |   | 25 || 26 | 1 | IN   | CE1     | 11  | 7   |
 |   0 |  30 |   SDA.0 |   IN | 1 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   |
 |   5 |  21 | GPIO.21 |   IN | 1 | 29 || 30 |   |      | 0v      |     |     |
 |   6 |  22 | GPIO.22 |   IN | 1 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  |
 |  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     |
 |  19 |  24 | GPIO.24 |   IN | 0 | 35 || 36 | 0 | IN   | GPIO.27 | 27  | 16  |
 |  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 0 | IN   | GPIO.28 | 28  | 20  |
 |     |     |      0v |      |   | 39 || 40 | 1 | IN   | GPIO.29 | 29  | 21  |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+---Pi 4B--+---+------+---------+-----+-----+
Pi3 physical (22pin) GPIO.6の「V」を読むと「0」になっている、


今度は physical (22pin)の「V」が「0」に変わっているのが確認できました、そこでこのポートを使って動作を検出することにします、
Rapsberry-Pi3の場合旧機種で言うところのGPIO.6はWiringPi経由でBCMのポート名で指定する必要があるので、ここでは25番ポー トとして記述します。
以下に自動シャットダウンとリブートに対応したpythonのコードを示します、このライセンスはGPLに準じます。
作成には以下のようにnanoエディターを起動し記述する。

pi@moode:~$ /home/pi/nano psu_switch.py

import RPi.GPIO as GPIO
import time
import os

GPIO.setmode(GPIO.BCM)
GPIO.setup(25,GPIO.IN,pull_up_down=GPIO.PUD_UP)

button_before = 1
button_now = 1
holdcount = 0
pushed = 0


try:  
  GPIO.wait_for_edge(25, GPIO.FALLING)

  while True:
    button_now = GPIO.input(25)
    pushed = button_before + button_now

    if (not(pushed)):
      holdcount += 1
    else:
      holdcount = 0

    if(button_now and (not(button_before))):
      os.system("sudo shutdown -r now")
    if((not(pushed)) and holdcount >= 100):
      os.system("sudo shutdown -h now")
      break

    button_before = button_now
    time.sleep(0.03)

except KeyboardInterrupt:  
  GPIO.cleanup()

GPIO.cleanup()


再起動した時に自動で起動するように永久設定してしまう前に、念のためテストをしてみましょう。

 pi@moode:~$ sudo python psu_switch.py

 ACC電源を落としたら自動でシャットダウン動作に入り、ボタンのチョイ押しならリブートするはず (再起動後はマニュアルで psu_switch.pyを再実行する必要があります)
通常動作中にボタンを長押しすると電源が入ったままRaspberry-Piがシャットダウンしてしまいますが、再度チョイ押しすることで再起動できます。

(これ以降の作業は失敗すると面倒な事になる可能性もあるのでこの段階でSD カードのバックアップを取ってから次へ進むのが良いでしょう)

psu_switch.pyがうまく動くのが確認できたら、いよいよ自動実行を埋め込みます、
/etc/rc.localの最終行の exit 0 する前行にpsu_switch.pyを自動実行する記述をnanoエディタで編集し以下のように追記します。

pi@moode:/etc$ sudo nano /etc/rc.local

# This Program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Moode; see the file COPYING.  If not, see
# .
#
# Moode Audio Player (c) 2014 Tim Curtis
# http://moodeaudio.org
#
# 2016-06-07 2.6 TC moodeOS 1.0
#
/usr/bin/udisks-glue > /dev/null 2>&1
/var/www/command/watchdog.sh > /dev/null 2>&1
/var/www/command/worker.php > /dev/null 2>&1
sudo python /home/pi/psu_switch.py &           
exit 0
 
以上でもって再起動しても、毎回 上記のPythonスクリプトが自動で実行されるようになるのでRaspberry-Piを車載化した際にも、シャットダウン操作を気にすることなく運転に専念できる ようになります。

MoOde Audio Application側の設定

Raspberry-Pi 3  type B+や4 type B であればBluetoothとWiFiを内蔵しているのでCyebrBerry DAC基板を挿して電源を接続するだけでよく非常にシンプルなシステムとなります。
ネット上で認識できたら最初にまずDACのタイプを「HiFiBerry DAC+ pro」と設定して再起動を選んでください。
基本的に走行中はRaspberry-Piはインターネットに接続しない状態で動作し、ソフト ウエアによる独自ドメインへのアクセスポイントとして搭乗者のスマートフォーンにクローズトなWiFi接続を提供します。ハイレゾ対応のメディアサーバーとし ての実用性も含め て、とこ とん追求してみたいと思うので、対応メディアとして以下の全てのインタフェースで再生を有効に設定します。
Player Status
Media
Comment(s)
MoOde Audio Player
SD Card カード内に保存されているコンテンツ
USB USB Thumb FLASHなどのデバイス内に保存されているコンテンツ
Slave Device
WiFi接続 iPhoneの再生アプリでAirPlay出力先として指定する
Bluetooth接続 スマホ等でイアホンの代わりとして指定する
Amazon MusicやGoogle Play Musicなどの再生ではスマートフォンで再生しているコンテンツの出力先デバイスとして動作します、WiFi経由でもBT経由でも音を出すことはできますが Bluetoothの 場合はSBC圧縮が掛かったデータが転送されますし、AirPlayの場合は非圧縮の16bitリニアPCMで転送され音質的に有利なのですが、電力の消費量が大きいので WiFi接 続の場合Qi 対応のホルダー等なんらかの方法で充電しながらの使用をお勧めします。 ハイレゾはHD動画並みにモバイル通信パケットを消費してしまうので私の場合もっぱらスマートフォンにダウンロードしたものばかりを聴いています。

屋内のDHCP環境で使用の場合は有線でLANに接続することで自宅のネットワーク内で http://mode /とブラウザにURLを指定することでUI画面に到達できると思います。


Installed Gallery 基板の画像

Top View (ver 0.1 Board)

画像はプロトタイプの基板、Ki-CADで殆ど自動配線した基板であるが、許せる配線パターン が引けるまで部品レイアウトを何度も繰り返し最適化したので手動で配線設計したのはたった12本だけ。残念なことにI2Cラインのラベル名を間違ってし まってパターンが繋がらなかったのでポリ ウレタン線でジャンパー接続している。


SPI接続のタッチパネル付き3.5"LCDモニターを装着した状態での画像(フロント側)



SPI接続のタッチパネル付き3.5"LCDモニターを装着した状態での画像(リア側)



Audio Performance Check (性能チェック編)

 試作したverr0.1の基板で特性をチェックしてみた。 高速で多量のノイ ズを振り撒くRaspberry-Pi 4 B+にMoodeAudio4.5を搭載し、再生音をFocusrite Scarlet Gi6 Gen2改で測定した。電源は秋月電子で買ったACアダプタ(12V)を使用。


1kHz Distortion (1kHzサイン波再生時の歪スペクトラム特性)

一番高い3次高調波歪のレベルでも-100dB以下であった、WaveSpectraによ れば歪率は0.00411%と出たが、この付近までくると測定に使用したADCの性能限界近いので実際はもっと低歪の可能性がある。またノイズフロアの上 昇等も見られないので極めてクリーンな再生音だといえよう。特に基本波の根元付近に注目して欲しい、基本波スペクトルの麓の左右への広がりが少なくシャー プでありクロック位相ノイズ特性や再生音のジッター特性が良好な事を示している。この辺りはDACがローカルにTCXOによる自前のクロックを持ってマス ターモードで動いている事が大きいと思われる。

Remain Noise Spectrum(デジタルゼロ再生時の残留ノイズ特性)


気になるような残留ノイズもなく、十分にクリーンである。


[注意事項]

 本情報は、あくまでも部分的情報の公開が目的であり、確実で完全な情報であることを保証するものではありません。 ユーザー個人の趣味であり またメーカを冒?したり営業妨害を意図するものでもありません。 従って本情報に基づいて機器を改造した際に、機器が動作しない、もしくは、期待した 性能が得られない等の 障害が発生したり、万が一に事故等が発生したとしても、当方は一切の責務において関知しないものであります。 実際に機器の改造を行う際は、あく ま でも各自、個人の責任において行ってください、腕に自信の無い方は絶対にトライしないで下さい。 本設計の回路やアイディアの無断転載や商用化はご遠 慮ください。
[Caution:] (If you use above information, At Your own risk!)

更新日 2017.Sep.9th

inserted by FC2 system