MPU6050 加速度センサー & ジャイロスコープモジュールを使って姿勢確認を行いました。下記サイトのプログラムを引用して、Processing4による姿勢グラフィックをMadgwickフィルタを使い、傾きを変化したところ自然な姿勢確認できました。
●参考サイト MadgwickフィルタのライブラリをArduinoで使う【https://qiita.com/Ninagawa123/items/9520bad3c78ee40194fc】
動画
ESP8266開発ボード MPU6050
ESP8266 MPU6050回路図
Processing ダウンロード
●processing ダウンロード【https://processing.org/download】
ダウンロードしたProcessingを任意のファイルに保存する。
ESP8266プログラム
#include "MPU6050.h"
MPU6050 accelgyro;
#include <MadgwickAHRS.h>
Madgwick MadgwickFilter;
int16_t ax, ay, az;//加速度 int16_tは2バイトの符号付き整数
int16_t gx, gy, gz;//角速度 同上
float ROLL, PITCH, YAW;
void setup()
{
Wire.begin();
Serial.begin(115200);
accelgyro.initialize();//I2Cデバイスの初期化
delay(300);
MadgwickFilter.begin(100);//フィルタのサンプリングを100Hzで
}
void loop()
{
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
MadgwickFilter.updateIMU(gx / 131.0, gy / 131.0, gz / 131.0, ax / 16384.0, ay / 16384.0, az / 16384.0);
ROLL = MadgwickFilter.getRoll();
PITCH = MadgwickFilter.getPitch();
YAW = MadgwickFilter.getYaw();
Serial.print(ROLL); Serial.print(",");
Serial.print(PITCH); Serial.print(",");
Serial.print(YAW);
Serial.print("\n");
delay(10);
}
シリアルモニター
Processing
import processing.serial.*;
Serial myPort;
printArray(Serial.list());
【実行】
[1] "COM10"
※Processing プログラム
int available_serialport = 1に変更する
Processing プログラム
import processing.serial.*; // シリアルライブラリをインポート
Serial myPort; //シリアルポートのインスタンス
int available_serialport = 1; // シリアル検索プログラムで調べたシリアルポートの番号に設定数値を変更しておく
String arduinoPort = Serial.list()[available_serialport ]; //シリアルポートの設定
float []data = new float [3]; //シリアルのデータを格納する配列を宣言
void setup() {
lights();
size(300, 300, P3D); // キャンバスサイズ
myPort = new Serial(this, arduinoPort, 115200); // シリアルポートの設定
}
void draw() {
background(230); //背景グレー
translate(width / 2, height / 2, 0); // 原点を図形の中心に
rotateX(radians(-data[1])); //ここではProcessingのX軸としてPITCH軸の値を渡している.センサの初期方向にあわせお好みで調整
rotateZ(radians(-data[0])); //ここではProcessingのZ軸としてROLL軸の値を渡している.センサの初期方向にあわせお好みで調整
int size = 10;//図形のサイズ倍率。キャンバスを大きくする時に変更可
box(20 * size, 1 * size, 15 * size); //GY-521基盤のような直方体を描く
translate(0, -4 * size, 0);
}
void serialEvent(Serial p) { //シリアルを監視
String inString = myPort.readStringUntil('\n'); //データがあったら改行のところまで読み込む
if (inString != null) { //シリアルの文字列データが何か入っていれば
inString = trim(inString); //シリアル文字列の前後の空白を削除
data = float(split(inString, ',')); //ピリオドで分割して配列に格納
println(data);//受信した配列データをprocessingのコンソールに出力
}
}
0 件のコメント:
コメントを投稿