NRF+MPU6050

Dependencies:   mbed nRF24L01P

Files at this revision

API Documentation at this revision

Comitter:
AlexQian
Date:
Sun Sep 01 10:33:23 2019 +0000
Parent:
5:6a93542b8922
Commit message:
test

Changed in this revision

MPU6050.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r 6a93542b8922 -r ad2f9458ab75 MPU6050.h
--- a/MPU6050.h	Mon Apr 15 05:16:57 2019 +0000
+++ b/MPU6050.h	Sun Sep 01 10:33:23 2019 +0000
@@ -698,7 +698,7 @@
   uint8_t whoami = readByte(MPU6050_ADDRESS, WHO_AM_I_MPU6050);  // Read WHO_AM_I register for MPU-6050
 //  Serial_2.printf("I AM 0x%x\n\r", whoami); Serial_2.printf("I SHOULD BE 0x68\n\r");
   
-  if (whoami == 0x98) // WHO_AM_I should always be 0x68
+  if (whoami == 0x68) // WHO_AM_I should always be 0x68
   {  
     //pc.printf("MPU6050 is online...");
     wait(1);
diff -r 6a93542b8922 -r ad2f9458ab75 main.cpp
--- a/main.cpp	Mon Apr 15 05:16:57 2019 +0000
+++ b/main.cpp	Sun Sep 01 10:33:23 2019 +0000
@@ -0,0 +1,128 @@
+#include "mbed.h"
+#include "MPU6050.h"
+#include "nRF24L01P.h"
+#define NRF24_TRANSFER_SIZE 32
+float Yaw,Pitch,Roll;
+float Yaw_t,Pitch_t,Roll_t,Power_t;
+float P,I,D;
+int Power[4];
+int counts;
+char rxdata[NRF24_TRANSFER_SIZE];
+
+DigitalOut myled1(PB_3);
+DigitalOut myled2(PB_4);
+mpu6050 mpu6050(PB_11,PB_10);
+Serial pc(PA_9, PA_10,115200);
+nRF24L01P nrf24_PB_15(PB_15,PB_14,PB_13,PA_4,PB_2,PB_12);
+PwmOut myServoPA_6(PA_6);
+PwmOut myServoPA_7(PA_7);
+PwmOut myServoPB_0(PB_0);
+PwmOut myServoPB_1(PB_1);
+
+void NRF_Init()
+{
+    nrf24_PB_15.powerUp();
+    nrf24_PB_15.setTransferSize( NRF24_TRANSFER_SIZE );
+    nrf24_PB_15.setReceiveMode();
+    nrf24_PB_15.setRxAddress(12345ull);
+    nrf24_PB_15.setTxAddress(12345ull);
+    nrf24_PB_15.enable();
+}
+void MPU_Init()
+{
+    pc.printf("Initializing...\n");
+    while(mpu6050.Init())  //初始化
+    {
+        counts+=1;
+        wait(1);
+        myled2=!myled2;
+        if(counts>10)
+        {
+            pc.printf("Initialation failed\n"); // 初始化失败
+            break;
+        }   
+    }
+    pc.printf("Initialized\n"); //初始化完成
+    for(int i=0;i<20000;i++) //校零
+    mpu6050.receiveData(&Yaw,&Pitch,&Roll);  //读取传感器姿态
+}
+void motor(int pwm,int number)
+{
+    switch(number)
+    {
+    case 0:
+        myServoPA_7.period_ms(20);
+        myServoPA_7.pulsewidth_ms(((pwm * 20) / 1000));
+        break;
+    case 1:
+        myServoPA_6.period_ms(20);
+        myServoPA_6.pulsewidth_ms(((pwm * 20) / 1000));
+        break;
+    case 2:
+        myServoPB_0.period_ms(20);
+        myServoPB_0.pulsewidth_ms(((pwm * 20) / 1000));
+        break;
+    case 3:
+        myServoPB_1.period_ms(20);
+        myServoPB_1.pulsewidth_ms(((pwm * 20) / 1000));
+        break;
+    default:
+        break;
+    }
+}
+void angle_control()
+{
+    double ERoll,EPitch,EYaw,ERoll_last,EPitch_last,EYaw_last;
+    double Interg_R,Interg_P,Interg_Y;
+    double out_T,out_R,out_P,out_Y;
+    ERoll=Roll-Roll_t;
+    EPitch=Pitch-Pitch_t;
+    EYaw=Yaw-Yaw_t;
+    Interg_R+=ERoll; Interg_P+=EPitch; Interg_Y+=EYaw;
+//    out_R=P*ERoll + I*Interg_R + D*(ERoll-ERoll_last);
+//    out_P=P*EPitch + I*Interg_P + D*(EPitch-EPitch_last);
+//    out_Y=P*EYaw + I*Interg_Y + D*(EYaw-EYaw_last);
+    if(Power_t>200)
+   { 
+        out_T=Power_t-50;
+        Power[0]=out_T+out_R-out_P+out_Y;
+        Power[1]=out_T-out_R-out_P-out_Y;
+        Power[2]=out_T-out_R+out_P+out_Y;
+        Power[3]=out_T+out_R+out_P-out_Y;
+    }
+    else
+        Power[0]=Power[1]=Power[2]=Power[3]=0;
+    for(int i=0;i<4;i++)
+        motor(Power[i],i);    
+}
+int main()
+{
+    P=1;I=0;D=0;
+    MPU_Init();
+    if(Yaw_t<10&&Yaw_t>-10)
+        Yaw_t=0;
+    while(1) 
+    {
+        counts=counts+1;
+        mpu6050.receiveData(&Yaw,&Pitch,&Roll);  //读取传感器姿态 
+        if (nrf24_PB_15.readable()) {
+            nrf24_PB_15.read( NRF24L01P_PIPE_P0, rxdata, NRF24_TRANSFER_SIZE);
+            if (rxdata[0] == 36 && rxdata[1] == 77) {
+                Roll_t = rxdata[6] * 256 + rxdata[5];
+                Pitch_t = rxdata[8] * 256 + rxdata[7];
+                Yaw_t = rxdata[10] * 256 + rxdata[9];
+                Power_t = rxdata[12] * 256 + rxdata[11];
+        //      Roll_Config = rxdata[14] * 256 + rxdata[13];
+        //      Pitch_config = rxdata[16] * 256 + rxdata[15];
+        //      Yaw_config = rxdata[18] * 256 + rxdata[17];
+                Roll_t =(Roll_t-1500)*45/1000;
+                Pitch_t =(Pitch_t-1500)*45/1000 ;
+                Yaw_t =(Yaw_t-1500)*45/1000 ;
+            }
+        }
+//      pc.printf("Yaw, Pitch, Roll: %.2f, %.2f, %.2f\n", Yaw, Pitch, Roll);
+        angle_control();
+        myled1=counts%2;
+        wait(0.01);
+    }
+ }
\ No newline at end of file