2012年3月4日日曜日

シリアル通信で255より大きい数字を送る

3軸加速度センサーを使ってみる のエントリーでArduinoにつないだ3軸加速度センサーでアナログ値から加速度、傾斜度を計算してそのままシリアルで送信、モニターするところまでしました。
今度はProcessingでデータを受信し、3Dで描画したオブジェクトを加速度に応じて揺らしたり傾けたりしようとしましたがつまずいた点が。
Arduino側は以前に書いた アナログ入力値0~1023を0~255にマッピング
A0 =map(A0,0,1023,0,255);
し、
Serial.write(A0);
で1バイトで送信できていたのですが、
その値から加速度、傾斜度をProcessingで計算すると解像度が1/4になるので 、どうしようかなと思ったわけです。



まずArduinoで計算した浮動小数点の値を送る方法を調べている時にわかった点。
Serial.print(1.123456);
で送信すると "1.12" に切り捨てられること。
桁数を増やすには
Serial.print(1.123456,6);
で "1.123456"が送信できる。
参考:Arduino 日本語リファレンス
(送信バイト数が大きくなり効率悪そう?)

マイコンでの浮動小数点の計算は遅くなるらしいこと。
→Arduino側での計算は最小限にして、Processing側で計算させる。
→計算前のどの値を送るのか?
→アナログ入力値(0~1023)をそのまま送ろう。

参考:建築発明工作ゼミ2008 Arduino-Processing シリアル通信3
"950"の場合、"3"と"182"の2バイト(256x3+182を意味)に分解して送信する方法。

参考:ArduinoとProcessingの連携2:大きな値を送信する、データの流れを視覚化する
数値を16ビットの2進数に変換して上位8ビット、下位8ビットに分けて2バイトで送信する方法。

今回はこの方法でリンク先の送受信のスケッチを使います。
ただArduino側のスケッチで、Arduino 1.0では
24行 Serial.print(val[i] >> 8, BYTE);
26行 Serial.print(val[i] & 255, BYTE);
で、サポートされていないとエラーが出たので
24行 Serial.write(val[i] >> 8);
26行 Serial.write(val[i] & 255);
と変えました。
Processing側のスケッチに3Dのオブジェクトを動かすスケッチを付け加えていきたいと思います。

環境:Arduino Uno R3、Arduino 1.0、Processing 1.5.1



0 件のコメント:

コメントを投稿