先日Raspberry Pi(Model B)とArduinoをUSBシリアル接続して使っていました。USBケーブルをぶちっと抜いて電源を落としてしまったらSDカードが壊れてました。Raspbianは起動してもファイルシステムがRead-Onlyになってしまいます。マイコンはUSBケーブルを抜いて電源をぶちっと落とすので、Linuxの小型コンピューターでもついやってしまいます。Read-Onlyの修復方法をいくつか試しても直らないので結局SDカードにRaspbianを焼き直しました。Stopping SD Card Corruption on Raspberry Pi’s Raspbianなどを読んで最適な方法を見つけたいと思います。作業に困るのでJohnny-Five環境をBeagleBone Blackでも構築します。BeagleBone Blackの方がもうちょっと雑に扱えます。
ホストマシン
Firmataプロトコルを使うホストマシンをRaspberry PiからBeagleBone Blackに変更しました。ディスプレイとキーボードを使う作業マシンは同様にChromebookを使います。Arduinoとの接続はUSBシリアル変換ケーブルはBBBをケースに入れてしまいピンを刺せないので、USBテザリングをしてSSH接続します。
Chromebook
BBBにSSH接続するコマンドをスクリプトにまとめました。
#!/bin/bash
sudo sh -c 'echo 1 >> /proc/sys/net/ipv4/ip_forward'
sudo iptables -t nat -A POSTROUTING -o mlan0 -j MASQUERADE
sudo iptables -A FORWARD -i mlan0 -o eth0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o mlan0 -j ACCEPT
ssh ubuntu@192.168.7.2
croshからshellを起動します。
cntl-alt-t
を押してcroshを起動してからshellを実行します。
crosh> shell
作成したスクリプトを使いChromebookからBBBにSSH接続します。
$ bash ~/Downloads/bbb-setup.sh
BeagleBone Black
BBBにはUbuntu 14.04.1をインストールしています。
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="14.04.1 LTS, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 14.04.1 LTS"
VERSION_ID="14.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
以前どういう状態でBBBを終了していたか忘れてしまいました。一通りBBBの環境を確認してまわります。時間あわせとタイムゾーンの設定をします。
$ sudo ntpdate -b -s -u pool.ntp.org
$ sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
ルーティングテーブルを表示します。
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.7.1 0.0.0.0 UG 0 0 0 usb0
192.168.7.0 0.0.0.0 255.255.255.252 U 0 0 0 usb0
デフォルトゲートウェイがなかったら設定します。
$ sudo route add default gw 192.168.7.1
usb0のIPアドレスはstaticにします。
...
auto usb0
iface usb0 inet static
address 192.168.7.2
netmask 255.255.255.252
network 192.168.7.0
gateway 192.168.7.1
resolv.confにGoogle DNSを使います。
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 8.8.8.8
nameserver 8.8.4.4
DNSが未設定の場合は/etc/resolv.conf
は直接編集せずresolvconf
コマンドを使います。
$ sudo vi /etc/resolvconf/resolv.conf.d/base
nameserver 8.8.8.8
nameserver 8.8.4.4
$ sudo resolvconf -u
BBBからChromebookのUSBテザリングを経由して、名前解決とインターネットに接続できました。
$ ping -c 1 www.yahoo.co.jp
PING www.g.yahoo.co.jp (183.79.197.250) 56(84) bytes of data.
64 bytes from 183.79.197.250: icmp_seq=1 ttl=50 time=26.3 ms
--- www.g.yahoo.co.jp ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 26.348/26.348/26.348/0.000 ms
Johnny-Fiveの環境構築
Node.js
以前はapt-getでNode.jsをインストールしていました。パッケージを削除して最新版に入れ直します。
$ sudo apt-get update
$ apt-cache show nodejs
$ sudo apt-get remove --purge nodejs
node-armから最新版をインストールします。
$ wget http://node-arm.herokuapp.com/node_latest_armhf.deb
$ sudo dpkg -i node_latest_armhf.deb
一度ログアウトしてバージョンを表示します。
$ node -v
v0.12.0
$ npm -v
2.5.1
Gort
ArduinoのFirmataファームウェアは最新にしたばかりですが、BBBにもGortからAVRDUDEをインストールしておきます。
$ wget https://s3.amazonaws.com/gort-io/0.3.0/gort_0.3.0_linux_arm.tar.gz
$ tar zxvf gort_0.3.0_linux_arm.tar.gz
gort_0.3.0_linux_arm/gort
gort_0.3.0_linux_arm/README.md
gort_0.3.0_linux_arm/LICENSE
$ sudo cp gort_0.3.0_linux_arm/gort /usr/local/bin
$ gort --version
gort version 0.3.0
BBBにUSBケーブルで接続したArduinoのデバイスファイルを表示します。
$ gort scan serial
1 serial port(s) found.
1. [/dev/ttyACM0] - [usb-Arduino__www.arduino.cc__0043_55431313338351E0F111-if00]
USB device: Bus 001 Device 002: ID 2341:0043 Arduino SA Uno R3 (CDC ACM)
ubuntuユーザーはすでにdialoutグループに入っているので、/dev/ttyACM0
デバイスファイルの書き込み権限を持っています。
$ ls -l /dev/ttyACM0
crw-rw---- 1 root dialout 166, 0 Mar 24 12:27 /dev/ttyACM0
$ groups
ubuntu adm kmem dialout cdrom floppy audio dip video plugdev users netdev i2c xenomai weston-launch systemd-journal spi admin
BBBにAVRDUDEをインストールします。動作確認のためArduinoのFirmataファームウェアも更新します。
$ gort arduino install
$ gort arduino upload firmata /dev/ttyACM0
Lチカ
いつものようにJohnny-FiveのLチカサンプルを動かしてみます。
$ mkdir -p ~/node_apps/johnny-five-start
$ cd !$
package.jsonにJohnny-Fiveのパッケージを指定します。
{
"name": "johnny-five-start",
"version": "0.0.1",
"private": true,
"dependencies": {
"johnny-five": "0.8.49"
},
"scripts": {"start": "node app.js"}
}
app.jsは1秒間隔でLチカするサンプルです。
var five = require("johnny-five");
var board = new five.Board();
board.on("ready", function() {
var led = new five.Led(13);
led.blink(1000);
});
npmでパッケージをインストールしてサンプルアプリを実行します。Lチカが開始したのを確認できたら、Ctrl-Cを2回押してプログラムを終了します。
$ npm install
$ npm start
> johnny-five-start@0.0.1 start /home/ubuntu/node_apps/johnny-five-start
> node app.js
1427170202861 Device(s) /dev/ttyACM0
1427170202977 Connected /dev/ttyACM0
1427170206552 Repl Initialized
>>