0%

BeagleBone BlackからArduinoをJohnny-FiveとFirmataで操作する

先日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接続します。

bbb-arduino.jpg

Chromebook

BBBにSSH接続するコマンドをスクリプトにまとめました。

~/Downloads/bbb-setup.sh
#!/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にします。

/etc/network/interfaces
...
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を使います。

/etc/resolv.conf
# 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のパッケージを指定します。

~/node_apps/johnny-five-start/package.json
{
"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チカするサンプルです。

~/node_apps/johnny-five-start/app.js
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
>>