M5Stackと磁気センサを接続してみたよ
こんにちは!
棚の中に眠っていた、Raspberri Pi2やPi3やM5Stack、ESP等々、、、を生き返らせる試みを行っています。
今日は眠っていたM5Stackと、市販の磁気センサを接続してみます。
Grove系で提供されているようなM5Stack専用センサではないので、自分でM5Stackの端子に間違いなく接続するところから始めます。
※使用しているホストPCはWindows11です。
※M5Stackを初めて使う場合、ハードウェアによってはWindowsPCに専用ドライバのインストールなど必要かと思いますが、割愛します。
1.対象センサ
Conta(TM) BM1422AGMV 3軸磁気センサです。
接続インタフェースはI2Cです。
スイッチサイエンスさんのサイトで購入しました。
2.接続
3.3vとGND、それとI2CのSDA. SCLを接続するだけです。
3.ArduinoIDEで開発
開発はArduinoIDEを使用します。
3.1 ライブラリのダウンロード
ロームさんから提供されているライブラリがあります。(ラッキー💛)
ありがたく使わせていただきます。
ライブラリがない場合、対象センサの仕様書を見ながら、初期化や設定やらひとつひとつこなす作業が必要なので、結構しんどい。😮💨
ちなみに今回のセンサの仕様書(データーシート)はここにあります。
じゃ、ライブラリをダウンロードします。
公式サイトからソフトウェア(zipファイル)をダウンロードすれがOKです。
BM1422AGMV.zipがダウンロードされました。
後でこれを使って、ライブラリをインストールします。
※本記事は2024年4月に記載しました。
もしかすると現時点ではデーターシート、ライブラリ等変わっているかもしれませんのでご注意ください。
3.2 まっさらのワークスペースを起動
さてこれからプログラムを作っていきます。
まっさらのワークスペースを起動しますね。
まずM5Stack用ライブラリをダウンロードします。
「ライブラリの管理」から、ライブラリマネージャーを起動します。
ライブラリマネージャーから、使っているM5Stackに最適なものを選択します。
にしても、しばらく見ないうちに、M5Stack系増えましたねー。
使っているものが「M5Stack」なのかどうか、ちゃんとチェックしてインストールしないといけないですね。M5Stack Core2とかいろいろあって。
「インストール」ボタンを押すとインストールできます。
「更新」ボタンを押すと、最新に更新できます。
他のライブラリもインストールするよー、と言われるので、「Install all」します。
しばらくたつとインストール完了します。
シリアルで通信できるようにしてみますね。
先頭にM5Stackライブラリ用ヘッダファイルをインクルードします。
#include <M5Stack.h>
setup()内に、シリアルを初期化するコードを書きます。
通信速度は115200bpsにしました。
Serial.begin(115200);
適当なところで、データ出力します。
Serial.println("Yeah! It's a beautiful day!");
実行してみましょう。
っとその前に、ボードマネージャーの設定をしましょうか。
4.ボードマネージャーの設定
M5Stackを使えるようにするために、ボードマネージャーを設定しないといけないです。
4.1 環境設定
[ファイル]メニューに「環境設定」があるので、選択します。
「環境設定」が起動します。
[追加のボードマネージャの URL] に、以下入力してOKします。
https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json
(なんか前とURL変わっているような。。。)
4.2 ボードマネージャ設定
[ツール]メニューから[ボード]→[ボードマネージャ]を選択し、ボードマネージャを起動します。
ボードマネージャが起動したら、M5Stackを選択し、インストールします。
4.3 ボード選択
自分の持っているのは結構古いM5Stackなので、M5Coreのようです。
ボードとして、M5Coreを選択します。
5.検証、コンパイル、実行
まず、検証、コンパイルをします。
実行する前に、COMポートの設定をしておきます。
M5StackとWindowPCとをUSBケーブルで接続し、接続しているCOMポートの番号を設定しないといけないです。
せっかくなので、シリアルモニタも起動しておきましょう。
115200bpsになっていますね。
さて、実行してみましょう。
マイコンボードに書き込めがOKです。
文字が出ましたね。
なんだかここまで、長かったなー。😓
6.磁気センサを動かす。
ようやく、磁気センサに取り掛かれます。
3.3 BM1422AGMVライブラリをインストール
先ほどダウンロードしたBM1422AGMV.zip の出番です。
[スケッチ]メニューから[ライブラリをインクルード]->[.ZIP形式のライブラリ―をインストール] を選択し、BM1422AGMV.zip を選択してインストールします。
インストール完了後、もう一度[ライブラリをインクルード]を見てみます。
居た!
3.4 磁気センサから値を取得
次に、磁気センサにアクセスして値をとってみましょう。
ここで一度BM1422AGMV.zipを解凍して、中身を見てみます。
※しつこいようですが、、、
本記事は2024年4月に記載しました。
もしかすると現時点ではデーターシート、ライブラリ等変わっているかもしれませんのでご注意ください。
exampleとしてBM1422AGMV.inoがあります。
見てみましょう。
・初期化する関数
・値を取ってくる関数
が、あるはず。それをコールすればOKなはず。
ありましたね。
・初期化する関数:bm1422a.init()
・値を取ってくる関数:bm1422a.start()してbm1422a.get_val(mag)
じゃ、それを追加してみましょう。
とりあえずはエラー処理等、できるだけ省きますね。
i2cを使えるようにする関数 Wire.begin() もコールしましょう。
ついでに、取得した値をシリアル経由でPCに送信するようにしてみます。
プログラムは以下のようになりました。
#include <M5Stack.h>
#include <Wire.h>
#include "BM1422AGMV.h"
#define AXIS_X (0)
#define AXIS_Y (1)
#define AXIS_Z (2)
#define DATA_DIGIT (3)
BM1422AGMV bm1422a(BM1422AGMV_ADDR_LOW);
void setup() {
int32_t result;
Serial.begin(115200);
Wire.begin();
result = bm1422a.init();
if (result == BM1422AGMV_OK) {
(void)bm1422a.start();
} else {
Serial.println("error");
while(1);
}
delay(BM1422AGMV_MEAS_TIME);
}
void loop() {
int32_t result;
float32 mag[BM1422AGMV_DATA_SIZE];
result = bm1422a.get_val(mag);
if (result == BM1422AGMV_OK) {
Serial.print("X : Y : Z [uT] = ");
Serial.print(mag[AXIS_X], DATA_DIGIT);
Serial.print(",");
Serial.print(mag[AXIS_Y], DATA_DIGIT);
Serial.print(",");
Serial.print(mag[AXIS_Z], DATA_DIGIT);
Serial.println();
} else {
Serial.println("error");
}
// For Single Measurement
(void)bm1422a.start();
delay(BM1422AGMV_MEAS_TIME);
return;
}
4.実行結果
実行結果は以下です。
磁気センサの値と思しきものが表示されています。
5.センサ値から方角を計算する?
磁気センサは、各軸方向の磁力を計測するものです。
このセンサは、X、Y、Zの3軸方向の磁力が計測できます。
詳しくは、ロームさんが解説してくださっています。
自分なりに解釈すると、
・磁場が全くないところで計測する場合、X、Y、Zの3軸方向の磁力出力分布図の円の中心はゼロになり、tanを用いた計算式で表すことができる。
・全く磁場がないのは現実的でなく、実際は円の中心の磁場を考慮した計算が必要。
・計算結果として算出されるのは、磁北であり、真北ではない。
磁北と真北のずれは偏角という。国土地理院のサイトで見ることができる。
ちなみに、Z軸もあるので、姿勢制御にも使えるそうです。
今回、磁気センサを使って知りたいのは、
「磁場が荒れてるかどうか、それが頭痛と関係するかどうか」
であり、方角を知りたいわけではないので、生センサデータが安定しているのか荒れているのかを見てみたいと思います。
という事で。
次回、温湿度センサもつけてみますね。
この記事が気に入ったらサポートをしてみませんか?