极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14772|回复: 7

[DIY] 双轮自平衡小车

[复制链接]
发表于 2015-12-2 16:18:04 | 显示全部楼层 |阅读模式
本帖最后由 迷你强 于 2015-12-5 10:13 编辑


这是总体的效果图
工作原理:
两轮自平衡小车在完成自身平衡的同时能够完成运动控制和适应不同环境的其它控制任务。我们利用陀螺仪和加速度传感器MPU6050来检测车体状态的变化,并利用直流光电编码电机控制驱动,精确控制电机进行相应的调整,以保持系统的平衡

小伙伴们看到这里是不是觉得心痒痒的呀~~~
材料准备:

0824双孔梁144        1
25mm直流电机连接片        2
同步带轮90T        2
轮胎68.5x22mm        2
法兰盘 4mm        2
螺丝M4*8        22
螺丝M4*16        4
尼龙柱30mm        6
塑料铆钉M4*8mm        4
亚克力板B        2
        
Orion主控板        1
直流编码电机扩展包(包含2个25mm直流编码电机)        1
陀螺仪传感器        1
红外接收模块        1
红外遥控器        1
18650锂电池        1
RJ25连接线20cm        3
        
六角扳手        
十字起子        

制作步骤:

    搭建底盘,由一根双孔梁作为整个小车的主要支架,底两侧安装25mm编码直流电机。

一会儿就如是说

将车轮固定在编码电机输出轴上,就是下面酱紫

安装主控板和其它电子模块


将亚克力支架固定在双孔梁上的内螺纹槽中。同时压住编码电机的连接线。

安装剩余的电子模块以及连线(编码电机驱动接Port 1、陀螺仪接Port 8、红外接收器接Port 6)

用魔术贴将电池固定在小车顶部,完成搭建

使用方法:
打开电源开关,先将小车放倒在地面,待电机停止转动后,扶正小车后并复位主控板。小车将在2秒内转为平衡状态。用红外遥控器方向键控制小车前进后左右转弯。

Arduino代码

  1. #include "MeOrion.h"
  2. #include "MeEncoderMotor.h"
  3. #include "MeSerial.h"
  4. #include "MeInfraredReceiver.h"
  5. #include <Wire.h>
  6. #include <SoftwareSerial.h>

  7. #define RELAX_ANGLE 7.5 //Nature Balance Angle
  8. #define MOTOR_ENABLE     //Enable Motor

  9. /**************Line Finder***************/
  10. #define LED_1 !(PINB&(1<<0))  //8  
  11. #define LED_2 !(PIND&(1<<2))  //2
  12. #define LED_3 !(PINB&(1<<4))  //12
  13. #define LED_4 !(PINB&(1<<5))  //13

  14. /***************Regist Flags***************/
  15. #define COMDONE 0x0001    //Frame Command End
  16. #define MOVING 0x0002     //Moving
  17. #define TRACING 0x0004    //Tracing
  18. #define START 0x0008      //Start

  19. MeEncoderMotor encoder;
  20. MeInfraredReceiver ir(PORT_6);

  21. /***************MPU6050 Define**********************/
  22. double accX, accY, accZ;
  23. double gyroX, gyroY, gyroZ;
  24. double  compAngleY, gyroYangle;
  25. int16_t tempRaw;
  26. uint32_t IMU_timer;
  27. uint8_t i2cData[14];

  28. /***************PID Define**********************/
  29. typedef struct
  30. {
  31.   double P, I, D;
  32.   double Setpoint, Output, Integral, last_error;
  33.   uint32_t Timer;
  34. } PID;

  35. PID  PID_angle, PID_speed, PID_turn;

  36. uint32_t FLAG;
  37. char comdata[19], data_p; //Serial Data
  38. float joy_x, joy_y;

  39. void setup()
  40. {
  41.   /*********************Initialize********************/
  42.   Serial.begin(115299);  //Serial
  43.   Wire.begin();           //I2C Wire
  44.   ir.begin();             //Infred Received
  45.   /*********************MPU6050 initialize********************/
  46.   i2cData[0] = 7;
  47.   i2cData[1] = 0x00;
  48.   i2cData[2] = 0x00;
  49.   i2cData[3] = 0x00;
  50.   while (i2cWrite(0x19, i2cData, 4, false));
  51.   while (i2cWrite(0x6B, 0x01, true));
  52.   while (i2cRead(0x75, i2cData, 1));
  53.   if (i2cData[0] != 0x68)
  54.     while (1);
  55.   delay(100);

  56.   while (i2cRead(0x3B, i2cData, 6));
  57.   accX = (i2cData[0] << 8) | i2cData[1];
  58.   accY = (i2cData[2] << 8) | i2cData[3];
  59.   accZ = (i2cData[4] << 8) | i2cData[5];
  60.   tempRaw = (i2cData[6] << 8) | i2cData[7];

  61.   double pitch = atan(-accY / sqrt(accX * accX + accZ * accZ)) * RAD_TO_DEG;
  62.   gyroYangle = pitch;
  63.   compAngleY = pitch;
  64.   IMU_timer = micros();

  65.   /*********************Encoder********************/
  66.   encoder.begin();
  67.   encoder.setMode(0, 1);  //pwm mode
  68.   encoder.setMode(1, 1);

  69.   /*********************PID Initialize********************/
  70.   PID_angle.Setpoint = RELAX_ANGLE;
  71.   PID_angle.P = 22.0;    //18
  72.   PID_angle.I = 0.05;    //0.1
  73.   PID_angle.D = 0.001;   //0.0005

  74.   PID_turn.P = 10;
  75.   PID_turn.D = 30;

  76.   PID_revalue();
  77.   IMU_fillter();
  78.   //FLAG |= TRACING;
  79.   PID_speed.Setpoint = 0;
  80.   gyroYangle = RELAX_ANGLE;
  81.   compAngleY = RELAX_ANGLE;
  82.   FLAG |= START;

  83. }
  84. long receiveTime = 0;
  85. void loop()
  86. {
  87.   if(ir.buttonState()){
  88.     while(ir.available()){
  89.       parseJoystick(ir.read());
  90.       receiveTime = micros();  
  91.     }
  92.   }
  93.   if(micros()-receiveTime>100000){
  94.     receiveTime = micros();
  95.     parseJoystick(0xFA);
  96.   }
  97.    
  98.   IMU_fillter();
  99.   PID_revalue();
  100.   PID_angle_compute();
  101.   PID_speed_compute();
  102.   PID_angle_compute();
  103. }
复制代码

想知道更多在产品上面的应用可以看我们双十二双子星淘宝众筹哦~~~欢呼雀跃~~~~
https://izhongchou.taobao.com/dr ... 4BT&id=10051221

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2015-12-2 18:09:16 | 显示全部楼层
这个感觉比DF的那个火烧强,像水星版的大白
回复 支持 反对

使用道具 举报

发表于 2015-12-2 18:10:27 | 显示全部楼层
有点 N年前那个LG棒棒糖手机的感觉
回复 支持 反对

使用道具 举报

发表于 2015-12-2 22:43:36 | 显示全部楼层
成本太高,鉴定完毕.
回复 支持 反对

使用道具 举报

发表于 2015-12-4 14:43:38 | 显示全部楼层
呕吼……找不到库啊。
回复 支持 反对

使用道具 举报

发表于 2015-12-4 22:34:06 | 显示全部楼层
include的文件有吗?
回复 支持 反对

使用道具 举报

发表于 2015-12-5 10:14:43 | 显示全部楼层
竟然是伺服电机
回复 支持 反对

使用道具 举报

发表于 2015-12-6 08:50:45 | 显示全部楼层
楼主,先收藏之,谢谢分享。
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-16 18:56 , Processed in 0.063364 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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