16
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

6軸センサを用いて衝撃を検出する(M5StickC)

Last updated at Posted at 2020-01-21

M5StickCは6軸センサが内蔵されているので衝撃を検出できるんじゃないかと思ったんですが、
ネットで検索しても出てこなかったので自分でなんとかしました。
需要があるか分かりませんが備忘録としてQiitaにまとめることにしました。

M5StickCに限らず6軸センサなら何でも大丈夫だと思います(加速度の単位は違うかもしれない)

##衝撃を検出するには?
衝撃ということはいわゆるGを検出すればいいので(異論は認める)静止時の重力加速度がどのように検出されているか確認します。

まず6軸センサの加速度を足せばいいんじゃないか?と思って足してみましたが・・・
角度によってはマイナスになるのでうまく行きません。

##ベクトルとして考える
簡単にするため2軸としてXとYがマイナスになるように45度傾けた図はこうなりますので、ベクトルとして考えればよさそうですね。

image.png

というわけでXYZそれぞれの二乗を足して平方根を取ってみます。
ほぼサンプルのままです。

#include <M5StickC.h>
float accX = 0;
float accY = 0;
float accZ = 0;

float gyroX = 0;
float gyroY = 0;
float gyroZ = 0;
float g = 0;

void setup() {
    M5.begin()
    M5.Lcd.setRotation(3);
    M5.Lcd.fillScreen(BLACK);
    M5.Lcd.setTextSize(1);
    M5.Lcd.setCursor(40, 0);
    M5.Lcd.println("MPU6886 TEST");
    M5.Lcd.setCursor(0, 15);
    M5.Lcd.println("  X       Y       Z");
    M5.MPU6886.Init();
    pinMode(GPIO_NUM_10, OUTPUT); // internal LED
    digitalWrite(GPIO_NUM_10, HIGH);
}
void loop() {
    M5.MPU6886.getGyroData(&gyroX, &gyroY, &gyroZ);
    M5.MPU6886.getAccelData(&accX, &accY, &accZ);
    M5.Lcd.setCursor(0, 30);
    M5.Lcd.printf("%4.1f %4.1f %4.1f      ", gyroX, gyroY, gyroZ);
    M5.Lcd.setCursor(140, 30);
    M5.Lcd.print("o/s");
    M5.Lcd.setCursor(0, 45);
    M5.Lcd.printf("%4.1f %4.1f %4.1f      ", accX * 1000, accY * 1000, accZ * 1000);
    M5.Lcd.setCursor(140, 45);
    M5.Lcd.print("mg");
    M5.Lcd.setCursor(0, 60);

    // accX,accY,accZそれぞれの二乗和の平方根を取る
    g = sqrt(pow(accX, 2) + pow(accY, 2) + pow(accZ, 2)) * 1000;
    M5.Lcd.printf("mG : %4.1f ", g);

    if (2000 < g) {
        // 2Gより衝撃が大きいとき内蔵LEDを点灯
        digitalWrite(GPIO_NUM_10, LOW);
        delay(1000);
        digitalWrite(GPIO_NUM_10, HIGH);
    }
    delay(1);
}

image.png

こうすることで見やすいように1000倍してありますがだいたい1000=1Gくらいの値が出るようになりました。
写真では1120.5になってますが値がフラフラしてるので問題ないと思います。
ただしどの程度の精度が出てるかは不明です。

動作の様子

下の画像はArduino IDEのシリアルプロッタでグラフにしてみたものです。
オレンジの線がGです。1000=(だいたい)1Gとなります。
赤矢印の区間はなるべく空中で動かないようにM5StickCを回転させました。
姿勢によってXYZの値は変わりますが加速度は1G付近をキープしています。

青矢印の部分でM5StickCを手に叩きつけています。
3000程度の値になってるので3Gくらいかかっていたようです。

image.png

というわけで衝撃を検出できるようになりましたので、
デスストランディングに出てくるダメージセンサーテープを作ってみました。
M5StickCで衝撃を検出してNeopixelテープを光らせています。

16
11
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?