マルチ機能(MARG)センサー(ATD-M4S,GY-80)
※MARG(英:Magnetic, Angular Rate and Gravity)センサーとは、3軸角速度計と3軸加速度計からなるIMU(慣性計測装置、英: inertial measurement unit)と、さらに3軸地磁気計によって構成されるマルチセンサーアレイの事。
1. 「GY80.h」サンプルプログラム
以下「GY80.h」ライブラリを使ったマルチ機能センサー(ATD-M4S,GY-80)とデータの送受信を行うためのサンプルプログラムです
#include <Wire.h>
#include <GY80.h>
GY80 sensor = GY80(); //GY80インスタンスを作成する
void setup(){
Serial.begin(9600); // 毎秒9600ビットでシリアル通信を初期化する
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);} // 安定性のための読み取り間の遅延
#include <GY80.h>
GY80 sensor = GY80(); //GY80インスタンスを作成する
void setup(){
Serial.begin(9600); // 毎秒9600ビットでシリアル通信を初期化する
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:サンプルプログラム
※プログラムはコチラを参考にさせて頂きました
2. 初期設定
2.1 ライブラリ呼出し
最初に「GY80.h」ライブラリを呼び出す事で以下の機能が利用可能になります。
#include <GY80.h>
2.2 インスタンス作成
GY80インスタンス(ここではsensorという名前)を作成します。
GY80 sensor = GY80();
2.3 初期化
センサーを初期化します。
sensor.begin();
2.4 フルスケール範囲
GY80_scaleタイプより、各センサーから得られた値をスケーリングする方法を細かく設定出来ます。
デフォルト(def)から変更しない場合は何もしません。
詳細については表1を参照下さい。
表1:GY80_scaleタイプ一覧
項目 | 内容 |
磁力計フルスケール範囲を設定する[μT]
例:void m_set_scale(uint8_t scale);
|
GY80_m_scale_88
GY80_m_scale_130
GY80_m_scale_190
GY80_m_scale_250
GY80_m_scale_400
GY80_m_scale_470
GY80_m_scale_560
GY80_m_scale_810 //(def)
|
加速度計フルスケール範囲をGで設定する
例:void a_set_scale(uint8_t scale);
|
GY80_a_scale_2
GY80_a_scale_4
GY80_a_scale_8
GY80_a_scale_16 //(def)
|
測定周波数を設定する
例:void a_set_bw(uint8_t bw);
|
GY80_a_bw_3200 //1600Hz
GY80_a_bw_1600 // 800Hz
GY80_a_bw_800 // 400Hz
GY80_a_bw_400 // 200Hz
GY80_a_bw_200 // 100Hz
GY80_a_bw_100 // 50Hz
GY80_a_bw_50 // 25Hz
GY80_a_bw_25 // 12.5Hz
GY80_a_bw_12_5//6.25Hz //(def)
GY80_a_bw_6_25 // 3.13Hz
GY80_a_bw_3_13 // 1.56Hz
GY80_a_bw_1_56 // 0.78Hz
GY80_a_bw_0_78 // 0.39Hz
GY80_a_bw_0_39 // 0.20Hz
GY80_a_bw_0_20 // 0.10Hz
GY80_a_bw_0_10 // 0.05Hz
|
ジャイロスコープのスケールをdpsに設定します。
例:void g_set_scale(uint8_t scale);
|
GY80_g_scale_250
GY80_g_scale_500
GY80_g_scale_2000
|
2.5 変数の型
GY80の各タイプの構造体に使用されている変数の型は表2の通りです。
表2:変数の型一覧
項目 | 内容 |
GY80_scaled |
float a_x;
float a_y;
float a_z;
float m_x;
float m_y;
float m_z;
float g_x;
float g_y;
float g_z;
float p;
float t;
|
GY80_raw |
int16_t a_x;
int16_t a_y;
int16_t a_z;
int16_t m_x;
int16_t m_y;
int16_t m_z;
int16_t g_x;
int16_t g_y;
int16_t g_z;
uint32_t p;
uint16_t t;
|
GY80_single_raw |
int16_t x;
int16_t y;
int16_t z;
|
GY80_single_scaled |
float x;
float y;
float z;
|
3. 測定
3.1 測定(スケーリングされた値)
GY80_scaledタイプより、すべてのセンサーからスケーリングされた値を取得する例です。
詳細については表3を参照下さい。
GY80_scaled val = sensor.read_scaled;
表3:GY80_read_scaledタイプ一覧
項目 | 内容 |
GY80_scaled read_scaled(); | すべてのセンサーからスケーリングされた値を返す。 |
GY80_single_scaled m_read_scaled(); | 磁力計からのスケーリングされた値をmicroTesla [μT]で返す。 |
GY80_single_scaled a_read_scaled(); | G、1G = 9.81m / s2でスケールされた加速度計の値を返す。 |
GY80_single_scaled g_read_scaled(); | dps、6dps = 1rpmでスケールされたジャイロスコープの値を返す。 |
float p_read_scaled(); | バール(100kPa/bar)の圧力値を返す。 |
float p_read_altitude(); | 高度をmで返す - 正確ではなく、気圧が時間と共に変化するので、高度差を測定するためだけに短時間でよく使用される。 |
float t_read_scaled(); | 温度を摂氏で取得した値を返す。 |
3.2 測定(生データ)
GY80_rowタイプより、すべてのセンサーから生データを取得する例です。
詳細については表4を参照下さい。
GY80_raw val = sensor.read_raw;
表4:GY80_rowタイプ一覧
項目 | 内容 |
GY80_raw read_raw(); | すべてのセンサーから生データを返す。 |
GY80_single_raw m_read_raw(); | 磁力計から生データを返す。 |
GY80_single_raw a_read_raw(); | 加速度計から生データを返す。 |
GY80_single_raw g_read_raw(); | ジャイロスコープから生データを返す。 |
uint32_t p_read_raw(); | 気圧計から生データを返す。 |
uint16_t t_read_raw(); | 温度計から生データを返す。 |
4. まとめ
「GY80.h」ライブラリは、デフォルト設定で良ければ図1サンプルプログラムの様にシンプルにプログラムが書けてとても便利です!