基于 arduino 的两轮自行车

4 篇文章 0 订阅
1 篇文章 0 订阅

看到别人做的自动行驶自行车,觉得好玩,自己也做一个,用arduino可以轻松实现。

因为开始是在做无人机,所以带着遥控器接收机等装备,一起开始设计自行车,就做个遥控的自行车吧,一个马达后轮驱动,MPU6050控制平衡,一个舵机控制前轮掌握方向,如此而已。

主要模块:
1、接收机程序(接收控制命令)
2、马达驱动程序(驱动后轮转动前行,速度可调)
3、舵机驱动程序(驱动前轮转向,以纠正车身意外倾斜)
4、陀螺仪读取
陀螺仪数据的作用:当车身发生倾斜时,要用舵机驱动前轮转向,在前进运动中,前轮的转向自然可以纠正车身的倾斜。

程序框架:
1、读取接收机数据 :re_da[0]-re_da[3]分别是1、2、3、4通道接收机数据。
2、读取陀螺仪数据:agx,agy,agz,其实就用一个agx就可以了。
3、根据接收机数据和陀螺仪数据计算马达和舵机。
4、用计算结果驱动马达和转向舵机。
用map函数直接把三通道(油门)接收机数据映射成合适的马达速度控制变量。
但是,方向舵机计算比较复杂,这也是自行车控制的特殊之处。

舵机控制前轮方向主要有如下考虑:
首先,假如转向舵为中间值(数值1500)

当陀螺仪数据X<0(车身向左倾斜)时,舵机操作前轮也向左拐。当X>0(车身向右倾斜)时,前轮也必须向右拐,以保持车身平衡。当陀螺仪数据趋近于零时,前轮直行。这就是基本的平衡控制。
但是,前轮向左,到底应该拐多少呢?按说,在速度快的时候,车把动作就要小,在车子速度慢的时候,车把动作就要大。这里没有速度数据,所以只好用油门量来代替。经实验,在油门1400的时候,转向参数20是比较合适的,在油门1800的时候,转向参数为10比较合适。于是据此得出计算公式:
kn=26-(re_da[2]-1100)/50; //转向参数,其中 re_da[2] 为油门通道数值,数值在1080-1920之间,kn就是转向参数(倍率)
val1=re_da[0]-(agx+k_x)*kn; //马达控制,其中 re_da[0] 为转向通道数值,数值在1080-1920之间,1500为中间值。agx为陀螺仪给出的倾斜度,val1就是计算出来的转向舵机的数值。

转弯实现
在上述基础上,如果转向通道re_da[0]朝一方倾斜,自行车肯定就会向另外一方倾斜,所以,要想左转,只要将车把稍微朝右偏转,在陀螺仪矫正下,车子就自动向左倾斜转弯了。

测试视频:https://v.youku.com/v_show/id_XNDMzMzQ2NDgzMg==.html?spm=a2hzp.8253869.0.0

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于Arduino两轮循迹小车的实现方法: 1. 硬件部分: - Arduino UNO开发板 - L298N电机驱动模块 - 两个直流电机 - 循迹模块(由高发射功率红外光电二极管和高灵敏光电晶体管组成) 2. 软件部分: - 将循迹模块的输出引脚连接到Arduino UNO的数字输入引脚上。 - 通过IO口控制L298N驱动模块改变两个直流电机的工作状态,从而实现小车循迹。 - 可以使用PID算法来提高循迹的精度和稳定性。 下面是一个简单的Arduino代码示例,实现了基于循迹模块的两轮循迹小车: ```arduino int leftMotor1 = 5; // 左电机正转 int leftMotor2 = 6; // 左电机反转 int rightMotor1 = 10; // 右电机正转 int rightMotor2 = 9; // 右电机反转 int leftSensor = A0; // 左传感器 int rightSensor = A1; // 右传感器 void setup() { pinMode(leftMotor1, OUTPUT); pinMode(leftMotor2, OUTPUT); pinMode(rightMotor1, OUTPUT); pinMode(rightMotor2, OUTPUT); pinMode(leftSensor, INPUT); pinMode(rightSensor, INPUT); } void loop() { int leftValue = analogRead(leftSensor); int rightValue = analogRead(rightSensor); if (leftValue < 500 && rightValue < 500) { // 直行 digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); } else if (leftValue >= 500 && rightValue < 500) { // 左偏 digitalWrite(leftMotor1, LOW); digitalWrite(leftMotor2, HIGH); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); } else if (leftValue < 500 && rightValue >= 500) { // 右偏 digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, LOW); digitalWrite(rightMotor2, HIGH); } else { // 停止 digitalWrite(leftMotor1, LOW); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, LOW); digitalWrite(rightMotor2, LOW); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值