Nano 33 BLE Senseのジャイロスコープデータを取得する

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の詳細を知りたい場合は、ここを参照してください。

ジャイロスコープ

ジャイロスコープセンサーは、物体の向きと角速度を測定・維持できるデバイスです。ジャイロスコープは加速度センサーよりも高度です。というのも、ジャイロスコープは物体の傾きや面方向(lateral orientation)を測定できますが、加速度センサーは直線的な動きしか測定できないからです。

ジャイロスコープの軸

ジャイロスコープの軸

ジャイロスコープセンサーは「角速度センサー」とも呼ばれます。度/秒で測定される角速度は、単位時間あたりの物体の回転角の変化です。

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

プログラム作成

  1. 設定

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

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

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

  1. ボードを接続する

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

ボードを選択する

ボードを選択する

  1. ボードにかかる力の向きを表示する

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

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

setup()では、軸の生の値を表示しないので、最後の行を削除します。

1
Serial.println("X\tY\tZ");

次に、最初に初期化したので、loop()では、以下を削除します。

1
float x, y, z;

また、以下の行も不要なので削除します。

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

代わりに、センサーが利用可能かを確認し、その後3軸を読む既存の文の後に、 4つのif文を追加します。

以下が追加するコードです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
if(y > plusThreshold)
{
Serial.println("Collision front");
delay(500);
}
if(y < minusThreshold)
{
Serial.println("Collision back");
delay(500);
}
if(x < minusThreshold)
{
Serial.println("Collision right");
delay(500);
}
if(x > plusThreshold)
{
Serial.println("Collision left");
delay(500);
}

if文は、最初に定義したplusThresholdとminusThresholdのxとy、zwの値を比較します。これらの値に従い、ボードを動かした力の方向を表示します。

  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
/*
  Arduino LSM9DS1 - Gyroscope Application

  This example reads the gyroscope values from the LSM9DS1 sensor 
  and prints them to the Serial Monitor or Serial Plotter, as a directional detection of 
  an axis' angular velocity.

  The circuit:
  - Arduino Nano 33 BLE Sense

  Created by Riccardo Rizzo

  Modified by Benjamin Dannegård
  30 Nov 2020

  This example code is in the public domain.
*/

#include <Arduino_LSM9DS1.h>

float x, y, z;
int plusThreshold = 30, minusThreshold = -30;

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

  if (!IMU.begin()) {
    Serial.println("Failed to initialize IMU!");
    while (1);
  }
  Serial.print("Gyroscope sample rate = ");
  Serial.print(IMU.gyroscopeSampleRate());
  Serial.println(" Hz");
  Serial.println();
  Serial.println("Gyroscope in degrees/second");
}
void loop() {
  
  if (IMU.gyroscopeAvailable()) {
    IMU.readGyroscope(x, y, z);
  }
  if(y > plusThreshold)
  {
    Serial.println("Collision front");
    delay(500);
  }
  if(y < minusThreshold)
  {
    Serial.println("Collision back");
    delay(500);
  }
  if(x < minusThreshold)
  {
    Serial.println("Collision right");
    delay(500);
  }
    if(x > plusThreshold)
  {
    Serial.println("Collision left");
    delay(500);
  }
  
}

テスト

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

ボードの方向

ボードの方向

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

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

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

シリアルモニターの出力

シリアルモニターの出力

トラブルシュート

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

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

おわりに

この簡単なチュートリアルで、IMUセンサーモジュールとは何か、LSM9DS1ライブラリの使い方、ジャイロスコープセンサーからの値を測定し表示するためのArduino Nano 33 BLE Senseの使い方を学びました。さらに、ボードにかかる力の方向を検出するアプリケーションを作成しました。

オリジナルのページ

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

最終更新日

March 6, 2023

inserted by FC2 system