# Balance-Car **Repository Path**: JadenNeal/Balance-Car ## Basic Information - **Project Name**: Balance-Car - **Description**: This is a balancing car project with Arduino UNO R3 board - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2020-10-27 - **Last Updated**: 2022-03-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 基于Arduino UNO R3开发板的平衡车设计 ## 材料 - Arduino UNO R3 - Mpu6050陀螺仪 - HC-06蓝牙模块 - 晶门SSD 1306 0.96英寸OLED显示模块 - HC-SR04 超声波测距模块 - 红外对管模块 - WS2812全彩LED模块 - TB6612电机驱动模块 - 杜邦线若干(双公头,双母头,公母头) - 电机两个(含霍尔测速编码器) ## 整车连线 1. 超声波 + GND -- GND + Echo -- A3 + Trig -- A2 + VCC -- 5V 2. 蓝牙(HC-06) + RX -- 1(板子的发射端) + TX -- 0(板子的接收端) + GND -- GND + VCC -- VCC 3. 显示屏(SSD 1306) + VCC -- 5V + GND -- GND + SCL -- SCL + SDA -- SDA 4. 电机驱动(TB6612) + PWMA -- 10 + AIN2 -- 13 + AIN1 -- 12 + STBY -- 11 + BIN1 -- 7 + BIN2 -- 6 + PWMB -- 9 + GND -- GND + VM -- 12V + VCC -- 5V + GND -- GND + AO1 -- AO1 + AO2 -- AO2 + BO2 -- BO2 + BO1 -- BO1 + GND -- GND 5. 陀螺仪(MPU6050) + VCC -- 5V + GND -- GND + SCL -- A5 + SDA -- A4 + INT -- 2 + 最好在VCC和GND之间加个0.1uf的旁路电容 6. 电机A + AO2 + 5V + 3 + 8 + GND(并联0.1uf的旁路电容) + AO1(正极) 7. 电机B + BO1(正极) + GND(并联0.1uf的旁路电容) + 4 + 5 + 5V + BO2 8. 全彩LED + IN -- A1 + VCC -- 5V + GND -- GND 9. 红外对管 + OUT -- A0 + GND -- GND + VCC -- VCC
3维布局 3维布局草图
## 模块测试 ### 单模块测试程序 **注意:单模块测试时,接线按照**[原理图](https://github.com/JadenNeal/Balance-Car/blob/master/%E5%B9%B3%E8%A1%A1%E5%B0%8F%E8%BD%A6%E5%8E%9F%E7%90%86%E5%9B%BE.pdf) - [蓝牙HC-06](https://github.com/JadenNeal/Balance-Car/blob/master/Bluetooth/Bluetooth.ino) - [红外对管](https://github.com/JadenNeal/Balance-Car/blob/master/Infra/Infra.ino) - [陀螺仪MPU6050](https://github.com/JadenNeal/Balance-Car/blob/master/MPU6050/MPU6050.ino) - [晶门SSD 1306 OLED显示屏](https://github.com/JadenNeal/Balance-Car/blob/master/OLED/OLED.ino) - [超声波SR04](https://github.com/JadenNeal/Balance-Car/blob/master/Ultrasonic/Ultrasonic.ino) - [全彩LED](https://github.com/JadenNeal/Balance-Car/blob/master/fullLED/fullLED.ino) - [电机](https://github.com/JadenNeal/Balance-Car/blob/master/motor/motor.ino) ### 多模块联调测试程序 **注意:接线同上** - [蓝牙控制电机](https://github.com/JadenNeal/Balance-Car/blob/master/others/BT_and_Motor/BT_and_Motor.ino) - [串口控制电机](https://github.com/JadenNeal/Balance-Car/blob/master/others/Serial_and_Motor/Serial_and_Motor.ino) - [测定小车机械中值](https://github.com/JadenNeal/Balance-Car/tree/master/others/final_v2) - [红外线和LED](https://github.com/JadenNeal/Balance-Car/tree/master/others/infra_and_LED) ### 最终实现程序 **注意:接线按照“整车连线”写的接线** - [实现小车自平衡](https://github.com/JadenNeal/Balance-Car/blob/master/others/final_v4/final_v4.ino) - [最终版程序](https://github.com/JadenNeal/Balance-Car/blob/master/others/final_v5/final_v5.ino) ## 模块认知 测试笔记记录在[这里](https://github.com/JadenNeal/Balance-Car/tree/master/TEST_NOTES)。 ### UNO开发板 [参见这里](https://github.com/JadenNeal/Balance-Car/blob/master/TEST_NOTES/20190708/UNO_R3%E5%BC%80%E5%8F%91%E6%9D%BF%E7%AC%94%E8%AE%B0.md) ### Mpu6050模块 陀螺仪。 [知乎](https://zhuanlan.zhihu.com/p/20082486)上的关于MPU6050的讲解。 [野火](http://www.luwl.net/wp-content/uploads/2017/03/MPU6050%E6%95%99%E7%A8%8B.pdf)上关于MPU6050的讲解。 [英文版手册下载地址](http://pdf1.alldatasheetcn.com/datasheet-pdf/view/517744/ETC1/MPU-6050.html)。 ### HC-06 蓝牙。 HC-06是目前用的较多的蓝牙模块,HC-06只能作为从机工作,因此对于被控制的小车来说非常适合使用。 [这里](https://www.jianshu.com/p/5c220d0d3692)有非常清晰的接线图,其实不需要上位机测试,但更改名称或PIN需要用上位机进入AT进行更改。下载一个串口通信助手,打开后连接蓝牙(默认名称为HC-06),成功后即可发送数据,进行通信。 ### SSD 1306 OLED显示模块。 显示小车信息。 ### 红外对管模块 用来辅助测距。 ### HC-SR04 超声波。 测距功能实现的主要模块。 ### WS2812 全彩LED。 显示小车状态。 ## 问题汇总 在制作的过程中,遇到的问题有很多,包括硬件软件的问题,这里只列出几个比较典型的问题。 1. **Q**:明明板子单独测模块的时候没问题,但是后来小车调试的时候有时上传程序出错,两次上传隔的时间太短的话就更容易出现这种情况,为什么呢? **A**:这是由于**在用USB上传程序时**,开发板的VCC接到了其他模块的缘故。如果不拔下来,多次往复就有很大概率导致板子烧毁。因此,在上传程序的时候,一定要把板子的VCC断开,这样就不会有问题了。 如果给空板子烧程序都失败,那**很有可能是板子坏了**。 2. **Q**:上传程序后,小车有反应,但是总有延迟。在转动小车的时候,轮胎总要过一段时间才会作出反应,这是为什么呢? **A**:**程序的问题**。检查代码中是否有遗留下来的`delay()`,是否有`Serial.println()`、`Serial.print()`等需要串口才工作的函数。把这些全部注释掉,再查看效果。 3. **Q**:loop()是空的,按理说不会有函数运行,但是给小车上传程序后,小车还是能够对陀螺仪的变化作出反应,为什么呢? **A**:对于本次程序来说,这是因为**中断**或者**串口**存在的原因。 来看arduino的程序结构: ```c #include int main(){ init(); // 初始化库 initVariant(); // 初始化变量 setup(); // 初始化 for(;;){ loop(); // 主循环 if SerialEvent() serialEvent(); // 串口函数 } } ``` 最后的死循环中,除了loop,还有一个串口事件判断函数——有事件则去执行,没有就只执行loop。而loop中虽然没有语句,**但setup()中还有中断的功能** ```c MsTimer2::set(5, control); //使用Timer2设置5ms定时中断,控制control函数 MsTimer2::start(); //使用中断使能 ``` 开启了中断使能后,程序就会每隔中断的时间去执行一次中断指向的函数。因此loop中没有语句也是可以的。 4. 关于速度环调试的问题整理,参见[调试笔记04](https://github.com/JadenNeal/Balance-Car/blob/master/TEST_NOTES/20190717/%E8%B0%83%E8%AF%95%E7%AC%94%E8%AE%B004.md) 5. 关于转向环调试的问题整理,参见[调试笔记04](https://github.com/JadenNeal/Balance-Car/blob/master/TEST_NOTES/20190717/%E8%B0%83%E8%AF%95%E7%AC%94%E8%AE%B004.md)