arduinoの最近のブログ記事
さて、こんばんわ。
今日は頼まれことでmax2arduinoを久しぶりにぶり返してみる。
内容はサーボ動くんかい!
という感じです。
早速やってみよう!と思った矢先。
あ、Arduinoソフトウェアが新しくなってる!!というかpackageが
UNO!
Arduino UNO!
A UNO!
という事で買いました。
いいですね。昔のタバコみたいなこのパッケージ、よしよし。
じゃあ、やろうじゃないの。
まず情報によると、
ここから maxuino-zipを手に入れます。
そしてupしてなかったarduino-0021を手に入れインストール。
じゃあやりますか。
まずこれを使うには StandardFirmata をarduinoの中にいれて、(arduinoからfile/examples/firmata/standardFirmata)
サーボつけて起動!
maxuino07はUIもわかりやすくて比較的簡単に出来そう!!
って思っていたら。。。
arduino UNOではどうもStandardFirmataのverが2.2じゃないといけないぽいらしい。。。そしてそんなのが出てない。。
こまった。
どうしたよ。。
まぁ
前のArduinoで試してみっか!と
できたよ!
わーい!ギャンギャン動いておりますがな!
はい、おわり!
使用するもの:
*
XBee 802.15.4
*
XBee Explorer USB
*
Arduino XBEE Shield
*
Arduino Diecimila
*
3軸加速度センサ「KXM52-1050」
環境: Windows Vista
取り敢えず通信している様子が見たい
ここではArduino 3軸加速度センサで行った3軸加速度センサを用いたシリアル通信をXBeeで無線化する実験を行う。 準備 XBee 802.15.4 を XBee Explorer USBに取り付ける。こちらは受信側となる。 XBee Explorer USBにUSB(Mini-B)オスを接続する。 次に送信側のArduino XBEE Shield と Arduino Diecimila の準備 こちらは発信する側として使うので加速度センサをつなげる。 加速度センサのつなぎ方は↓の通り
Arduino XBEE Shieldを取り付ける前に5VとGNDにジャンパーワイヤを差し込んでおく。 アナログ入力は0番ピンと1番ピンを使用した。 Arduino XBEE Shieldの2つのジャンパーピンは「USB」と印字してる方に付ける。 USBケーブルを接続し、プログラムを書き込む。
Arduinoのコード Arduino 3軸加速度センサで使ったプログラムをそのまま使用。 void setup(){
//シリアル通信開始
Serial.begin(9600);
}
void loop(){
//2つの値をアナログ入力で読み込む
int x=analogRead(0);
int y=analogRead(1);
if(Serial.available()>0){
//Xの値を出力
Serial.print(x,DEC);
//値と値の間に区切りを入れる
Serial.print(",");
//Yの値を改行して出力
Serial.println(y,DEC);
//合図用データを読み込みバッファを空にする
Serial.read();
}
}
書き込みが済んだらArduino XBEE Shieldの2つのジャンパーピンを「XBEE」と印字してる方に付け変える。
USBケーブルの接続を外し、電源アダプタをつなげる。
Processingのコード
Arduino 3軸加速度センサで使用したコードとほぼ同じ。シリアルポートの指定を変更する。
import processing.serial.*;
Serial port;
//読み取り値の変数
int x,y;
//X軸-1G時316、+1G時756であることから
//X軸のオフセット値
int x_offset=536;
//X軸の振り幅(-1G〜0G又は0G〜+1G)
int x_range=220;
//Y軸-1G時271、+1G時711であることから
//Y軸のオフセット値
int y_offset=496;
//Y軸の振り幅(-1G〜0G又は0G〜+1G)
int y_range=220;
//角度(ラジアン)の変数
float radX,radY;
float filterX,filterY;
void setup(){
//3D画面サイズ400×400
size(400,400,P3D);
//シリアルポート設定
port = new Serial(this,"COM4",9600); //XBee Explorer USBと接続している方のシリアルポートを指定する。
//念のためバッファを空にする
port.clear();
//「10」(ラインフィード)が来る度にserialEvent()作動
port.bufferUntil(10);
//図形塗り面なし(ワイヤフレーム描画)
noFill();
}
void draw(){
//背景色を白
background(255);
//3D立体の座標を画面中央、-100奥に配置
translate(width/2,height/2,-100);
radX=2.0*x*PI/1023;
radY=2.0*y*PI/1023;
//センサX軸の角度は3D立体のX軸の角度に対応
//センサY軸の角度は3D立体のZ軸の角度に対応
//角度をそれぞれ代入
rotateX(-radX);
rotateZ(radY);
//直方体を描画
box(200,30,100);
}
//シリアル通信
void serialEvent(Serial p){
//文字列用変数を用意し、
//「10」(ラインフィード)が来るまで読み込む
String stringData=port.readStringUntil(10);
//データが空でないとき
if(stringData!=null){
//改行記号を取り除く
stringData=trim(stringData);
//コンマで区切ってデータを分解、整数化
int data[]=int(split(stringData,','));
//データ数が2個のとき
if(data.length==2){
//データの値を代入
x=data[0];
y=data[1];
//合図用データ送信
port.write(65);
}
}
}
//マウスボタンを押して通信開始
void mousePressed(){
//合図用データ送信
port.write(65);
}
図形を左クリックするとXBee間の通信が始まる。 XBee Explorer USB のRSS が点灯、 TX と RX が点滅する。 発信側の加速度センサを傾けると受信側のXBeeで変数x,yの値を受取り、processingで描いた図形も傾く。
環境
MacOS10.4.11
1.5GhzPPC
http://www.arduino.cc/playground/Interfacing/MaxMSP
のサイトより
SimpleMessageSystemというファイルをダウンロードする。
http://www.arduino.cc/playground/uploads/Code/SimpleMessageSystem.zi
解凍後、フォルダごと
app \ arduino \ hardware \ libraries \ SimpleMessageSystem
となるように入れる。
その後、arduinoを起動。
File > examples に SimpleMessageSystemがあるかを確認し、
実行して出てきたプログラムをarduinoに書き込み
以下プログラム
オブジェクト内のserialを書き換える。
これでmax上のトグルからpin13のLEDが制御できれば成功。
*これでarduinoが認識しない場合、arudinoのプッシュスイッチを押す事で認識するはず。
〜改良パッチ編〜
先ほど使用したmaxのパッチの改良版が以下からダウンロードできる。
http://blog.soundsorange.net/category/gear-hardware/
ダウンロードしたフォルダ内のファイルを
libraries \ SimpleMessageSystem\MaxMspExample
内に上書きして保存
SimpleMessageSystem.mxbを開き、先程の要領でserialを書き換える。
*なおサンプルファイルのpin13を光らせるオブジェクトの書き方が間違っているので修正。
#includevoid setup() { 200 with the USB version, that's 12x faster Serial.begin(9600); } void loop() { if (messageBuild() > 0) { switch (messageGetChar()) { case 'r': readpins(); break; case 'w': writepin(); } } } void readpins(){ switch (messageGetChar()) { case 'd': messageSendChar('d'); for (char i=2;i<14;i++) { messageSendInt(digitalRead(i)); } messageEnd(); break; case 'a': messageSendChar('a'); for (char i=0;i<6;i++) { messageSendInt(analogRead(i)); } messageEnd(); } } void writepin() { int pin; int state; switch (messageGetChar()) { case 'a' : pin = messageGetInt(); state = messageGetInt(); pinMode(pin, OUTPUT); analogWrite(pin, state); break; case 'd' : pin = messageGetInt(); state = messageGetInt(); pinMode(pin,OUTPUT); digitalWrite(pin,state); } }
書き込みに成功したら、 libraries \ SimpleMessageSystem\MaxMspExample\SimpleMessageSystem_analogin.mxb を開く。
maxwindow にエラーが表示されている場合、 printボタンを押しserialを確認。
この改良パッチによってdigtal inにも対応できるようになった。
