高音質ラズパイ用DACの設計と製作
概要
ラズパイ用の高音質DAC(msBerryDAC)を開発しました。対応機種は次のとおりです。
- Raspberry Piシリーズ
- Raspberry Pi Zeroでの動作報告もあります。
購入は取扱店からお願いします。
ラズパイ用の高音質DAC(msBerryDAC)を開発しました。対応機種は次のとおりです。
購入は取扱店からお願いします。
※この記事で扱っているVolumio(Ver1)は古いものです。音質云々以外の、設定情報などすべて古い情報になります。
Raspberry Pi用I2S DACを買ってみました。
外部クロック動作のオリジナル設計ラズパイ用DAC頒布中です。音質に拘った設計になっています。HiFiBerry DAC+ PROよりよっぽども音質良いです。
I2SとはDACチップを動作させるための通信規格でラズパイにはI2Sを直接出力する機能が存在します。ラズパイ用のI2S DACは色々発売されいて、国内でも既にいくつかでていますが、そのほとんどが水晶クロックを搭載していません。
というのも「ラズパイのI2S出力」はシステムクロック(SCLK)と呼ばれる「22.5792MHz」や「24.576MHz」のクロックを出力する機能がありません。ほとんどのラズパイ用DACは、BCLKと呼ばれる1bitごとのデータ出力クロックからシステムクロックを生成しています。
PCM51xxのような特殊なDACチップを使用したボードは存在するのに、PCM179xといったよく使われるDACチップを使用したボードが存在しないのはそのためです。
またこのBCLKについても、クロックタイミングが一定ではないことが知られています。再生速度が狂う代わりに、このクロックタイミングを一定にするというパッチも同じサイトで公開されていますが、それはそれで(音が高くなったり低くなったりする)問題があります。
あまり知られていないことですが、ラズパイのI2Sには外部クロックに同期してデータを出力するモードが存在します。説明すると大変なので詳しくはSND_SOC_DAIFMT_CBM_CFMでググってもらうとして、要するに「ラズパイにSCLKを与えるのではなく、ラズパイにBCLKやLRCLKを与えそれに同期してデータを出力してもらう」ことで、完全に正しいクロックでI2Sデータを出力することができます。
そのような機能を持つ製品として「HiFiberry DAC+ PRO」というものが存在します。
公式サイトからカートに入れて、日本国内の住所を普通に(ローマ字で)入力するだけで手に入れることができます。送料も「たった$8」ですので、6000円ぐらいで購入できました。
注文から1週間ぐらいで届きました。
このDACはラズパイのモデルB用です。手持ちのRaspberry Pi2 BにVolumio 1.55をインストールして早速使用してみました。
「HiFiBerry +」を選択して早速音を再生。
……
…………
……………………なにこれ、超気持ち悪い!
音質がどうのとかそういうの以前に、揺らいでるのか、歪んでるのか、とにかく気持ち悪くてしょうがない。これはおそらくラズパイの歪んだI2Sクロックが原因です。実はHiFiberry DAC+ PROを「Volumio Ver1.55」などで使用した場合、外部クロックは有効にならないのです(参照)。*1
2016年2月時点でラズパイ用DACで外部クロックを使用しているものなんてほぼ流通してませんから、今現在ネットにあがってるラズパイ用DACの感想は、ほとんどがこの狂ったI2Sによる再生によるもので……。
よくこんなのありがたく聞けますね!(笑)
やー、ほんと、音が狂ってるせいでリアルに吐き気してきました……。こんなん聞くならPCM2704で音質のいいDACのほうが100倍も良いです。
※注意:Volumio2等の最近のディストリビューションははじめから対応しています。この項目の情報は古くなっています。
VolumioというかHiFiBerry DAC+のドライバを更新すると、HiFiBerry DAC+ PRO対応になり、外部クロック再生ができるようになります。
Volumioが起動中のラズパイにsshで接続します。
ID: root
Pass: volumio
この後コンソールでカーネルのアップデートを実行します。
# rpi-update
なお、RaspbianやRaspbianベースの他のイメージでも、rootからrpi-updateで対応ドライバをインストールできるかと思います。
この項は直接関係ないので、あとで別記事に移す予定。
Volumioを転送した状態では、SDカードの空き容量が無駄になっていますので、この部分を使えるようにします。
# raspi-config
コマンドを実行して「1 Expand Filesystem」を選択すれば、勝手に拡張してくれる……はずなのですが
Your partition layout is not currently supported by this tool. You are probably using NOOBS, in which case your root filesystem is already expanded anyway.
と怒られてしまいます。Volumioのパーティションの切り方をRasbianと変更してあるらしく、うまく行きません。
/usr/bin/raspi-config を編集します。
if [ "$PART_NUM" -ne 2 ]; then whiptail --msgbox "Your partition layout is not (略)" 20 60 2 return 0 fi
「-ne 2」の部分を「-ne 3」に書き換えてから「raspi-config」を実行してください。うまく行きます。
まず、sources.listのdeb-srcが狂ってるので修正します。修正しなくてもあまり問題はないのですが気持ち悪いので。
# vi /etc/apt/sources.list deb http://mirrordirector.raspbian.org/raspbian/ jessie main deb-src http://mirrordirector.raspbian.org/raspbian/ jessie main
そのままシステムをアップグレードします。20分ぐらいかかります。
apt-get update apt-get upgrade apt-get dist-upgrade
config.txtに以下を設定。
hdmi_drive=1
/boot/cmdline.txt に以下を設定。
consoleblank=0
apt-get upgradeしないなら /etc/kbd/config も修正。確認は以下。
cat /sys/module/kernel/parameters/consoleblank
apt-get install rng-tools
mkdir /lib/firmware/brcm/ cd /lib/firmware/brcm/ wget https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm80211/brcm/brcmfmac43430-sdio.bin wget https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm80211/brcm/brcmfmac43430-sdio.txt reboot ifconfig wlan0
APモードで動作させる場合、チャンネルを6に設定しないと安定しないようです。
hoatapd.conf
interface=wlan0 driver=nl80211 hw_mode=g ssid=SSID # for Realtek 8192 (USB/rtl8192cu) #channel=1 # for Raspberry Pi 3 WiFi (BCM43430) channel=6
Linux 4.4.15-v7+現在、ドライバが未成熟なのか不安定。しっかりとした電源を用意しないと安定しない模様。
「rpi-update」後に再起動してもう一度再生してみます。今度はきちんと外部クロックを使用した再生ができました。
さっきまでの音が嘘のように、とても綺麗な音です。
基板上の役割は以下のようになっています。
主要部分の回路接続は以下のとおりです。
HiFiBerry DAC+には、通常の「HiFiBerry DAC+」と「HiFiBerry DAC+ PRO」が存在しますが、その判別は次の方法で行っています。
この3つの条件をすべて満たしたとき、HiFiBerry DAC+ PROボードとみなし、外部クロックを使用するようになります。
1年以上前に書いたメモそのままです。
XMOS公式サイトから開発ツールをダウンロード。登録が必要なようです。
http://www.xmos.com/products/development-tools
メールでダウンロードURLが送られてきます。
XDE(統合環境/Eclisp)が64bit環境では動かないので、
C:\Program Files (x86)\XMOS\DevelopmentTools\11.2.2\xde_bin\jre
以下に bin や lib といった32bitなJava環境をインストールする必要があります。面倒なので、TiのCCE(同じくEclispによるTi製チップ*1統合開発環境)から
C:\ti\ccsv5\eclipse\jre
を丸コピーして済ませました……。
デバイスをUSBケーブルでつないでから、JTAGをつなぎます。
じゃないと、xflashに失敗して次のエラーで悩みます(汗)
C:\Program Files (x86)\XMOS\DevelopmentTools\11.2.2>xflash d:\usb_audio.xe xrun: Problem in connection to device Error: F03034 Failed to fully run flash inquisitor. Error: F03034 By default xflash will try to connect to a target in order to determine Error: F03034 which flash device is being used even when outputting only to file. To Error: F03034 prevent this connection supply the --noinq option.
参考にしたサイト
MSP430を使用した超低消費電力な加速度(振動)ロガーを製作しました。
写真は「TAKACHI 防水・防塵アルミダイキャスト(AD10-7-4/W100×D65×H40)」に入れたものです。基板は厚さ約6mm以下になります。
MSP430の最新シリーズMSP430F5418使用時に、マニュアルやサンプルプログラムどおり行っても外付け32768Hz水晶を利用できない問題に遭遇し、これを解消するのに2日もかかってしまいました。
MSP430F5xxxのクロックシステムは図のようにいくつかのクロックソースから、ACLK、MCLK、SMCLKという名前のそれぞれのクロックのソースとして選択し、周辺モジュールはACLK、MCLK、SMCLKの中からソースクロックを選択するというような仕組みになっています。
RTCは
RTCCTL01 = RTCMODE
とするだけで他はほぼ自動で設定されますが、RTCにソースクロックとして32768Hzのクロックを与える必要があります。外付け時計用水晶はXT1(XIN/XOUT)に接続するようになっています。このXT1のクロックをACLKという名前のクロックソースとして指定し、このACLKがRTCのソースクロックとして使用されます。
XT1の水晶クロック → ACLK → RTCのクロックソース
XT1に外付けの時計用水晶(32768Hz)を取り付けて、XT1をLFモードに設定し起動します。対応するポートを機能セレクトにて切り替えれば通常はXT1のクロックが利用できます。
少なくともマニュアルにはこう書いてありますが、これでは一見動いているように見えて、RFOCLKという内部32768Hz RC発振回路が使用され大幅に時計がずれます(数分/1日)。
MSP430F5xxのクロックシステムにはフェイルセーフ機能があり、クロックの障害が発生すると自動的に(クロックソース選択レジスタの内容は変わらずに)安全なクロックソースに切り替える機能があります。XT1の時計用水晶に切り替えようとしても発振開始時に障害が検出されるため((当たり前))、代替発振機であるRC発振器のRFOCLKが常に使用されてしまいます。
しかも厄介なことに、代替ソースから本来のクロックソースに切り替える方法がマニュアルに書かれていません*1。
その方法ですが、発振安定後にXT1LFOFFGというXT1の発振障害フラグとOFIFGというクロック障害割り込み要求フラグの両方をクリアすることです。
UCSCTL7 &= ~XT1LFOFFG; SFRIFG1 &= ~OFIFG;
動作確認済のソースを置いておきます。MSP430F5xxにはXCAPという発振安定用コンデンサを内臓してそれを利用する機能がありますが、温度補償用の外付けコンデンサを使用したいためオフにしてあります。
void init_rtc() { // Set up XT1 by 32k oscillator P7SEL |= 0x03; // Analog function for XT1 Pins UCSCTL6 = XT2DRIVE_0 // Lowest current drive mode | 0 // XT2 internal | XT2OFF // XT2 off | XT1DRIVE_0 // XT1 0=lowest current | 0 // LF mode | 0 // XT1 internal | XCAP_0 // Internal cap 0=off, 3=12pF | 0; // XT1 on, if not user source // ACLK source is XT1CLK UCSCTL4 = (UCSCTL4 & ~SELA_7) | SELA__XT1CLK; // Clear XT1 fault flags while(UCSCTL7 & XT1LFOFFG) { UCSCTL7 &= ~XT1LFOFFG; SFRIFG1 &= ~OFIFG; } // RTC initalize // RTxSSEL, RTxPSDIV, etc automatically configure and don't care RTCCTL01 = RTCMODE; // Calender mode }
こんなことで2日つぶれました。デバイスのエラッタじゃないだけよかったのですが、エラッタの多さといい、ひどいRTCバグといい、最新デバイスだけに機能や性能は良いのですが枯れてないのが不便です。
今見たらマニュアルへの記載を発見しました。これほど重要なことを割り込み要因解除の文脈でついでに書かないでほしい……。
それにしても、ネット検索してもMSP430を本格的に使用している人はほとんど見つかりませんし、TIも売る気満々な割に浸透してないし、大口以外は相手にしてないのかも知れませんがちょっとツメが甘いように感じますね。