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

四、实物示例

相关文章
|
存储 Linux
Linux中的进程等待(超详细)
Linux中的进程等待(超详细)
507 1
|
Linux C++ Windows
code规范 --- 驼峰命名法
code规范 --- 驼峰命名法
1142 0
|
传感器 存储 监控
基于Arduino的线性循迹小车
基于Arduino的线性循迹小车
353 0
微信封号脚本插件,全自动批量投诉工具, vx隔空抓包封号思路【仅供学习参考用途】
这是一款针对微信投诉自动化处理的工具插件,通过模拟点击操作实现批量投诉功能。相比手动投诉,该插件效率更高、成功率更有保障。
|
传感器 算法 IDE
基于Arduino的遥控自平衡小车
基于Arduino的遥控自平衡小车
332 41
|
11月前
|
移动开发 编解码 前端开发
摸鱼必备-80款在线HTML小游戏
本文推荐了80款精彩的HTML5在线小游戏,涵盖益智、冒险、射击、体育等多种类型,适合各年龄段玩家。无需下载安装,随时随地畅玩。地址:[https://game.share888.top/](https://game.share888.top/)
2435 7
摸鱼必备-80款在线HTML小游戏
|
存储 NoSQL 算法
Redis6入门到实战------ 三、常用五大数据类型(列表(List)、集合(Set)、哈希(Hash)、Zset(sorted set))
这是关于Redis 6入门到实战的文章,具体内容涉及Redis的五大数据类型:列表(List)、集合(Set)、哈希(Hash)、有序集合(Zset(sorted set))。文章详细介绍了这些数据类型的特点、常用命令以及它们背后的数据结构。如果您有任何关于Redis的具体问题或需要进一步的帮助,请随时告诉我。
|
机器学习/深度学习 移动开发 TensorFlow
深度学习之格式转换笔记(四):Keras(.h5)模型转化为TensorFlow(.pb)模型
本文介绍了如何使用Python脚本将Keras模型转换为TensorFlow的.pb格式模型,包括加载模型、重命名输出节点和量化等步骤,以便在TensorFlow中进行部署和推理。
406 0
|
语音技术 传感器
51单片机智能小车(循迹、跟随、避障、测速、蓝牙、wifie、4g、语音识别)总结-1
51单片机智能小车(循迹、跟随、避障、测速、蓝牙、wifie、4g、语音识别)总结-1
51单片机智能小车(循迹、跟随、避障、测速、蓝牙、wifie、4g、语音识别)总结-1