今回は3軸加速度センサを使用して、物体の角度の取得をしてみました。
そして、角度を取得するだけでは楽しくないので、水平器を作ってみました。

Arduino UNO R4 Minima

Arduino UNO R4 Minima

Arduino UNO R4 Minima starter kit

Arduino UNO R4 Minima starter kit


準備するもの

  • Arduino UNO
  • 3軸アナログ加速度センサ KXR94-2050
  • 赤色LED ×11
  • カーボン抵抗 220Ω
  • ジャンパー線 たくさん

3軸加速度センサ “KXR94-2050” とは

加速度センサとは、文字通りセンサに加わっている加速度を取得できるセンサになっています。

できること:

  • 加速度を積分して速度や距離を取得
  • 重力方向から角度の取得(今回の用途)
  • 衝撃、振動、落下検知

KXR94-2050はDIP化されていて扱いやすく、秋月電子などで入手可能です。

加速度センサ

加速度センサ

早速、この三軸加速度センサを使用して、物体の角度を検出し、Arduinoで水平器を作成していきます。


Arduino水平器の回路図と配線図

回路図

回路図

配線図

配線図

センサとLEDを別のブレッドボードに配置し、センサを動かせるようにしています。

また、今回使用する水平器自体には、加速度センサのX軸の値しか使用しませんが、Y軸・Z軸の数値も読み取れるようにしています。

実際に組み立てた配線がこちらになります。

実装写真

実装写真


プログラム

#define AXISXPIN  0
#define AXISYPIN  1
#define AXISZPIN  2
#ifndef M_PI
#define M_PI  (3.1415926535897932384626433832795)
#endif

int ledPins[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
int a, a_before;
int numberOfledPins = sizeof(ledPins) / sizeof(ledPins[0]);

void setup() {
    for (int i = 0; i < numberOfledPins; i++) {
        pinMode(ledPins[i], OUTPUT);
    }
}

double Map(int iIn, int iIn1, int iIn2, double dOut1, double dOut2, boolean bConstrain = false) {
    double dValue = (iIn - iIn1) * (dOut2 - dOut1) / (iIn2 - iIn1) + dOut1;
    if (bConstrain) {
        double dOutMin = min(dOut1, dOut2);
        double dOutMax = max(dOut1, dOut2);
        dValue = constrain(dValue, dOutMin, dOutMax);
    }
    return dValue;
}

void loop() {
    int ADC_X = analogRead(AXISXPIN);
    int ADC_Y = analogRead(AXISYPIN);
    int ADC_Z = analogRead(AXISZPIN);

    double rotateX = Map(ADC_X, 292, 732, -1.0, 1.0, true);
    double dAngleX = asin(rotateX) * 180.0 / M_PI;

    a = 12 - ((ADC_X - 292)/40);
    a = constrain(a, 2, 12);
    digitalWrite(a, HIGH);

    if (a != a_before) {
        digitalWrite(a_before, LOW);
    }
    a_before = a;

    delay(5);
}

24行目から49行目は出力されたアナログ値をsinθ値に変換する関数です。

この時、iTn1, iTn2はセンサを90° と-90° に傾けた時のAD変換値が挿入されます。

69行目から75行目は取得したAD変換値から角度を計算しています。

この時、

double rotateX = Map( ADC_X, 292, 732, -1.0, 1.0, true );

の292が加速度センサをX軸を中心に-90° 、732が90° 傾けた値です。

この数値はセンサの個体によって変わってくるので、各自で調整が必要になります。

77行目から87行目はLEDを点灯させるためのプログラムです。

使用する出力ピンによって数字が変わるので注意してください。

各箇所でコメントアウトしていますが、シリアル通信によって角度を取得できるようになっています。

実際に動かすと以下の動画のようになります。


動作確認

角度によってLEDの点灯位置が移動し、水平を視覚的に確認できます。

角度によってLEDの光が移動しているのがわかると思います

また、水平移動に合わせてLEDの光が移動しています。

このような動作になれば正常に動いています。


まとめ

  • 加速度センサで角度を計測
  • AD変換と三角関数(sin, asin)を使って角度演算
  • LEDで傾きを視覚化

今回はX軸のみ使用しましたが、Y軸・Z軸も使えばもっと複雑な姿勢制御も可能になります。
次回は2軸水平器などにもチャレンジしてみたいですね!

See you…