Nano 33 BLE Senseの加速度センサーデータを取得する

LSM9DS1 IMUセンサーを使い、Nano 33 BLE Senseの相対位置を測定する方法を学びます。


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


このチュートリアルは、ボードの相対位置を測定するために、Arduino Nano 33 BLE SenseのLSM9DS1モジュールの3軸加速度センサーに着目します。これは、加速度センサーの軸の値を活用し、Arduino IDEのシリアルモニターに戻り値を表示することで、実現します。

目的

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

  • LSM9DS1モジュールとは何なのかを理解します。
  • LSM9DS1ライブラリを使用します。
  • 加速度センサーから値を読み取ります。
  • 生データをボードの位置に変換します。
  • シリアルモニターにライブデータを表示します。

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

  • このプロジェクトでは、外部のセンサーや機器を利用しません。
  • このチュートリアルでは、ボードのプログラムを記述するのに、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の詳細を知りたい場合は、ここを参照してください。

加速度センサー

加速度センサーは、加速度を測定するのに利用するデバイスです。この力は、重力のように静的であったり、多くのモバイルデバイスでの場合のように動きや振動のように動的だったりします。

加速度センサーの動作方法

加速度センサーの動作方法

この例では、加速度センサーを、ボードの位置情報を提供するための「水準(level)」として利用します。このアプリケーションでは、ボードを上下左右に傾けたのきの角度を読み取るだけでなく、ボードの相対位置も読み取るようにします。

プログラム作成

  1. 設定

Arduino Webエディタを開き、Librariesタブをクリックし、LSM9DS1ライブラリを探します。その後、> Examplesで、SimpleAccelerometer スケッチを開きます。開いた後は、Accelerometereという名前に変更します。

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

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

  1. ボードを接続する

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

ボードを選択する

ボードを選択する

  1. 相対位置を表示する

次に、異なる角度にボードを動かしたときに、ボードの相対位置を表示するために、スケッチ例を修正する必要があります。

x、y、z軸をfloatデータ型として、閾値となる変数int plusThreshold = 30;int minusThreshold = -30;setup()の前で初期化します。

setup()では、以下の行を削除します。

1
2
3
Serial.println();
Serial.println("Acceleration in G's");
Serial.println("X\tY\tZ");

3軸の生の値は不要なので、これらの値を表示する行を削除できます。同様に、以下の行をloop()から削除します。

1
2
3
4
5
Serial.print(x);
Serial.print('\t');
Serial.print(y);
Serial.print('\t');
Serial.println(z);

代わりに、loop()では、3軸の値を読み始めるようセンサーに指示します。この例では、Z軸の値はこのアプリケーションでは不要なので、利用していません。これも削除します。

IMU.readAccelerationの初期化後、ボードの異なる位置を取得するために, 4つのif文を追加します。これらの行は、軸の傾きの度数だけではなく、ボードがどの方向に傾いているのかを計算します。

 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
if(x > 0.1){
    x = 100*x;
    degreesX = map(x, 0, 97, 0, 90);
    Serial.print("Tilting up ");
    Serial.print(degreesX);
    Serial.println("  degrees");
    }
  if(x < -0.1){
    x = 100*x;
    degreesX = map(x, 0, -100, 0, 90);
    Serial.print("Tilting down ");
    Serial.print(degreesX);
    Serial.println("  degrees");
    }
  if(y > 0.1){
    y = 100*y;
    degreesY = map(y, 0, 97, 0, 90);
    Serial.print("Tilting left ");
    Serial.print(degreesY);
    Serial.println("  degrees");
    }
  if(y < -0.1){
    y = 100*y;
    degreesY = map(y, 0, -100, 0, 90);
    Serial.print("Tilting right ");
    Serial.print(degreesY);
    Serial.println("  degrees");
    }

最後に、結果の値をSerial.printし、delay(1000)を追加します。

注意: 以下のコードを正常に動作させるには、コードの初期化時にボードの向きと傾きを特定する必要があります。詳細な情報は、「テスト」セクションを参照してください。

  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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/*
  Arduino LSM9DS1 - Accelerometer Application

  This example reads the acceleration values as relative direction and degrees,
  from the LSM9DS1 sensor and prints them to the Serial Monitor or Serial Plotter.

  The circuit:
  - Arduino Nano 33 BLE Sense

  Created by Riccardo Rizzo

  Modified by Jose García
  27 Nov 2020

  This example code is in the public domain.
*/

#include <Arduino_LSM9DS1.h>

float x, y, z;
int degreesX = 0;
int degreesY = 0;

void setup() {
  Serial.begin(9600);
  while (!Serial);
  Serial.println("Started");

  if (!IMU.begin()) {
    Serial.println("Failed to initialize IMU!");
    while (1);
  }

  Serial.print("Accelerometer sample rate = ");
  Serial.print(IMU.accelerationSampleRate());
  Serial.println("Hz");
}

void loop() {

  if (IMU.accelerationAvailable()) {
    IMU.readAcceleration(x, y, z);

  }

  if (x > 0.1) {
    x = 100 * x;
    degreesX = map(x, 0, 97, 0, 90);
    Serial.print("Tilting up ");
    Serial.print(degreesX);
    Serial.println("  degrees");
  }
  if (x < -0.1) {
    x = 100 * x;
    degreesX = map(x, 0, -100, 0, 90);
    Serial.print("Tilting down ");
    Serial.print(degreesX);
    Serial.println("  degrees");
  }
  if (y > 0.1) {
    y = 100 * y;
    degreesY = map(y, 0, 97, 0, 90);
    Serial.print("Tilting left ");
    Serial.print(degreesY);
    Serial.println("  degrees");
  }
  if (y < -0.1) {
    y = 100 * y;
    degreesY = map(y, 0, -100, 0, 90);
    Serial.print("Tilting right ");
    Serial.print(degreesY);
    Serial.println("  degrees");
  }
  delay(1000);
}

テスト

ボードのデータを正しく読むために、スケッチをボードにアップロードする前に、USBポートの横にあるボードを手で持ちます。ボードは上向きにし、あなたから離れる方向を指すようにします。以下の図に、ボードの方向と動きを示します。

X軸とY軸の作用

X軸とY軸の作用

次に、スケッチを検証、ボードにアップロードし、左側のメニューからモニターを開きます。

ボードを地面と平行にし、一つの方向: 前、後、右、左に動かします。動かした方向に従い、モニターに毎秒結果が表示されます。

これらの値を返却するスケッチのスクリーンショットを示します。

ボードの傾き状況を表示する

ボードの傾き状況を表示する

トラブルシュート

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

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

おわりに

この簡単なチュートリアルで、IMUセンサーモジュールとは何か、LSM9DS1ライブラリの使い方、Arduino Nano 33 BLE Senseの使い方を学びました。さらに、3軸加速度センサーを使い、ボードの傾きの度数と相対位置を測定するためのアプリケーションを作成しました。

オリジナルのページ

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

最終更新日

March 6, 2023

inserted by FC2 system