基于Arduino UNO的智能摇头避障小车

news2024/9/29 3:33:56

目录

1.首先介绍两个基本函数

2.L298N控制逻辑

3.让小车实现前后左右轮子动代码示例

4.串口介绍

5.跟随小车开发

6.摇头避障小车开发

7.实物展示


1.首先介绍两个基本函数

void setup() { 
// put your setup code here, to run once: 把你的设置代码放在这里,运行一次
}
void loop() {
// put your main code here, to run repeatedly: 把你的主代码放在这里,重复运行
}

2.L298N控制逻辑

根据我们的接线:

左电机由引脚2,3控制,右电机由4,5控制。正反转导致前进后退需要根据输出端子那边的电机接线实际验证 测试。

接线说明:

左电机安装朝向是接杜邦线的那侧朝外(朝轮子) 左轮上,接左端子的OUT2口, 左轮下,接左端子的OUT1口, IN1由2控制,IN2为3控制 右电机安装朝向是接杜邦线的那侧朝内(背对轮子) 右轮上,接右端子的OUT3口, 右轮下,接右端子的OUT4口, IN3由4控制,IN4为5控制

3.让小车实现前后左右轮子动代码示例:

void setup() {
// put your setup code here, to run once:
//左轮信号方向初始化
pinMode(2,OUTPUT);// 配置2口为输出引脚
pinMode(3,OUTPUT);// 配置3口为输出引脚
//右轮信号方向初始化
pinMode(4,OUTPUT);// 配置4口为输出引脚
pinMode(5,OUTPUT);// 配置5口为输出引脚
}
void loop() {
// put your main code here, to run repeatedly:
//小车前进
digitalWrite(2,LOW);
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
delay(1000);
//小车后退
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
delay(1000);
//小车左转,右轮前,左轮后
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
delay(1000);
//小车右转,左轮前,右轮后
digitalWrite(2,LOW);
digitalWrite(3,HIGH);
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
delay(1000);
}

 可以用函数封装,代码示例:

void qianJin() {
// 小车前进的功能
digitalWrite(2,LOW);
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
}
void houTui() {//函数的封装
// 小车后退的功能
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
}
void zuoZhuan(){
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
}
void youZhuan(){
digitalWrite(2,LOW);
digitalWrite(3,HIGH);
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
}
void carInit()
{
// put your setup code here, to run once:
pinMode(2,OUTPUT);// 配置2口为输出引脚
pinMode(3,OUTPUT);// 配置3口为输出引脚
//右轮信号方向初始化
pinMode(4,OUTPUT);// 配置4口为输出引脚
pinMode(5,OUTPUT);// 配置5口为输出引脚
}
void setup() {
carInit();
}
void loop() {
qianJin();//函数的调用
delay(1000);
houTui();
delay(1000);
zuoZhuan();
delay(1000);
youZhuan();
delay(1000);
}

4.串口介绍

我们把程序通过电脑下载到WemosD1上的时候,就是通过串口通信

在程序中,我们也可以通过函数调用实现串口通信

串口的初始化函数:

描述:开启串口,通常置于setup()函数中。 Serial.begin(speed)

参数: speed:波特率,一般取值9600,115200等。

ArduinoUno通过串口发送一个消息给电脑

Serial.print(“test message,这里是消息,喜欢发什么消息,就写什么消息”)

Serial.println(“test message,这里是消息,喜欢发什么消息,就写什么消息”), 比上面多了ln,代表换行

代码示例:

​
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
}
void loop() {
// put your main code here, to run repeatedly:
Serial.print("zglnb");
Serial.println("zglnb");
}

​

打开测试

5.跟随小车开发

主要用到超声波模块,型号:HC-SR04

 原理图:

超声波代码通过串口测验:

void setup() {
// put your setup code here, to run once:
// Trig 接 9,通过9发送一个触发信号给超声波
pinMode(9,OUTPUT);
// Echo 接 8,通过读取8高电平维持的时间,确认超声波在空气中传播的时间
pinMode(8,INPUT);
Serial.begin(9600);
}
void loop() {
long shijian;
long juli;
// put your main code here, to run repeatedly:
// 发送一个10us的信号给超声波,9Trig
digitalWrite(9, LOW);
delayMicroseconds(2);
digitalWrite(9, HIGH);
delayMicroseconds(10);
digitalWrite(9, LOW);//超声波内部开始震荡,准备发送波
// 关注Echo高电平维持的时间,代表超声波发送到返回的时间,微秒
shijian = pulseIn(8,HIGH);
// 距离(cm) = 时间(s) * 速度340m/s 34000cm/s = cm
juli = shijian * 0.017;
Serial.print(juli);
Serial.println("cm");
}
//封装测距代码
//函数:名 参数 返回值
long getDis() {
// 测距函数
long shijian;
long juli;
// put your main code here, to run repeatedly:
// 发送一个10us的信号给超声波,9Trig
digitalWrite(9, LOW);
delayMicroseconds(2);
digitalWrite(9, HIGH);
delayMicroseconds(10);
digitalWrite(9, LOW);//超声波内部开始震荡,准备发送波
// 关注Echo高电平维持的时间,代表超声波发送到返回的时间,微秒
shijian = pulseIn(8,HIGH);
// 距离(cm) = 时间(s) * 速度340m/s 34000cm/s = cm
juli = shijian * 0.017;
return juli;
}
void setup() {
// put your setup code here, to run once:
// put your setup code here, to run once:
// Trig 接 9,通过9发送一个触发信号给超声波
pinMode(9,OUTPUT);
// Echo 接 8,通过读取8高电平维持的时间,确认超声波在空气中传播的时间
pinMode(8,INPUT);
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
long juli;
juli = getDis();
Serial.print(juli);
Serial.println("cm");
}

 跟随小车代码:

//前进
void qianJin() {
// 小车前进的功能
digitalWrite(2,LOW);
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
}
//后退
void houTui() {//函数的封装
// 小车后退的功能
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
}
//ting
void ting() {//函数的封装
// 小车后退的功能
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
}
//测距
//函数:名 参数 返回值
long getDis() {
// 测距函数
long shijian;
long juli;
// put your main code here, to run repeatedly:
// 发送一个10us的信号给超声波,9Trig
digitalWrite(9, LOW);
delayMicroseconds(2);
digitalWrite(9, HIGH);
delayMicroseconds(10);
digitalWrite(9, LOW);//超声波内部开始震荡,准备发送波
// 关注Echo高电平维持的时间,代表超声波发送到返回的时间,微秒
shijian = pulseIn(8,HIGH);
// 距离(cm) = 时间(s) * 速度340m/s 34000cm/s = cm
juli = shijian * 0.017;
return juli;
}
void carInit()
{
// put your setup code here, to run once:
pinMode(2,OUTPUT);// 配置2口为输出引脚
pinMode(3,OUTPUT);// 配置3口为输出引脚
//右轮信号方向初始化
pinMode(4,OUTPUT);// 配置4口为输出引脚
pinMode(5,OUTPUT);// 配置5口为输出引脚
}
void setup() {
// put your setup code here, to run once:
carInit();
// Trig 接 9,通过9发送一个触发信号给超声波
pinMode(9,OUTPUT);
// Echo 接 8,通过读取8高电平维持的时间,确认超声波在空气中传播的时间

pinMode(8,INPUT);
}
void loop() {
// put your main code here, to run repeatedly:
delay(50);//为了放缓超声波交互的速度,交互过快,得出距离后会卡顿,影响效果体验
long juli;
juli = getDis();
//如果距离大于3且小于13,后退
if( 3 < juli && juli < 15){
houTui();
}
//如果距离大于14且小于40,前进
if( 14 < juli && juli < 40){
qianJin();
}
if(juli > 50){
ting();
}
}

6.摇头避障小车开发

需要舵机模块

 如下图所示,最便宜的舵机sg90,常用三根或者四根接线,黄色为PWM信号控制用处:垃圾桶项目开盖 用、智能小车的全比例转向、摄像头云台、机械臂等 常见的有0-90°、0-180°、0-360°

Arduino官方提供Servo类来支持舵机操作

//舵机的初始化
Servo myServo; //定义一个Servo变量
myServo.attach(10);//把舵机黄色信号线插在arduino的引脚10
myServo.write(0);//转到某角度,根据实际执行观看
myServo.write(90);//转到某角度,根据实际执行观看

摇头避障小车代码:

#include <Servo.h>
Servo myServo;//因为很多子函数要用这个变量,所以把servo定义成全局变量,作用域是整个代码文件
void ting() {
// 小车前进的功能
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
}
void qianJin() {
// 小车前进的功能
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
}
void houTui() {//函数的封装
// 小车后退的功能
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
}
void zuoZhuan() {
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
}
void youZhuan() {
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
}
void carInit()
{
// put your setup code here, to run once:
pinMode(2, OUTPUT); // 配置2口为输出引脚
pinMode(3, OUTPUT); // 配置3口为输出引脚
//右轮信号方向初始化
pinMode(4, OUTPUT); // 配置4口为输出引脚
pinMode(5, OUTPUT); // 配置5口为输出引脚
}
long getDis() {
// 测距函数
long shijian;
long juli;
// put your main code here, to run repeatedly:
// 发送一个10us的信号给超声波,9Trig
digitalWrite(9, LOW);
delayMicroseconds(2);
digitalWrite(9, HIGH);
delayMicroseconds(10);
digitalWrite(9, LOW);//超声波内部开始震荡,准备发送波
// 关注Echo高电平维持的时间,代表超声波发送到返回的时间,微秒
shijian = pulseIn(8, HIGH);
// 距离(cm) = 时间(s) * 速度340m/s 34000cm/s = cm
juli = shijian * 0.017;
return juli;
}
void setup() {
// put your setup code here, to run once:
//定义一个Servo变量
carInit();
myServo.attach(10);//把舵机黄色信号线插在arduino的引脚10
// Trig 接 9,通过9发送一个触发信号给超声波
pinMode(9, OUTPUT);
// Echo 接 8,通过读取8高电平维持的时间,确认超声波在空气中传播的时间
pinMode(8, INPUT);
Serial.begin(9600);
}
void loop() {
long youjuli;
long zhongjuli;
long zuojuli;
//如果前面没有障碍物,我让小车往前走
myServo.write(100);//中间方向
delay(500);
zhongjuli = getDis();
Serial.print("中间距离是:");
Serial.println(zhongjuli);
if (zhongjuli < 35) {
ting();//检测到前方右障碍物
//往右边摇头,并测距
myServo.write(30);//右方向
delay(500);
youjuli = getDis();
Serial.print("右边距离是:");
Serial.println(youjuli);
myServo.write(100);//测完右边距离,再回到中间,此时可以不测距
delay(500);
//往左边摇头,测左边距离
myServo.write(170);//左边方向
delay(500);
zuojuli = getDis();
Serial.print("左边距离是:");
Serial.println(zuojuli);
myServo.write(100);//测完右边距离,再回到中间,此时可以不测距
delay(500);
if(zuojuli > youjuli){
Serial.println("左转");
zuoZhuan();
delay(100);
ting();
}
if(zuojuli < youjuli){
Serial.println("右转");
youZhuan();
delay(100);
ting();
}
} else { //前方无障碍物,小车前进
qianJin();
}
}

7.实物展示

 

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

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

相关文章

创建项目并精细化配置【Vue3】

创建项目并精细化配置 git管理项目 基于 create-vue 创建出来的项目默认没有初始化git仓库&#xff0c;需要我们手动初始化 执行命令并完成首次提交 git initgit addgit commit -m “init” 什么是别名路径联想提示 在编写代码的过程中&#xff0c;一旦输入 /&#xff0c;V…

【数据分享】1929-2022年全球站点的逐日平均露点数据(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 对于具体到监测站点的气象数据&#xff0c;之前我们分享过1929-2022年全球气象…

【零基础入门学习Python---Python函数和模块】

&#x1f680; Python &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

protoBuf

序列化和反序列化 链接 序列化的对象是什么 程序对象 对象序列化之后是什么 字节流 protocol buffer 链接 教程 原文链接 Protocol Buffer 的作用 通过将结构化的数据&#xff08;拥有多种属性&#xff09;进行序列化&#xff0c;从而实现&#xff08;内存与硬盘之间…

探索MediaPipe检测人脸关键点

MediaPipe是Google开源的计算机视觉处理框架&#xff0c;基于TensorFlow来训练模型&#xff0c;支持人脸识别、人脸关键点、物体检测追踪、图像分类、人像分割、手势识别、文本分类、语音分类等。我们可以使用CPU来推理&#xff0c;也可以选择GPU加速推理。在滤镜特效场景&…

【软考网络管理员】2023年软考网管初级常见知识考点(17)-数据加密与签名摘要

涉及知识点 对称加密&#xff0c;非对称加密&#xff0c;数字签名&#xff0c;报文摘要&#xff0c;数字证书 软考网络管理员常考知识点&#xff0c;软考网络管理员网络安全&#xff0c;网络管理员考点汇总。 文章目录 涉及知识点前言一、对称加密技术1.DES2.3DES3.IDEA4.AES5…

系统架构的精髓:18个必懂的设计概念一览

要想在系统设计领域中脱颖而出&#xff0c;深入理解一些基础的系统设计概念是必不可少的&#xff0c;这些概念包括负载均衡、缓存、分区、复制、数据库和代理等。 依据我自己的经验&#xff0c;我总结出了18个关键概念&#xff0c;如果能掌握这些&#xff0c;将极大地提升你处…

Android APT 系列 (二):APT 筑基之注解

注解介绍 元数据 元数据就是为其他数据提供信息的数据 注解 官方解释&#xff1a;注解用于为代码提供元数据。作为元数据&#xff0c;注解不直接影响你的代码执行&#xff0c;但也有一些类型的注解实际上可以用于这一目的。Java 注解是从 JDK 1.5 开始添加到 Java 的。 简单…

建议收藏:OpenKruise入门与实践

简介 OpenKruise 是一个基于 Kubernetes 的扩展套件&#xff0c;主要聚焦于云原生应用的自动化&#xff0c;比如部署、发布、运维以及可用性防护。 OpenKruise 提供的绝大部分能力都是基于 CRD 扩展来定义&#xff0c;它们不存在于任何外部依赖&#xff0c;可以运行在任意纯净的…

css 背景颜色级别高于背景图

<div class"bg-parent"> <img :src"employeeImg" class"bg-url" /> <div class"bg"> <el-icon class"plus-icon"> <Plus /> </el-icon> </div> </div> .bg-parent{ //父级…

Web服务器群集:Nginx之Rewrite重写

目录 一、理论 1.Nginx正则表达式 2.location匹配 3.rewrite重写 二、实验 1.基于域名的跳转 2.基于客户端 IP访问跳转 3.基于旧域名跳转到新域名后面加目录 4.基于参数匹配的跳转 5.基于目录下所有 php结尾的文件跳转 6.基于最普通一条url请求的跳转 三、总结 一、…

福昕Foxit PDF远程代码执行漏洞CVE-2023-27363分析与复现

漏洞概述 福建福昕软件开发股份有限公司是一家国际化运营的PDF电子文档解决方案提供厂商&#xff0c;提供文档的生成、转换、显示、编辑、搜索、打印、存储、签章、表单、保护、安全分发管理等涵盖文档生命周期的产品技术与解决方案。其下产品Foxit PDF Reader和Foxit PDF Edit…

性能测试——App性能测试需要关注的指标

目录 一、Android客户端性能测试常见指标&#xff1a; 二、预期标准指定原则 三、测试方法及工具 一.从用户角度出发 二.站在管理员的角度考虑需要关注的性能点 三.站在开发(设计)人员角度去考虑 四.站在测试工程师角度考虑 总结&#xff1a; 一、Android客户端性能测试…

无功功率补偿及电容器的简单介绍 安科瑞 许敏

摘要&#xff1a;主要对无功功率的概念、电容器的补偿方式、补偿容量的计算等方面进行了阐述&#xff0c;在此基础上介绍了电容器运行的注意事项。 关键词&#xff1a;电力电容器&#xff1b;补偿方式 &#xff1b;运行 0 引言 笔者从进入吕合煤业从事电工工作的那天起&#…

Wav2Lip原理以及训练

原理 1: 音视频同步判别器 常规SyncNet&#xff1a; 功能&#xff1a;音频和嘴唇同步 实质&#xff1a;判断音频和唇形在某个共同参数空间下的相似性。 网络结构&#xff1a; 一种伪孪生网络结构&#xff0c;分别提取嘴形特征和音频特征&#xff0c;然后通过对比损失计算两者…

VS2017+OpenCV4.5.1 安装与配置,扩展模块opencv_contrib的安装与配置

文章目录 VS2017OpenCV4.5.1 安装与配置&#xff0c;扩展模块opencv_contrib的安装与配置1、OpenCV下载&#xff1a;&#xff08;1&#xff09;下载地址&#xff1a;https://opencv.org/releases/page&#xff08;2&#xff09;解压到指定文件夹&#xff1a; 2、配置环境&#…

如何进行可视化的数据过滤?Sugar BI 的过滤组件教你快速实现

Sugar BI 中支持了 10种过滤组件&#xff0c;这些过滤组件都是让用户在浏览报表或大屏的时候&#xff0c;能够交互式的对页面上的图表进行数据的过滤。所有过滤组件对图表的数据过滤设置都是一样的&#xff0c;如下&#xff1a; 例如页面中已有两个图表&#xff08;这两个图表…

人脑髓鞘化

髓鞘化 大纲&#xff1a;髓鞘化定义&#xff1b;髓鞘化能用来干嘛&#xff1b;髓鞘化现阶段存在的痛点&#xff1b;现有方法如何解决问题&#xff1b;我们方法的优势。 定义 髓鞘化是指髓鞘发展的过程&#xff0c;它使神经兴奋在沿神经纤维传导时速度加快&#xff0c;并保证…

开窗函数分享

开窗函数定义 开窗函数&#xff1a;用于为行定义一个窗口&#xff0c;它一组值进行操作&#xff0c;不需要使用group by子句对数据进行分组&#xff0c;能够在同一行中同时返回基础行的列和聚合列。 划重点!!! 开窗函数返回&#xff1a;基础行列、聚合列 下面通过例子看一下…

OJ# 376 机器翻译

题目描述 ​ 小李的电脑上安装了一个机器翻译软件&#xff0c;他经常用这个软件来翻译英语文章。 ​这个翻译软件的原理很简单&#xff0c;它只是从头到尾&#xff0c;依次将每个英文单词用对应的中文含义来替换。对于每个英文单词&#xff0c;软件会先在内存中查找这个单词的…