基于Arduino UNO的循迹小车

目录

1.analogWrite函数的使用

2.红外循迹模块介绍

3.循迹小车代码实现

4.实物示例

1.analogWrite函数的使用

用analogWrite来替换digitalWrite

说明

将一个模拟数值写进Arduino引脚。这个操作可以用来控制LED的亮度, 或者控制电机的转速.

在Arduino UNO控制器中, analogWrite()函数支持以下引脚: 3, 5, 6, 9, 10, 11 在调用analogWrite()函数前,您无需使用pinMode()函数来设置该引脚。

语法

analogWrite(pin, value)

参数

pin :被读取的模拟引脚号码

value :0到255之间的PWM频率值, 0对应off, 255对应on

小车接线情况说明(具体看个人)

2,3控左电机,4,5控右电机

代码示例:

//小车前进的代码是:
void qianJin() {
// 小车前进的功能
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
}
//如果我们只对前进,左转,右转控制速度
//由于硬件特性:Arduino UNO的3,5口支持analogWrite函数,2,4口不支持
//所以,我希望前进的代码是
void qianJin() {
// 小车前进的功能
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
}
//此时,把接口4,5的杜邦线对调
//为了速度控制可以优化代码成
void qianJin() {
// 小车前进的功能
digitalWrite(2, LOW);
analogWrite(3, 120);
digitalWrite(4, HIGH);
analogWrite(5, 120);//120是
}

控制前进速度的代码:

/*
把IO口4和IO口5的接线对调!
前进代码左轮3是模拟输出,5是模拟输出,2和4口不支持,直接给低电平
3口和5口支持模拟输出,达到小车前进方向上的速度控制目的。
*/
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 qianJin() {
// 小车前进的功能
digitalWrite(2, LOW);
analogWrite(3, 230);
digitalWrite(4, LOW);
analogWrite(5, 230);
}
void setup() {
// put your setup code here, to run once:
carInit();
}
void loop() {
// put your main code here, to run repeatedly:
qianJin();
}

控制前进左转右转:

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 qianJin() {
// 小车前进的功能
digitalWrite(2, LOW);
analogWrite(3, 150);
digitalWrite(4, LOW);
analogWrite(5, 150);
}
void zuoZhuan() {
// 小车左转,左边电机速度慢,右边电机速度快
digitalWrite(2, LOW);
analogWrite(3, 90); //左
digitalWrite(4, LOW);
analogWrite(5, 250);//右
}
void youZhuan() {
// 小车左转,左边电机速度慢,右边电机速度快
digitalWrite(2, LOW);
analogWrite(3, 250); //左
digitalWrite(4, LOW);
analogWrite(5, 90);//右
}
void setup() {
// put your setup code here, to run once:
carInit();
}
void loop() {
// put your main code here, to run repeatedly:
youZhuan();
}

2.红外循迹模块介绍

我这里用的是红外循迹模块TCRT5000

简单概括:没反射回来,D0输出高电平,灭灯

(1)什么情况下红外线没有返回来

         红外照射在黑线上

         在黑线上DO电平表现为高电平!

         灯的表现为灭灯

(2)什么时候该左转

         说明小车偏右,说明左循迹模块在黑线上,左循迹模块的电平表现为高电平

         右循迹模块能接收到红外,电平表现为低电平

(3)什么实时该右转

         说明小车偏左,右循迹在黑线上,右循迹高电平,左循迹低电平

3.循迹小车代码实现

/*
做循迹模块接Arduino的11口,右循迹模块接Arduinod的12口
小车控制速度前进
*/
int leftX = 11;
int rightX = 12;
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 qianJin() {
// 小车前进的功能
digitalWrite(2, LOW);
analogWrite(3, 100);
digitalWrite(4, LOW);
analogWrite(5, 100);
}
void ting() {
// 小车前进的功能
digitalWrite(2, LOW);
analogWrite(3, 0);
digitalWrite(4, LOW);
analogWrite(5, 0);
}
void zuoZhuan() {
// 小车左转,左边电机速度慢,右边电机速度快
digitalWrite(2, LOW);
analogWrite(3, 80); //左
digitalWrite(4, LOW);
analogWrite(5, 250);//右
}
void youZhuan() {
// 小车左转,左边电机速度慢,右边电机速度快
digitalWrite(2, LOW);
analogWrite(3, 250); //左
digitalWrite(4, LOW);
analogWrite(5, 80);//右
}
void setup() {
// put your setup code here, to run once:
carInit();
pinMode(leftX,INPUT);
pinMode(rightX,INPUT);
}
void loop() {
// put your main code here, to run repeatedly:
//什么时候该左转
//左循迹模块的电平表现为高电平,右循迹模块表现为低电平
if( digitalRead(leftX) == 1 && digitalRead(rightX) == 0 ){
zuoZhuan();
}
//什么时候右转
//右循迹高电平,左循迹低电平
if( digitalRead(leftX) == 0 && digitalRead(rightX) == 1 ){
youZhuan();
}
//什么时候前进
//左右都为低电平
if( digitalRead(leftX) == 0 && digitalRead(rightX) == 0 ){
qianJin();
}
//什么时候停
//左右都为高电平
if( digitalRead(leftX) == 1 && digitalRead(rightX) == 1 ){
ting();
}
}

4.实物示例

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

查询Oracle当前用户下,所有数据表的总条数

需求:查询Oracle当前用户下,所有数据表的总条数 方法:存储过程 右键点击Procedures,点击New 点击OK 把存储过程写进去,然后点击编译运行: create or replace procedure tables_count ist_count numbe…

xshell安装jdk1.8环境

xshell安装jdk1.8环境 大家好,今天我们来学习一下xshell安装jdk1.8环境,好好看,好好学,超详细的 第一步 进入xshell官网下载 第二步 打开xshell新建一个会话,如下图: 第三步 输入你的名称、主机ip、端口号(…

CSS中伪类详解和用法例子详解

文章目录 一、伪类介绍二、伪类选择器1.动态伪类2.结构伪类3.否定伪类4.状态伪类5.目标伪类 一、伪类介绍 用于已有元素处于某种状态时(滑动、点击等)为其添加对应的样式,这个状态是根据用户行为而动态变化的。 二、伪类选择器 动态伪类作…

Arduino uno 环境配置 for Mac

1、IDE 在官网下载 官网地址:https://www.arduino.cc/en/software 看到钱💰不要怕,只是问你捐不捐款,不收钱,你直接安装就行 (你也可以捐一点~) 安装之后 2、安装驱动 地址 &…

互联网+洗鞋店预约小程序新模式;

互联网洗鞋店预约小程序 1、线上线下业务的结合。 传统的线下业务消费者到店可以向其推介线上的预约到家服务,让线下的消费者成为小程序内的会员,留存客户之后线上可直接触达,减少与消费者的距离,从等待客户到可以主动出击&…

黑客是什么?想成为黑客需要学习什么?

什么是黑客 在《黑客辞典》里有不少关于“黑客”的定义, 大多和“精于技术”或“乐于解决问题并超越极限”之类的形容相关。然而,若你想知道如何成为一名黑客,只要牢记两点即可。 这是一个社区和一种共享文化,可追溯到那群数十年前使…

6.Mysql主从复制

文章目录 Mysql主从复制读写分离概念:读写分离的作用:读写分离的作用条件:主从复制与读写分离mysq支持的复制类型主从复制的工作过程配置时间同步主服务器配置从服务器配置 读写分离MySQL 读写分离原理目前较为常见的 MySQL 读写分离分为以下…

A核与M核异构通信过程解析

现在越来越多的产品具有M core和A core的异构架构,既能达到M核的实时要求,又能满足A核的生态和算力。比如NXP的i.MX8系列、瑞萨的RZ/G2L系列以及TI的AM62x系列等等。虽然这些处理器的品牌及性能有所不同,但多核通信原理基本一致,都…

Linux - 那些年测试服务器带宽的 3 种方式

方式一 speedtest-cli wget -O speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.pychmod x speedtest-cliorcurl -Lo speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.pychmod x speedtest-c…

重生之我测阿里云U1实例(通用算力型实例)

官方福利!!!!大厂羊毛你确定不薅??? 参与ECSU实例评测,申请免费体验机会:https://developer.aliyun.com/mission/review/ecsu 参与ECSU实例评测,申请免费体验…

一些零散的查询知识

一、all any some 表: all大于所有的值: any some:大于任意一个即可 例题: 大于50部门所有员工工资的人: 等价于: 二、exists关键字 1、exists查询 exists(子查询) 如果有满足条件的记录,那么exi…

C/C++内存管理(内存分布、动态内存分配、动态内存分配与释放、内存泄漏等)

喵~ 内存之5大区(栈区、堆区、静态区、常量区、代码区)C/C中各自的内存分配操作符内存泄露?内存泄漏检测方法 内存之5大区(栈区、堆区、静态区、常量区、代码区) 1、栈区(stack):由编译器自动分…

【从删库到跑路】详细讲解MySQL的函数和约束作用

🎊专栏【MySQL】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【如愿】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰 文章目录 🍔函数⭐字符串函数🎈字符串拼接函数&…

LabVIEW开发呼吸分析系统

LabVIEW开发呼吸分析系统 在日常生活中,许多人都在练习调息法,但大多数人都不知道如何以完美的方式做。不当的做法不会带来适当的结果。一种使用LabVIEW分析呼吸信号的方法,以使人们以完美的方式练习调息。这有助于从业者按照系统指定的说明…

Vue2封装一个全局通知组件并发布到NPM

✍🏼作者:周棋洛,计算机学生 ♉星座:金牛座 🏠主页:点击查看更多 🌐关键:vue2 组件封装 npm发包 文章目录 1. 前言 🍃2. 我为什么要封装通知插件 ❓3. 初始化vue空项目 &…

Learn Mongodb DB数据库部署 ②

作者 : SYFStrive 博客首页 : HomePage 📜: PHP MYSQL 📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗 📌:觉得文章不错可以点点关注 &#x1f44…

【STM32】软件I2C控制频率

在上一篇文章中,我们已经介绍了整个软件I2C的实现原理,但是也遗留了一个问题,那就是I2C速率的控制,其实就是控制SCL信号的频率。 微秒级延时 在上篇文章中,我们使用了SysTick进行延时,具体如下&#xff1…

Ubuntu下编译VTK

1.先安装QT,不知道不装行不行,我们项目需要。 2.去VTK官网下载VTK源码。 3.解压源码。 4.编译需要用cmake-gui,装QT的一般都有,但需要把路径添加到PATH才能用。 5.打开cmake-gui,设置源码路径,编译输出路…

Java开发 - Canal的基本用法

前言 今天给大家带来的是Canal的基本用法,Canal在Java中常被我们用来做数据的同步,当然不是MySQL与MySQL,Redis与Redis之间了,如果是他们,那就好办了,我们可以直接通过配置来完成他们之间的主从、主主&…

【SpringBoot】一、SpringBoot3新特性与改变详细分析

前言 本文适合具有springboot的基础的同学。 SpringBoot3改变&新特性 一、前置条件二、自动配置包位置变化1、Springboot2.X2、Springboot3.X 三、jakata api迁移1、Springboot2.X2、Springboot3.X3、SpringBoot3使用druid有问题,因为它引用的是旧的包 四 新特…
最新文章