ラベル Raspberry Pi の投稿を表示しています。 すべての投稿を表示
ラベル Raspberry Pi の投稿を表示しています。 すべての投稿を表示

2016年8月10日水曜日

Raspbian JessieがWindows用USBタッチスクリーンディスプレイに対応していた件

モンゴル方面からテクニカルな相談が相次ぐ昨今、Raspberry Piのタッチディスプレイをプロジェクタに映せないかという、検索するとよくある「それできません」な要件がありました。

いろいろ調べてみたところ、usbtouchdisplayというドライバがLinux kernel 3のどこかで入った模様をつかみ、だめもとで、Windows 10で使っている「Dell S2340T」23インチ10点マルチタッチディスプレイをUSBとHDMI接続して、Raspbianをそのまま起動してみました。

lsusbしてみた結果がこれ。
Raspbian JessieにDell S2340Tを接続してlsusb
"MicroTouch Systems, Inc"というのが見えますね。さらにDisplayLinkも見えました。いや素晴らしい。HDMIなくてもDisplayLinkに対応していればUSBだけでいけるということなんではないでしょうか(そっちも試せという声が... いやすみません)。

試しにタッチしてみました。
どうもキャリブレーションは必要なようですが、とにかく指に反応する様子は確認できました。

検索では皆さんいろいろご苦労されている様子があったので、ゆうべはずいぶん悩んで調べていたのですが、たぶん、たいていのWindows用外部ディスプレイのUSBマルチタッチは対応しているんではないかと思います。

モンゴル方面には、なにか適当なマルチタッチディスプレイとHDMIスプリッタを用意せよと連絡して完了。よかった。

ひとまず速報的にお知らせいたします。

2016年3月12日土曜日

Raspberry Pi純正7inch Touch ScreenとRaspbian Jessieへのジェスチャー機能の導入

Raspberry Pi公式7inch Touch Screenが届いたのが1月中旬だったかと思いますが、いままで多忙のため、ほったらかしにしていました。

OSも入れ替えるので、スクリーンがあったほうがよいと思い、使ってみることにしました。

まずボードを見ると、ATTINY88、つまり汎用AVRマイコンがいて、おや、と思いました。基板のパターンが見えないのでなんともいえませんが、東芝TC358762XBG DPI-DSIシリアル-パラレル変換チップとディスプレイコントローラのFT5406DQ9(フレキのなかに埋まっている)の間に入って、パラレル信号をAVRマイコンのI/Oで受けて、FT5406DQ9にSPIで画面のビットマップデータを渡す仕事をしているのかなあと思うところです。TC358762XBGの右側、Raspberry Piロゴのところで盛大にパラレルのラインが走っているのですが、スルーホールが終端になっているので、そこから基板の裏に抜けてATTINY88のI/Oに入っていると想像すると、ATTINY88とフレキのコネクタが隣り合っている理由が立つんではないか、という感じです。

あとRaspberry Piにこのボードから給電する使い方なので、電源がどうなっているのかが気になりますが、搭載されている電源チップはTIのTPS65101という液晶ディスプレイ用マルチ電圧電源チップが搭載されているだけで、Raspberry Pi基板給電についてこれといった特別な配慮はないように見えました。USB端子から給電されたものを液晶用にはこのチップで複数の電圧の電源を作って使いますが、Raspberry Pi側にはそのまま流すだけなのかなと思います。

マルチタッチのための指の座標などを扱うI2Cに関しては、Raspberry Pi A+/B+以後はDSI端子にI2Cが出ているのでそれを使うそうです。一方、Pi 1のDSIにはI2Cが含まれていないので、Raspberry PiのGPIOに配線するためのI2Cピンヘッダが出ているということのようです。販売されているキットに4色のメス-メスワイヤーがついてきて、赤と黒でRaspberry Piにこの基板から給電するような説明で、残りの3つのピンや黄と青のワイヤーの使い道について説明がないのは、それが理由のようです。つまり、Pi 1ならSCLとSDAを余った2本のワイヤーでそれぞれGPIOの物理ピン番号で5(SCL)と3(SDA)につないでタッチ機能を使えるようにする、ということ。さらに、ボード上のUSB A端子は5V出力用なので、百均の短いmicroUSBケーブルを使ってRaspberry Piに給電してあげれば、Pi 1以外ではキットに添付のワイヤーは不要になります。
ディスプレイ裏のボード部分
話が前後しましたが、接続方法はRSコンポーネンツの代理店ケイエスワイさんのページにある通り簡単で、DSIフラットケーブルの向きや裏表を間違えないことと、この手のケーブル用コネクタはプラスチックの押さえを引き出してからケーブルを差し込み、再度押し込んで固定する構造ということさえ理解していればよい、と、他のブログでもいろいろ解説されている通りです。Raspbianも最新のNOOBSでは最初からタッチデバイスを「FT5406」として認識してくれました。lsmodすると、「rpi_ft5406」というカーネルモジュールも入っています。

ということで、いきなり何も困らない感じでしたが、触ってみると困るのが右クリックがないこと。

WheezyではXの設定でEmulateButton3関係のプロパティを設定してあげれば動くようですが、Jessieではプロパティが設定されていても無視されるようでした。ここまではフォーラムの前半の議論の通りですが、次のページにあたる後半に、twofingというプログラムでジェスチャーイベントを設定してやる方法がありました。 設定手順は別スレッドに整理されていたので、こちらを参照されるとよいと思います。

「twofing」が実現するのは、以下の3つのジェスチャーのようです。
  • 2本指スクロール(タブレットと同様に、指に画面移動がついてくる動き)
  • 2本指ピンチズームと回転
  • 2本指タップによる右クリック
やってみると、狭い画面で2本指タップで右クリックというのはなかなかつらいですが、タップを使っている間に右クリックだけのためにマウスに手を伸ばすのはたいへん残念なので、それよりはよほどいいのかなと思います。

フォーラムに書かれている手順の概略をだいたいまとめると以下の通り。
  1. gitを入れる
    $ sudo apt-get install git
  2. ソースを取得
    $ git clone https://github.com/Plippo/twofing.git
  3. 必要なライブラリ取得
    $ sudo apt-get install build-essential libx11-dev libxtst-dev libxi-dev x11proto-randr-dev libxrandr-dev
  4. cd twofing; make; make install
  5. /etc/udev/rules.d/70-touchscreen-egalax.rules に以下を追記
    KERNEL=="event*",ATTRS{name}=="FT5406 memory based driver",SYMLINK+="twofingtouch",RUN+="/bin/chmod a+r /dev/twofingtouch"
  6. ~/.config/lxsession/LXDE-pi/autostart に以下を追記
    @/usr/bin/twofing
5番目はOS起動時にタッチスクリーンの入力イベントデバイスを、twofingが参照するデバイス /dev/twofingtouch に関連付ける記述で、6番目はLXDEが起動するときについでにtwofingを起動させるための記述です。

これで二本指ジェスチャーが使えるようになって、マウスがなくてもあまり困らなくなると思います。

右クリックは上部のバーですぐに確かめられます。スクロールは標準のEpiphanyブラウザで、ピンチでの拡大縮小はLibreOfficeで確認できると思います。

このあとさらにオンスクリーンキーボードもあればキーボードも不要になっていよいよタブレットということになりそうですが、LXDEデスクトップを使うには解像度が足りないので画面が狭く、ちょっと躊躇するところです。この画面サイズで指操作を考慮した特定のアプリケーションでの利用に限定するのが無難なのかと思います。研究・開発用という感じでしょうか。

2016年3月11日金曜日

Raspbian Jessie上のドリトルで日本語入力できた

昨年夏にRaspberry Piのドリトルで日本語入力しようとしたとき、Jessie+ibus-anthyではドリトルだけ日本語入力できないという問題があり、Wheezyに戻して使うということをしていました。

しかし、Raspberry Pi 3で標準搭載のWi-Fi+Bluetooth 4.1チップのドライバが、発表日である2月29日以後のRaspbianにしか入っていないような報告があり、Jessieがインストールされることが確実なため、日本語入力の方法を探しておかなければならないと思い、試してみました。

日本語入力については、検索してみるとscimを使う人、ibusを使う人、いろいろおられるようでしたが、uimを使う設定を書かれている人がいて、「あ、これは...!!」と思った次第。

具体的にはNOOBSは1.8.0でした(2016年2月29日付)が、もちろんJessieです。

RSコンポーネンツの解説にしたがって、日本語フォントを導入したあと、
$ sudo apt-get install uim uim-anthy
としました。なにやらuimのメニューアプレットが表示されましたが、日本語入力への切り替えがわかりませんでした。検索してみると、コマンドラインから「uim-pref-gtk」を起動せよとのこと。

起動すると、左の「グループ」のなかにいろいろありますが、「全体キー設定1」をみると、「Shift+スペース」がローマ字かな変換のオンオフということがわかりました。状態表示がよくわからないので「全体設定」グループの「視覚設定」→「□カーソルの側に入力モード表示」にチェックを入れて、「OK」ボタンを押し、設定変更してみたところ、たしかに、Shift+スペースで、直接入力とローマ字かな変換の表示が変化して、日本語変換できることが確認できました。

さてドリトルです。新しくインストールしたRaspbianなので、再び公式ページからダウンロードしてインストールするんですが、Jessieからは、ダウンロードフォルダの名称が「Downloads」になったんですね。Wheezyでは全角カタカナの「ダウンロード」だったので、コマンドラインからの入力に一手間入ってつらかったのですが、助かります。「dpkg -i ファイル名」でインストール、メニューからドリトルを起動しました。

日本語入力、ちゃんとできました。

最初に失敗してから半年以上経っているので、どこがどう変化してうまくいくようになったのかよくわかりませんが、いちおうuim-anthyでは大丈夫ということが確認できたので、ご報告です。

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クライアント設定をして,ひとまず完了かと思います。

2015年12月28日月曜日

温湿度気圧センサBMP280 Breakout基板について

BoschのBMP280温湿度気圧センサを使う例がいくつか紹介されていますが,試してみていくつかはまったのでメモ。

使用したのは,スイッチサイエンスさんオリジナルの「BMP280搭載 温湿度・気圧センサモジュール」であります。基板が青いので一瞬Adafruitかな?と思ってしまったのですが,Adafruitのは3.3Vレギュレータがついていて,あとピン配置も異なります。

配線ですが,使わないピンがないことに注意することが大事です。7ピンすべて,どこかにつなぐこと。具体的には,I2Cの場合,ピンを手前にしたときの並びで「SDO」を解放のまま使われている例が見られますが,これは「I2Cアドレスの選択ビット」になるので,必ずプルアップもしくはプルダウンしないと,I2Cアドレスがふらふらと変化して,変な値をランダムに出すことになります。
  • I2Cの場合,SDOはプルダウンで0x76,プルアップで0x77です。開放のままにしていると,両方のアドレスをふらふらします。
  • 右端のVioとVcoreの両方を3.3Vに接続しましょう。スイッチサイエンスのページではジャンパでつながっていると書かれていますが,手元の基板はそうなっていなくて,チップが動作しませんでした。
  • プルアップ抵抗は入れましょう。Raspberry Pi内蔵プルアップ抵抗があるからいいやと思っても,測定値がちゃんと得られていないように見えます。
それで,Arduino IDEからAdafruitのBMP280対応コードを入れると思いますが,内部でAdafruit_Sensor.hを読んでいて,これはライブラリ管理には登録されていないので,GitHubからZIPをダウンロードして,ZIPファイルからインストールする必要があります。

Raspberry Piの場合はPythonで試すと思いますが,python-smbusをパッケージマネージャ等から入れてから,Adafruit_Python_BMP280を入れることになると思います。GitHubのREADME.mdの記述通りにいろいろ入れようとすると,Python2.6が入ったりします。たぶん記述が古いので,python-smbusだけでよいはず。

あと,Adafruit_BMP280_Example.pyのなかでは,I2Cアドレスとして0x77が書かれているので,SDOピンをプルアップに変更するか,コードを0x76に書き換えるなどして,合わせる必要があります。エラーがどっと出るときは,アドレスが合わずにデバイスが見つかっていないときです。

設定ビットでは,オーバーサンプリング数やIIRフィルタの設定などします。スイッチサイエンスさんの説明がわかりやすいです。ただ,キャリブレーションの値の読み出しと計算については特に書かれていませんが,Boschのデータシートを見ると,出荷前にチップ内部のNVRAMに値が記録されているそうです。えらく大層な計算をしますが,精度を得るには必要なので,書かれている通りに補正計算ルーチンを使いましょう(もしくは使う言語に応じて移植しましょう)。固定小数点で計算する場合と浮動小数点計算する場合がありますが,精度が高々0.2%,湿度はもっと悪いのでどちらを使っても実用上の違いはないと思います。

それと,データシートを読まないと気づかないですが,湿度を得るまでのレイテンシは1秒かかります。1秒間隔で値を読みだすのはちとつらいと思います。

取り急ぎ,ご報告まで。

2015年10月27日火曜日

GoPiGoとは

Raspberry Piでロボットカー制御、というので話題らしい、「GoPiGo」のサイトをみてみました。
GoPiGo Base Kit

とても見覚えのある感じのモータとタイヤ(ちっちゃいものくらぶの通販サイト参照)でありまして、いつのまにか欧州サイト他でも見かけるようになったので、さすがともんさんお目が高いと思うわけですが、それにレーザーカットした木製もしくはアクリル筐体、そしてRaspberry Piに載せるボードなんですが、なんとArduinoでした.

GitHubに回路以外の一式が掲載されているのですが、FirmwareのなかみはArduinoのスケッチです。しかも、GPIO上のシリアルポートで通信しておりまして、おんなじこと考える人はいるもんだなあと思った次第。

セットアップはGertboard使っておりまして、これはアナログはSPIでRaspberry Piに渡すので、そのへんの違いや、モータをドライブできる回路も乗っているので、わたくしが作成した簡易基板よりは豪華。
"Red Board"
GoPiGoは、電力が必要なのは車輪のモータだけのようなので、Gertboardの簡略版と思われる一方、赤外線リモコン対応などの追加もあるようです。でもまあ、がっつりと DIP版のATmega384Pが存在感を放っているあたり、好感がもてますね:)
Base Kitのパーツ一覧
上図はBase Kitですが、車輪にとりつけるロータリエンコーダ相当の溝を切った円盤もあり、対応言語によってはエンコーダの値をみてフィードバック制御可能なようにもなっているようです。PythonだとBluez使ってBluetooth接続したPS3リモコンにも対応している模様。サンプルもたくさんありますが、個人的にはJavaやNode.jsに対応したのがえらいなと思った次第。Pythonの簡単なソケット通信サンプルもあって、ソケットからロボットカーの操作もできるようです。
Starter Kit
Starter Kitだと、超音波距離センサとその首をふるサーボモータがついてくるようです。

あとオプションでRaspberry Pi純正カメラをつけてビデオストリーミングするようなPythonスクリプトがあり、PC側でモニタしたり、Raspberry PiでOpenCVを動かして画像認識するようなデモがあったりと、PythonではI2Cインタフェースを含めていろいろな材料を提供しているようです。

YouTube動画をみる限り、なかなかきびきびと動きますね。開発はVNCとファイル共有を併用し、PC側で編集したプログラムをファイル共有でRaspberry PiのPythonで実行するのをVNCの画面から操作しています。Avahi(mDNS)も動かして、IPアドレスでなく、名前で接続できるようなこともしています。

材料は特別なものはとくにないので、Arduinoやモータドライバを含めてある程度の材料が手元にあれば、GitHubのレポジトリからほぼ同様のものを作っていけるように思いました。

ゼロから工作していく感じが学習向けだと思うのですが、日本語対応という点ではScratchがありますが、Pythonほど情報提供されていないので、Python怖くない中高生や大学生にはおすすめできるけれど、そうでない人にはまだ敷居が高いのかもしれません。

2014年7月26日土曜日

Raspberry PiのGPIOソケット直結のArduinoを自作してみた

Raspberry Piから、「Arduinoのプログラムと同じように書いて、Arduinoのシールドをそのまま使えるようにする拡張カード」は結構出ているようだ。重要なのは、Arduino用のシールドとして販売されている基板をRaspberry Piから利用するということで、Arduinoそのものが途中にいるわけではない。
商品として、せっかくのRaspberry Piの機能を犠牲にして間にArduinoをはさむような間抜けなものは出したくない、というのは当然だと思うし、使いたいのはシールドになっているセンサーその他のデバイスであってATmegaマイコンではない、のが普通だと思う。

というわけで、その「普通ではないほう」をやりました。といっても、Arduino IDEからプログラムするほうはまだできていないので、中間報告というか、ざっくり「ドリトルの教科書に書かれている、『Arduinoの利用』」がそのまま使えるようにしました、ということであります。

ドリトルはArduinoとはシリアル通信するので、Raspberry PiのGPIOにせっかく出ているいろいろな端子は全く使わず、電源とシリアルのみを使うという豪勢なんだか貧乏なんだかわからないソリューション。

回路は、Arduino Unoから電源関係とUSB関係を取り除いた、ATmega328P周辺と、レベルコンバータがわりの分圧抵抗だけという簡単構成。というか、手ハンダで受講生人数分を揃えるのに余計な作業は避けなければならないという事情。

基板は、いわゆるバニラシールド基板でよいわけだけれども、試しに秋月が扱っている長方形のユニバーサル基板(200円)を使ってみることにした。というのは、秋月オリジナルのバニラシールドは、USB B端子などにあたる部分はスルーホールにせず、SMD用パターンにして「うっかりミス」に配慮されているのだけれど、僕はArduinoそのものを作るので、基板全体を使いたいということ、特に、今年は多分間に合わないけれど、モータドライバICを載せるスペースを確保しておきたいという希望があったから。ただし、その長い部分はV字カットが基板に入っており簡単に折れるよう配慮されているので、それをまたぐようにGPIO用2x13メス端子を取り付けて折れないようにした。

ATmega328Pへのブートローダー及びドリトル用スケッチの書き込みは、手持ちのAVR ISP mkIIを使って、手持ちのUnoのATmegaを差し替えながら直接書き込んでおいた。なんだか普通じゃないと感じる人は正常で、あとで説明するけれども自作Arduino(USBなし)基板はシリアル関係で問題を起こすので、ISPから直接書き込むのがいちばん安定していたから。ブートローダーはUno用で全く問題がない。optiboot優秀です(Uno R3以後のもの)。FTDIかどうかに関係なく、きちんと書けます。

とりあえず第一号
第一号機はご覧のとおりであります。GPIOの端子を前後逆につけてしまったので、Arduino部分はRaspberry Piの基板の外に出てしまったけれど手遅れなのでこれはこのままとする感じ。

それで、何度やってもシリアル関係がどうにも正常に通信できず何日も悩んでいたのだけれど、値段をけちってセラロックにしていたのを、ふと思い立って横に作ってあったクリスタルのブレッドボード用基板をつないだらあっさり解決してしまいました。

秋月の値段ならセラロックをわざわざ選ぶ意味はないのだけれど、基板等の発注時にクリスタルを入れるのを忘れていたので、大須で調達しようとすると、国産品だと120円とかするのでひよったのが失敗の原因だったのか、なにか別の偶然だったのかはわからないわけですが、シリアルまわりで他と通信する可能性がある場合にはクリスタルを選ぶのをとりあえずおすすめしておきます。セラロックのときはFTDIとさえ通信できなかったんで、ハズレのセラロックだったのかもしれないけれど、ある種の教訓として心に刻むことにしました。

せっかくなので、ドリトルとお話ができている状態のビデオも掲載しておきます。


アナログポートにはなにもつながっていないので適当な値が出るのですが、この速度で実行できるのはOracle Java SE 8のおかげです。OpenJDKではこの3分の1以下の速度になってしまいます。

それで一応、Eagleで回路図と両面基板のレイアウトなんかもしたのでつけておきます。時間ないのにバカじゃないかと自己嫌悪するわけですが。

いま回路図みたらなんか一部壊れてますな。それはともかく、右の謎パーツは、SparkFunがEagle用ライブラリとして提供しているシールド基板でして、これを置くと、基板レイアウトのときに、シールド基板内部に部品が収まるように配置できてちょっとうれしかったりするわけです。左はGPIO端子です。GPIO 17をDTR(書き込み完了等のリセット)に使えという話なんで、そうしてます。

超適当に書いた回路図

それなりにがんばってみた基板レイアウト
GPIO用ソケットの1番ピンがへんなところに行ってますがこれは裏返したり回転したりしているうちにこうなっただけで、ワイヤの配置はたぶんあっているはずであります。

それと、受動部品とLEDがSMDになってるのはもちろんスルーホールがめんどくさいからでして、ユニバーサル基板でもこれからは手持ちのSMDパーツを使っていく予定です。ATmegaがそうなっていないのは、作った基板間違ってたとかの非常時でもCPUを救出できるようにしたかったからであります。自信あればTeensy互換(USB内蔵のATmega使用)とか余裕ぶっこきの設計にしてもいいんですけどね。

2014年7月18日金曜日

完全設定したRaspbianもしくはSDカードの内容のバックアップ方法

Raspberry Pi用に作成したSDカードだが、さまざまなカスタマイズを加えたものを増産したいという場合に、SDカード全体のイメージファイルを作成して別のカードに書く、ということを考えるかもしれない。しかし、市販されているSDカードの容量は意外と末尾が微妙に異なっており、あるカードから作ったイメージが別のカードに入らないことが往々にして生じる。
また、そもそも未使用部分が多いであろう場合に、カード全体をイメージにするのが適当なのだろうか、という素朴な疑問もある。

そこで、日本Ejectコマンド研究会会長にしてRaspberry Pi界の重鎮である、あっきいさんが書かれた、「NOOBS用カスタムOSイメージの作成」に触発を受け、実験してみたところうまくいったので報告しておく。

前提としてここでは、なにか別のSDカードに複製したい、オリジナルのSDカードがあり、さらに未使用もしくは再度利用する可能性のないSDカードがもう1枚があることを前提とした記述とする。

このためには、ext4ファイルシステムを理解するOSということで、Linuxマシンが必要となる。僕はUbuntu 14.4のマシンを用意した。

Ubuntuマシンに、オリジナルのSDカードを挿入すると、自動的に各パーティションすべてを一気にマウントしてくれる。それはつまり、bootパーティションであり、rootパーティションである。rootパーティションは、Raspbianのバージョンにも依存するかと思うけれど、6月20日版の場合、rootパーティションにはラベルがなく、 UUIDが直接マウントポイントになってしまう。

ここで、以下のようなコマンドを入力する。
# cd /home/xxxx/boot ←xxxxは自分のユーザ名
# tar cvpf ~/boot.tar .
# cd ../root  ←もしくは長いUUIDのフォルダ名
# tar cvpf ~/root.tar .
内容まるごとUbuntu側にバックアップすることになる。

次に、新しいSDカードにそれを入れたいのだが、Raspbianの設定に合ったパーティションの設定しなおしから始まる。

gpartedは、Linuxでは非常に便利な、ディスクパーティションエディタだと思う。Ubuntu側にapt-get install gpartedで入れておく。

最初はOSがSDカードをマウントした状態で、gpartedを起動する。すると、ドライブを/dev/sdbに切り替えられるので、ここでようやく[パーティション]→[アンマウント]でマウントを外してパーティション設定ができるようになる(外さなくてもできるときもあるようだけれどあまり深く調べていない)。

Raspbianのパーティション構成は、以下の通り。

  1. 先頭4MB―未使用
  2. 56MB―bootパーティション(fat16フォーマット)
  3. 残り(4GB SDカードなら、3260MB)―rootパーティション(ext4フォーマット)
  4. 未使用が若干残る
この構成でパーティションを切り直せば、新品のSDカードであってもあとは簡単だ。

バックアップした内容を、SDカードに書き込む。
# cd /media/ユーザ名/boot
# tar xvpf ~/boot.tar
# cd ../root ←もしくはUUID名。UUIDだと見づらいから、パーティションを切るときに「root」のラベルを付けておくとよいと思う。
# tar xvpf ~/root.tar
これであとは、syncでもなんでもしてSDカードをアンマウントして、Raspberry Piに挿し直せばすぐに起動することができる。おそらく、4GBより大きなSDカードに対しても有効だと思う。

2014年7月15日火曜日

Raspberry Piで、TightVNCserverの画面サイズを設定する

ノートPCをクライアントとして、Raspberry PiのTightVNCサーバに接続すると、Xvncのデフォルトジオメトリが結構大きいので、Windows 8ノートPCの安価なものだと液晶画面が1366x768というスナップ可能な最小限の画面解像度のことがあるので、縦が足りないということはよくある。TightVNCサーバを起動するスクリプト、つまり、/etc/init.d/vncserver に記述を加えることになろうかと思う。

vncserverコマンドを起動しているところ(start命令の処理内容)で、vncserverのオプションに、-geometry 800x600 などとしておき、
$ sudo /etc/init.d/vncserver restart
でよい。なお、800x600だと、シャットダウンボタンのアイコンが画面の下にぎりぎり見える程度のところに現れることがあるので、つまんで適当な位置に移動しておく。LXDEのlightdmの場合、移動前と移動後でアイコンが重なる位置にあると、ドラッグアンドドロップに勘違いされることがあるので、狙いからずれたと思ったら、いったん大きく外に出し、再度目的の場所に移動する必要があるようだ。
 
 

Raspberry PiのWiFi設定-DHCPから固定IPアドレスまで最速版

有線のLAN環境がないところでRaspberry PiのWiFiを設定する方法。いろいろ混乱があるようなので、2014年6月20日版Raspbianで最短(当社調べw)の設定手順を最短で書く。

Raspbianが起動している状態で、login: pi, Password: raspberryのデフォルトアカウントでログインしているところからはじめる。

$ sudo bash
# chmod 660 /etc/wpa_suoplicant/wpa_supplicant.comf
# wpa_passphrase SSID KEY >> $* ← SSIDもKEY(パスワード)も、特にダブルクォートなどで囲むことなく、そのまま書く。ハッシュしたほうに、それがKEYの文字として含まれしまい認証エラーになることがあるるようだ。
# vi $* ← 編集する。

内容は、以下のとおり。
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="SSID" ←コマンドで指定したSSIDが入っている。
    key_mgmt=WPA-PSK
    proto=WPA2
    pairwise=TKIP CCMP
    group=TKIP CCMP ←ここまでの4行追記
    #psk="4332221111"←コマンドで入力したまま
    psk=9a7cdfea2bbbda47edacc95b2ae7a1c..... ←長いハッシュされた鍵が生成されている  
}
複数のWiFi接続先があれば、上のwpa_passphraseコマンドでのハッシュを含むnetworkエントリ生成から、4行追記を繰り返す。

続いて、/etc/network/interfacesファイルの編集。Raspbianの設定のままではWPA2のWiFiスポットに接続しないので、それをまず直す。
auto lo

iface lo inet loopback
iface eth0 inet dhcp

allow-hotplug wlan0
iface wlan0 inet dhcp ←なぜか"manual"になっているが、素直にdhcpするように直す
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf ←wpa-roamはwpa-confにしておく
iface default inet dhcp
この状態で、
$ sudo ifdown wlan0
$ sudo ifup wlan0
するとDHCPでのアドレス取得がいつまでたっても終わらないので、迷わず上記はやらずにsudo reboot。

WPA2のSSIDと共有鍵さえ間違っていなければ接続できるはず。逆に、いくらやっても接続できないなら、記述を見なおすとか、wpa_passphraseを再度実行するのもよいかもしれない。また、WiFiドングルが2.4GHzまで対応なのか5GHz対応なのかで違ってくるので、2.4GHzまでの安いものを使うなら、WiFiスポットが2.4GHzでの接続に対応するよう設定しておく。記述は正しいと考えれれるのにつながらないならWiFiルータの再起動で解決することもある。

ここで、/etc/resolv.confの自動生成をするパッケージresolvconfを入れる。
$ sudo apt-get install resolvconf
$ sudo service resolvconf start
WiFiでDHCPにより接続できているはずなので、apt-getなども問題なくうまくいくはず。だめなら設定を見なおすとかエラーメッセージをよくみて考えるなどして解決する。ときには、WiFiルータ側を再起動する必要があるかもしれない。特に混雑しているAPは、新たに一台追加する余裕がないときがあるので、ルータ再起動でいちはやく接続を勝ち取るのは有効な戦略。

最後に、固定IPの設定に変更する。/etc/network/interfacesをそのように書きなおす。
auto lo
iface lo inet loopback
auto lo

iface lo inet loopback
iface eth0 inet dhcp

allow-hotplug wlan0
iface wlan0 inet static ←固定IP設定を宣言して、以下パラメータを入れる。
address 192.168.1.xxx ←使う予定の固定IPアドレスを書く
netmask 255.255.255.0 ←接続するネットワークの設定に合わせる
gateway 192.168.1.1 ←default routeを決めるので、ネットワークの設定に合わせる
dns-nameservers 192.168.1.1 ←/etc/resolv.confの設定にかかわる。ここではWiFiルータを指しているがいつまでも安全とはいえないので、ひとまず信頼できるDNSを書いておくのは悪くない(が、8.8.8.8は愚の骨頂だと思う)。
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp
「address」から「dns-nameservers」までの追記が正しければ、以下の手順でうまくいく。
$ sudo ifdown wlan0
$ sudo ifup wlan0
このときに、「can't read /etc/network/interfaces」などと出たら、そのファイルの記述が誤っていないか確認すべき。

あとは再起動しようがなにしようがWiFiで固定IPの設定が維持されるはず。 

2014年6月29日日曜日

Raspberry Piでドリトルを実行する(解決・追記あり)

(追記:最新のRaspbian(2014/6/20付)ではOracle JDKの7と8が最初から入っているので、以下の記述の先頭にある、apt-getでOracle版を入れる作業は不要です。2014-07-02)
(追記:Oracle Java EE 8 JDKを使うということと、RXTXが使えるようなshell scriptに訂正した。headlessとheadfulについても補足した。2014-07-01)

以前にも書いたのだけれども、教育用プログラミング言語「ドリトル」は、OpenJDK7で動作するが、いまはOracle Java EE 8がheadlessじゃなくてAWTも含む形で配布されているので、そちらを使うことにする。なので、
$ sudo apt-get install oracle-java8-jdk
でいくことにする。以前、openjdk-7-jreを入れていた人は、
$ sudo apt-get delete openjdk-7-jre
$ sudo apt-get autoremove
してから、Oracleのやつを入れることになると思う。というのも、どうも、OpenJDKでRXTXが使えているという話がなくって、Oracleのを使えという意見が散見されるから。実際には追ってないのでよくわからないけど。

ただ、Oracleので実行すると、日本語フォントが明朝になるのがどうも残念。このあたり誰か教えてほしいかもしれない。

(追記:OpenJDK-7が持っている、fontconfig.propertiesを/usr/lib/jvm/*/jre/lib以下に置いてやれば解決した。したがって、いったんOpenJDK-7を入れてから同ファイルをどこかにコピーしておき、apt-get remove後に当該の場所へ残しておいたファイルを入れてやればいいことになると思われる。なお、この設定ファイルはvlgothic, IPA, sazanamiあたりを使うので、もしこれらのフォントが入っていなければ、apt-get install fonts-ipafontなどで入れてやらなと効果が出ない。)

それで、ドリトル本体なのだが、普通にzipファイルを展開してもうまくいかないので、だいたい次のような手順をとればよいのではないかと思う。
$ cd   ←ホームディレクトリにいる。ここにダウンロードしたzipファイルを置いておく。
$ mkdir dolittle
$ cd dolittle
$ unzip ../dolittle232.zip ←適当に、その時点での最新のものを展開
$ rm -r lib* ← RXTXライブラリがIntel用なので捨てる
$ sudo apt-get install librxtx-java ← ARM版のRXTXをインストールする
それで、dolittle.shは、以下のものに置き換える。
#!/bin/sh
cd /home/pi/dolittle
java -cp /usr/share/java/RXTXcomm.jar:dolittle.jar -Djava.library.path=/usr/lib/jni -Dgnu.io.rxtx.SerialPorts=/dev/ttyAMA0 o3.UI 2>&1 /dev/null &
要するに、ドリトルを展開したディレクトリをカレントディレクトリにして、そこでjava実行し、標準エラー出力に出てくるJVMのエラーメッセージを/dev/nullに捨てるということ。

(追記:2>&1じゃないと、1って名前のファイルができますな。すみません。それと、/usr/lib/jniの下にRXTXのネイティブコードがあるんだけれど、そこをオプションで指さないとだめみたいだったので、追記しました。さらに、Raspbianの場合、シリアルポートをシステムプロパティで指定する必要があるんだそうで、この一連の作業でRXTXの問題が完全解決しました。2014-07-01)

Raspberry Piの場合、例えばArduinoを接続すると/dev/ttyACM0というデバイスができる。これは特にシステムプロパティで指定しなくてもドリトルから見つかるのだが、通信の設定が正しいかどうかは不明。デジタルもアナログも、コマンドはドリトル側から送信するのだがArduinoは正しく受け取っていないように見える。一方、GPIOに出ているシリアルポートは/dev/ttyAMA0で、これを使うと問題なくArduinoと通信することができた。

Arduinoのシリアルポートは5Vで、Raspberry PiのGPIOは3.3Vだから、直結してはいけない。正しくはレベルコンバータを通して(専用ICもあるけれどトランジスタと分圧抵抗で自作してよい)つながなければ、Raspberry Piを壊す可能性があるが、シリアルに関しては、この記事にあるように、RX端子だけ分圧するのでなんとかいけるようだ。同記事には、GPIOのシリアルポートをシリアルコンソールを解除して自由に使えるようにする設定も記述されているので参照されたい。

なお、Javaのシステムプロパティを操作しなければいけないという話は、ArduinoのサンプルJavaコードのコメントに書かれている。
(追記:今回の場合、dolittle.jarが相対パスなので、カレントディレクトリをdolittle.jarがある場所にしておかないと、headless modeという、グラフィック機能をオフにしたJVMが起動してしまうことがある。headfulかheadlessかのフラグは、システムプロパティのjava.awt.headlessに論理値で指定できるので、javaのオプションに「-Djava.awt.headless=false」を書いておけばheadlessが選ばれる可能性はなくなるが、カレントディレクトリが間違っていた場合は結局「o3.UIが見つかりません」とか「mainが見つかりません」のようなエラーになるので、よしあしではある。このへんは、Oracleのjava seにおけるheadlessについてのページに書かれている。 2014-07-01)

さらに、デスクトップにアイコンを置くために、ayumi.pngをjarから取り出しておく。
$ unzip dolittle.jar image/ayumi.png
$ mv image/ayumi.png .
$ rmdir image
で、デスクトップの設定を以下のように書いておく。ファイル名は、~/Desktop/dolittle.desktopでいいと思う。
[Desktop Entry]
Encoding=UTF-8
Version=1.0
Type=Application
Exec=/home/pi/dolittle/dolittle.sh
Icon=/home/pi/dolittle/ayumi.png
Terminal=false
Name=Dolittle
Name[ja]=ドリトル
Comment= Dolittle Programming System
Categories=Application;Education;Development;
MimeType=application/x-dolittle-program
Scratchの設定をパクらせてもらったので適当だけれど、まぁこんな感じなんではないかと思う。さらにこれをLXDEのメニューに反映させるため、
$ sudo cp dolittle.desktop /usr/share/applications
しておくと幸せな感じになるような気がします。
LXDEのメニューに追加された

ドリトル実行中


2013年9月16日月曜日

ユニバーサル基板の配線には「ポリウレタン銅線」を使え

この夏は(というかお盆前からずっと)ユニバーサル基板に手ハンダで配線ということをずっとしているのですけど、いやほんと、疲れますね。

何が面倒かというともちろん部品間の配線でありまして、従来の(論理ICやオペアンプ単品を扱うような時代)常識では、部品の足を曲げたり、ニッパで切った足を集めておいてつなぐとか、長さが足りない時はスズメッキ線で引き回すなんてことをしますよね。

スズメッキ線は銅線にスズをメッキしているだけなので、当然交差すると接触のおそれがありますから、できるだけ接触しないように気遣うとか、場合によっては基板の表裏を縫って配線をまたぐなんてことをするわけですが、やればやるほど疲れるじゃないですか。

かといって、リード線は被覆をむくのが面倒(いくら工具を使うとしても)だし、裏で引っ張れば配線山盛りになるし表に出せば美しくない仕上がりで、美観を考えつつ引き回すとかまぁ、ありえな〜い!と叫びたいです。そもそも配線が何本も重なったら、デバッグの際にどれがどこに行っているのかわかったもんでもないわけですし。(色を変える人とかいますか)

もちろん、マイコン初期世代ではワイヤーラッピングなどというある種の工芸もあったわけですが、いずれにせよソケットに多数のワイヤが巻きつきそれがあちこち交差するわけで、やっぱりワイヤ山盛り状態でなおかつその美意識が厳しく問われる世界だったような気がするわけです。

さて、それで何年か前に「TTLでマイコンを自作する」話をTwitter経由で知り合った方から、「ポリウレタン銅線がいいですよ」と言われていたのを、先日ふと立ち寄った秋葉原で思い出したわけです。なんでも、銅線にポリウレタンがコートされているだけなので、ハンダゴテで簡単に溶けて、絶縁されているので重なってもOKという。その方は、ICソケットのピンに引っ掛けるぐらいの細い線でくるくると引き回すような職人芸をお持ちとおっしゃっていたような。

ちょうどいま、Raspberry Piの拡張I/O基板を作っておりまして、スズメッキ線の限界を感じていたところなので、秋月→千石→ヒロセというコースをたどるなかで、最後にヒロセの地下にあるのを見つけた次第。店頭の方いわく、「ネットでヒロセにあるというのをきいて買いに来られる方多いですよ」とのこと。あ、そうなんですか。

ただ、その前に、「ポリウレタン線」と言ったら、「ああ、ニクロム線ですね」と軽く返さえて「え?」と。ニクロム線というと、小学校の理科なんかでモータ巻くのに使った記憶しかなくて、濃紺色の塗膜が鈍く光る銅線というイメージと、店頭にある明るい銅線のギャップに戸惑うわけです。紙やすりで塗料をはがして配線する感じ。面倒だと歯でしごいたりなかして、塗料飲み込んでるけど大丈夫かな―なんて思ったりした少年時代を思い出します。

それはさておき、いや、なんでも、いまどきニクロムを塗布するような線材は作ってないんだそうで、ポリエステル、ポリスチレン、ポリウレタンなどが主流になったから、その経緯でそれらを総称して「ニクロム線」と業界では言うらしい。へー。

というわけで買いました。0.4mm, 0.5mm, 0.6mmの3種類。いくらロジック回路とはいえ、あまり細い線は自分で取り回せるか不安だったので、どのへんが使いやすいか確認する意味でこの3種。というのも、極細のポリウレタン線のリールをお尻につけたペンを買って難儀した思い出(しかも1000円以上してすごく損した気分)がありまして。

ポリウレタン銅線
ひとことでいうなら、この0.5mmぐらいがある意味万能的な感じ。0.4mmは同じところを何本も線を通さなければいけないときに使うぐらいかな、というところ。でもってまぁ、使ってみたイメージはこんなところ。
追加の配線に使ってみた
スズメッキ線での涙ぐましい配線の末、回路図エディタの両面基板でも通せなかった線(基板を起こすならピン間に2本ぐらい通せばたぶんなんとかなるんでしょうが、手ハンダですからね)にこれを起用いたしました。これ、どこにつながっているかというと、Raspberry PiのGPIOから2個のモータドライバのロジック部分に入る線と、モータドライバから実際にモータをつなぐ端子台へつながる線のところ、それからトランジスタアレイ通したデジタル出力端子への配線です(と書いて、GPIOから直接つながっていることに気づきました…修正せねば)。ここはもう、両面駆使してなんとかモータドライバ周辺だけはなんとかなったものの、GPIOコネクタからの線が通る場所がなくて諦めていたところ。基板は秋月の両面スルーホールB基板です。なので、GPIOのコネクタのハンダは部品面に出ますから、その隣からえいやと貫通させて表で折り曲げてハンダする感じ。

使用感ですが、0.5mmはスズメッキ線ほどハンダの乗りはよくないものの、被覆が熔ければなんとかなる感じ。鉛フリーはんだをつかっているせいもあって作業性に問題があるのかもしれず、一応調温できるハンダゴテで450度設定です。なので、スズメッキ線全廃するには少し慣れが必要な印象でした。特に、短い配線は熔けたハンダに流されたりして、あららと戸惑ったりしました。

というわけで手ハンダする皆様には、ヒロセから通販で買うのをおすすめする次第ですが、名古屋の方なら、第二アメ横ビルのパーツコーナー入ってすぐ左のタケヤ電子でも扱われていましたのでどうぞ。なにより、スズメッキ線より安いのがよいです。貧乏なので10m巻きを買うわけですが、スズメッキ線だと300円ぐらい(ヒロセだと327円とか)のところ、それより100円ぐらい安かったりします。もちろん、リールで買うのもありかと。手のひらサイズで500g(グラム売り)が太さによりますが2000〜3000円ぐらい。

でももはや、Fusion PCB(香港)がある現在、ユニバーサル基板でがんばる必然性はほとんどないですよね。今後は回路図エディタでERCチェック通った基板を発注して作るつもりです。あと手ハンダも厳しいので、皆さんがやられているような、カッティングマシンでステンシル作って表面実装部品を鉄板焼きリフローするメソッドに移行していきたい感じです。

2013年7月31日水曜日

Raspberry PiでVNC(ローカルのコンソールを使用しない場合)の設定

技術評論社から出たJapan Raspberry Pi Users Groupの本にほとんど基本的なことは掲載されているので、Raspberry Piを使いはじめるにあたってはこの本を参照すればたいていのことは解決すると思うのですが、若干補足めいた話。

授業でRaspberry Piを使わせるときに問題になるのはディスプレイとキーボード・マウスということは以前書いたと思うのですが、結論はVNCということになるので、VNCサーバに何を選ぶのか、試してみた結果を書いておきます。

ちょっと検索すると、TightVNCを入れるという話がすぐに見つかります。おそらく、Raspbian wheezyデフォルトはこれということなのでしょう。TightVNCは、vncserverコマンドでコンソールを使用しないXvncサーバを立ち上げるので、HDMI等のディスプレイを接続しないPiでもログインせずに遠隔クライアントから接続できるので、なにかと都合がよさそうです。

クライアントはMac OS X版のバイナリはないようだったので、Java版を使いました。

PiはWi-Fi接続(PCIブランドのGW-USWExtremeは発熱もなく、非常に好調に通信できています)ですが、十分な速度で描画されました。普通に使ってストレスのないレベルです。

問題は、LXDE右下の赤い電源ボタン風アイコンですが、ここをクリックしても「ログアウト」しか出ないため、シャットダウンがマウス操作ではできないこと。これはまた検討することにして、別のVNCサーバを試すことにしました。

x11vncは、コンソールで起動しているXサーバのミラーリングをするVNCサーバです。ミラーリングなので、コンソール画面と完全に一致した操作ができ、つまり電源ボタンでシャットダウンができるということです。

同じTightVNCのJavaクライアントで接続しますが、描画が非常に遅く、とても同じWi-Fiの下にいるとは思えないほどのストレスがありました。ひとつには、XとXvncの2つのサーバが上がっているためのメモリ不足、もしくは(あるいはそれに重ねて)ミラーリングのためのメモリ消費もしくはCPUパワー不足があるのかもしれません。

ひとまず、x11vncは候補から外してTightVNCに戻ることにしました。

/etc/init.d/vncserverとして、起動・終了スクリプトを作成します。lightdmとntpを参考にしたので冗長かもしれないのですが、とりあえずこんな風にしてあります。

#! /bin/sh
### BEGIN INIT INFO
# Provides: vncserver
# Required-Start: $network $remote_fs $syslog
# Required-Stop: $network $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop:  0 1 6
# Short-Description: TightVNC server
# Description: Debian init script for the TightVNC server
### END INIT INFO
set -e
PATH=/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/bin/vncserver
PIDFILE=/home/pi/.vnc/vncserver:0.pid
test -x $DAEMON || exit 0
if [ -r /etc/default/locale ]; then
  . /etc/default/locale
  export LANG LANGUAGE
fi
. /lib/lsb/init-functions
case "$1" in
  start)
           log_daemon_msg: "Starting TightVNC Server: "vncserver"
           /usr/bin/sudo -u pi /usr/bin/vncserver :0 -rfbauth /home/pi/.vnc/passwd
           log_end_msg $?
  ;;
  stop)
          log_daemon_msg "Stopping VNC Server" "vncserver"
          set +e
                  /usr/bin/sudo -u pi /usr/bin/vncserver -kill :0
          set -e
          log_end_msg $?
  ;;
  status)
          status_of_proc -p "$PIDFILE" "$DAEMON" vncserver && exit 0 || exit $?
  ;;
  restart)
          $0 stop
          sleep 1
          $0 start
  ;;
  *)
          echo "Usage: /etc/init.d/vncserver {start|stop|restart|status}"
          exit 1
  ;;
esac
exit 0
このとき、先にコンソールからpiでログインしておき、vncpasswdを実行して、パスワードファイルを生成しておきます。このスクリプトで起動するvncserverが、パスワードファイルを参照するからです。

また、スクリプトを見ていただくとわかるとおり、piユーザとしてvncserverをディスプレイ番号0で起動しています。したがって、VNCクライアントからは、5900番ポートで接続し、設定したパスワードを入れればpiユーザのデスクトップ画面が現れる、という次第です。

これを、/etc/rc?.d ディレクトリ以下にリンクを張ってもらいます。
$ sudo update-rc.d vncserver start 5 2 3 4 5 . stop 1 0 1 6 .
これで、run levelが2, 3, 4, 5のときはvncserverを起動し、0, 1, 6のときには落とすようになります。つまり、通常のマルチユーザではvncserverが起動し、シャットダウンやシングルユーザモード等では落とすということになります。

2013年4月17日水曜日

RSからRaspberry Pi Type Bが届いた(梱包について)

RSから、発注していたType B基板が届いた。おなじみの、ラズベリーカラーのプラケースで梱包されていた。伝聞でしか知らなかったけれども、いまでもこのケースで出荷しているようだ。
3個注文した
いわゆる「INVALID IF SEAL BROKEN」が手前と奥の面に貼ってあり、開梱されていないことを証明している。薄い紙なので、簡単に破れるが、ケース側に粘着物は残る。ケースはやわらかい(日本語でいえばビニール風)ので、溶剤を使うとよくないかもしれない。ホームセンター等で売っているシールはがしの溶剤ならいいのかもしれない。

内部には、「Quick Start Guide」と「Regulatory Compliance and Safety Information」ということで、最低限のマニュアルシートが2枚と、導電プラスチックの袋に入った基板が入っていた。袋は密封されていないので、基板を出すのにハサミは必要ない。

箱のなかみ
ケースをじっくり眺めると、フタ側になにやら基板サイズに近いでっぱりがある。

フタ側に基板サイズのでっぱりが
試しに載せてみると、たしかに基板サイズである。

ぴったり載る
で、この写真で右側はツメになっていて、基板がひっかかる。左側は単なる高さ合わせのようだ。左側中央に突起が出ているので、SDカードがあたってしまう。したがって、上写真の向きで取り付けることが想定されているようだ。

ツメで固定される。SDカードスロット側になる

反対側は単なる台で、固定されない
載せてみたところではいい感じなのだが、やはり左側がぶらぶらなので、USBやEthernetのコネクタ側を触ると基板がずれてしまう。GPIOをいじるときはSDカード側なので、固定されていて動かないから、それでよしということなのかもしれない。

というわけで、梱包ケースもそのまま実験用や持ち運び用に使ってね、ということがわかった。なので、特にケースにこだわりがない場合は、RSから基板だけ買ってもケースつきみたいなものだと理解して、高いケースをわざわざ買わなくてもよさそうだ。

なお、element14から届いた基板はMade in the UKだったけれど、RSから届いたのはMade in Chinaだった。element14はfunnelグループ企業で中華資本だったと思っていたので、なんだか不思議。プラケースの表にもRSのパーツ番号が書かれた黄色いシールに「Made in China」と書かれている。白いほうのシールの余白は、名前とか書いておけば学校でも誰のものかわかってよいかもしれないな、と思った。

2013年4月11日木曜日

RS社のRaspberry Pi用ケース

Raspberry Piを校費で購入するとき、本学ではRSコンポーネンツとの取引があるので、途中に業者を入れなくても済むことから、RSに直接発注することにした。すると、ケースの取扱があり、クリア、ブラック、ホワイトの3色から選べるので、クリアを注文してみた。

いつも話題になるのは納期だけれども、ケースは翌日届いた。横浜市瀬谷区から。そりゃ早いわけだ。

届いたRSのケース
雰囲気はなかなかよい。上面と底面にRaspberry Piのマークが刻まれている。それから、底面だけれどもしっかりと放熱のための穴が開いている。Raspberry Piはかなり熱くなるので、密閉されたケースでは動作が不安。それに、ModMyPiのサイトでは、CPUとRAMが積み重ねられた部分(基板中央)に載せるヒートシンクも扱っているぐらいなので、こういう配慮は好印象だ。
空気穴が空いているのが好印象
ケースは上下のパーツを組み合わせる一般的なものだけれども、上と下では材質が違う。上はメラミン樹脂っぽい硬質なもの、下はやや柔らかめのプラスチックだ。
左が下の部分、右は上のカバー部分
この理由は、基板を取り付けてみるとわかる。4つのツメで基板を固定するようにデザインされている。メラミン樹脂ではちょっとした変形でも割れてしまうから柔らかくなければいけない。そして、ツメで固定されていることで、カバーをしない状態でも非常に安定している。ModMyPiの標準ケースは、ただ基板を載せるだけなので簡単に外れてしまうが、このケースでは基板がゴム足のついたプラスチック台に固定されていることで、安心して絶縁が担保された状態でケーブルのつけ外しができる。電子工作をすると、机の上は金属部品やはんだくずで散らかりがちだけれども、これなら基板の裏がそれらに接触する心配がない。
4箇所のツメで基板をがっちり固定できる
上のカバー部分は、やや背が高くなっている。カタログ写真では少々不恰好に思えたが、ひとつにはエアフローが確保できること、もうひとつは、拡張基板を載せた状態でもカバーが乗せられる空間があるということで、考慮されたデザインの結果なのだろう。
上にややゆとりがある
ちなみに、GPIOからケーブルを外に引き出す穴はあいていない。いかなるケーブルを引き出す隙間もないので、GPIOで実験するときにはカバーを外す必要がある。カバーをつけたければ拡張基板として上に載せる以外に方法はない。そして、拡張基板からも当然線を引き出すことはできないので、完結した基板でなければならない。まぁ、ほこりよけとか、持ち歩き用と考えるべきなのだろう。ただ、カバーはメラミン樹脂なので変形には非常に弱いから、このケースでバッグに他のものと一緒に入れると傷になったりヒビが入ったりするのではないかと思う。心配なら、透明な粘着シートを貼っておくのが無難ではないだろうか。

2013年3月26日火曜日

Raspberry Pi用のJVMとドリトルの動作について

Raspberry Pi搭載のセンサー付きロボットカーを構想しているところ。

ただし、本業の授業用なので、プログラミング言語としてはドリトルで、ということになる。ドリトルはJavaで記述されているので、JVMさえあればひとまずどんな環境でも起動させることはできることになっている。

一方で、Raspberry Piはメモリが512KBあるとはいえ、あくまで組み込みLinuxが主な動作環境なので、通常のJava SEが動くかどうかがはっきりしなかった。結果としては、OpenJDKであればRaspberry Piでもドリトルが通常通り使えることが確認できた。パッケージ名としては、現状ではopenjdk-7-jre。これをapt-get installするだけでいい。JVMはzeroとjamvmが入る。どちらもAWTやSwingなどX11の画面にグラフィクス描画ができ、JITも組み込まれた、ほぼJava SE互換のもの。しばらく前まではRaspberry Piの現在の基板に使われているSoCのhard floatには対応しておらず、Raspbian(Raspberry Pi用Debian)そのものがsoft floatでコンパイルされたバイナリ上でしか動作しなかったが、現在はarmhfに対応しているので通常のRaspbianからapt-getするだけでよい。

ドリトルは普通にLinux用に用意されているshell scriptから起動できる。ただし、起動まで6秒程度、また、ダイアログ等の表示がもたもたして、軽快とはいえない。zeroよりjamvmのほうがましだという説にしたがって、javaの起動オプションに「-jamvm」を加えてみたが、はっきりとわかる違いは感じられなかった。

ドリトルの特徴は日本語の命令語やパンクチュエーションが使えることにあるので日本語入力も入れておきたいところだが、これは一般的なibus-anthyを入れることで対応した。当初、英語キーボードをつないでいるせいかIMEの切り替えができないようだったが、自分の趣味でfonts-ipaex(IPAexフォント)を入れて、ibusの設定でそれを表示フォントにしたところでなぜだかうまく切り替えられるようになった。理由は追求していない。ibusの設定ファイルで肝心なものがそのタイミングで生成されたのかなにか、そんなところかと思う。

ドリトルの編集画面(プログラム記述画面)で日本語入力するが、やはり動作はもたつく。といっても、anthy自体が律速なのでしかたがない。入力が遅れてくるので先に確定をすると、確定だけが先に入って遅れてきた入力が捨てられるなど、うーむと思ってしまうところはある。ただ、授業の範囲では許容できると判断した。

OpenJDK上のドリトルの最大の問題は、やはりグラフィクスにある。定番の
カメ太=タートル!作る。
の1行を実行すると、タートルが現れるまでジャスト5秒待たされる。これはきつい。とはいえ、いったん現れたタートルを動かす分には全く遅さを感じなかったので、タートルの画像を読み込むところでの問題なのかもしれない(標準の画像はjarに同梱だがオンメモリになくてSDカードからunzipしながら読んでいるため遅くなるのかもしれない)。ロボット制御には関係なさそうなので気にしないか、オーバークロック設定をして時間を若干短縮するかは今後考えることにした。

なお、Raspberry Pi用でグラフィクスが使えるもうひとつのJVMにavianがあるが、これはフットプリント(メモリ専有量)を最小限にするためにJITを内蔵していないので、インストールして試してみたが、ひどい結果になった。起動に10秒強、タートルが現れるのもやはり10秒そこそこ、終了の際の確認ダイアログなども2秒待ちで現れるような状態で、これは全く使い物にならない。

一方、Oracleが提供しているJava ME 8のearly access版は「headless」といい、AWTやSwingは使えない。かわりにJavaFXを使えということのようだ。ただし、Raspberry Pi用のJavaFXはOpenGL ES2でフレームバッファに直接書き込む実装とのことで、X11の画面を上書きしてしまう。JVMそのものの速度、JavaFXの速度ともに十分ということなので、テレビに映し出すにはベストの選択といえるが、授業ではVNCを使ってモニタやキーボード・マウスすべて学生個人のノートPCのみで済ませるつもりなので、X11の画面転送しかできない既存のVNCの実装では対応できないし、JavaFXそのものについても知識がないので授業にはもう間に合わない選択肢となった。

OracleのRaspberry Pi用Java 8は、GPIOをフルアクセス(Serial, I2C, SPIなどを含む)できるクラスライブラリを持つとのことで、組み込みJavaならではの開発に特化した実装のようではある。

ともあれ、OpenJDK 7があれば、ドリトルの画面だけで完結するプログラムの利用には全く支障がないようだ。また、未確認だがRaspberry Piのフォーラムには、RXTXがそのまま使えるという風な記述があるので、シリアルポートでの通信もそのまま使える可能性があり、MYUロボへのプログラム転送程度ならば現状のまま動くのかもしれない。

残る問題は、GPIOのアクセスをどうするかという部分である。OpenJDKのまま正攻法でいくならば、WiringPiのJava NIO実装を用いてJavaのコードを追加するやりかたなのだろう。これはGPIOを/dev/mem経由でアクセスするとのことで、速度についての不安はまったくないように思われる。また、ArduinoのWiringクラス準拠のAPIのようだ。ただ、ドリトル本体をいじることになるのでこれがどの程度の工数になるのか僕には見積もることができない。

最も簡単なのは、Wiring Piのコマンドライン実装を呼び出す方法だが、いちいちプロセスをexecすることになるので実用性の点で不安がある。割りきってしまうならば、WiringPiのexampleにあるようにデバイスごとの専用コマンドを作り(LCDやファミコン用リモコンなどのサンプルがある)、必要に応じて呼び出すやりかたでもよいのかもしれない。ただし、汎用性はない。

いまのところ、WiringPiサーバデーモンを作り、シンプルなバイナリプロトコルを通じてやりとりできないか、ということを考えている。現在の開発バージョン2.32はKineXというKinectの骨格情報をストリームするアプリケーションからsocket経由で値を取得する実装が含まれている。そこで2.32版ドリトルにはsocket通信に関する一般的なクラスが用意されているかと期待したが、KineX専用のクラスが実装されているようで、結局ドリトルに手を入れなければならないことにはかわらないようだ。ただし、WiringPiのNIOを組み込んでしまうとドリトルでしかうれしくないが、WiringPiサーバデーモンは他の言語からも利用可能という汎用性があり、世の中のためにはなるかもしれない。どちらにするかはわからないし、外部コマンドで済ませることになるかもしれないが、いずれにせよ時間との勝負ではある。

2013年3月1日金曜日

Raspberry PiのXMBCで日本語ファイル名表示

順番が間違っているような気がするが、Raspberry Piがあり、HDMIでディスプレイにつないでXBMCメディアセンターが動いているという状態からはじめる。

SMBでWindowsマシン上にある動画ファイルのフォルダをマウントして再生しようというわけである。

XBMCはPi用LinuxであるRaspianとは別に、最小限の内容にしぼったOpenELECという組み込みLinuxの上で動くイメージファイルが配布されている。このイメージファイルで起動すると、FAT16のパーティションの次にExt4パーティションができ、そこにOpenELECが展開され、以後ここから起動する。

Raspberry PiのGPUアクセラレーションのおかげで、全く問題のない性能が出ている。ところが、ファイル名に日本語が使われていると、その部分は空白になってしまい、どれがどれだかわからないことになる。理由は簡単で、Unicodeフォントを搭載しているものの、日本語のグリフが含まれないものだけがあるからだ。

このあたりは自分でソースからビルドするならばどうにでもなるのだが、あいにく手元に適当なLinuxマシンがなく、起動しているOpenELECにsshログインしてフォントを書き込みたいということになるものの、ルートパーティションはread onlyでマウントされており、面倒だ。また、OpenELECそのものが頻繁にアップデートされていることを考えると、バックアップできない場所にはフォントを置きたくない。

手っ取り早く書き換えできるのが、メディア(動画や音声、写真など)を置く/storage以下となる。

XBMCのUIは、Skinによって全く違うものに変更できる。UIはXMLで定義されていて、画像ファイルもフォントもメッセージもすべてSkinによって置き換えができる。要するに、日本語フォントを含むSkinを自前で作り、addonとして組み込んでしまえば解決というわけだ。

ここではひとまず、その前段階として、適当なSkinをaddonとして導入し、それをsshログインした状態で書き換えて対処してみる。

オフィシャルに提供されているSkinのなかで、今回はXeeboを選んでみた。デフォルトとは大きく異なり、タッチパネルでの操作を意識したという、UIパーツのサイズが大きめで、フラットデザインのすっきりした印象のものだ。

addonは、/storage/.xbmc/addon以下に書き込まれる。Xeeboは、skin.xeeboというディレクトリ以下に展開されている。フォントは720p/fonts以下、フォントの設定は720p/Fonts.xmlに記述されている。

そこで、適当な日本語グリフを含むUnicodeフォントとして、IPAexフォントを選んでみた。IPAexゴシックを使うことにする。ファイル名はipaexg.ttfだ。そこで、
$ scp ./ipaexg.ttf root@IPアドレス:/storage
として、書き込みができる/storageのところにコピーする。その後、OpenELEC側で
# mv ~/ipaexg.ttf ~/.xbmc/addon/skin.xeebo/720p/fonts
で、所定の場所に入れてやる。ここには専用にデザインされたxeebo.ttfとxeebo-light.ttfが入っている。ファイル名を表示するのはxeebo.ttfのほうなので、ipaexg.ttfをこの名前で上書きしてもいいかもしれない。ただ、XMLファイル~/.xbmc/addon/skin.xeebo/720p/Fonts.xmlを編集して、xeebo.ttfをipaexg.ttfに置き換えるのでも同じことだ。再起動すればちゃんと日本語のファイル名が表示される。

XBMCの設定で、autoupdateするようにしていると、Skinが置き換えられてすべてが無になるかもしれない。それを避けるなら、自分で別名のテーマを作成し、zipして、/storage直下に置き直接インストールするのが無難だろう。いまのXeebo改造版をzipしてバックアップをとっておくのがいちばん簡単といえる。

ひとまず、当面の解決ということでこの項を終わる。