基于Arduino的遥控自平衡小车

news2024/10/8 16:45:08

基于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.coloradmin.cn/o/2196775.html

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

相关文章

Vue中使用富文本编辑框的实践与探索

在Web开发中,富文本编辑框是一个常见的功能。本文将介绍如何在Vue项目中集成和使用富文本编辑框,并分享一些实践经验。 一、为什么需要富文本编辑框 在开发网站、博客、论坛等应用时,用户往往需要编辑和发布带格式的文本内容。传统的文本输…

分布式事务seata AT和XA性能对比

1. AT模式和XA模式性能对比: AT的阻塞是阻塞在了业务服务层,全局锁。 而XA模式是阻塞在了数据库,对数据库的性能影响很大。 肯定是优选AT,可以提升数据库的性能。 (由于AT模式数据库事务阻塞小,那么同一…

公司监控电脑都能监控哪些信息?深刻回答,一文详解!

在当今数字化办公环境中,公司监控电脑已成为许多企业保障信息安全、提升工作效率的重要手段。 然而,这种监控行为也引发了关于员工隐私权的广泛讨论。 本文将深入探讨公司监控电脑所能监控的信息范围,以及如何在保障企业安全与尊重员工隐私…

omron fins 内存区域写入(MEMORY AREA WRITE)

1. 完整的代码如下: import socket import binasciiclass Omron:def __init__(self, ip, port9600):self.ip ip # PLC的IP地址self.port port # PLC的端口,默认为9600def send_receive_fins(self):with socket.socket(socket.AF_INET, socket.SOCK_…

某个应用的CPU使用率居然达到100%,我该怎么办?

摘至https://learn.lianglianglee.com/ CPU使用率 Linux 作为一个多任务操作系统,将每个 CPU 的时间划分为很短的时间片,再通过调度器轮流分配给各个任务使用,因此造成多任务同时运行的错觉。 为了维护 CPU 时间,Linux 通过事先定…

使用标签实现MyBatis的基础操作

目录 前言 1.配置MyBatis⽇志打印 2.参数传递 2.1 #{} 和 ${}区别 2.2传递多个参数 3.增删改查 3.1增(Insert) 3.2删(Delete) 3.3改(Update) 3.4查(Select) 前言 接下来我们会使用的数据表如下: 对应的实体类为:UserInfoMapper 所有的准备工作都…

全局数据在Python包中模块间管理方法探讨

在开发大型 Python 应用程序时,有时需要多个模块共享和管理全局数据。如何优雅地在 Python 包内的不同模块间共享全局数据是一个常见的设计问题。我们希望避免全局变量的混乱和难以维护的代码,但同时能够安全、高效地管理这些共享数据。 下面我们将探讨…

低代码赋能汽车制造产业链场景系列

当前汽车行业数字化智能化转型浪潮下,整车及其上下游产业链的协同创新正变得至关重要。头部车企与上下游供应链企业正逐步解决在生产管理、业务互通、系统集成等方面的痛点与挑战。电动化、智能化、网联化作为汽车产业的三大趋势,正共同推动未来汽车产业…

MS SQL Server 实战 统计与汇总重复记录

目录 需求 范例运行环境 数据样本设计 功能实现 上传EXCEL文件到数据库 分组统计 SQL 语句 分组汇总 SQL 语句 having 语句过滤最终统计结果 小结 需求 在日常的数据管理应用中,统计和汇总重复记录的情况是经常遇到的一个问题,然后我们会根据统…

文字转语音软件哪个好?这里告诉你

在英语学习的众多环节中,听力练习无疑是至关重要的一环。 然而,平时缺乏英语环境,如何高效地利用身边的英语材料进行听力训练呢?这时,英语文字转语音工具就很重要了! 今天,就为大家介绍五款优…

【C++】认识匿名对象

文章目录 目录 文章目录前言一、对匿名对象的解读二、匿名对象的对象类型三、匿名对象的使用总结 前言 在C中,匿名对象是指在没有呗命名的情况下创建的临时对象。它们通常在单个语句中执行一系列操作或调用某个函数,并且不需要将结果存放进变量中。 匿名…

常用动词敬语形式大揭秘,柯桥零基础日语培训

一、常用动词的敬语形式 1. する(做) • 尊敬语: なさる (Nasaru) 例:社長はよく運動をなさいます。 (社长经常锻炼。) • 谦逊语: いたす (Itasu) 例:この仕事は私がいたします。 &…

Java解析图形mdb矢量mdb

Java解析图形mdb矢量mdb 背景:项目中需要解析图形mdb,同事积累下的代码无法读取复杂图形;终于在某位大佬的博客下发现新的 解析方法,特此整理记录下。原理:jackcess(assess提供解析mdb属性)、es…

C++模拟实现二叉搜索树

目录 1.二叉搜索树的概念 2.二叉搜索树的性能分析 3.二叉搜索树的结构和中序遍历 3.1二叉搜索树中节点的结构 3.2二叉搜索树的结构 3.3中序遍历 4.二叉搜索树的插入 5.二叉搜索树的查找 6.二叉树搜索树的删除 7. 二叉搜索树的默认成员函数 8.参考代码 9.二叉搜…

常见的图像处理算法:Canny边缘检测

一、Canny边缘检测算子的由来 Canny 边缘检测算子是一种多级检测算法。1986 年由 John F. Canny 提出,同时提出 了边缘检测的三大准则: 1、低错误率的边缘检测:检测算法应该精确地找到图像中的尽可能多的边缘,尽可能的减少漏检…

【一起学Rust | 框架篇 | Tauri2.0框架】高级概念之安全特性的权限与能力

文章目录 前言一、开发前准备1. 准备项目2. 需求分析1. 监听系统热键2. 切换窗口无边框3. 切换窗口全屏 二、安装插件三、前端实现功能四、配置权限 前言 当前时间为 2024 年 9 月,距离Tauri 2.0 的 RC 版本发布迄今已近一个月。从 Tauri 官方渠道可以看出&#xf…

李飞飞:我不知道什么是AGI

图片来源:Stanford University 你对人工通用智能(AGI)感到困惑吗?这就是 OpenAI 执着于最终以“造福全人类”的方式创造的东西。你可能想认真对待他们,因为他们刚筹集了 66 亿美元以更接近这个目标。 但如果你仍然在…

揭秘Sui存储基金:灵活且可持续的链上数据管理解决方案

链上数据存储的方法常常被忽视,因为所使用的机制通常是传统和常见的。然而,在去中心化网络中,数据存储对确保数据完整性和长期可访问性至关重要。Sui的链上存储与其他区块链有所不同。 Sui存储基金是为了解决链上数据永久存储问题而设计的核…

企业架构系列(16)ArchiMate第14节:实施和迁移视角

在企业架构中,为了有效地规划和管理架构的变更与实施,通常会使用不同的视角来描述架构的不同方面。本篇涉及到三个主要视角:项目视角、迁移视角以及实施与迁移视角。 一、实施和迁移视角概览 1.项目视角 元素与关系:关注项目本身…

“网络安全等级保护测评入门:基础概念与重要性“

网络安全等级保护测评(简称“等保测评”)是依据国家网络安全等级保护制度,对信息系统安全等级进行评估和评定的过程。它是提高信息系统安全性、保障信息安全的重要手段。以下是关于等保测评的基础概念与重要性的详细解读: 一、等…