Nano 33 BLE Senseの磁気センサーデータを取得する

Nano 33 BLE Senseを使い、電子機器周辺の磁界の乱れを検出する方法を学びます。


AUTHOR: Nefeli Alushi、LAST REVISION: 2023/02/20 18:07


IMUモジュール

このチュートリアルは、Arduino Nano 33 BLE SenseのLSM9DS1モジュールの3軸磁気センサーに着目します。このチュートリアルでは、アプライアンスや電子デバイス周辺の磁界の変化や乱れを検出するアプリケーションを作成するために、IMUセンサーを利用します。これは、磁気センサーの軸の値を活用し、磁界の乱れに応じてボードの内蔵LEDを点滅させます。

目的

このプロジェクトの目的は以下の通りです。

  • LSM9DS1モジュールとは何なのかを理解します。
  • LSM9DS1ライブラリを使用します。
  • 磁界センサーから値を読み取ります。
  • 環境の磁界の乱れに応じた視覚的フィードバックを作成します。
  • センサーの値をLEDの光度に変換します。

必要なハードウェアとソフトウェア

  • このプロジェクトでは、外部のセンサーや機器を利用しません。
  • このチュートリアルでは、ボードのプログラムを記述するのに、Arduino Creative Webエディタを利用します。

LSM9DS1慣性モジュール

IMUは、慣性計測ユニット(Inertial Measurement Unit)を意味します。IMUは、物体のSpecific Forceや角速度、物体の向きを、加速度計やジャイロスコープ、しばしば磁力計の組み合わせを利用して測定・報告する電子デバイスです。このチュートリアルでは、Arduino Nano 33 BLE Senseボードに搭載されているLSM9DS1 IMUモジュールについてもう少し学びます。

LSM9DS1センサー

LSM9DS1センサー

LSM9DS1は、3D線形加速度センサーや3Dデジタル角速度センサー、3Dデジタル磁気センサーを搭載したシステムインパッケージです。

ライブラリ

Arduino LSM9DS1ライブラリを使えば、複雑なプログラミングを行わずに、Arduino Nano 33 BLE SenseのIMUモジュールを利用することができます。このライブラリは、センサーを初期化し、以下のように値を設定します。

  • 加速度センサーのレンジ: [-4, +4]g -/+0.122 mg
  • ジャイロスコープのレンジ: [-2000, +2000] dps +/-70 mdps
  • 磁気センサーのレンジ: [-400, +400] uT +/-0.014 uT
  • 加速度センサーの出力データレート: 104Hz固定
  • ジャイロスコープの出力データレート: 104Hz固定
  • 磁気センサーの出力データレート: 20Hz固定

LSM9DS1の詳細を知りたい場合は、ここを参照してください。

磁気センサー

磁気センサーは、ある位置の磁界の方向や強さ、相対変化といった磁気を測定するデバイスです。

磁気センサーセンサーの動作方法

磁気センサーセンサーの動作方法

このチュートリアルでは、XとY、Zの値を読み、ボード周辺の磁気の強度に従い、内蔵LEDを通じて視覚的フィードバックを提供します。

この例では、ジャイロスコープでボードにかかる力の方向を示すのに利用します。これは、ボードを前後左右の4方向に一瞬振ることで実現します。結果をシリアルモニターに表示します。

プログラム作成

  1. 設定

Arduino Webエディタを開き、magnetometerという名前で新しいスケッチを作成します。Librariesタブをクリックし、LSM9DS1ライブラリを探します。その後、ライブラリをインクルードするボタンをクリックします。

Webエディタでライブラリを探す

Webエディタでライブラリを探す

  1. ボードを接続する

次に、Arduino Nano 33 BLE SenseをPCに接続し、Webエディタが認識することを確認します。すると、ポートとボードが以下の図で示すように現れます。現れない場合は、指示に従いエディタがボードを認識するためのプラグインをインストールしてください。

ボードを選択する

ボードを選択する

  1. 磁界の変化を認識する

ライブラリをインクルードしたら、残りのコードの作成ができます。コードが動作するのに必要となる浮動小数点型の変数float x,y,z, ledvalue;を定義することから始めます。

setup()では、IMU.begin()関数でIMUセンサーを初期化することだけが必要です。

loop()では、IMUの3軸の値を読むために、IMU.readMagneticField(x, y, z);関数を追加します。次に、if文を追加し、ボードにより検出された磁界の正負を判定します(ボードの向きに依存します)。磁界が負であれば、ledvalue = -(x)でledvalueを正の値に変換します。これにより内蔵LEDとして有効な値となります。

最後に、analogWrite(LED_BUILTIN, ledvalue);で、磁界の乱れに従い、LEDの明るさを設定します。その後、少し遅延させます。

  1. 完全なコード

完全なコードを以下に示します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/*
  Arduino LSM9DS1 - Magnetometer

  This example reads the magnetometer's values from the LSM9DS1 sensor 
  and `analogWrite` the built-in LED according to the intensity of
  the magnetic field surrounding electrical devices.

  The circuit:
  - Arduino Nano 33 BLE Sense

  Created by Benjamin Dannegård
  4 Dec 2020

  This example code is in the public domain.
*/


#include <Arduino_LSM9DS1.h>
float x,y,z, ledvalue;

void setup() {
  IMU.begin();
}

void loop() {
  
  // read magnetic field in all three directions
  IMU.readMagneticField(x, y, z);
  
  if(x < 0)
  {
    ledvalue = -(x);
  }
  else{
    ledvalue = x;
  }
  
  analogWrite(LED_BUILTIN, ledvalue);
  delay(500);
}

テスト

スケッチの検証とボードへのアップロードが成功したら、テストします。自宅の電気製品や電流で動作する機器を選びます。例えば、このチュートリアルでは、テストのためにPCの充電器を使います。

ボードをPCの充電コード上に5~10秒置きます。そして、数秒間そこから遠ざけます。ボードがコードの近くにあるときには、内蔵LED(オレンジ色)が点滅するのがわかります。LEDの明るさは、検出した磁界により異なります。

以下にボード位置を説明するスクリーンショットを示します。

磁界の乱れを調べる

磁界の乱れを調べる

しかし、このアプリケーションには他の使い方もあります。LEDの明るさが十分見えない場合は、例えば、電子湯沸かし器やトースター、テレビ、コーヒーメーカーなどで試してください。このためには、同じ手順で、デバイスが動作しているときに、ボードをケーブルの近くに近づけてください。

トラブルシュート

エラーが起きることもあります。コードが動作しないときはいくつかの共通の問題があり、解決できます。

  • 括弧やセミコロンが抜けている。
  • Arduinoボードが、間違ったポートに接続されている。
  • ケーブル接続の予期しない切断。

おわりに

この簡単なチュートリアルで、IMUセンサーモジュールとは何か、LSM9DS1ライブラリの使い方、磁気センサーで磁界の乱れを検出するためのArduino Nano 33 BLE Senseの使い方を学びました。さらに、IMUセンサーモジュールから読み取った値によって、LEDの明るさを制御するアプリケーションを作成しました。

オリジナルのページ

https://docs.arduino.cc/tutorials/nano-33-ble-sense/imu-magnetometer

最終更新日

March 6, 2023

inserted by FC2 system