1. 功能说明

在双轮小车上安装一个六轴陀螺仪传感器,本文示例将实现双轮小车自主平衡功能。

2. 电子硬件

在这个示例中,我们采用了以下硬件,请大家参考:

主控板

Basra主控板(兼容Arduino Uno)

扩展板

Bigfish2.1扩展板

传感器 六轴陀螺仪
电池 7.4V锂电池

电路连接:

① 六轴陀螺仪传感器(GND、VCC、RX、TX)连接在Bigfish扩展板的Gnd、Vcc(3.3v)、RX、TX;

② 2个直流电机分别连在Bigfish扩展板的(5,6)、(9,10)。

3. 功能实现

      编程环境:Arduino 1.8.19

      实现思路:实现小车的自平衡。当人为去打破小车的平衡时,小车能够自行恢复到平衡状态。这里当俯视小车时,小车处于水平位置代表平衡状态;前倾或后仰等均为非平衡状态。

3.1 测试数据

① 需要先测出陀螺仪沿Y轴的状态数据。下表是本实验中测试出的实验数据,大家可参考格式,测试出自己的实验数据。

物料

测试数据‍‍

陀螺仪的加速度包Y轴数据

沿Y轴俯仰陀螺仪时,数据从(-0.05,1.13)逐渐增大;

陀螺仪平放时的值为0.74;‍

② 找准双轮小车的平衡状态(大家可尝试把锂电池安装在小车底部,让小车默认为平衡态)

3.2 示例程序

将参考例程(Gyroscope_Control_Car.ino)下载到主控板:

【程序源代码资料内容详见 双轮平衡车-自平衡】

/*------------------------------------------------------------------------------------版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.Distributed under MIT license.See file LICENSE for detail or copy athttps://opensource.org/licenses/MITby 机器谱 2023-04-25 https://www.robotway.com/------------------------------*//*  功能:自平衡小车接线:陀螺仪传感器(GND、VCC、RX、TX)接在扩展板的( Gnd、Vcc(3.3v)、RX、TX);直流电机分别接在(5,6),(9,10)*/#include<Math.h>#define Gyroscope_left_LimitAngle_Y  -0.05  //读取到陀螺仪 Y 轴向前的极限数值#define Gyroscope_Right_LimitAngle_Y  1.13  //读取到陀螺仪 Y 轴向后的极限数值#define Gyroscope_Middle_LimitAngle_Y  0.74  //读取到陀螺仪 Y 轴平放时的数值#define Motor_Pin_Count 4/*由于直流电机的物理差异,左右电机的速度值不同;需要先微调两电机的pwm值,保证小车能走直线(否则会出现小车原地打转)*/#define left_Motor_Speed_Init 60  //左侧电机的初始速度(0-255)#define right_Motor_Speed_Init 70  //右侧电机的初始速度(0-255)#define Motor_Speed_Mix 0  //电机速度增量最小值#define Motor_Speed_Max 20  //电机速度增量最大值unsigned char Re_buf[11],counter=0; //存储陀螺仪数据的变量unsigned char sign=0;  //定义是否接收到陀螺仪数据的标志位float a[3];  //用于存储x、y、z三轴的角速度包数值int motor_pin[4] = {5,6,9,10};//定义电机引脚int map_to_int[3] = {0,0,0};  //用于存储Y轴向左偏、向右偏、平放的数值enum{Forward = 1,Back,Stop};  //定义电机前进、后退、停止三种状态void setup(){delay(1000);Serial.begin(115200);//打开串口,并设置波特率为115200for(int i=0;i<Motor_Pin_Count;i++){pinMode(motor_pin[i],INPUT);  //将电机的四个引脚设置为输出模式}map_to_int[0] = Gyroscope_left_LimitAngle_Y*100;  //重新赋予陀螺仪 Y 轴向前的极限数值map_to_int[1] = Gyroscope_Right_LimitAngle_Y*100;  //重新赋予陀螺仪 Y 轴向后的极限数值map_to_int[2] = Gyroscope_Middle_LimitAngle_Y*100; //重新赋予陀螺仪 Y 轴平放时的数值}void loop(){Get_gyroscope_And_Control();//读取陀螺仪参数,并判断平衡小车前倾、后仰或者是平放状态}//实时读取陀螺仪发送的数据(serialEvent()函数会自动运行)void serialEvent() {  while (Serial.available()) {Re_buf[counter]=(unsigned char)Serial.read();if(counter==0&&Re_buf[0]!=0x55) return;  //第0号数据不是帧头  counter++;  if(counter==11)  //接收到11个数据{  counter=0;  //重新赋值,准备下一帧数据的接收sign=1;}  }}

判断双轮小车前倾、后仰或者是平放状态的参考程序(Gyroscope_Device.ino)如下:

/*------------------------------------------------------------------------------------版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.Distributed under MIT license.See file LICENSE for detail or copy athttps://opensource.org/licenses/MITby 机器谱 2023-04-25 https://www.robotway.com/------------------------------*/void Get_gyroscope_And_Control()//读取陀螺仪参数,并判断平衡小车前倾、后仰或者是平放状态{int gyroscope_acc_data= 0;int map_data= 0;if(sign){  sign=0;if(Re_buf[0]==0x55)  //检查帧头{  switch(Re_buf [1]){case 0x51:{a[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*16;a[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*16;a[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*16;//把陀螺仪的加速度包的Y轴数据转换为直流电机的速度map_data = fabs(a[1]) * 100;  //fabs()取浮点数的绝对值if( (map_data >= (map_to_int[2]-10)) && (map_data <= (map_to_int[2]+10)) ){//小车处于平衡态Motor_State(Stop,0,0);  }else if( (map_data < (map_to_int[2]-10)) && (map_data >= map_to_int[0]) ){/*当小车前倾,自行调整至平衡假如现在获取到陀螺仪数据0.50,转换为50并进行映射为直流的pwm值过程Motor_State(Forward,60+map(50,64,5,0,20), 70+map(50,64,5,0,20))*/Motor_State(Forward,left_Motor_Speed_Init+map(map_data,(map_to_int[2]-10),map_to_int[0],Motor_Speed_Mix,Motor_Speed_Max),right_Motor_Speed_Init+map(map_data,(map_to_int[2]-10),map_to_int[0],Motor_Speed_Mix,Motor_Speed_Max) );}else if( (map_data <= map_to_int[1]) && (map_data > (map_to_int[2]+10)) ){//当小车后仰,自行调整至平衡Motor_State(Back,left_Motor_Speed_Init+map(map_data,(map_to_int[2]+10),map_to_int[1],Motor_Speed_Mix,Motor_Speed_Max),right_Motor_Speed_Init+map(map_data,(map_to_int[2]+10),map_to_int[1],Motor_Speed_Mix,Motor_Speed_Max) );}  }break;}}}}void Motor_State(int _mode, int _left, int _right)//电机状态函数{switch(_mode){case Forward: {analogWrite(motor_pin[0],_right);analogWrite(motor_pin[1],0);analogWrite(motor_pin[2],_left);analogWrite(motor_pin[3],0);}break;case Back:  {analogWrite(motor_pin[1],_right);analogWrite(motor_pin[0],0);analogWrite(motor_pin[3],_left);analogWrite(motor_pin[2],0);}break;case Stop:  {analogWrite(motor_pin[0],0);analogWrite(motor_pin[1],0);analogWrite(motor_pin[2],0);analogWrite(motor_pin[3],0);}break;}}

双轮平衡车实现自平衡功能相关推荐

  1. kstools工具是什么牌子_2020年平衡车推荐,电动平衡车哪个牌子好?老司机教你如何选购电动平衡车...

    2020年平衡车推荐,电动平衡车哪个牌子好?老司机教你如何选购电动平衡车 随着我国科技的发展,生活水平的提高,在很多地方都出现了电动平衡车的身影,人们将电动平衡车当做短距离代步的工具,也是非常实用的. ...

  2. 智能车的转弯部分_邛崃斯维刻平衡车维修平衡车不充电怎么处理哪里有

    邛崃斯维刻平衡车维修平衡车不充电怎么处理哪里有 智能平衡车的用途 如今的道路上,早已不仅是汽车.自行车.电动车等传统交通工具全制霸的局面了,车流与车流中间,也不时夹在着智能滑板车.电单车.平衡车等的身 ...

  3. 测速源码_物联网之智能平衡车开发实战项目(附源码)

    自从上次分享了"适合练手的10个前端实战项目(附源码)"之后,很多小伙伴就私信问有没有物联网相关的实战项目教程,那么今天就给大家分享一个物联网工作初期经常接触的项目:智能平衡车开发 ...

  4. pid算法通俗解释,平衡车,倒立摆,适合不理解PID算法的人来看!

                        先插句广告,本人QQ522414928,不熟悉PID算法的可以一起交流学习,随时在线 http://liuxinyu520zhuanshu.qzone.qq.c ...

  5. HAL库版STM32双轮自平衡车(三) ———代码精讲

    系列文章目录 编码电机测速 HAL库OLED的使用 HAL库版STM32双轮自平衡车(一) ---代码思路和PID基础精讲 HAL库版STM32双轮自平衡车(二) --- CubeMX的配置.原理图接 ...

  6. HAL库版STM32双轮自平衡车(一) ———代码思路和PID基础精讲

    系列文章目录 HAL库版STM32双轮自平衡车(一) ---代码思路和PID的简单介绍(本篇) HAL库版STM32双轮自平衡车(二) --- CubeMX的配置.原理图接线.物料准备 HAL库版ST ...

  7. 双轮载人平衡车设计完整教程之调校测试篇

    双轮载人平衡车设计完整教程之调校测试篇 实验及路测结果 6.1 硬件测试 6.1.1车体与元件安装 车体采用的是精钢打造的船型包厢,车体机械部分的安装及重量分布,直接影响到小车的平衡性能.拿起螺丝准备 ...

  8. HAL库版STM32双轮自平衡车(四) ———— 原理图以及PCB绘制

    系列文章目录 HAL库版STM32双轮自平衡车(一) ---代码思路和PID基础精讲 HAL库版STM32双轮自平衡车(二) --- CubeMX的配置.原理图接线.物料准备 HAL库版STM32双轮 ...

  9. HAL库版STM32双轮自平衡车(五) ———— 调参

    系列文章目录 HAL库版STM32双轮自平衡车(一) ---代码思路和PID基础精讲 HAL库版STM32双轮自平衡车(二) --- CubeMX的配置.原理图接线.物料准备 HAL库版STM32双轮 ...

最新文章

  1. 剑指offer第二版答案详细版(带详细解题思路)
  2. 实心和空心哪个抗弯能力强_空心砖4大优缺点一次看 便宜耐用营造大自然原始风...
  3. sqlserver数据文件位置如何迁移
  4. [转载][总结]函数getopt(),getopt_long及其参数optind
  5. 交叉编译成windows版
  6. C++之类模板最简单的使用
  7. Linq的优点以及注意事项
  8. FCPX插件:半调图像高级马赛克特效Yanobox Mosaic
  9. 深度学习《Photo Editing》
  10. 亚马逊最大无人售货超市开张,云端结账随拿随走
  11. yum安装jdk1.8
  12. 在excel工作表中c1单元格_Excel工作表中的11个逻辑函数应用技巧,中文解读,动图演示!...
  13. 了不起的 Unicode!
  14. Java Stream flatMap()
  15. 章节十五、6-log4 2-用默认的配置
  16. 适配器模式和代理模式的区别
  17. java 车牌号归属地_本地化JavaAnpr用于本地的车牌
  18. 还不了解MySQL的指令?有它就够了!
  19. MOOC慕课进入课程后无法刷新出视频、作业等界面
  20. 数据库三范式设计习题

热门文章

  1. 法律不能使人人平等,但是在法律面前人人是平等的.
  2. 一段很有意思小代码:视频中提取心率
  3. 【无人机】基于Matlab的四旋翼无人机模糊控制仿真
  4. SSM+邢台市域直通公交小程序 毕业设计-附源码211514
  5. 通达OA工作流列表控件获取数据,JSON回传,参数保存txt文本
  6. 计算机学术周报告计,学术周,一个熟悉又陌生的名词.doc
  7. 基于javaweb的汽车维修管理系统(java+ssm+jsp+easyui+echarts+mysql)
  8. java计算机毕业设计基于ssm的火车订票管理系统(源代码+数据库+Lw文档)
  9. unity休闲游戏象棋游戏源码,支持安卓+IOS双端 unity2019 C#语言开发
  10. 【LSS: Lift, Splat, Shoot】代码的复现与详细解读