Arduinoソースコード
#include "I2Cdev.h"
#include "MPU6050_6Axis_MotionApps20.h"
MPU6050 mpu;
#define OUTPUT_TEAPOT
int const INTERRUPT_PIN = 2;
bool blinkState;
bool DMPReady = false;
uint8_t MPUIntStatus;
uint8_t devStatus;
uint16_t packetSize;
uint8_t FIFOBuffer[64];
Quaternion q;
VectorFloat gravity;
float ypr[3];
uint8_t teapotPacket[14] = { '$', 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0x00, 0x00, '\r', '\n' };
volatile bool MPUInterrupt = false;
void DMPDataReady() {
MPUInterrupt = true;
}
void waitForStartSignal() {
Serial.println(F("Waiting for PC 'r' to start..."));
while (!Serial.available() || Serial.read() != 'r') {
delay(10);
}
Serial.println(F("Start signal received!"));
}
void setup() {
Wire.begin();
Wire.setClock(400000);
Serial.begin(115200);
while (!Serial);
delay(200); // ← 安定性向上のため追加
Serial.println(F("Initializing I2C devices..."));
mpu.initialize();
pinMode(INTERRUPT_PIN, INPUT);
Serial.println(F("Testing MPU6050 connection..."));
if (!mpu.testConnection()) {
Serial.println("MPU6050 connection failed");
while (true);
} else {
Serial.println("MPU6050 connection successful");
}
Serial.println(F("Initializing DMP..."));
devStatus = mpu.dmpInitialize();
mpu.setXGyroOffset(-519);
mpu.setYGyroOffset(-798);
mpu.setZGyroOffset(510);
mpu.setXAccelOffset(-1126);
mpu.setYAccelOffset(989);
mpu.setZAccelOffset(1073);
if (devStatus == 0) {
Serial.println("These are the Active offsets:");
Serial.println(F("Enabling DMP..."));
mpu.setDMPEnabled(true);
Serial.print(F("Enabling interrupt detection (Arduino external interrupt "));
Serial.print(digitalPinToInterrupt(INTERRUPT_PIN));
Serial.println(F(")..."));
attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), DMPDataReady, RISING);
MPUIntStatus = mpu.getIntStatus();
Serial.println(F("DMP ready! Waiting for start signal..."));
DMPReady = true;
packetSize = mpu.dmpGetFIFOPacketSize();
} else {
Serial.print(F("DMP Initialization failed (code "));
Serial.print(devStatus);
Serial.println(F(")"));
}
pinMode(LED_BUILTIN, OUTPUT);
waitForStartSignal(); // ★ PCから 'r' が届くまで待つ
}
void loop() {
if (!DMPReady) return;
if (mpu.dmpGetCurrentFIFOPacket(FIFOBuffer)) {
teapotPacket[2] = FIFOBuffer[0];
teapotPacket[3] = FIFOBuffer[1];
teapotPacket[4] = FIFOBuffer[4];
teapotPacket[5] = FIFOBuffer[5];
teapotPacket[6] = FIFOBuffer[8];
teapotPacket[7] = FIFOBuffer[9];
teapotPacket[8] = FIFOBuffer[12];
teapotPacket[9] = FIFOBuffer[13];
Serial.write(teapotPacket, 14);
teapotPacket[11]++;
blinkState = !blinkState;
digitalWrite(LED_BUILTIN, false); // 点灯を省略しても可
}
}