基于Arduino UNO的循迹小车

简介: 基于Arduino UNO的循迹小车

一、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();
}

二、红外循迹模块介绍

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


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


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


        红外照射在黑线上


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


        灯的表现为灭灯


(2)什么时候该左转


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


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


(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();
    }
}

四、实物示例

相关文章
|
JSON 算法 Go
Golang语言使用 jwt-go 库生成和解析 token
Golang语言使用 jwt-go 库生成和解析 token
1015 0
|
IDE 开发工具 iOS开发
基于MacOS搭建ESP8266 NodeMCU CP2102开发环境
基于MacOS搭建ESP8266-NodeMCU开发环境 1. 下载、安装驱动 2. Arduino开发环境配置 2.1. 下载、安装Arduino 2.2. 配置Arduino
基于MacOS搭建ESP8266 NodeMCU CP2102开发环境
|
2月前
|
人工智能 JavaScript 前端开发
Open Design:让你的 Coding Agent 变身设计引擎,本地优先的开源 Claude Design 替代品
Open Design 是开源本地化设计智能体,让 Claude/Cursor 等 Coding Agent 直接生成品牌一致的原型、MP4动效、PPTX演示稿与视觉资产。100+技能×150套DESIGN.md设计系统×261插件×21 Agent全适配,数据不出本机。
|
JSON 数据可视化 物联网
基于STM32和FreeRTOS的实时天气系统设计与实现【免费开源】
随着物联网(IoT)技术的发展,实时数据监测系统逐渐成为日常生活和工业环境中不可或缺的组成部分。其中,气象监测系统不仅可以提供温度、湿度、天气状况等信息,还可以通过数据分析为农业、城市管理和个人生活提供智能化建议。本项目以STM32F407为核心控制器,结合FreeRTOS实时操作系统和ESP8266 Wi-Fi模块,实现一套高可靠、实时更新的智能气象监测系统。同时,系统集成了计时功能,通过串口屏将实时数据可视化展示,为用户提供直观的操作体验。
基于STM32和FreeRTOS的实时天气系统设计与实现【免费开源】
|
6月前
|
人工智能 运维 Ubuntu
阿里云轻量服务器系统镜像 vs 应用镜像有什么区别?90%的人都选错!
阿里云轻量服务器中,系统镜像为纯净OS(如Ubuntu、Windows),需手动部署环境;应用镜像则预装WordPress、宝塔等完整应用及依赖,开箱即用。新手选应用镜像,定制需求选系统镜像。
803 6
|
IDE Java 程序员
学生邮箱白嫖/免费安装JetBrains全家桶(IDEA/pycharm等) —— 保姆级教程
本文提供了如何使用学生邮箱免费获取并安装JetBrains全家桶(包括IDEA、PyCharm等)的详细教程,涵盖了学生认证、软件下载、安装及常见问题的解决方法。
8420 0
学生邮箱白嫖/免费安装JetBrains全家桶(IDEA/pycharm等) —— 保姆级教程
|
数据安全/隐私保护
思科模拟器Cisco Packet Tracer 8.2.1注册、下载和安装教程(正确+详细)
本文详细总结了思科模拟器Cisco Packet Tracer 8.2.1注册、下载和安装教程(正确+详细),看这一篇就够啦~
59146 7
思科模拟器Cisco Packet Tracer 8.2.1注册、下载和安装教程(正确+详细)
|
Web App开发 数据采集 JavaScript
Chrome浏览器实例的TypeScript自动化脚本
Chrome浏览器实例的TypeScript自动化脚本
|
传感器 NoSQL 算法
ROS Moveit 配置全网最详细教程
本文是关于ROS Moveit配置的全网最详细教程,提供了一键安装脚本,以及如何使用Moveit进行机器人运动规划的详细步骤和说明。文中还深入解析了Moveit的配置包文件、Moveit的源码,以及如何使用不同的运动规划算法(如CHOMP、LERP、STOMP)进行路径规划。
3659 1
ROS Moveit 配置全网最详细教程

热门文章

最新文章