2016/02/17(水)HiFiBerry DAC+ PROを買って使ってみた

※この記事で扱っているVolumio(Ver1)は古いものです。音質云々以外の、設定情報などすべて古い情報になります。


Raspberry Pi用I2S DACを買ってみました。

宣伝

外部クロック動作のオリジナル設計ラズパイ用DAC頒布中です。音質に拘った設計になっています。HiFiBerry DAC+ PROよりよっぽども音質良いです。

Raspberry PiのI2S出力

I2SとはDACチップを動作させるための通信規格でラズパイにはI2Sを直接出力する機能が存在します。ラズパイ用のI2S DACは色々発売されいて、国内でも既にいくつかでていますが、そのほとんどが水晶クロックを搭載していません。

というのも「ラズパイのI2S出力」はシステムクロック(SCLK)と呼ばれる「22.5792MHz」や「24.576MHz」のクロックを出力する機能がありません。ほとんどのラズパイ用DACは、BCLKと呼ばれる1bitごとのデータ出力クロックからシステムクロックを生成しています

PCM51xxのような特殊なDACチップを使用したボードは存在するのに、PCM179xといったよく使われるDACチップを使用したボードが存在しないのはそのためです。

またこのBCLKについても、クロックタイミングが一定ではないことが知られています。再生速度が狂う代わりに、このクロックタイミングを一定にするというパッチも同じサイトで公開されていますが、それはそれで(音が高くなったり低くなったりする)問題があります。

Raspberry Piで外部クロックを使う

あまり知られていないことですが、ラズパイのI2Sには外部クロックに同期してデータを出力するモードが存在します。説明すると大変なので詳しくはSND_SOC_DAIFMT_CBM_CFMでググってもらうとして、要するに「ラズパイにSCLKを与えるのではなく、ラズパイにBCLKやLRCLKを与えそれに同期してデータを出力してもらう」ことで、完全に正しいクロックでI2Sデータを出力することができます。

そのような機能を持つ製品として「HiFiberry DAC+ PRO」というものが存在します。

HiFiberry DAC+ PROの購入

公式サイトからカートに入れて、日本国内の住所を普通に(ローマ字で)入力するだけで手に入れることができます。送料も「たった$8」ですので、6000円ぐらいで購入できました。

注文から1週間ぐらいで届きました。

HiFiberry_DAC_plus_02.jpg

HiFiberry_DAC_plus_03.jpg

Volumioのインストール

このDACはラズパイのモデルB用です。手持ちのRaspberry Pi2 BにVolumio 1.55をインストールして早速使用してみました。

HiFiberry_DAC_volumio.png

「HiFiBerry +」を選択して早速音を再生。


……

…………

……………………なにこれ、超気持ち悪い!


音質がどうのとかそういうの以前に、揺らいでるのか、歪んでるのか、とにかく気持ち悪くてしょうがない。これはおそらくラズパイの歪んだI2Sクロックが原因です。実はHiFiberry DAC+ PROを「Volumio Ver1.55」などで使用した場合、外部クロックは有効にならないのです(参照)。*1

2016年2月時点でラズパイ用DACで外部クロックを使用しているものなんてほぼ流通してませんから、今現在ネットにあがってるラズパイ用DACの感想は、ほとんどがこの狂ったI2Sによる再生によるもので……。


よくこんなのありがたく聞けますね!(笑)


やー、ほんと、音が狂ってるせいでリアルに吐き気してきました……。こんなん聞くならPCM2704で音質のいいDACのほうが100倍も良いです。

*1 : 解決方法は下で述べます

Volumioを外部クロック対応にする

※注意: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

DVI-Dに出力

config.txtに以下を設定。

hdmi_drive=1
  • 1 : DVIモード
  • 2 : HDMIモード

コンソールのスクリーンセイバーをオフ

/boot/cmdline.txt に以下を設定。

consoleblank=0

apt-get upgradeしないなら /etc/kbd/config も修正。確認は以下。

cat /sys/module/kernel/parameters/consoleblank

ハードウェア乱数を有効化

apt-get install rng-tools 

Ras Pi3で内蔵WiFi(wlan0)有効化

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+現在、ドライバが未成熟なのか不安定。しっかりとした電源を用意しないと安定しない模様。

HiFiBerry DAC+ PROの外部クロック再生

「rpi-update」後に再起動してもう一度再生してみます。今度はきちんと外部クロックを使用した再生ができました。

さっきまでの音が嘘のように、とても綺麗な音です。

HiFiBerry DAC+ PROの回路と仕組み

基板上の役割は以下のようになっています。

HiFiberry_DAC_plus_04.jpg

  • P4ヘッダはI2S出力です。外部DACを接続できるようになっています。
  • ID EEPROMにはIDを示すシリアルROMです。27pin/28pinがID用に予約されているようですが、調べてないので詳細は知りません。

主要部分の回路接続は以下のとおりです。

HiFiberry_DAC_plus_PRO.png

仕組み

  • dacplusのi2sドライバは、i2cによってPCM5122チップをコントロールする。
  • 44.1kHzと48kHz系により、PCM5122のGPIO3/6を操作して使用する水晶クロック(SCLK)を切り替える。
  • 192/96/48などの再生周波数により、PCM5122にSCLKからBCLKおよびLRCLKを生成させる。
  • BCM2708/BCM2836は、与えられたBCLK/LRCLKに同期してI2Sデータを出力する。(SND_SOC_DAIFMT_CBM_CFMモード)

HiFiBerry DAC+には、通常の「HiFiBerry DAC+」と「HiFiBerry DAC+ PRO」が存在しますが、その判別は次の方法で行っています。

  • X44をonにし、2msウエイト後、PCM5122の94番レジスタを読み込む。
    • bit 6(CDST)が0であること(PCM5122がSCKを認識していること)を確認する。
  • X44をoffにして、同様にクロックがないことを確認する。
  • X48をonにして、同様にクロックがあることを確認する。

この3つの条件をすべて満たしたとき、HiFiBerry DAC+ PROボードとみなし、外部クロックを使用するようになります。

2016/02/10(水)銀行のRSAワンタイムキーを分解

よくあるやつです。電池切れのがありますので分解してみました。

jnb-rsa01.jpg

接着されてるかなと思ったのですが、意外や両面テープでした(液晶のまわりのみ)。それでも十分外しにくかったですけど……。

jnb-rsa02.jpg

表面。ほとんど液晶。半透明の樹脂で全体が固められていて容易に分解できないようになっています。これ以上の分解は諦めました。分解するとチップかどこか壊れるように仕組んでありそうですね。

jnb-rsa03.jpg

裏面をみると端子が生えていて、ここからシリアルナンバーなどを焼きこむ仕組みだと推測されます。

固めてある分だけ、思ったよりもコストかかってそうですね。

関連記事

2016/02/07(日)抵抗ノイズを測定したかった

抵抗のパラメーターを「抵抗値」と「消費ワット数」しかないと思ってる人が多そうなので、昔からの課題にしている「抵抗による音質の差を目で見える形にする」って方法がないかよく考えたりしてました。

それで最近組んでみたのがこんな回路。

noise_amp.jpg

音声信号を抵抗(R2,R3)に流したとき、どのような差が出てくるか約100倍に拡大して表示してみようという回路です。R10には実際には可変抵抗を使い、最後の抵抗2つで元信号との差を取って見てみようという回路でした。


しかし実際に測定してみると、差が小さすぎてぜんぜん拉致があきません(汗)。仕方ないので以前製作した差動プリアンプを使ってさらに100倍に増幅して観測。ようやくオシロスコープ表示できるように。

でもゲイン誤差やオペアンプによる歪のほうが大きいのか、カーボン抵抗とLGMFS(音質の良い金皮)で比べても観測できる誤差はありませんでした。

ゲインを変更 2016/02/09

測定したい抵抗で101分の1(1K/10)に落としてからオペアンプで101倍して、反転した信号と抵抗+半固定抵抗で合成して差を作り、それを更に100倍する回路に変更しました。

noise-amp.jpg

うまく行ったわけではないので回路図は省略します(苦笑)

ここに100Hzのsin波を入れてやります。

NA-sin100.png

これを半固定抵抗で調整してゲイン誤差を最小にします。

NA-sin2.png

これで測定準備完了。試しにホワイトノイズを再生してみます。

NA-white.png

実際に測定してみる

高周波ノイズが多すぎて大変なので、オシロスコープで2.9kHzフィルタをかけた状態で測定しました。

曲冒頭(秋月カーボン)

test1-r1.png

曲冒頭(LGMFS)

test1-r2.png

15秒ぐらい(秋月カーボン)

test2-r1.png

15秒ぐらい(LGMFS)

test2-r2.png

画像を重ねて切り替えてみると、少し秋月のほうがノイズが多いかなと思えなくはないですが、測定方法を考えると残念ながら有意な差とはいいにくいレベルです(苦笑)

いい方法思いついたら続報書きますが、このままお蔵入りの線が濃厚です(汗)

最近の調べ物

Raspberry PiのI2Sまわりを調べてるんですが、記事にして技術情報を公開している人少ないですね。アンプ系とかでもそうですけど。実物あります、売ってます。うーん、そりゃ商売としては正しいでしょうけども……。みんなケチだな(個人の感想です)。*1

頒布物は、基本的に基板ぐらいしか価値がないと思ってるので、このブログは技術情報はむしろ積極的に公開していくスタイル。その方がいろんな反応あって面白いので!(笑)

でも最近は、そもそも泥臭いことするエンジニア減ったよなーと思う今日この頃だったりもしました。

*1 : とはいえ、中にはものすごく泥臭い情報を記述している方もいて、とても参考になってありがたい限り。

2015/12/01(火)gitコマンドメモ

自分用メモ。

初期設定

$ git config --global user.name "nabe"
$ git config --global user.email "nabe-g@example.com"
$ git config --global core.editor vi
$ git config --global color.ui true 
$ git config --global core.pager 'less'
$ git config --list
$ git init
$ git clone http://------/

基本コマンド

$ git status
$ git log
$ git log --oneline
$ git log --pretty=oneline
$ git diff
$ git diff --cached
$ git rm
$ git mv

コミット

$ git commit
$ git commit --amend		直前のコミットをやり直し(上書き)
$ git reset  --soft HEAD^	ファイルをそのままでコミットの取り消し

stash

$ git stash
$ git stash pop

ブランチとタグ

$ git branch new-branch
$ git checkout branch-name
$ git merge develop
$ git tag -a v3.00-beta2 -m "Version 3.0x"
$ git push
$ git push --tags
$ git tag -d DeleteTAG
$ git push origin :DeleteTAG

リモート操作

$ git remote -v
$ git remote add [name] [url]
$ git remote add 
$ git remote rename pb paul

その他

手元の変更取り消し

$ git checkout -- .

ログ

$ git log --pretty=oneline

2015/11/09(月)IPカメラ(Webcam)リレープログラム / ip-camera-relay.pl

IP Cameraの映像を中継するプログラムです。以下の機能があります。

  • IPカメラへの自動再接続。
  • 複数のIPカメラを登録し、接続できたカメラの映像を中継する。接続が切れたら、次に接続できたカメラに接続する。
  • IPカメラに接続できていない時は、指定した画像(ブランクイメージ)を代わりに送信する。

VLCなどのIPCamストリーム受信ソフトでは、カメラとの接続が切れた場合に自動再接続を行ってくれないものがあります。またカメラと接続が切れたときにブランク画像を挿入したいこともあり、それを実現するためのソフトになります。

プログラム

Gistに置いたので、適当に拾ってください。

使い方

$ ip-camera-relay.pl -p 8888 http://(camera-ip):port/stream-path

クライアント接続用に8888番ポートを開き、指定したカメラに接続します。カメラURLはブラウザから接続するURLではなく、ビデオストリームのURLを指定してください*1

複数のカメラを指定すると、それぞれを順番に接続します。最初に接続できたストリームをクライアントに配信し、カメラとの接続が切れたら次に接続できたカメラの映像を送ります。

どのカメラとも接続できない時は、ブランク画像(標準では640x480の青い画像)を送信します。

その他オプションはヘルプを参照してください。

*1 : ブラウザから接続したりカメラの仕様書を見れば、書かれているかと思います。

WebCamのプロトコル

続きを読む