Arduino UNO R4 Minimaでセンサ・インターフェーシング ㉟ 加速度センサ LIS331
Adafruitの3軸加速度センサ LIS331(ST Microelectronics)を利用します。このモデルは、LIS331HHと表記されるデバイスを扱います。HLIS331DLやLIS331DLHは、加速度のスペックが異なります。
●AdafruitのStemma QT/Qwiicボード
Stemma QT/Qwiic(JST SH 4ピン)コネクタは2か所に装着されていて、どちらにつないでもかまいません。このコネクタを使ってI2Cで制御する場合、特に、ジャンパ線をつなぐなどは不要です。
コネクタは、表と裏のどちらも差し込めそうですが、ピンが内部の上部に並んでいるので、差し込める方向は一意です。ロック機構はないですが、すぐに抜けるということはありません。
●加速度センサLIS331のおもなスペック
- 動作電圧 2.16~3.6V
- 動作温度範囲 -40~+85°C
- 加速度測定範囲 ±6g、±12g、±24g;16ビット
- インターフェース I2C(最大400kHz)、SPI(10MHz)
- スレーブ・アドレス デフォルト0x18、裏面のaddrジャンパをショートすると0x19
●使用環境
- Arduino UNO R4 Minima
- Arduino IDE 2.2.1
- Windows10 22H2
●接続
Arduino UNO R4 MinimaのI2C信号とセンサ・ボードをJSTコネクタでつなぎます(Stemma QT/Qwiicボードの写真の比率は異なる)。
●スレーブ・アドレスを確認
従来からよく使われているi2cScanner.inoを動かしてスレーブ・アドレスを確認します。電源は3.3Vです。
0x18を見つけてきました。
●ライブラリの用意
LIS331で検索して、見つかった Adafruit LIS331ライブラリをインストールします。
インストールを始めたとき、関連のライブラリや依存関係をインストールするかというパネルが出た場合は、全てをインストールします。
●サンプル・スケッチ
メニューのファイル->スケッチ例から、Adafruit LIS331のlis331hh_accel_demo.inoを選択します。
コンパイル、実行します。
X:、Y:、Z:が m/s^2単位の加速度です。
重力加速度 1gは、9.8m/s^2です。
●グラフィック・ディスプレイに測定結果を表示
次の記事を参考に、グラフィック・ディスプレイに測定した値を表示します。
Arduino UNO R4 Minimaでセンサ・インターフェーシング ⑤ 温湿度センサSi7021の測定結果をグラフィック・ディスプレイに表示
スケッチです。lis331hh_accel_demo.inoからSPI関連を削除しました。
// Basic demo for accelerometer readings from Adafruit LIS331HH
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_LIS331HH.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_LIS331HH lis = Adafruit_LIS331HH();
void setup(void) {
Serial.begin(115200);
while (!Serial) delay(10); // will pause Zero, Leonardo, etc until serial console opens
Serial.println("LIS331HH + ssd1306");
//if (!lis.begin_SPI(LIS331HH_CS)) {
// if (!lis.begin_SPI(LIS331HH_CS, LIS331HH_SCK, LIS331HH_MISO, LIS331HH_MOSI)) {
if (! lis.begin_I2C()) { // change this to 0x19 for alternative i2c address
Serial.println("Couldnt start");
while (1) yield();
}
Serial.println("LIS331HH found!");
lis.setRange(LIS331HH_RANGE_6_G); // 6, 12, or 24 G
Serial.print("Range set to: ");
switch (lis.getRange()) {
case LIS331HH_RANGE_6_G: Serial.println("6 g"); break;
case LIS331HH_RANGE_12_G: Serial.println("12 g"); break;
case LIS331HH_RANGE_24_G: Serial.println("24 g"); break;
}
// lis.setDataRate(LIS331_DATARATE_50_HZ);
Serial.print("Data rate set to: ");
switch (lis.getDataRate()) {
case LIS331_DATARATE_POWERDOWN: Serial.println("Powered Down"); break;
case LIS331_DATARATE_50_HZ: Serial.println("50 Hz"); break;
case LIS331_DATARATE_100_HZ: Serial.println("100 Hz"); break;
case LIS331_DATARATE_400_HZ: Serial.println("400 Hz"); break;
case LIS331_DATARATE_1000_HZ: Serial.println("1000 Hz"); break;
case LIS331_DATARATE_LOWPOWER_0_5_HZ: Serial.println("0.5 Hz Low Power"); break;
case LIS331_DATARATE_LOWPOWER_1_HZ: Serial.println("1 Hz Low Power"); break;
case LIS331_DATARATE_LOWPOWER_2_HZ: Serial.println("2 Hz Low Power"); break;
case LIS331_DATARATE_LOWPOWER_5_HZ: Serial.println("5 Hz Low Power"); break;
case LIS331_DATARATE_LOWPOWER_10_HZ: Serial.println("10 Hz Low Power"); 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() {
/* Get a new sensor event, normalized */
sensors_event_t event;
lis.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);
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);
}