Arduino UNO R4 Minimaでセンサ・インターフェーシング ㉞ 加速度センサ MSA301

 Adafruitの3軸加速度センサ MSA301(MEMSensing Microsystems)を利用します。

AdafruitのStemma QT/Qwiicボード

 MSA301ボード解説のページ

 Stemma QT/Qwiic(JST SH 4ピン)コネクタは2か所に装着されていて、どちらにつないでもかまいません。このコネクタを使ってI2Cで制御する場合、特に、ジャンパ線をつなぐなどは不要です。

 コネクタは、表と裏のどちらも差し込めそうですが、ピンが内部の上部に並んでいるので、差し込める方向は一意です。ロック機構はないですが、すぐに抜けるということはありません。

加速度センサMSA301のおもなスペック

 MSA301のデータシートページ

  • 動作電圧 1.62~3.6V
  • 動作温度範囲  -40~+85°C
  • 加速度測定範囲 ±2、±4、±8、±16g;14ビット
  • インターフェース I2C(最大400kHz)
  • スレーブ・アドレス 0x26

使用環境

  • Arduino UNO R4 Minima
  • Arduino IDE 2.2.1
  • Windows10 22H2

接続

 Arduino UNO R4 MinimaのI2C信号とセンサ・ボードをJSTコネクタでつなぎます(Stemma QT/Qwiicボードの写真の比率は異なる)。

スレーブ・アドレスを確認

 従来からよく使われているi2cScanner.inoを動かしてスレーブ・アドレスを確認します。電源は3.3Vです。

  0x26を見つけてきました。

 


ライブラリの用意

 MSA301で検索して、見つかった  Adafruit MSA301ライブラリをインストールします。

 インストールを始めたとき、関連のライブラリや依存関係をインストールするかというパネルが出た場合は、全てをインストールを選びます。


サンプル・スケッチ

 メニューのファイル->スケッチ例から、Adafruit MSA301のacceldemo.inoを選択します。

  コンパイル、実行します。

 最初のX:、Y:、Z:がrawデータで、つぎのX:、Y:、Z:が m/s^2単位の加速度です。

 重力加速度 1gは、9.8m/s^2です。

グラフィック・ディスプレイに測定結果を表示

 次の記事を参考に、グラフィック・ディスプレイに測定したを表示します。

  Arduino UNO R4 Minimaでセンサ・インターフェーシング ⑤ 温湿度センサSi7021の測定結果をグラフィック・ディスプレイに表示

 スケッチです。


// Basic demo for accelerometer readings from Adafruit MSA301

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_MSA301.h>
#include <Adafruit_Sensor.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) #define SCREEN_ADDRESS 0x3D ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); Adafruit_MSA301 msa; void setup(void) { Serial.begin(115200); while (!Serial) delay(10); // will pause Zero, Leonardo, etc until serial console opens Serial.println("Adafruit MSA301 test!"); // Try to initialize! if (! msa.begin()) { Serial.println("Failed to find MSA301 chip"); while (1) { delay(10); } } Serial.println("MSA301 Found!"); //msa.setDataRate(MSA301_DATARATE_31_25_HZ); Serial.print("Data rate set to: "); switch (msa.getDataRate()) { case MSA301_DATARATE_1_HZ: Serial.println("1 Hz"); break; case MSA301_DATARATE_1_95_HZ: Serial.println("1.95 Hz"); break; case MSA301_DATARATE_3_9_HZ: Serial.println("3.9 Hz"); break; case MSA301_DATARATE_7_81_HZ: Serial.println("7.81 Hz"); break; case MSA301_DATARATE_15_63_HZ: Serial.println("15.63 Hz"); break; case MSA301_DATARATE_31_25_HZ: Serial.println("31.25 Hz"); break; case MSA301_DATARATE_62_5_HZ: Serial.println("62.5 Hz"); break; case MSA301_DATARATE_125_HZ: Serial.println("125 Hz"); break; case MSA301_DATARATE_250_HZ: Serial.println("250 Hz"); break; case MSA301_DATARATE_500_HZ: Serial.println("500 Hz"); break; case MSA301_DATARATE_1000_HZ: Serial.println("1000 Hz"); break; } //msa.setPowerMode(MSA301_SUSPENDMODE); Serial.print("Power mode set to: "); switch (msa.getPowerMode()) { case MSA301_NORMALMODE: Serial.println("Normal"); break; case MSA301_LOWPOWERMODE: Serial.println("Low Power"); break; case MSA301_SUSPENDMODE: Serial.println("Suspend"); break; } //msa.setBandwidth(MSA301_BANDWIDTH_31_25_HZ); Serial.print("Bandwidth set to: "); switch (msa.getBandwidth()) { case MSA301_BANDWIDTH_1_95_HZ: Serial.println("1.95 Hz"); break; case MSA301_BANDWIDTH_3_9_HZ: Serial.println("3.9 Hz"); break; case MSA301_BANDWIDTH_7_81_HZ: Serial.println("7.81 Hz"); break; case MSA301_BANDWIDTH_15_63_HZ: Serial.println("15.63 Hz"); break; case MSA301_BANDWIDTH_31_25_HZ: Serial.println("31.25 Hz"); break; case MSA301_BANDWIDTH_62_5_HZ: Serial.println("62.5 Hz"); break; case MSA301_BANDWIDTH_125_HZ: Serial.println("125 Hz"); break; case MSA301_BANDWIDTH_250_HZ: Serial.println("250 Hz"); break; case MSA301_BANDWIDTH_500_HZ: Serial.println("500 Hz"); break; } //msa.setRange(MSA301_RANGE_2_G); Serial.print("Range set to: "); switch (msa.getRange()) { case MSA301_RANGE_2_G: Serial.println("+-2G"); break; case MSA301_RANGE_4_G: Serial.println("+-4G"); break; case MSA301_RANGE_8_G: Serial.println("+-8G"); break; case MSA301_RANGE_16_G: Serial.println("+-16G"); break; } //msa.setResolution(MSA301_RESOLUTION_14 ); Serial.print("Resolution set to: "); switch (msa.getResolution()) { case MSA301_RESOLUTION_14: Serial.println("14 bits"); break; case MSA301_RESOLUTION_12: Serial.println("12 bits"); break; case MSA301_RESOLUTION_10: Serial.println("10 bits"); break; case MSA301_RESOLUTION_8: Serial.println("8 bits"); break; } display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS); display.clearDisplay(); display.drawRect(0, 0, display.width(), display.height(), SSD1306_WHITE); display.setTextSize(1); // Normal 1:1 pixel scale display.setTextColor(SSD1306_WHITE); // Draw white text display.setCursor(3,3); display.println("X:"); display.setCursor(64,3); display.println("Y:"); display.setCursor(3,34); display.println("Z:"); display.display(); delay(200); } void loop() { msa.read(); // get X Y and Z data at once // Then print out the raw data Serial.print("X: "); Serial.print(msa.x); Serial.print(" \tY: "); Serial.print(msa.y); Serial.print(" \tZ: "); Serial.print(msa.z); delay(100); /* Or....get a new sensor event, normalized */ sensors_event_t event; msa.getEvent(&event); /* Display the results (acceleration is measured in m/s^2) */ Serial.print("\t\tX: "); Serial.print(event.acceleration.x); Serial.print(" \tY: "); Serial.print(event.acceleration.y); Serial.print(" \tZ: "); Serial.print(event.acceleration.z); Serial.println(" m/s^2 "); Serial.println(); display.setTextSize(1); // Draw 2X-scale text display.setCursor(3,17); display.fillRect(3, 17, 70, 16, SSD1306_BLACK); display.println(event.acceleration.x); display.setCursor(60,17); display.fillRect(60, 17, 66, 16, SSD1306_BLACK); display.println(event.acceleration.y); display.setCursor(3, 46); display.fillRect(3, 46, 100, 16, SSD1306_BLACK); display.println(event.acceleration.z); display.display(); delay(500); }

 実行例です。

前へ

Arduino UNO R4 Minimaでセンサ・インターフェーシング ㉝ IMU BNO055

次へ

Arduino UNO R4 Minimaでセンサ・インターフェーシング ㉟ 加速度センサ LIS331