ArduinoとProcessingをFirmataで繋げてみました その2 加速度センサ
- 2018/03/31
- 12:37
RoboTakaoです。ようこそ「極力ローコスト ロボット製作 ブログ」にお越しくださいました。
前回まででArduinoをProcessingからコントロールするFirmataの準備までしてきました。
今回は「Prototyping Lab」という書籍を参考に加速度センサーのレシピをためしてみます。

元のサンプルコードは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));
結線


動作
うまく、センサを傾けるとキューブが回転するようにできました。
それでは今回はこの辺で失礼します!ありがとうございます
前回まででArduinoをProcessingからコントロールするFirmataの準備までしてきました。
今回は「Prototyping Lab」という書籍を参考に加速度センサーのレシピをためしてみます。

元のサンプルコードは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));
結線


動作
うまく、センサを傾けるとキューブが回転するようにできました。
それでは今回はこの辺で失礼します!ありがとうございます
スポンサードリンク
MacOS 10.13.4アップデートでバックライト調整ができなくなった。MacBook early 2009 x macOS High Sierra ホーム
ArduinoとProcessingをFirmataで繋げてみました。その1 準備まで