이제 오늘하려고 생각한것의 마지막 파트

 

이전글 코드는 ypr 값 값 값

식으로 나왓는데

ypr 지우고 콤마 분할되도록 수정

#include "I2Cdev.h"
#include <SoftwareSerial.h> 

#include "MPU6050_6Axis_MotionApps20.h"
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
    #include "Wire.h"
#endif

// class default I2C address is 0x68
// specific I2C addresses may be passed as a parameter here
// AD0 low = 0x68 (default for SparkFun breakout and InvenSense evaluation board)
// AD0 high = 0x69
MPU6050 mpu;
//MPU6050 mpu(0x69); // <-- use for AD0 high

#define OUTPUT_READABLE_YAWPITCHROLL


#define LED_PIN 13 // (Arduino is 13, Teensy is 11, Teensy++ is 6)
bool blinkState = false;

// MPU control/status vars
bool dmpReady = false;  // set true if DMP init was successful
uint8_t mpuIntStatus;   // holds actual interrupt status byte from MPU
uint8_t devStatus;      // return status after each device operation (0 = success, !0 = error)
uint16_t packetSize;    // expected DMP packet size (default is 42 bytes)
uint16_t fifoCount;     // count of all bytes currently in FIFO
uint8_t fifoBuffer[64]; // FIFO storage buffer

// orientation/motion vars
Quaternion q;           // [w, x, y, z]         quaternion container
VectorInt16 aa;         // [x, y, z]            accel sensor measurements
VectorInt16 aaReal;     // [x, y, z]            gravity-free accel sensor measurements
VectorInt16 aaWorld;    // [x, y, z]            world-frame accel sensor measurements
VectorFloat gravity;    // [x, y, z]            gravity vector
float euler[3];         // [psi, theta, phi]    Euler angle container
float ypr[3];           // [yaw, pitch, roll]   yaw/pitch/roll container and gravity vector

// packet structure for InvenSense teapot demo
uint8_t teapotPacket[14] = { '$', 0x02, 0,0, 0,0, 0,0, 0,0, 0x00, 0x00, '\r', '\n' };


volatile bool mpuInterrupt = false;     // indicates whether MPU interrupt pin has gone high
void dmpDataReady() {
    mpuInterrupt = true;
}



//RXD3, TXD4
SoftwareSerial BTSerial(4, 3);

void setup() {
    BTSerial.begin(9600);

    #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
        Wire.begin();
        TWBR = 24; // 400kHz I2C clock (200kHz if CPU is 8MHz)
    #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
        Fastwire::setup(400, true);
    #endif

    while (!BTSerial); // wait for Leonardo enumeration, others continue immediately

    // initialize device
    BTSerial.println(F("Initializing I2C devices..."));
    mpu.initialize();
    //pinMode(INTERRUPT_PIN, INPUT);

    // verify connection
    BTSerial.println(F("Testing device connections..."));
    BTSerial.println(mpu.testConnection() ? F("MPU6050 connection successful") : F("MPU6050 connection failed"));

    // load and configure the DMP
    BTSerial.println(F("Initializing DMP..."));
    devStatus = mpu.dmpInitialize();

    // supply your own gyro offsets here, scaled for min sensitivity
    mpu.setXGyroOffset(220);
    mpu.setYGyroOffset(76);
    mpu.setZGyroOffset(-85);
    mpu.setZAccelOffset(1788); // 1688 factory default for my test chip

    // make sure it worked (returns 0 if so)
    if (devStatus == 0) {
        // turn on the DMP, now that it's ready
        BTSerial.println(F("Enabling DMP..."));
        mpu.setDMPEnabled(true);

        // enable Arduino interrupt detection
        BTSerial.println(F("Enabling interrupt detection (Arduino external interrupt 0)..."));
        attachInterrupt(0, dmpDataReady, RISING);
        //attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), dmpDataReady, RISING);

        mpuIntStatus = mpu.getIntStatus();

        // set our DMP Ready flag so the main loop() function knows it's okay to use it
        BTSerial.println(F("DMP ready! Waiting for first interrupt..."));
        dmpReady = true;

        // get expected DMP packet size for later comparison
        packetSize = mpu.dmpGetFIFOPacketSize();
    } else {
        BTSerial.print(F("DMP Initialization failed (code "));
        BTSerial.print(devStatus);
        BTSerial.println(F(")"));
    }
}


void loop() {
    // if programming failed, don't try to do anything
    if (!dmpReady) return;

    // wait for MPU interrupt or extra packet(s) available
    while (!mpuInterrupt && fifoCount < packetSize) {
    }

    // reset interrupt flag and get INT_STATUS byte
    mpuInterrupt = false;
    mpuIntStatus = mpu.getIntStatus();

    // get current FIFO count
    fifoCount = mpu.getFIFOCount();

    // check for overflow (this should never happen unless our code is too inefficient)
    if ((mpuIntStatus & 0x10) || fifoCount == 1024) {
        // reset so we can continue cleanly
        mpu.resetFIFO();
        //BTSerial.println(F("FIFO overflow!"));

    // otherwise, check for DMP data ready interrupt (this should happen frequently)
    } else if (mpuIntStatus & 0x02) {
        // wait for correct available data length, should be a VERY short wait
        while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();

        // read a packet from FIFO
        mpu.getFIFOBytes(fifoBuffer, packetSize);
        
        // track FIFO count here in case there is > 1 packet available
        // (this lets us immediately read more without waiting for an interrupt)
        fifoCount -= packetSize;

        #ifdef OUTPUT_READABLE_YAWPITCHROLL
            // display Euler angles in degrees
            mpu.dmpGetQuaternion(&q, fifoBuffer);
            mpu.dmpGetGravity(&gravity, &q);
            mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
            BTSerial.print(ypr[0] * 180/M_PI);
            BTSerial.print(",");
            BTSerial.print(ypr[1] * 180/M_PI);
            BTSerial.print(",");
            BTSerial.println(ypr[2] * 180/M_PI);
        #endif
    }
    delay(50);
}

 

 

 

 

 

동작은 하긴하는데

송신 속도가 너무 느려서

다음 링크 참고해서 보드레이트 변경 

https://rockjjy.tistory.com/2503

 

Arduino Uno 로 HC-06 블루투스 슬레이브 모듈을 사용해 무선으로 코드 업로드 해보기

Arduino Uno 로 HC-06 블루투스 슬레이브 모듈을 사용해서 무선으로 코드를 업로드 해보는 프로젝트 입니다 Arduino 에 코드를 업로드 하는 가장 기본적인 방법은 USB 데이터 케이블을 사용해서 코드를

rockjjy.tistory.com

 

 

 

115200으로 바꾼뒤 배터리 연결하면

ypr을 제대로 받질 못한다.

pc로 전원주면 정상동작하긴하는데

 

다시 9600으로 낮춘뒤

해도 안되는데

딜레이를 30ms 주면 베터리 연결한 상태에서도 정상적으로 putty에서 볼수 있다.

20ms 딜레이도 안됨.

 

전원 문제는 생각도 못햇는데 골치아프네

값이 정상적으로 받아지다가 중간에 튈때도 많다.

 

송신 문자열에 .이랑 소수점 있으니까 이걸 제거해주면 어떨까

 

보내는게 줄어서인가 아까보단 나은거같기도하고

 

 

putty에선 정상적으로 뜨는데 값이 왜이렇게 튈까 찾아보다가

 

 

 

 

 

 

 

 

ypr빼고  리드 스트링 결과 그대루 출력시 결과

putty완 다르게 꽤 깨지는편

 

 

 

 

 

딜레이 30대신 200정도 줘볼까

느린건 아쉽지만 깨지는건 현저히 줄었다.

 

 

 

 

그리고 고정한 상태에서

y가 65, 5 가  번갈아 들어오는 상황이었는데

푸티로 열어보니 67정도로 계속 들어옴

근데 언리얼 시리얼 플러그인에서 리드 스트링할때 65 의 앞인 6을 잘라서 읽어버림.

 

 

 

 

잘되나 싶었는데 언리얼 시리얼 플러그인에서 막혀버리네

나머진 내일확인해봐야겟다.

 

진행 과정에 있었던 문제 

gpt 문답

Q : 아두이노에 보조베터리로 전원을주고 블루투스모듈과 MPU6050을 아두이노에 연결한 상태에서 블루투스 시리얼 통신을 했어.
아두이노에 delay를 주지않으면 MPU6050으로부터 값을 못가져오는데
delay(100)정도 주면 값을 블루투스로 받아올수 있었어
delay 유무에 따라 왜이러는거야?
그런데 베터리를 안쓰고 PC 전원을 주면 delay를 안써도 정상적으로 보내져
베터리 전원 문제도 있는거야?

 

A : 보조 배터리로 전원을 줄 때와 PC 전원을 사용할 때의 차이는 전원의 안정성과 품질에 기인할 수 있습니다. 보조 배터리는 출력 전압이나 전류의 안정성이 PC USB 포트보다 상대적으로 낮을 수 있고, 이는 전자 부품의 정상 작동에 영향을 줄 수 있습니다.

MPU6050과 블루투스 모듈은 정확한 타이밍과 일정한 전원 공급이 필요한 부품들이므로, 전원 공급이 불안정하면 센서 데이터의 샘플링과 처리가 제대로 이루어지지 않을 수 있습니다. `delay(100)`을 추가함으로써, 센서가 데이터를 처리하고 준비하는데 필요한 시간을 확보하게 되며, 이는 불안정한 전원 상황에서도 데이터를 안정적으로 처리할 수 있는 여유를 제공합니다.

반면 PC USB 포트는 일반적으로 보다 안정적인 전원을 제공합니다. 따라서 전원 불안정이 센서의 데이터 처리에 미치는 영향이 적어, `delay` 없이도 데이터를 정상적으로 처리할 수 있습니다.

전원 문제를 해결하기 위해 다음과 같은 방법을 시도해보실 수 있습니다:

- 보조 배터리의 출력 전압과 전류가 아두이노와 연결된 모듈의 요구 사항을 충족하는지 확인하세요.
- 전원 라인에 전압 조정기나 캐패시터와 같은 필터링 회로를 추가하여 전원 노이즈를 줄이세요.
- 가능하다면, 더 안정적인 전원 공급 장치를 사용하세요.

이러한 조치를 통해 전원 공급 문제를 해결하고, 모든 조건에서 MPU6050과 블루투스 모듈이 안정적으로 작동하도록 할 수 있습니다.

+ Recent posts