极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: It's_me

基于Arduino+MPU6050+Tp-link 703n平衡车完美站立(部分代码上传)

  [复制链接]
发表于 2014-6-26 20:23:22 | 显示全部楼层
mark,回去慢慢看。
回复 支持 反对

使用道具 举报

发表于 2014-6-26 20:49:39 | 显示全部楼层
本帖最后由 iohongwal 于 2014-6-30 21:29 编辑

  1. unsigned char Re_buf[11],counter=0;
  2. unsigned char sign=0;
  3. int M11=5;
  4. int M12=6;
  5. int M21=9;
  6. int M22=10;
  7. int Pwm_out = 0;
  8. int Turn_Need = 0;
  9. int Speed_Need = 0;
  10. int speed_output_R , speed_output_L;
  11. int count_l=13;
  12. int count_r=8;
  13. int count_left;
  14. int count_right;
  15. float speeds , speeds_filter, positions;
  16. float diff_speeds,diff_speeds_all;
  17. float a[3],w[3],Angle[3],T;
  18. short sAccelerat[3],sAngleVelocity[3],sAngle[3],sT;
  19. float Kap = 24.5;       //
  20. float Kad = 10;         //
  21. float Ksp = 2.8;        //
  22. float Ksi = 0.11;       //
  23. void setup()
  24. {
  25.   Serial.begin(115200);
  26.   pinMode(5,OUTPUT);
  27.   pinMode(6,OUTPUT);
  28.   pinMode(9,OUTPUT);
  29.   pinMode(10,OUTPUT);
  30.   analogWrite(5,0);
  31.   analogWrite(6,0);
  32.   analogWrite(9,0);
  33.   analogWrite(10,0);
  34. }
  35. void Motor(float v1,float v2)
  36. {
  37.   if (v1>255){v1=255;analogWrite(M11,0);analogWrite(M12,v1);}
  38.   else if (v1>0) {analogWrite(M11,0);analogWrite(M12,v1);}
  39.   else if (v1>-255) {analogWrite(M12,0);analogWrite(M11,-v1);}
  40.   else  {v1=-255;analogWrite(M12,0);analogWrite(M11,-v1);}
  41.   
  42. if (v2>255){v2=255;analogWrite(M21,0);analogWrite(M22,v2);}
  43.   else if (v2>0) {analogWrite(M21,0);analogWrite(M22,v2);}
  44.   else if (v2>-255) {analogWrite(M22,0);analogWrite(M21,-v2);}
  45.   else {v2=-255;analogWrite(M22,0);analogWrite(M21,-v2);}  
  46. }
  47. void loop()
  48. {
  49. }


  50. void PID_PWM()
  51. {
  52.   speeds=(count_left + count_right)*0.5;

  53.   diff_speeds = count_left - count_right;
  54.   diff_speeds_all += diff_speeds;

  55.   speeds_filter *=0.85;  //一阶互补滤波
  56.   speeds_filter +=speeds*0.15;

  57.   positions += speeds_filter;
  58.   positions += Speed_Need;
  59.   positions = constrain(positions, -2300, 2300);//抗积分饱和

  60.   Pwm_out = Kap*Angle[0] + Kad*w[0] + Ksp*speeds_filter + Ksi*positions ;  //PID控制器
  61.   if(Turn_Need == 0)
  62.   {
  63.     speed_output_R = int(Pwm_out - diff_speeds_all);
  64.     speed_output_L = int(Pwm_out + diff_speeds_all);
  65.   }
  66.   speed_output_R = int(Pwm_out + Turn_Need);
  67.   speed_output_L = int(Pwm_out - Turn_Need);
  68.   Motor(speed_output_L , speed_output_R);
  69.   count_left = 0;
  70.   count_right = 0;

  71.    Serial.print(Angle[0]);Serial.print(" ");
  72.   Serial.print(w[0]);Serial.print(" ");
  73.   Serial.println(Pwm_out);Serial.print(" ");
  74. }
  75. void serialEvent() {
  76.   while (Serial.available()) {
  77.    
  78.     //char inChar = (char)Serial.read(); Serial.print(inChar); //Output Original Data, use this code
  79.   
  80.     Re_buf[counter]=(unsigned char)Serial.read();
  81.     if(counter==0&&Re_buf[0]!=0x55) return;      //第0号数据不是帧头              
  82.     counter++;      
  83.     if(counter==11)             //接收到11个数据
  84.     {   
  85.        counter=0;               //重新赋值,准备下一帧数据的接收
  86.        switch(Re_buf [1])
  87.         {
  88.         case 0x51:
  89.                 a[0] = float(short(Re_buf [3]<<8| Re_buf [2]))/32768*16;
  90.                 a[1] =  float(short(Re_buf [5]<<8| Re_buf [4]))/32768*16;
  91.                 a[2] =  float(short(Re_buf [7]<<8| Re_buf [6]))/32768*16;               
  92.                 break;
  93.         case 0x52:
  94.                 w[0] =  float(short(Re_buf [3]<<8| Re_buf [2]))/32768*250;
  95.                 w[1] =  float(short(Re_buf [5]<<8| Re_buf [4]))/32768*250;
  96.                 w[2] =  float(short(Re_buf [7]<<8| Re_buf [6]))/32768*250;
  97.                 break;
  98.         case 0x53:
  99.                 Angle[0] =  float(short(Re_buf [3]<<8| Re_buf [2]))/32768*180;
  100.                 Angle[1] =  float(short(Re_buf [5]<<8| Re_buf [4]))/32768*180;
  101.                 Angle[2] =  float(short(Re_buf [7]<<8| Re_buf [6]))/32768*180;
  102.                 T =  float(short(Re_buf [9]<<8| Re_buf [8]));///340.0+36.25   
  103.                 sign=1;
  104.                 break;
  105.         }
  106.     }      
  107.   }
  108. }


复制代码


這我是用你的PID改 幫我看看有冇甚麼問題
因為呢我寫進arduino 走不動 和讀不到資料
回复 支持 反对

使用道具 举报

发表于 2014-6-27 14:48:09 | 显示全部楼层
楼主可不可以发个买电机的链接啊
回复 支持 反对

使用道具 举报

发表于 2014-6-28 11:04:58 | 显示全部楼层
LZ 电机是采用步进的摸  有链接木有
回复 支持 反对

使用道具 举报

发表于 2014-6-29 17:04:01 | 显示全部楼层
技术贴!顶!
回复 支持 反对

使用道具 举报

发表于 2014-7-20 10:30:59 | 显示全部楼层
想问下如何通过tx和rx实现703N和arduino的通信呢?
回复 支持 反对

使用道具 举报

发表于 2014-7-21 13:06:39 | 显示全部楼层
很好!
回复 支持 反对

使用道具 举报

发表于 2014-8-1 17:17:45 | 显示全部楼层
手机怎么接收路由的串口数据
回复 支持 反对

使用道具 举报

发表于 2014-8-27 18:21:12 | 显示全部楼层
不知道为什么站不起来。。
回复 支持 反对

使用道具 举报

发表于 2014-8-29 10:11:53 | 显示全部楼层
每个电机测速有A、B相两路信号,直接一路还是接两路呢?接两路可以测正反向,更准确呀!
回复 支持 反对

使用道具 举报

发表于 2014-9-4 17:27:06 | 显示全部楼层
有完整的代码吗?
回复 支持 反对

使用道具 举报

发表于 2014-9-15 12:43:53 | 显示全部楼层
为什么我的电机需要三个接口才能用pwm控制速度呢?
回复 支持 反对

使用道具 举报

发表于 2014-9-16 13:34:22 | 显示全部楼层
学习了,刚开始玩arduino
回复 支持 反对

使用道具 举报

发表于 2014-9-24 12:09:30 | 显示全部楼层
跟着楼主买了一样的串口MPU6050,  求楼主放出完整代码啊
回复 支持 反对

使用道具 举报

发表于 2014-9-24 13:46:31 | 显示全部楼层
楼主MPU6050里面的代码温度那里有点问题:
  1. T =  float(short(Re_buf [9]<<8| Re_buf [8]));///340.0+36.25
复制代码
而那个卖模块给出的代码是:
  1. T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25;
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-26 14:59 , Processed in 0.052757 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表