基于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.rhkb.cn/news/442311.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

活久见!2024年诺贝尔物理学奖颁给了AI大佬Hinton 和 Hopfield

家人们!让我们暂停手中工作,庆祝AI届的科学家首次获得诺贝尔物理学奖!!!!! 刚刚出炉的热乎消息:今年的诺贝尔物理学奖颁发给了约翰霍普菲尔德 (John Joseph Hopfield)与杰弗里辛顿&a…

充电桩用能计量有序充电服务的探索应用

关键词:云平台;自动检测;能源管理;有序充电 今年,电动汽车行业抓住了疫情影响洼地,迅速找到了发展突破口,从电动汽车发行政策到锂电池开发技术均出台了多层面利好消息,未来一段时间…

【JavaEE初阶】深入理解不同锁的意义,synchronized的加锁过程理解以及CAS的原子性实现(面试经典题);

前言 🌟🌟本期讲解关于锁的相关知识了解,这里涉及到高频面试题哦~~~ 🌈上期博客在这里:【JavaEE初阶】深入理解线程池的概念以及Java标准库提供的方法参数分析-CSDN博客 🌈感兴趣的小伙伴看一看小编主页&am…

SpringBoot日常:redission的接入使用和源码解析

文章目录 一、简介二、集成redissionpom文件redission 配置文件application.yml文件启动类 三、JAVA 操作案例字符串操作哈希操作列表操作集合操作有序集合操作布隆过滤器操作分布式锁操作 四、源码解析 一、简介 Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据网格…

Windows Ubuntu下搭建深度学习Pytorch训练框架与转换环境TensorRT

Windows Ubuntu下搭建深度学习Pytorch训练框架与转换环境TensorRT JetBrains2024(IntelliJ IDEA、PhpStorm、RubyMine、Rider……)安装包Anaconda Miniconda安装.condarc 文件配置镜像源查看conda的配置和源(channel)自定义conda虚拟环境路径conda常用命…

破解反编译:使用 ClassFinal 保护你的SpringBoot代码

在当今数字化时代,保护源代码的安全性变得愈发重要。无论是企业的核心算法还是独特的业务逻辑,代码一旦暴露,便可能导致竞争优势的丧失和商业机密的泄露。因此,在使用 Java 和 Spring Boot 开发项目时,理解从源代码到可…

websocket连接异常报错1006

目录: 1、问题现象2、问题原因3、解决方案 1、问题现象 WebSocket状态码的作用: 在WebSocket协议中,状态码用于表示连接状态和错误信息。通过状态码,我们可以快速判断连接是否成功,以及出现错误时的原因。常见的WebSo…

教培机构如何向知识付费转型

在数字化时代,知识付费已成为一股不可忽视的潮流。面对这一趋势,教育培训机构必须积极应对,实现向知识付费的转型,以在新的市场环境中立足。 一、教培机构应明确自身的知识定位。 在知识付费领域,专业性和独特性是关键…

VUE前后端分离毕业设计题目项目有哪些,VUE程序开发常见毕业论文设计推荐

目录 0 为什么选择Vue.js 1 Vue.js 的主要特点 2 前后端分离毕业设计项目推荐 3 后端推荐 4 总结 0 为什么选择Vue.js 使用Vue.js开发计算机毕业设计是一个很好的选择,因为它不仅具有现代前端框架的所有优点,还能让你专注于构建高性能、高可用性的W…

Matlab实现白鲸优化算法优化回声状态网络模型 (BWO-ESN)(附源码)

目录 1.内容介绍 2部分代码 3.实验结果 4.内容获取 1内容介绍 2部分代码 %% 清空环境变量 warning off % 关闭报警信息 close all % 关闭开启的图窗 clear % 清空变量 clc % 清空命令行 tic load bwand %%…

CC2530定时器1中断实现定时1-3

源码 #include "iocc2530.h"//引用CC2530头文件int t1_Count0; //定时器1溢出次数计数void Init_Led(void){ /*******************LED1初始化部分******************/P1SEL &~ 0x01; //设置P1_0口为通用I/O口P1DIR | 0x01; //设置P1_0口为输出口P…

软考越来越难了,2024年软考究竟还值不值得考?

最近不少同学沟通,聊到软考现在越来越难了,考了两三次都没过,也有不少新同学咨询软考考试的一些福利政策,投入大量的物力,财力,精力,那么到底软考值不值得考呢? 01 / 关于软考 软考…

Leetcode 10. 正则表达式匹配

1.题目基本信息 1.1.题目描述 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。 ‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s 的,而不是部分…

k8s的控制节点不能访问node节点容器的ip地址

master控制node服务器添加容器后,访问不了该node服务器容器的ip,只能在node服务器访问 排查后发现是k8s的master服务器和node节点的网址网段和k8s初始化时提示的ip网段不一致 我之前是192.168.137.50, 实际上master主机期望的是192.168.1.50 解决方案: 1.删除服务器后重建ma…

python爬虫 - 进阶requests模块

🌈个人主页:https://blog.csdn.net/2401_86688088?typeblog 🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、SSL证书问题 (一)跳过 SSL 证书验证 &#xff0…

Vue3中提到的Tree-shaking

我们知道,Vue3中提到一个叫Tree-shaking的东西,其实也并不是一个新的东西,有人称之为"摇树优化",什么意思? 按照作者的原话解释,Tree-shaking其实就是:把无用的模块进行“剪枝”&…

【Linux】进程间通信——System V消息队列和信号量

一、消息队列 1.1 概念 进程间通信的原理是让不同进程看到同一份资源,资源种类的不同就决定了通信方式的差异。如果用管道通信,则资源是文件缓冲区;如果用共享内存,则资源是内存块 消息队列是由操作系统提供的资源,…

postman自动化实战总结

Postman实战总结 简介 本次实战内容主要包括如下几点: l 背景介绍 l Postman使用,侧重于自动化实现,基础使用不做介绍 l 可视化Newman介绍 l 框架特色 l 实战中的坑 背景 随着国内软件技术的高速发展,越来越多的手工测试…

解决谷歌浏览器在安卓手机上的常见问题

在使用安卓手机浏览网页时,谷歌浏览器无疑是许多用户的首选。然而,在使用过程中,用户可能会遇到一些常见问题,如搜索图片困难、缓存积累过多导致浏览器卡顿,以及无法下载视频等。本文将针对这些问题,提供详…

【Linux】详解Linux下的工具(内含yum指令和vim指令)

文章目录 前言1. Linux下软件安装的方式2. yum2.1 软件下载的小知识2.2 在自己的Linux系统下验证yum源的存在2.3 利用yum指令下载软件2.4 拓展yum源(针对于虚拟机用户) 3. vim编辑器3.1 vim是什么?3.2 如何打开vim3.2 vim各模式下的讲解3.2.1…