基于Arduino的遥控自平衡小车

基于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)。

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

  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.


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1557675.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

HT8513 内置自适应同步升压和防破音功能的6.5W D类及AB类音频功率放大器

1、特征 防削顶失真功能(防破音,Anti-Clipping Function, ACF) 免滤波器数字调制&#xff0c;直接驱动扬声器 输出功率 3W (VBAT3.3V, RL-4Ω, THDN<1%, 20-20kHz full band) 2.0W (VBAT3.3V, RL8Ω,THDN<1%, 20-20kHz full band) 6.5W (VBAT4.2V, RL2Ω, THDN10%,f1kHz…

(Linux驱动学习 - 9).设备树下platform的LED驱动

一.platform相关结构体与函数 1.匹配列表 - struct of_device_id struct of_device_id {char name[32];char type[32];/* compatible 很重要&#xff0c;需要与设备树节点的 compatible 属性一致&#xff0c;才能匹配 */char compatible[128]; const void *data; }; …

IOT-Tree连接西门子PLC S7 200 Smart竟然如此简单

最近一个项目需要把用户现场控制柜接入到云端&#xff0c;控制柜使用西门子PLC Smart 200 SR40型号&#xff0c;已经运行多年&#xff0c;PLC通过以太网接口对接一个触摸屏。 按照我以往的经验&#xff0c;觉得触摸屏以太网接口已经被占用&#xff0c;那么只能通过剩余的RS485…

视频剪辑软件推荐电脑版:这5款剪辑软件不容错过!

在视频剪辑领域&#xff0c;选择合适的软件至关重要。不同的软件各有千秋&#xff0c;有的简单易用&#xff0c;适合新手快速上手&#xff1b;有的功能强大&#xff0c;适合专业团队进行深度编辑。以下是一些电脑版视频剪辑软件的推荐&#xff0c;涵盖了从新手到专业级别的不同…

智能电子价签:助力零售效率升级的关键

在竞争日益激烈的零售市场&#xff0c;如何优化运营、提升效率&#xff0c;是每个零售商都在关注的问题。电子价签作为一项创新技术&#xff0c;提供了蒿效的解决方案。今天&#xff0c;我们就来聊聊电子价签如何帮助零售商轻松管理信息、减少人工误差&#xff0c;并展示它在门…

Electron构建桌面应用程序,服务于项目的自主学习记录(持续更新...

无所畏惧地面对未知&#xff0c;并将其视为成长的机会 大纲官网快速入门1.安装node.js -- 这里推荐用nvm管理2.脚手架创建3.electron 包安装到应用的开发依赖4.创建主进程(main.js)并启动项目1.创建页面2.配置main.js3.启动项目 -- 效果 进阶 -- 基于项目场景功能使用场景一&am…

自动猫砂盆有必要买吗?2024年热门风大的自动猫砂盆测评分享!

自动猫砂盆不知道大家尝试过没&#xff0c;就是可以自动给猫咪铲屎的神器东西&#xff0c;而且它能把那些猫屎都集中收集起来&#xff0c;我们这种上班忙碌的人一回家就能收获一个干干净净的猫砂盆&#xff0c;别提有多快乐了。就算出差都不怕&#xff0c;三四天不回来都只用扔…

红黑树源代码(进阶与细节解释)

目录 对于结点的修改 红黑树模板参数的控制 红黑树结点当中存储的数据 对于insert函数的细节修改 迭代器的代码 迭代器类的添加 迭代器的 迭代器的-- 正向迭代器的代码 红黑树代码全部展示&#xff1a; 看完前两篇的文章&#xff0c;相信对于红黑树有了一定的了解&…

飘香水果购物网站:基于SpringBoot的架构设计

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常适…

【C++】模拟实现hash_table(哈希表)

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:实战项目集 ⚙️操作环境:Visual Studio 2022 目录 一.了解项目功能 二.逐步实现项目功能模块及其逻辑详解 &#x1f4cc;实现HashNode类模板 &#x1f38f;构造HashNode类成员变量 &#x1f38f;实现HashNode类构造函数…

家里养有宠物应该用哪款宠物空气净化器比较好?哪款最能吸毛?

这不是国庆节刚过吗&#xff0c;我的小猫终于是平安的度过了在农村生活的时光&#xff0c;之前还担心会不会被爸妈嫌弃&#xff0c;这下好了&#xff0c;嫌弃也过了国庆节。 但是一把猫咪带回出租房&#xff0c;由于几天不在房子里待&#xff0c;猫咪对熟悉的环境又特别激动&a…

视频怎么做成扫码展示?视频二维码在线做的方法

视频想要快速的分享给其他人&#xff0c;选择生成二维码是一种很方便的形式&#xff0c;其他人只需要扫描二维码就可以在线查看视频&#xff0c;与其他分享方式相比更加的简单、方便。现在日常生活中有很多场景都会有视频二维码的应用&#xff0c;简化了获取视频的流程&#xf…

JavaEE: 深入解析HTTP协议的奥秘(3)

文章目录 HTTP认识 "报头"(Header)认识 "状态码"(status code) HTTP JavaEE: 深入解析HTTP协议的奥秘(2) 书接上文~ 认识 “报头”(Header) Header 的整体的格式是"键值对"结构. 每个键值对占一行,键和值之间使用分号分隔. Host 表示服务器主…

【基础篇】一个键值数据库包含什么?

背景 今天&#xff0c;在构造这个简单的键值数据库时&#xff0c;我们只需要关注整体架构和核心模块。这就相当于医学上在正式解剖人体之前&#xff0c;会先解剖一只小白鼠。我们通过剖析这个最简单的键值数据库&#xff0c;来迅速抓住学习和调优 Redis 的关键。 我们把这个简…

STM32外设应用知识详解

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

RKMEDIA画面质量调节-QP调节

QP是在视频采集编码过程中的量化参数&#xff0c;其值与画面质量成反比&#xff0c;即QP值越大画面质量越小&#xff0c;其具体调整方法如下&#xff1a; typedef struct rkVENC_RC_PARAM_S {RK_U32 u32ThrdI[RC_TEXTURE_THR_SIZE]; // [0, 255]RK_U32 u32ThrdP[RC_TEXTURE_TH…

如何基于 RLHF 来优化 ChatGPT 类型的大语言模型

&#x1f6b4;前言 对于ChatGPT来说&#xff0c;RLHF是其训练的核心。所谓RLHF&#xff0c;即Reinforcement Learning with Human Feedback&#xff0c;基于人类反馈的强化学习。这项技术通过结合模型自身的生成能力和人类专家的反馈&#xff0c;为改进文本生成质量提供了新的…

解决Android Studio中使用lombok插件错误: 找不到符号的问题

问题 主要是想节省实体类的set、get等方法&#xff0c;使用lombok报错如下&#xff1a; 解决方案 由于Android的限制&#xff0c;在Android中使用lombok兼容极其麻烦&#xff0c;如果你只是想减少set、get等代码可以直接使用kotlin的data class 示例 data class KotlinTes…

等级保护等保资料原件合集(word源资料)

第二章 系统定级与安全域 2.1 系统定级 2.1.1 不同等级的安全保护能力 2.1.2 重要信息系统 2.1.3 定级参考 2.2 安全域定义 2.2.1 安全域定义方法 2.2.2 安全域等级描述 第三章 实施方案设计 3.1 三级等保要求 3.2 基本要求的详细技术要求 3.2.1 物理安全 3.2.2 网…

Unity 从零开始的框架搭建1-1 unity中对象调用的三种方式的优缺点分析【干货】

该文章专栏是向QFrameWork作者凉鞋老师学习总结得来&#xff0c;吃水不忘打井人&#xff0c;不胜感激 Unity 框架搭建学习笔记1-1&#xff0c;前一个1代表凉鞋的第一季教程&#xff0c;后一个1代表该季第一篇我的文章 unity中对象调用的三种方式 方法调用&#xff0c;例如&…