基于Arduino的遥控自平衡小车
- 一、项目简介
- 二、所需材料
- 三、理论支持
- 四、外壳设计
- 五、线路连接
- 六、检查MPU6050连接
- 七、烧录库
- 八、PID控制设置
- 九、设置传感器参数
- 十、无线移动控制
- 十一、超声波模块
一、项目简介
一个使用Arduino Nano、MPU-6050以及便宜的6伏直流齿轮电机的自平衡机器人。这个机器人不仅能够站立,还能通过nRF24L01传输的无线数据进行行走。我还增加了一个超声波传感器用于距离测量。我使用了所有方便得到的东西,不需要复杂的3D打印模型或者昂贵的步进电机。
实物图:
二、所需材料
- 2x arduino nano
- 2x nrf24l01
- 1x L298N motor driver
- 2x Small size breadboard
- Jumper wires
- 2x Dc 6v geared motor
- MPU 6050 Triple Axis Accelerometer and Gyro Breakout
- 1x 10k potentiometer
- 1x 10k resistor
- 6x 18650 lithium batteries
三、理论支持
像倒立摆一样,自平衡机器人的重心位于轮子之上,使其天生不稳定。机器人需要不断调整其轮子以保持90度的直立位置,类似于倒立摆的底座必须移动以保持摆杆直立。
机器人持续监测其倾斜角度。如果它开始向前倾倒,轮子就会向前驱动,将底座移至重心下方,将其推回平衡状态。如果它向后倾斜,轮子则向相反方向移动。机器人不断调整其位置以保持平衡。机器人越快要倒下,轮子就越快地向倾斜角度旋转。
它需要持续的反馈(倾斜角度)和一个控制系统(如PID控制器)来实时调整轮子以维持稳定。我们将使用mpu-6050传感器进行实时反馈。MPU-6050设备将3轴陀螺仪和3轴加速度计结合在同一个硅芯片上,并内置了数字运动处理器(DMP)。
为了使机器人保持平衡,我们需要知道两个关键事项:
- 机器人当前的倾斜角度和期望的倾斜角度(设定点)。
- 这个角度变化的速率(机器人倾倒的速度有多快)。
为了获得这些读数:
- 我们使用加速度计来估计倾斜角度。加速度计测量不同轴上由于重力引起的加速度,这可以用来计算相对于地面的倾斜角度。
- 我们使用陀螺仪来测量角速度,这告诉我们机器人旋转或倾倒的速度有多快。
通过结合加速度计和陀螺仪的数据,通常使用互补滤波或卡尔曼滤波等技术,我们可以更准确地估算机器人的倾斜角度和角速度。然后,这些值在控制系统中用来调整电机的速度和方向以保持平衡。
在这里,我使用的是预先构建的库函数,这些函数提供了几乎准确的读数。
四、外壳设计
我使用了8毫米厚的PVC板来制作框架。您可以使用胶合板、3D打印部件或您手头上任何坚固的材料,但要确保它足够稳固。形状取决于您的想象力,但您需要考虑重量分布,分布得越好,您在编程部分需要调整的就越少。我制作了一个盒状形状以保持简单。使用图片参考来制作机身。我在接缝处使用了热熔胶。
注意:尽可能精确地将电机对齐到中心。
接下来是备受争议的部分,一些人认为大部分质量应该尽可能地放置得更高,而另一些人则持相反观点。我的逻辑是,是的,当最大质量位于底部时,很难打破平衡,但同样,从跌倒中恢复平衡也很困难。因此,我建议将大部分质量(通常是电池最重)放置在顶部或中间位置,尽管这并不是绝对必要的。我尝试了两种模型,两种模型都适用于我的模型。最终的选择取决于您的模型。
第二件重要的事情是,mpu6050放置的位置并不重要。无论您将它放置在哪里,倾斜角度总是相同的。简单的逻辑是,您将传感器放置得越低,您记录的不必要噪音就越少。但您总是可以在编码中改变读数的灵敏度。我尝试了所有三个位置(底部、中间、顶部),所有位置都能完美工作,只是需要相应地调整PID值。我们将在编程部分后面讨论PID。
五、线路连接
MPU 6050:
- 引脚名称 = Arduino引脚编号
- VCC = 5V
- GND = GND
- SCL = A4
- SDA = A5
nRF24L01:
- 引脚名称 = Arduino引脚编号
- VCC = 3V3
- GND = GND
- CE = A0
- CSN = A1
- SCK = D13
- MISO = D12
- MOSI = D11
L298N:
- 引脚名称 = Arduino引脚编号
- ENA = 3
- IN1 = 4
- IN2 = 5
- ENB = 10
- IN3 = 6
- IN4 = 7
建议在两个电机引脚上焊接0.1微法拉(uF)陶瓷电容器(104),这将最小化噪音。
六、检查MPU6050连接
在添加了所有必需的库之后。上传示例草图(使用图片参考),并检查mpu6050是否工作正常。上传草图后移动机器人,并观察串行监视器。当您移动机器人时,您会注意到偏航、俯仰和翻滚角度都在变化。
在这个阶段,记下俯仰角何时为负何时为正。这将有助于您后续的工作。
七、烧录库
‘SPI.h’ 和 ‘nRF24L01.h’:这些库处理与nRF24L01无线模块的通信。
‘RF24.h’:提供了一个更高级别的接口来控制无线模块。
‘PID_v1.h’:实现了PID(比例-积分-微分)控制算法,这对于保持平衡至关重要。
‘I2Cdev.h’ 和 ‘MPU6050_6Axis_MotionApps20.h’:用于与MPU6050传感器接口,以获取方向数据。
八、PID控制设置
PID控制器通过根据传感器读数调整电机输出来帮助保持机器人的平衡。它计算三个部分:比例、积分和微分响应,并将它们结合起来控制电机。目标是保持目标角度(setpointPitchAngle/setpointYawAngle)。我们还可以远程改变这个目标角度以使机器人向前或向后移动。当前角度和目标角度之间的差异被称为误差。PID控制器使用这个误差来确定电机的速度和方向。我们使用PID库来简化这个过程。
我们为电机设置了最小速度。测试每个电机在负载下的最低PWM值,看它从哪个值开始旋转,并将该值设置为最小速度。即使您使用的是相同的电机,这个值也可能略有不同,因此请单独调整它们,以保持两个电机以相同的速度运行。
为了保持平衡,我将目标俯仰角(setpointPitchAngle)设置为0度。然而,由于重量分布、传感器位置或传感器本身的小误差等因素,您的机器人可能不会完美地在0度处保持平衡。您可能需要通过试验和错误来调整设定点,以找到最适合您机器人的角度。
PID调整:
由于我没有使用编码器来物理确保电机的旋转,为了保持机器人平行移动,我使用了两组PID控制器。一个用于固定俯仰,另一个用于偏航。如果您将偏航PID值设置为零,机器人仍然可以使用俯仰PID保持平衡。然而,任何轻微的不平衡或地面的不平整都可能导致机器人意外旋转,从而导致它跌倒,因为没有东西控制偏航运动。
您需要像调整其他PID循环一样调整偏航循环,结合试验和错误以及经验法则循环调整方法(只需谷歌搜索即可)。
提示:KI项整合了错误时间,所以如果机器人向前或向后漂移,您应该增加PID_PITCH_KI值。您可以将其提高到PID_PITCH_KP的5/7倍。您也可以相应地进行偏航PID调整。
九、设置传感器参数
初始化MPU 6050之后,我们需要手动设置偏移量。这些偏移量用于纠正加速度计和陀螺仪的读数,以提高准确性。即使来自同一家制造商,每个传感器也有自己的偏移量。为了确定偏移量,我们将对传感器的100个原始读数取平均值。不用担心,我们不会手工进行这个操作。我们安装的库中有一个预先制作的循环程序。
首先,尽可能准确地将机器人放置在90度垂直位置,并用一些支撑物固定它,而不是用手拿着。然后打开Arduino IDE > 文件 > 示例 > MPU6050 > IMU_Zero;上传代码并打开串行监视器(9600)。这将需要4到5分钟。完成后,复制值并将相关值粘贴到程序中。
首先,我们包含了必要的库,并定义了CE和CSN引脚来创建rf24对象。CE和CSN引脚用于触发无线模块作为发射器或接收器工作。我们定义了一个地址(const byte address[6] = “ABCDE”),它就像一个密码。这个地址在发射器和接收器上必须相同,才能成功通信。
接下来,我们创建了一个包含四个1字节变量的数据包:“pot1”、“pot2”、“pot3”和“switch1”,并将其命名为“data”。在接收器端,我们将其命名为“receiverdata”。
为了访问发射器端的变量,我们使用data.pot1来访问“pot1”,使用data.pot2来访问“pot2”。在接收器端,我们以相同的方式使用receiverdata.pot1和receiverdata.pot2。
nRF24L01是一款对电流供应敏感的无线通信模块。Arduino板载的3.3V调节器可能无法提供足够的电流。因此,建议使用独立的3.3V电压调节器,并且在电源线路之间加入一个100微法拉(uF)的电解电容器,以确保电流供应的平滑性。
在void loop
部分,我们将原始的模拟读数通过mapAndAdjustJoystickDeadBandValues
函数进行过滤,并使用radio.write
函数传输数据。
目前,我们只需要data.pot1
和data.pot2
变量来控制机器人的移动;data.swtch1
用于开启和关闭超声波传感器。data.pot3
已经被添加进去,以防我们将来需要连接其他设备。
十、无线移动控制
这部分控制机器人的俯仰角度。俯仰PID始终处于活动状态,以维持期望的角度,默认为0度。当无线遥控器工作时,它会根据电位计的值调整俯仰角度。如果无线遥控器停止工作,它会将俯仰角度重置为0度,并关闭LED以显示无线连接已丢失。
这段内容描述了机器人如何动态地在利用PID控制器实现的自动偏航控制和基于无线遥控pot2输入手动偏航调整之间切换。
-
当无线遥控器可用且pot2处于中心位置(127)时:使用偏航PID控制器根据陀螺仪数据稳定机器人的偏航。
-
当无线遥控器可用但pot2不在中心位置时:禁用偏航PID控制器,并通过基于pot2值调整电机速度来进行手动偏航控制。
-
当无线遥控器不可用时:偏航PID控制器保持活跃,以自主维持机器人的偏航稳定性。
注意:即使偏航PID被禁用旋转,俯仰PID仍在运行并尝试保持平衡。
如果您遇到机器人尝试左右旋转而俯仰PID检测到不平衡的问题,它可能会通过调整电机速度来抵消预期的旋转,导致机器人无法按预期旋转或出现“冻结”现象。
如果遇到这个问题,首先检查无线发射器的侧面,使用串行打印查看是否物理读取了正确的值。如果不是,检查连接是否松动或考虑更换操纵杆。如果这仍然无法解决,简单地增加电机调整值。在我的情况下,我使用了200。
十一、超声波模块
我使用了3毫米PVC板和双面胶带将超声波传感器固定在机身上。
我在将超声波传感器集成到主程序中时失败了很多次。你可以查看这个Arduino论坛的帖子,从第30个帖子开始,你可以看到每次失败的尝试的详细情况。简而言之,添加超声波传感器会使循环变慢,因此机器人无法保持平衡并维持稳定的无线连接。程序以非常高的频率从mpu6050读取数据,并相应地设置电机的速度和方向。所以慢速循环会破坏每个元素之间的协调。
注意:即使偏航PID被禁用旋转,俯仰PID仍在运行并尝试保持平衡。
如果您遇到这个问题,首先检查无线发射器的侧面,使用串行打印查看是否物理读取了正确的值。如果不是,检查连接是否松动或考虑更换操纵杆。如果这仍然无法解决,简单地增加电机调整值。在我的情况下,我使用了200。
希望你喜欢这个项目,并在构建过程中找到乐趣!如果你有任何问题或需要帮助,欢迎在评论区交流。
作者:Svan.
注意:本博文为不得在未经本人同意进行转载或者二次创作,违者必究!!!