Files
2026-09-25 10:48:51 +10:00

4.2 KiB

MSA301ForStuduino

Adafruit MSA301 ライブラリ v1.1.0 を、株式会社アーテックが Studuino 向けに改変したものです。 MSA301 / MSA311 加速度センサーを I2C 経由で読み出します。

オリジナル: https://github.com/adafruit/Adafruit_MSA301 オリジナルのライセンス(BSD)は license.txt を参照してください。

本ライブラリは Adafruit が配布する公式版とは互換性がありません。 公式版の Adafruit_MSA301 と同時にインストールしても衝突しないよう、 ライブラリ名・フォルダ名・ファイル名・インクルードガードを変更しています。

使い方

#include <MSA301ForStuduino.h>

Adafruit_MSA311 msa;   // MSA311 (I2C 0x62)
// Adafruit_MSA301 msa;   // MSA301 (I2C 0x26)

void setup() {
  Wire.begin();
  if (!msa.begin()) {
    // センサーが見つからない
  }
}

void loop() {
  msa.read();
  // msa.x, msa.y, msa.z
}

依存ライブラリは BusIOForStuduino のみです。 Adafruit Unified Sensor および Adafruit SSD1306 は必要ありません。

オリジナルからの変更点

1. ライブラリ名・ファイル名の変更

公式版との衝突を避けるため、次のように改名しました。クラス名は変更していません。

オリジナル 本ライブラリ
Adafruit_MSA301(フォルダ) MSA301ForStuduino
Adafruit_MSA301.h MSA301ForStuduino.h
Adafruit_MSA301.cpp MSA301ForStuduino.cpp
ADAFRUIT_MSA301_H(インクルードガード) MSA301FORSTUDUINO_H
name=Adafruit MSA301 name=MSA301ForStuduino

2. Adafruit Unified Sensor への依存を削除

Adafruit_MSA301 クラスの Adafruit_Sensor 継承を外し、getEvent() と getSensor()、sensors_event_t を用いる API を削除しました。 ATmega168(SRAM 1KB)ではメモリに余裕がないためです。

3. 未使用 API の削除

Studuino が使用しない設定用 API(setDataRate() / getDataRate() / setPowerMode() / getPowerMode() / setBandwidth() / getBandwidth() / setRange() / getRange() / setResolution() / getResolution() / enableAxes() / setClick() / enableInterrupts() / getMotionInterruptStatus() など)と、対応する enum 定義を削除しました。 これらの設定は begin() の中で固定値(125Hz / 250Hz / ±2G / 8bit / ノーマルモード)を直接書き込む形に置き換えています。

4. Adafruit_MSA311 クラスの追加

MSA311(I2C アドレス 0x62)に対応する Adafruit_MSA311 クラスを追加しました。 Adafruit_MSA301 を継承し、既定 I2C アドレスのみが異なります。

5. begin() を複数回呼び出せるよう修正

オリジナルの begin() は呼ばれるたびに Adafruit_I2CDevice を new していました。 Studuino のセンサー値確認モードはセンサーの抜き差しからの復帰のため 一定周期で begin() を呼び直す設計になっており、この実装のままでは 呼び出しのたびにメモリリークが発生し、SRAM 1KB の ATmega168 では 数十秒で枯渇して動作が破綻します。

そのため、確保済みの場合は再確保しないよう変更しました。 あわせて、コンストラクタで i2c_dev を nullptr に初期化しています。

Adafruit_MSA301::Adafruit_MSA301() : i2c_dev(nullptr) {}

bool Adafruit_MSA301::begin(uint8_t i2c_address, TwoWire *wire) {
  if (i2c_dev == nullptr) {
    i2c_dev = new Adafruit_I2CDevice(i2c_address, wire);
  }
  ...
}

なお、この変更により i2c_dev は初回の begin() で確保された I2C アドレスを 保持し続けます。2回目以降の begin() に渡した i2c_address は無視されます。

6. 配布物からの除外

ビルドに不要なファイルを削除しました(examples/、assets/、 MSA301-V1.0-ENG.PDF、.github/、.travis.yml、code-of-conduct.md)。

examples/ は上記 2. と 3. の API 削除により、そのままではコンパイルが 通らなくなっていたため削除しています。