2016年1月16日土曜日

Raspberry Pi 2用GPIOオスメス変換アダプタ製作



RPi B+/A+以後はGPIOは40ピンになったので,B用にAdafruitから買ったコブラケーブルが使えなくなってしまいました。理由は26ピン用コネクタの両端がピンヘッダのピン間隔より広いから。「削ればまだ使えるのではないか?」と,いま気づいたけれど,ひとまず今後の課題とします。

それで,40ピンはIDEコネクタなので,画像検索してみるとIDEケーブルを使っている例が多数出てきます。

それもいいのだけれど,考えてみればブレッドボード用リード線のオスメス問題を解決したいだけなので,この方のブログエントリのように,40ピンソケットを向きあわせにはんだ付けすれば,ちと高さがアレだが十分ではないか,ということなんですね。素晴らしい発見だと思いました。

というわけで,秋月の長さを自由に切って使える2列のピンソケットが手元に常備されているので,早速取り組んでみました。実は在庫が足りなかったので,反対側は1列を重ねて,はんだ付けするのでまあいいやというやりかた。

作業は簡単で,老眼その他で目も手も怪しいのだけれど,さくさく作業が進んで,テスタで変なショートしたりずれたりしなかったか,両側にピンヘッダを差し込んで確かめてみても問題なく完了しました。よかった。

それで,このアダプタにピンの名前を印刷した紙を貼る,というアイディアをいただくことにしたのだけれど,控えめに,RPiに取り付けたときに上半分になる部分だけになるようにされていた部分,これは両幅いっぱいにして秋葉あきわさんの御札よろしく「火除け魔除けになって穴も隠れます」(牛ほめ)とするのがよいのではないかと思って,もとのodtに書かれていない,UART, SPI, I2C, PWMなど各ピンの用途を後ろに追加してみました。

スプレッドシートでどうやってぴったりのサイズに印刷できるようにするのかと思ったら,セルの高さが「0.1"」になっておりまして,印刷してみるとたしかに400milでした。幅は適当に「0.75"」にしてみましたが,あててみたらぴったり。素晴らしい。
1番ピン(奇数)側
2番ピン(偶数)側
貼り付けは,事務用のアラビアゴム糊です。一晩置いてみました。

仕上がりには満足しましたが,やっぱり紙なので保護が必要かなあと思い,透明テープを貼ろうとしたら,幅がほぼぴったりでなおびっくり。上の写真は,テープを貼ったので,はみ出したところが少し折れたりしております。ニッパで40ピンに切ったので少し長さが違っていて,カッターで削って揃えようとしたのですが,削りすぎたり足りなかったりで長さが少し違うためです。

GPIO_19に「PWM1」と書いてありますが,これはオーディオ用なんだそうです。「音声出力しないなら使ってもいいんじゃない?」とのこと。PWM2もあるけれど,それは映像用らしく,触るべきではないようです。詳しくは財団のフォーラム記事参照。モーターカー制御の予定があるので,PWMが2つとれればいいなと思って追記したんですが,使えるかどうかはためしていません。
内側はピン名が見づらいことが判明
RPi基板に載せてみました。外側(偶数ピン側)はいいんですが,内側(奇数ピン側)はとても見づらい。どうも失敗だったようです。節穴部分もへこんでしまったし... 何か埋めてからのほうがよかったんですね。パテとか。

ひとまず今回は,I2CやSPIが見えればよいということで納得することにします。いい工夫があったら,どなたかぜひ公開してください。

2016年1月9日土曜日

Raspberry Pi 2にArch Linuxを設定する

最小限の組み込みLinux環境を作るべく,Arch LinuxをRaspberry Pi 2にインストールしたので,そのメモ。

ひとまず起動用に,UHS-1 Class 10の8GBのマイクロSDカードを用意しました。Raspbianと違ってとても小さいのでこんなにいらないのだけれど,年末だったせいか,4GBは全部売り切れだったので,ひとまず最安値で。ブランドは東芝でしたが並行輸入品だそうで。

Raspberry Pi用のArch Linuxは,財団のサイトからは配布されていません。昔はみたような気がするんだけれど,とにかくいまはない。それと,イメージを書けばよいという簡単な話ではなくて,LinuxマシンでSDカードの設定をしていかなくてはいけないので,Linuxマシンが必要です。どのLinuxでもいいので,例えばUbuntuのCD-Rとか作って,CD-R起動の状態で,特にPC等へLinuxをインストールしない状態で作業してもいいんじゃないかと思います(よくわからない)。

手元にはArch Linuxで稼働しているマシンがあったので,作業はそれで行いました。

OS本体は,/rootパーティション以下を.tar.gzした状態で配布されています。また,Pi 2以外(Zeroを含む)とPi 2ではARM Coreの命令セットが違うのですが,別個に作って配布されています。

正直な話,Arch Linuxは他のディストリビューションと違って,Wikiがすべての情報源かつ,OS側に特別なサポートツールがないので,PCでArch Linuxにある程度慣れてからのほうがいいと思います。

というわけで,Wikiはこちら。

Arch Linux: Raspberry Pi

OSは,以下のページにずらっとARM向け各種が並んでいます。

 Arch Linux|ARM Downloads

Raspberry Pi 2はARMv7アーキテクチャということで,下の方に「ArchLinuxARM-rpi-2-latest.tar.gz」というファイルがあると思います。それ以外はARMv6アーキテクチャということで,上の方に「ArchLinuxARM-rpi-latest.tar.gz」というファイルがあると思います。

今回はRi 2用なので,下の方のやつをもってくるわけですが,先にSDカードの準備を含む手順があるので,その説明ページのリンクを示します。
手順はどちらも同じですが,一応Pi 2用に書かれているインストール手順に沿って書いてみます。
  1. SDカードを何らかの手段でLinuxにマウントします。USB接続のカードリーダを使うのが一般的だと思いますが,ノートブック型だとSDカードスロットがあって簡単かもしれません。そのデバイス名を見ておきます。買ってきた状態だと,FAT32でひとつのパーティションになっているはずなので,/dev/sdX1(Xは適当なアルファベット1文字)だけのデバイスに見えるはずです。僕の場合,なぜか/dev/sdg1だったので,以下,それ前提で書きます。
  2. rootになります。sudo -sでいいかな。お好みで。
    1. fdiskでパーティションを自分で切ります。# fdisk /dev/sdg
    2. 試しにpコマンドを入れると,現在のパーティションテーブルが見えると思います。これをメモリ上ですが,いったんクリアします。oコマンド。これでpすると,何もないんだよー的な数行の表示が出ると思います。続けて,nコマンドで/bootパーティション(FAT32フォーマット)を作ります。プライマリなのでpを入力し,1がデフォルト (パーティション番号1ということ)なので,そのままEnterを押してOK。続けてパーティションサイズをきかれるので,「+100M」と入力してEnterします。
    3. このパーティションをFAT32に設定するため,tコマンドを入力して,タイプにはcを入れるらしいです。これは,「W95 FAT32 (LBA)」という型に対応するようです。 心配なら,ここでpコマンドで確認してもいいと思います。
    4. 残りをext4ファイルシステムにするため,nコマンドでパーティションを追加することを指示して,プライマリp,2番目がデフォルトになっていると思うので,このままEnterを押してよいと思います。パーティションサイズは残り全部なので,そのままEnterで確定。この状態でpコマンドで確認してもいいと思います。
    5. 最後にメモリ上のパーティションテーブルを実際のSDカードに書き込みます。wコマンド。途中でわからなくなったら,wするまではSDカードは無事なので,^Cなどで中断して最初からやり直してもOK。
  3. 次に,手でファイルシステムを作ってやります。FAT32は,mkfs.vfatコマンドが必要ですが,Arch Linuxの場合,最初からは入っていません。
    # pacman -S dosfstools
    してやると入ります。
  4. # mkfs.vfat /dev/sdg1
    # mkdir /mnt/boot
    # mount /dev/sdg1 /mnt/boot
    
    パーティションが小さいので,わりとすぐに終わると思います。あと,デバイス名はくれぐれも先に調べたものに合わせてください。それと,Arch Linuxは/mntというディレクトリがあったので,そこにbootとrootを作ることにしました。お使いのLinux環境に合わせて適当に変更してください。/mnt/bootのなかみは空ですが,あとから移してきますので,マウントはしておいてください。
  5. rootパーティションのファイルシステムを作ります。ext4なのでおなじみの通り。
    # mkfs.ext4 /dev/sdg2
    # mkdir /mnt/root
    # mount /dev/sdg2 /mnt/root
    
  6. では,OS本体をもってきて,/root以下に展開します。今回はPi 2なので,そちらのイメージ。それ以外はそれなりに。
    # wget http://archlinuxarm.org/os/ArchLinuxARM-rpi-2-latest.tar.gz
    # bsdtar -xpf ArchLinuxARM-rpi-2-latest.tar.gz -C /mnt/root
    # sync
    
    wgetでとってきていますが,curlじゃなきゃやだとか思う人はcurl使ってください。ドキュメントに書いてあったのを転記しただけです。展開した後安全のためにsyncしていますが,SDカードイメージにそれなりの変更を加えているので,結構待たされます。心配になるかもしれませんが,1分ぐらいのつもりで待ちましょう。
  7. 最後に,/bootパーティションのなかみを/root/boot以下から移します。
    # mv /mnt/root/boot/* /mnt/boot
    
    ここで心配なら,再度syncしてもいいと思います。
  8. 以上でインストールは終わったので,後始末です。
    # cd /
    # umount /mnt/boot /mnt/root
    # rmdir /mnt/boot /mnt/root
    
おつかれさまでした。これで,SDカードのアンマウントも終わったので,カードはLinux PCから抜いて,Raspberry Pi 2に挿しなおしてください。

さて,以下は,Arch Linux ARM起動後の最小限の作業になると思うので, 今回はそこまでメモしておしまいにします。

最初はコンソールで作業しなければいけないので,RPi 2のUSBにキーボード,HDMIディスプレイ,Ethernetケーブルを挿して,電源を投入します。Wi-Fiしかない人は,PC用のArch Linuxのスタートアップマニュアルを参考にしてWi-Fi設定までやってください。

最初に電源を入れると,普通にLinuxの起動シーケンスが進んで,login: まできます。Arch Linux ARMのユーザ名は,Raspberry Pi版かどうかに関係なく共通で,「alarm」です。Arch Linux ARMの大文字の部分だけとってきたんだな,と思えば覚えられると思います。初期パスワードも同じく「alarm」です。

次に,rootの作業をするわけですが,驚くかもしれませんが,sudoが入っていません。よって,最初はsuする必要があります。rootの初期パスワードは「root」です。ログイン名とおんなじ。

気持ち悪いので,sudoを入れて,パスワードを変えたり,「pi」ユーザを作ったりすることにします。
$ su
Password: root
# pacman -S sudo
# vi /etc/sudoers
設定はお好みで。Raspbianに合わせるなら,
%wheel ALL=(ALL) NOPASSWORD: ALL
の行をコメントアウトするんだと思います。書き込み許可がないので,w!で強制書き込みします。

これで,sudoできるようになりましたが,alarmきもちわるいな,と思うので,ユーザ「pi」を作ってwheelグループに入れることにしました。
# useradd -G wheel -m -c "Pi User" pi
# password pi
(raspberryを2回入れる)
ついでなので,alarmはロックしてログインできなくしてしまいます。
# passwd -l alarm
rootのパスワードも変更しておきましょうか。
# passwd root
(お好みで)
 sshは最初から起動しているので,IPアドレスがわかれば,例えばいま作ったpiユーザでsshログインすることはできます。でも,やはりavahiを入れて,ホスト名を広報してもらったほうが使いやすいと思います。
# pacman -S avahi
# systemctl enable avahi-daemon
# systemctl start avahi-daemon
これで,「ホスト名.local」でつながると思います。AvahiはMac OSが採用しているmDNSなので,Windowsマシンからは,iTunes等を入れるなどしてApple Bonjourサービスが起動していないと見えません。

ホスト名は,/etc/hostnameに書かれている内容を起動時に読み込んで設定するので,お好みのホスト名に変更して再起動することで,リモートログインも気持ちよくできるんではないかと思います。初期状態では,「alarmpi」です。

最後に,SSH接続するMacなどの~/.ssh/configに,適当な設定を書いておくなど,通常のSSHクライアント設定をして,ひとまず完了かと思います。

2016年1月6日水曜日

逐次比較型A/Dコンバータの勉強

そもそもA/Dコンバータってどうやってできてるの? ADCデバイスをソフトウェアから使うとき,クロック周波数指定するけどどうして? という疑問から,いまさらながらにしくみを勉強したところ,逐次比較型A/Dコンバータって,上位ビットから順に二分探索で電圧値を求める(LSBは切り捨て)手順だということに気づいた。

説明は,第一種アマチュア無線免許の試験問題解説をされているRadio-GXKさんのサイトの記事がとてもわかりやすい。同時に解説されている二重積分形型についてもわかりやすくて,とてもよかった。

変換トリガとともにサンプルホールドした入力電圧値を,Aref電圧に対して,上位ビット(MSB)から1/2, 1/4, 1/8, ... と,求めるビット数分だけ割っていった電圧を保持するDAC(キャパシタで構成するのが一般的なようだ)を用意しておき,クロックごとに上位ビットから順に比較していき,入力電圧値がDACのそのビットの電圧値より大きければ1,小さければ0をを出力ラッチに入れると同時に,次のサイクルでDACのビット設定にも反映することをLSBまで繰り返す。

つまり,末端,葉の部分で左から0V,右に向かって2のbit数乗(8bitなら2^8=256)刻みでArefまでの値が並ぶ二分木として決定木を作り,根から左なら0,右なら1を選ぶように木をたどることでアナログの電圧値をArefの比でいくつになるのかを二進法で示した値が得られるということ。決定木は「コンピュータサイエンス・アンプラグド」の活動「20の扉」と,その解説が参考になると思う。MSBが根でLSBが葉になるところも解説の図と一致する。

なるほど二分探索ね,と思って検索してみたら,特許にそういう記述をしているものがあった。意外と大学の講義ノートのようなものには見かけないので,ソフトウェア屋さんとハードウエア屋さんの壁みたいなものを感じた次第。アルゴリズミックに動く回路なので,アルゴリズム名で説明すればいいのになあ。

一方,⊿Σ型ADCについては,日本人の発明ということで,ちょっと感動した。Wikipedia参照。PDMになる,というのは感覚的にはわかるがデジタル信号処理の理解が中途半端なので,式を見ていても,はあそうですかとしかならなかった。残念。

それで,ではPDMの結果をマルチビットにする(PCM相当に変換する)デシメーションフィルタってなんだろうと思ったら,⊿Σ変調含めて詳しく書いてあったブログがあった。このへんから入っていくと,すっきりわかるような気がする。decimationで辞書をひくと「サンプリングレートを大幅に下げる」って書いてあるけれど,高い周波数で1bit AD変換しているPDM結果を,適当な量子化ビット数に数えられるだけの間隔(例えば8bitなら,1/256)に落として,その区間における,元の周波数における1の数をカウントするという理解でよいのだろうか。密度の高低を値の大小に変換するわけだから。このページではディジタルローパスフィルタとなってて,検索してみると詳しい解説がいろいろあって,いくつか眺めているうちに,その表現に,ひとまず納得した。加算するので遅延していく(位相が遅れる)というのもアナログと同じ特性。なるほど。