記事一覧

ArduinoとProcessingをFirmataで繋げてみました その2 加速度センサ

RoboTakaoです。ようこそ「極力ローコスト ロボット製作 ブログ」にお越しくださいました。

前回まででArduinoをProcessingからコントロールするFirmataの準備までしてきました。
今回は「Prototyping Lab」という書籍を参考に加速度センサーのレシピをためしてみます。

g_sensor08.png

元のサンプルコードはex_09_3_MeasureTilt.pdeで、加速度センサを傾けるとProcessing上うのキューブが回転するというものです。
サンプルコードはここからダウンロードできます。

加速度センサーは手持ちのMMA7361R2を使用したため、多少コードを修正しています。

変更点の概要
・MMA7361R2はスケールを1.5Gと6Gで選択できますが今回は1.5Gとしました。
 もとのサンプルコードは2.5Gに対して1.5Gに変更します。
・サンプルコードは重力加速度を1Gとしていますが、センサは1.2ぐらいで出力しているので
 X、Y、Z軸の値から角度を計算するようにします。
・加速度センサはゼロ点位置がずれているので適宜補正しました。
 (キャリブレーションすれば良いのでしょうがチップに機能があってもピンが出ていないため止めました。)

変更点の詳細

シリアルポートをArduino IDEで確認して変更

arduino = new Arduino(this, "/dev/cu.usbserial-AI045T5H", 57600);

アナログピン番号の指定追加

final int zAxisPin = 2;

計算用の変数追加

float zAxisValueLast = 338;

Arduinoで読み取る軸を追加

float zAxisValue = arduino.analogRead(zAxisPin);

スムーシングの計算式追加

float zAxisValueSmoothed
= zAxisValue * ratio + zAxisValueLast * (1.0 - ratio);
zAxisValueLast = zAxisValueSmoothed;


読み取った値をMapでスケーリング

float zAxisSinTheta
= map(zAxisValueSmoothed, 92, 583, -1.5, 1.5);


最小値 センサ中央値1.65V – 1.5G*0.8V/G*1023 = 92
最大値 センサ中央値1.65V + 1.5G*0.8V/G*1023 = 583

センサ中央値は適宜センサーのずれ量を見て修正しておく

読み値からか角度を計算して座標を変換

rotateZ(asin(xAxisSinTheta/zAxisSinTheta));
rotateX(asin(yAxisSinTheta/zAxisSinTheta));


結線

g_sensor05.png

g_sensor06.jpg

動作



うまく、センサを傾けるとキューブが回転するようにできました。

それでは今回はこの辺で失礼します!ありがとうございます

コメント

コメントの投稿

非公開コメント

プロフィール

RoboTakao

Author:RoboTakao
みなさんご訪問ありがとうございます。ロボット作りたいけどお小遣いそんなにないし、簡単でローコストでロボットを作るための私のプロジェクトを紹介します。

ウェブサイトもありますのでそちらもよろしくお願いします。
http://robotakao.jp/