アーカイブ
BeagleBoard(Ubuntu9.04)とArduinoやmoxaを接続し、シリアル通信でやりとりする
BeagleBoardはTIの作ったオープンソースハードウェア。こっそり春頃からいじっていたんだけど書いてなかった。
スペックに難はあるが、ディスプレイとサウンド出力つきの組み込み環境が俺でも作れるのは魅力。作品のレベルをプロダクトに近い所まで引き上げられる。
最近CRESTでのプロジェクト用にARM版Ubuntu9.04をbuildしてインストールして、Arduinoと接続する所までやったので書いておこう。
今はApache2とruby1.8.7(いずれもaptでインストールした)を使って、外付けしたArduinoとmoxaからデータを読み取っている。とりあえず大学院棟の明るさをCdSで取得してwebに公開している → http://shokai-b.mag.keio.ac.jp/light

■準備
BeagleBoardと、インストール時にパソコンとBeagleBoard間でシリアルコンソールを使うのに必要なBeagleケーブルはdigikeyで購入できる。他の部品は国内で全て入手可能。

■Ubuntu9.04をBeagleBoardにインストール
OSはSDカードにインストールする。
最初デスクトップ版をインストールしてみたけど重すぎた。AngstromやHandheld Mojoならそれなりに動くけど、フルのUbuntuデスクトップはウィンドウマネージャをtwmにしても無理だった。
今回の用途にはCUIがあれば十分だったので、最低限のbuildツールを含んだARM用イメージを作って起動させた。
なお作業はext3のファイルシステムが読み書きできる必要があるので全て別のUbuntu Desktopで行った。
- BeagleBoardにUbuntu Desktop版インストール – 橋本詳解
- BeagleBoardにUbuntuセットアップ(GUIなし)、sshdを入れてリモートログインしてみる – 橋本詳解
- いろいろインストールして環境を整える – 橋本詳解
- Rubyまわりをインストール – 橋本詳解
これで、ApacheやRubyやsshdはもちろん、emacsと各種elisp、gemとeasy_install、rails2やsinatra、mongrel_clusterとapache2でmod_proxy_balancerなどがaptとgemでさくっとインストールできた。
このへんのサーバサイドアプリ開発環境のセットアップの容易さはubuntuさすが。
処理速度は体感でDebian化した白箱より速い。SDカードなのであまりR/Wしたくないがたぶん外付けUSB-HDDも認識できるんじゃないだろうか。そうすると、クローラ作ったり簡単なbotを動かす程度の俺は自宅サーバ環境はBeagleBoardで十分という可能性もある。
処理速度とストレージ読み書きに不安はあるが小型かつバッテリーでも動かせるUbuntu Linux環境ができた。
■Arduino / moxaとの通信
BeagleBoard基板上のシリアルコンソールに使ったポートをArduinoやmoxaとの通信を使った。
本当はUSBで接続したかったけどできなかった。
FTDIチップのドライバはaptでインストールできるが、USBに接続しても認識されない(/dev/ttyUSB0に現れない)
同じバージョンのUbuntuデスクトップを別のAMD64マシンで用意して、同じようにセットアップをしたがこちらは認識した。ARM版Ubuntuが何かおかしいのかもしれない。
64bitAMDマシンではlsmodした時にFTDIチップを監視してるプロセスがいるんだけど、BeagleBoardではlsmodしてもいない。
誰かLinux詳しい人教えてくれるとうれしいです・・・
しかたないのでセットアップに使ったBeagleケーブルのオス版を作って通信に使う。
シリアルポートの9つのピンにはよく見ると番号が振ってあり、それをBeagleBoardの基板上の1~9ピン(10は無視する)と接続する。
シリアルポート側は
12345
6789
のようになるが、BeagleBoard上のコネクタは
13579
2468
となっているのでとても捻れる。気合いではんだづけする。基板上のシルク印刷をよく見てね。




これで、Arduinoの外側にあるRX / TXピンにMAX232(ADM3202)を接続すればBeagleBoardとシリアル通信できる。

ArduinoにCdS(明るさのセンサ)なんかを接続して数値をBeagleBoardに送り続ければいい。
/etc/event.d/ttyS2 を削除して再起動すると、/dev/ttyS2がシリアルコンソールではなくシリアルポートとして開ける。
screen /dev/ttyS2
でモニタできる。
UNIX系なので、シリアルポートもFileとして簡単に読み出せた。
Arduino + BeagleBoard(Ubuntu) シリアルポートを読んでたまにファイルに書き出す – 橋本詳解
通信できる手段が整えばあとは好きにできる。
Mac版Arduino IDEがlibrxtxSerial.jnilibが見つからないエラーで起動しないのを対処
起動時にこんなエラーが出た。環境はMacbook pro 17インチ OSX LeopardでXCodeなどもたぶん全部入れてあるメイン開発環境。
java.lang.UnsatisfiedLinkError: /Applications/arduino/Arduino.app/Contents/Resources/Java/librxtxSerial.jnilib: no suitable image found.

原因は64bit環境で実行されようとしているかららしい。
対処法は2つ。
■Arduinoを32bit版で起動させる
Arduino実行ファイルを右クリックして「情報を見る」
「32ビットモードで開く」にチェック入れる
(hitoriblogさんより)
■64bit版rxtxSerial.jnilibをインストールする
http://iharder.sourceforge.net/current/java/librxtxSerial.jnilib を
/Arduino 16.app/Contents/Resources/Java/
の中にある librxtxSerial.jnilib と入れ替える。
これはTechnobabble: Arduino: Problems With librxtxSerial.jnilibに書いてあった方法。
両方ともIDEの起動までは試した。
Arduinoの実機が今ないので動作は試していない。まあどっちかで動くだろう。
他にもフォーラムでも同様の質問が出ていて、こちらでは
アプリケーション/ユーティリティ/Java Preferences
でJavaアプリケーションの方でJ2SE5.0の32bit版が優先されるように上の方にもってこいという指示が出ていた。質問者はこれで解決したらしいけど俺の環境では駄目だった。
これはArduinoがJ2SE6向けに作られていないため。
Arduinoが流行っている
日本語Twitter検索でarduinoのRSSを監視しているんだけど、最近はかなりの頻度で誰かがArduinoをいじっているのでGoogle Trendsでも見てみた
まずは世界全体。2005年ごろに出てから毎年倍々になってきている。
Google Trends: arduino (世界全体)

続きを読む…
Arduino – ロータリーエンコーダ改
Arduino – ロータリーエンコーダを回すのコードがアレだったのでシンプルに書き直した。回路はそのままで。
char rot_state; // 状態 0~3
char rot_pinA = 8; // PinA of RotaryEncoder
char rot_pinB = 9; // PinB
void setup()
{
Serial.begin(9600);
pinMode(rot_pinA, INPUT);
pinMode(rot_pinB, INPUT);
rot_state = rotary_getState(rot_pinA, rot_pinB); // 現在の状態を保存しておく
}
void loop()
{
// ロータリーエンコーダの状態を監視して、PCにシリアル通信で送る
char rot_past = rot_state;
rot_state = rotary_getState(rot_pinA, rot_pinB); // 今の状態
char rot_dir = rotary_getDir(rot_state, rot_past); // 回転方向
switch(rot_dir){
case 2:
Serial.println("R"); // 右回転
break;
case 1:
Serial.println("L"); // 左回転
break;
}
delayMicroseconds(10);
}
/* ロータリーエンコーダの状態番号0~3を取得する */
char rotary_getState(char pinA, char pinB){
// 2つのピンからの入力状態をチェック
if(digitalRead(pinA)){
if(digitalRead(pinB)) return 2;
else return 0;
}
else{
if(digitalRead(pinB)) return 1;
else return 3;
}
}
/* 1つ前の状態と比較して、回転方向を取得する */
char rotary_getDir(int state, int past_state){
if((state+3+1)%3 == past_state) return 1; // 左回り
else if((state+3-1)%3 == past_state) return 2; // 右回り
return 0; // 変化無し
}
Arduino – ロータリーエンコーダを回す
Arduinoでロータリーエンコーダの回転を検出した。
ロータリーエンコーダは可変抵抗と異なり、アナログ値を出すのではなく回転方向を2byteでデジタル出力するので、無限に回転させる事ができる。マウスのホイールもロータリーエンコーダで出来ている。
Source Code (Arduino 0009 Alpha / ATmega8 16MHz)
基本的に回路もプログラムもATMega8でやったのと全く同じ方法でできた。
s.h.log: AVR – mega8でロータリーエンコーダを回す
ロータリーエンコーダーの真ん中の足をGNDに接続し、左右の足をそれぞれマイコンのピンに接続。また、左右の足とマイコンのピンの間で、10kΩの抵抗を使ってプルアップする(VCCに接続する)
まあ写真の通り。インクリメンタル型ロータリーエンコーダーは2本の線で4種類の回転状態を出力する。1クリック回す(カチッと言う)と、4種類の状態が一回りする。
とりあえず状態に0,1,2,3と名前をつけて、10ms毎ぐらいに状態を見に行くと、状態が1増えていたら右に回転、減っていたら左に回転みたいな感じでわかる。
ただし、Arduinoにはタイマーが無いので、メインループ loop() の中で delayMicroseconds(10); を呼んで、10ミリ秒を作っている。
なので、ロータリーエンコーダと同時にタイミングが難しい処理を行うとおかしくなるかもしれない。
例えば赤外線の受信とか。

最近のコメント