特集5「ラズパイの電源を自在にコントロールしよう」p.81-86

2018年5月24日更新の補足

 86ページ掲載の図20の写真で接続するピンが違っておりました。本文は正しいので、本文で紹介した通り、電源スイッチのピン7のコードをラズパイの7番ピンに、ピン8のコードは11番ピンに接続してください。お詫びして訂正いたします。

特集2「ハイレゾ音楽プレーヤーを自作、ジャケット表示やリモコン操作を可能に」p.39-58

2018年3月5日更新の補足

リモコン信号をうまく登録できない場合(RAWモードによるリモコン登録の手順)

 リモコンの機種によっては、うまく信号を学習できない場合があります。特に、地デジ対応テレビ用など最近のリモコンは、コードが長くなっている関係で、学習用コマンド「irrecord」の標準動作では対応できないことが多いようです。その場合の対処方法を補足します。

 うまく学習できないリモコンは、irrecordのRAWモードで登録するといいでしょう。

 RAWモードで登録したリモコンではリピート動作(ボタンを押し続けると同じコードを送信し続ける動作)に対応できないため、例えばボリュームを上げるときに音量上げのボタンを連打する必要があるなど若干の制限が出ますが、基本的なリモコン操作に問題は生じません。

 図1にirrecordのRAWモードによる登録の流れを示します。

図1 irrecordのRAWモード

$ irrecord -n -f
(略)
Please take the time to finish the file as described in
https://sourceforge.net/p/lirc-remotes/wiki/Checklist/ an send it
to   so it can be made available to others.

Press RETURN to continue.
↑[Enter]キーを押すと数秒程度、環境雑音を測定します。
決してリモコンのボタンを押さないでください。
Checking for ambient light  creating too much disturbances.
Please don't press any buttons, just wait a few seconds...

No significant noise (received 0 bytes)

Enter name of remote (only ascii, no spaces) :remocon
↑適当な名前を入力します。誌面同様、remoconと入力したことにします。
Using remocon.lircd.conf as output filename

Now start pressing buttons on your remote control.

It is very important that you press many different buttons randomly
and hold them down for approximately one second. Each button should
generate at least one dot but never more than ten dots of output.
Don't stop pressing buttons until two lines of dots (2x80) have
been generated.

Press RETURN now to start recording.
↑[Enter]キーを押したらリモコンのボタンをランダムに1秒程度ずつ押してください。
受信すると画面のドットが描画されドットが80個になったら終わります。
Please enter the name for the next button (press  to finish recording)
PLAY
↑登録したいボタンのラベル名(誌面表参照)を入力して[Enter]キーを押します

Now hold down button "PLAY".
↑リモコンのプレイボタンを押してください。
Please enter the name for the next button (press  to finish recording)
STOP
↑次に登録したいボタンのラベル名(誌面表参照)を入力して[Enter]キーを押します

Now hold down button "STOP".
↑リモコンのストップボタンを押してください。

Please enter the name for the next button (press  to finish recording)
このような手順で18個のボタンを登録していきます。

Please enter the name for the next button (press  to finish recording)
↑18個のボタンを登録し終えたら何も入力せずに[Enter]キーを押します。

Successfully written config file remocon.lircd.conf
↑これで完了です

 カレントディレクトリーにremocon.lircd.confが作成されるので、/etc/lirc/lircd.conf.d/以下にコピーしてください。

$ sudo ./remocon.lircd.conf /etc/lirc/lircd.conf.d/

 Raspberry Piを再起動すれば登録したリモコンで操作できます。

DACボード専用システムの構成とカスタマイズのヒント

 DACボード専用システムは、本誌Part2に紹介している設定がすべて行われており、また必要なライブラリがすべてインストールされています。

 LCDの表示やMPDの制御をするメインスクリプトは/usr/local/bin/superdac.pyです。このスクリプトはsystemdによって自動起動されます(/etc/systemd/system/superdac.service参照)。

 /usr/local/bin/superdac.pyは、MPDの制御にpython-mpd2を使用しています。python-mpd2の非同期idleを使ったイベント検出などをしているので、PythonでMPDを制御したいと考えている方ならば参考になるでしょう。

 また、Alsa AudioのMixerを制御するためにpyalsaaudioを、SMBを使ってNASからカバーアートを取得するためにpysmbのSMBConnectionクラスとNetBIOSクラスを用いています。これらを利用するサンプルとしても活用していただけるはずです。

 なお、セカンダリーSDのマウントには/etc/fstabを使わずsystemdで起動させる/usr/local/bin/mmc2.pyを利用しています。/etc/fstabを用いて自動マウントさせると、nofailオプションを付けても起動に失敗する場合があるための処置です。詳しくは/usr/local/bin/mmc2.pyを参照してください。

セカンダリーSDカードのパフォーマンスについて

 LCDパネル裏のセカンダリーSDカードに関して、p.49の右段6行目で「DMA転送をサポートしてない」と書きましたが、バージョン4.1以降のカーネルにSPIのDMAサポートが組み込まれており、使用されていました。おわびして訂正いたします。

 セカンダリーSDカードのパフォーマンスが低いのはDMAとは直接的には関係がなく、バス幅が1ビットであることに加えて、バスクロックが正常に設定されない場合があることが原因だと分かりました。

 SDカードが対応できるバスクロックはカードによって異なり、基本的に自動で設定されますが、SDカードによっては非常に低いクロックが設定されてしまう場合があります。

 また、8MHzを超えるクロックを設定すると不安定になり、マウントに失敗するSDカードがあるため誌面では8MHzに設定しています。しかし、マウント後にバスクロックを引き上げることで大半のSDカードは16MHzのバスクロックに対応できることが分かりました。

 8MHz以上のバスクロックを設定するには、まずDevice Treeのspi-max-frequencyの設定を8000000から16000000に変更します(図2)。

図2 mmc_spi_cs1.dts
voltage-rangeも誌面の<3000 3500>だとエラーが出るSDカードがあるため<3000 3600>に変更しています。

/dts-v1/;
/plugin/;

/ {
   compatible = "brcm,bcm2835", "brcm,bcm2836", "brcm,bcm2708", "brcm,bcm2709";

   fragment@0 {
      target = <&spi0>;
      frag0: __overlay__ {
         status = "okay";
         sd1 {
                reg = <1>;
                status = "okay";
                compatible = "spi,mmc_spi";
                voltage-ranges = <3000 3600>;
                spi-max-frequency = <16000000>;
         };
      };
   };
};

 このDevice Treeを基に作成したDevice Tree Blobに差し替えてください(専用SDカードイメージ「superdac.zip」は差し替え済みです)。

 再起動後、/sys/kernel/debug/mmcN/iosを参照します(NはセカンダリーSDカードが認識された番号によって変わり、1または2のいずれか)。

$ sudo cat /sys/kernel/debug/mmc1/ios
clock:          16000000 Hz
vdd:            23 (3.5 ~ 3.6 V)
bus mode:       2 (push-pull)
chip select:    1 (active high)
power mode:     2 (on)
bus width:      0 (1 bits)
timing spec:    0 (legacy)
signal voltage: 0 (3.30 V)
driver type:    0 (driver type B)

 このようにclockという項目が16000000Hzになっていれば問題ありませんが、カードによっては8000000やそれ以下になってしまっていることもあります。そのような場合、次のようにして強制的にバスクロックを引き上げることができます。

$ sudo echo 16000000 >/sys/kernel/debug/mmcN/clock [Enter]

 実行後、/sys/kernel/debug/mmcN/iosを参照してクロックが変わっていることを確認してください。このようにクロックを16MHzに引き上げることで、おおむね2MB/s前後と我慢できる速度が得られるようになります。

 専用システムではPythonスクリプト/usr/local/bin/mmc2.pyでSDカードをマウント後にクロックを再設定する仕組みにしています。興味がある方は参照してください。

 なお、Class 10対応のSDカードは50MHzまで対応が可能な一方、Raspberry PiのSPIクロックは31.2MHzの設定が可能なので、Device Treeで設定するクロック上限を50MHzに引き上げてみると、さらにパフォーマンスを上げられるかもしれません。不安定になる可能性もありますが試す価値はあるでしょう。

外部システムクロックが機能しているかどうかのチェック方法

 本誌Part3で外部システムクロックの製作を解説しています。外部システムクロックが正常に機能しているかどうか調べる方法を補足します。方法は、二つあります。

 一つはカーネルメッセージをチェックする方法です。Hifiberry DAC+のドライバは外部システムクロックがないとき再生開始時に次のようなカーネルメッセージを出力します。

pcm512x 1-004d: No SCLK, using BCLK: -2

 dmesgコマンドを実行し、上記のようなカーネルメッセージが出力されているときには外部システムクロックが正常に機能していません。DACが外部システムクロックを使用して動作すると上記のメッセージが出力されなくなります。

 もう一つハード的に調べる方法もあります。Hifiberry DAC+のドライバは、48kHzサンプリングのシステムクロック(24.576MHz)が入力されないと外部システムクロックがないと判断します。そのため、44.1kHzサンプリングのデータを再生しているときにもPCM_GPIO3がHighのままになっているのならば外部システムクロックが認識されていません。

特集3「自作AI スピーカー『VoiceKit』に独自の応答を組み込む」p.59-66

2018年3月5日更新の補足情報

 本誌p.66で、Volce Kitの初期設定方法を紹介していますが、最初のコマンドを実行する前に、次のコマンドを実行して、OSを最新の状態にしてください。

$ sudo apt update && sudo apt upgrade -y

 本誌p.66の最初のコマンドは、デスクトップ画面上の「Start dev terminal」をダブルクリックして開く端末の中で実行してください。記事中のほかのコマンドも同様です。

 なお、本誌記事執筆後の2018年2月21日に、Google AIスピーカーの開発キット(Google Assistant SDK)がバージョンアップしました(0.4.2から0.4.3に更新)。最新版で試したい方は、以下を参考にしてください。

 最新版のOSイメージは、こちらからダウンロードできます。

 最新版(0.4.3)でも基本的な操作は変わりませんが、コマンドが一部変更になります。p.60中段2行目のコマンドを下記のように変更します。「python」→「python3」に変わります。

$ python3 src/assistant_japanese.py

 p.66左段の最初のコマンドは下記のように変わります。「pip」→「pip3」になります。

$ pip3 install --upgrade googleassistant-sdk[samples] googleauth-oauthlib[tool] google-assistant-library

 ただし最新版SDKでは2018年3月5日現在、本誌で紹介した「gRPC」を使ったプログラムは問題ありませんが、Google Assistant Libraryを使ったプログラムはうまく動作しなくなっています(バグ報告についてはこちらを参照)。開発キットのアップデートが待たれます。