首页 > 其他分享 >基于Arduino的遥控自平衡小车

基于Arduino的遥控自平衡小车

时间:2024-10-12 14:21:29浏览次数:8  
标签:偏航 Arduino 小车 遥控 机器人 PID 使用 电机 无线

基于Arduino的遥控自平衡小车

一、项目简介

一个使用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)。

为了使机器人保持平衡,我们需要知道两个关键事项:

  1. 机器人当前的倾斜角度和期望的倾斜角度(设定点)。
  2. 这个角度变化的速率(机器人倾倒的速度有多快)。

为了获得这些读数:

  • 我们使用加速度计来估计倾斜角度。加速度计测量不同轴上由于重力引起的加速度,这可以用来计算相对于地面的倾斜角度。
  • 我们使用陀螺仪来测量角速度,这告诉我们机器人旋转或倾倒的速度有多快。

通过结合加速度计和陀螺仪的数据,通常使用互补滤波或卡尔曼滤波等技术,我们可以更准确地估算机器人的倾斜角度和角速度。然后,这些值在控制系统中用来调整电机的速度和方向以保持平衡。

在这里,我使用的是预先构建的库函数,这些函数提供了几乎准确的读数。

四、外壳设计

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我使用了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.pot1data.pot2变量来控制机器人的移动;data.swtch1用于开启和关闭超声波传感器。data.pot3已经被添加进去,以防我们将来需要连接其他设备。

十、无线移动控制

在这里插入图片描述
这部分控制机器人的俯仰角度。俯仰PID始终处于活动状态,以维持期望的角度,默认为0度。当无线遥控器工作时,它会根据电位计的值调整俯仰角度。如果无线遥控器停止工作,它会将俯仰角度重置为0度,并关闭LED以显示无线连接已丢失。

这段内容描述了机器人如何动态地在利用PID控制器实现的自动偏航控制和基于无线遥控pot2输入手动偏航调整之间切换。

  1. 当无线遥控器可用且pot2处于中心位置(127)时:使用偏航PID控制器根据陀螺仪数据稳定机器人的偏航。

  2. 当无线遥控器可用但pot2不在中心位置时:禁用偏航PID控制器,并通过基于pot2值调整电机速度来进行手动偏航控制。

  3. 当无线遥控器不可用时:偏航PID控制器保持活跃,以自主维持机器人的偏航稳定性。

注意:即使偏航PID被禁用旋转,俯仰PID仍在运行并尝试保持平衡。

如果您遇到机器人尝试左右旋转而俯仰PID检测到不平衡的问题,它可能会通过调整电机速度来抵消预期的旋转,导致机器人无法按预期旋转或出现“冻结”现象。

如果遇到这个问题,首先检查无线发射器的侧面,使用串行打印查看是否物理读取了正确的值。如果不是,检查连接是否松动或考虑更换操纵杆。如果这仍然无法解决,简单地增加电机调整值。在我的情况下,我使用了200。

十一、超声波模块

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我使用了3毫米PVC板和双面胶带将超声波传感器固定在机身上。

我在将超声波传感器集成到主程序中时失败了很多次。你可以查看这个Arduino论坛的帖子,从第30个帖子开始,你可以看到每次失败的尝试的详细情况。简而言之,添加超声波传感器会使循环变慢,因此机器人无法保持平衡并维持稳定的无线连接。程序以非常高的频率从mpu6050读取数据,并相应地设置电机的速度和方向。所以慢速循环会破坏每个元素之间的协调。

注意:即使偏航PID被禁用旋转,俯仰PID仍在运行并尝试保持平衡。

如果您遇到这个问题,首先检查无线发射器的侧面,使用串行打印查看是否物理读取了正确的值。如果不是,检查连接是否松动或考虑更换操纵杆。如果这仍然无法解决,简单地增加电机调整值。在我的情况下,我使用了200。

希望你喜欢这个项目,并在构建过程中找到乐趣!如果你有任何问题或需要帮助,欢迎在评论区交流。

作者:Svan.


注意:本博文为不得在未经本人同意进行转载或者二次创作,违者必究!!!

标签:偏航,Arduino,小车,遥控,机器人,PID,使用,电机,无线
From: https://blog.csdn.net/weixin_51141489/article/details/142758100

相关文章

  • Arduino Nano制作
    1、硬件原理图:2、相关文件路径:boards.txt(包含熔丝位及相关文件的名称信息)路径:D:\arduino-1.85\hardware\arduino\avrATmegaBOOT_168_atmega328.hex路径:D:\应用软件\arduino-1.85\hardware\arduino\avr\bootloaders\atmega3、读取芯片ID:4、进入熔丝位配置:5、设置熔丝位:bo......
  • Arduino UNO R3自学笔记24 之 Arduino如何使用MAX7219控制多个数码管?
    注意:学习和写作过程中,部分资料搜集于互联网,如有侵权请联系删除。前言:前面学习了单个数码管的控制,但是在大多场合一个数码管是满足不了使用场景的,因此对于数码管的学习,应该学会用尽可能少的端口去驱动更多的数码管,在此情况下,MAX7219比较适合我们使用。1.MAX7219引脚及功能介绍......
  • 基于Arduino的超声波和舵机模块集成使用
    一.超声波模块和舵机模块集成使用超声波模块:HC-SR04舵机模块:SG90目的:通过ArduinoUNO核心板控制舵机旋转到不同位置,同时获取不同位置超声波模块和障碍物间的距离,配合控制算法,进行基于超声波智能避障小车的制作。二.源代码#include<Servo.h>#definetrigPin2#define......
  • Arduino UNO R3自学笔记23 之 Arduino如何使用4511控制数码管?
    注意:学习和写作过程中,部分资料搜集于互联网,如有侵权请联系删除。前言:因为7段数码管控制需要用到7个IO,这会严重占用Arduino的IO口,因此我们采用现有IC来节省Arduino的IO口。1.CD4511介绍        CD4511是一款用于驱动共阴极LED(数码管)显示器的BCD码-七段码译码器。它具......
  • pwm模拟遥控器驱动电调控制无刷电机
    目录1.前言2.操作全程2.1输出pwm信号2.2硬件部分2.3电调校准3.启动4.总结1.前言我们小伙伴是不是都遇到到过我们的无刷电机买回来,上电,并且给了正确的pwm超,但是电机就是不转动。我也遇到了这个问题,不过最后还是让我蒙对了,哈哈。下面开始我们的操作。本人学识尚浅,如果......
  • Arduino物联网开发笔记01
    首先将开发板连接电脑然后下载Arduinoide(我的是2.0版的)这是官网的下载链接:https://www.arduino.cc/en/software接着左上角项目新建文件夹编写第一个程序`voidsetup(){Serial.begin(115200);//设置串口波特率}voidloop(){Serial.printf("Helloworld\n");delay(500)......
  • Arduino Nano 和 DHT11 实现 LabVIEW 温湿度采集
    ArduinoNano和DHT11实现LabVIEW温湿度采集ArduinoIDE安装如下库文件DHTsensorlibrarybyAdafruitDHT11温湿度传感器Data引脚与ArduinoNano开发板的D2引脚连接代码#include<DHT.h>#defineTemperature_COMMAND0x10//采集命令字#defineHumidity......
  • 3.资源《Arduino UNO R3 proteus 电机测速仿真工程文件(含驱动代码)》说明。
     资源链接: ArduinoUNOR3proteus电机测速仿真工程文件(含驱动代码)1.文件明细:2.文件内容说明包含:proteus工程、原理图、仿真程序。3.内容展示4.简述该文件为Proteus工程。用于电机测速验证。5.演示视频proteus仿真电机测速......
  • 【花雕学编程】Arduino动手做(232)---ESP32-S3 CAM使用joystick双轴摇杆模块控制LED灯
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来——小小的......
  • 【花雕学编程】Arduino动手做(232)---ESP32-S3 CAM使用DHT11模块测量温湿度
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来——小小的......