見出し画像

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軸もあるので、姿勢制御にも使えるそうです。

今回、磁気センサを使って知りたいのは、
「磁場が荒れてるかどうか、それが頭痛と関係するかどうか」
であり、方角を知りたいわけではないので、生センサデータが安定しているのか荒れているのかを見てみたいと思います。

という事で。
次回、温湿度センサもつけてみますね。

この記事が参加している募集

つくってみた

この記事が気に入ったらサポートをしてみませんか?