NOBのArduino日記!

NOBのArduino日記!

趣味は車・バイク・自転車・ラジコン・電子工作です。

MARGセンサーの使い方!(ATD-M4S,GY-80)(EXCEL VBAにデータ取得編)

イメージ 3
マルチ機能(MARG)センサー(ATD-M4S,GY-80)

 「xyz角速度・xyz加速度・xyz磁力・大気圧・温度」計11軸の測定が出来ると言うマルチっぷりのMARGセンサー(ATD-M4S,GY-80)をドローンの姿勢制御用センサーとして使えないかと考えています相補フィルター?

 また人のリモコン操作(前後・左右・上下の3軸?)やGPSデータ(経度・緯度・高度・日付・時刻・・・)等も統合してデータ処理し、ドローンの各モーター(4~8個)へどの位の出力を出すかを決める制御はどうすれば良いのか考え中です

※MARG(英:Magnetic, Angular Rate and Gravity)センサーとは、3軸角速度計と3軸加速度計からなるIMU(慣性計測装置、英: inertial measurement unit)と、さらに3軸地磁気計によって構成されるマルチセンサーアレイの事。

1. 実験!

  取り敢えず万能解析ツールであるEXCEL(VBA)を使って、マルチ機能センサー測定データをリアルタイムに取得してみました!

1.1 回路
 回路接続図をFritzingを使って図1の様に描いてみました。 
 また図1の通り実際に繋げた状態を図2に示します。
イメージ 5
図1:ブレッドボード回路図

イメージ 6
図2:実際に作ったもの

1.2 Arduinoプログラム
 図2の回路で、ArduinoUNOに書き込むプログラムを図3に示します。
 内容としては、「GY80.h」ライブラリをインクルードして、sensor.begin関数を実行するだけで4つのセンサーチップとのI2C通信が開始されます。
 この状態で、「GY80_scaled val = sensor.read_scaled();」を実行する事ですべてのセンサーから値を取得します。
 測定した結果をSerial.print関数により、USB接続されたPCへ115200bpsでシリアル出力します。
#include <Wire.h>
#include <GY80.h>
GY80 sensor = GY80(); //create GY80 instance

void setup(){  // 毎秒115200ビットでシリアル通信を初期化する:
  Serial.begin(115200);
  sensor.begin();}  //センサーを初期化する

void loop(){
  GY80_scaled val = sensor.read_scaled(); //すべてのセンサーから値を取得する
  // 以下値をシリアル出力する
  //Serial.print("Mag:");    //磁力計の値
  Serial.print(val.m_x,2);
  Serial.print(',');
  Serial.print(val.m_y,2);
  Serial.print(',');
  Serial.print(val.m_z,2);
  Serial.print(',');
  //Serial.print("Acc:");    //加速度計の値
  Serial.print(val.a_x,3);
  Serial.print(',');
  Serial.print(val.a_y,3);
  Serial.print(',');
  Serial.print(val.a_z,3);
  Serial.print(',');
  //Serial.print("Gyro:");   //ジャイロスコープの値
  Serial.print(val.g_x,1);
  Serial.print(',');
  Serial.print(val.g_y,1);
  Serial.print(',');
  Serial.print(val.g_z,1);
  Serial.print(',');
  //Serial.print("P:");      //気圧の値
  Serial.print(val.p,5);
  Serial.print(',');
  //Serial.print("T:");      //気温の値
  Serial.println(val.t,1);
  //delay(250);// 安定性のための読み取り間の遅延
  }    
イメージ 1
図3:ArduinoIDEプログラムの内容

1.3 VBAプログラム
 図3Arduinoプログラムではマルチ機能センサーから取得した11軸のデータが、測定の都度PC側に出力して来ます。
 このデータをEXCEL VBAで受け取る為に、図4の通りVBAプログラムを書いてみました。
 内容としては、ArduinoUNOが接続されたCOM4ポートに115200bpsで接続し、そこに到達したデータをデリミタの手前まで読み出しEXCELシート上に出力すると言う事を300回繰り返します。
イメージ 2

Sub EasyCommTest()
'20180305 NOBのArduino日記!(マルチ機能センサーの使い方!(ATD-M4S,GY-80)データ取得編)

'初期設定
Dim Val As Variant
Dim b As Variant
Dim N As Integer
N = 300
b = Split("Magn_x,Magn_y,Magn_z,Acce_x,Acce_y,Acce_z,Gyro_x,Gyro_y,Gyro_z,pressure,temp", ",")
ec.COMn = 4 'COM4を指定します
ec.Setting = "115200,n,8,2" '通信条件(ボーレート,パリティビット数,データビット数,ストップビット数)の設定
ec.HandShaking = ec.HANDSHAKEs.RTSCTS '通信ハンドシェークの設定
ec.Delimiter = ec.DELIMs.CrLf 'データの区切りを示す文字列を設定します

'表題を入力
For j = 0 To 10
    Cells(1, j + 1) = b(j)
Next j
'受信データの表示
For i = 1 To N
    a$ = ec.AsciiLine 'デリミタの手前までの受信文字列をA$に代入します.
    ec.InBufferClear '受信バッファをクリア
    '受信データの表示
    Val = Split(a$, ",")
    For j = 0 To 10
        Cells(i + 1, j + 1) = Val(j)
    Next j
Next i

'ポートを閉じる
ec.COMn = -1 '終了処理

End Sub
図4:VBAプログラムの内容

1.4 実験!
 と言う事で準備が整いましたので図3プログラムを書き込んた図2回路をPCに接続し、EXCELVBAを開いて図4VBAプログラムを実行してみた状態を動画1に示します
動画1:プログラムの実行結果

2. まとめ

 良い感じにマルチ機能センサーデータがEXCELシートに取得出来ました!
 これで後は取得したデータをEXCELで自由に処理出来ます!

イメージ 1イメージ 3
励みになりますのでよければクリック下さい(^o^)/