基于Arduino UNO的循迹小车

目录

一、analogWrite函数的使用

二、红外循迹模块介绍

三、循迹小车代码实现

四、实物示例


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

四、实物示例

  • 15
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
根据提供的引用内容,我们可以了解到该Arduino智能小车循迹+测速实验需要用到L293D电机驱动芯片和TT直流减速电机,以及红外循迹模块。因此,我们可以基于这些硬件组件来编写走迷宫的代码示例。 以下是一个简单的Arduino寻迹小车二驱四路红外循迹模块走迷宫代码示例: ```arduino #include <AFMotor.h> AF_DCMotor motor1(1); AF_DCMotor motor2(2); AF_DCMotor motor3(3); AF_DCMotor motor4(4); int leftSensor1 = A0; int leftSensor2 = A1; int rightSensor1 = A2; int rightSensor2 = A3; void setup() { pinMode(leftSensor1, INPUT); pinMode(leftSensor2, INPUT); pinMode(rightSensor1, INPUT); pinMode(rightSensor2, INPUT); } void loop() { int left1 = digitalRead(leftSensor1); int left2 = digitalRead(leftSensor2); int right1 = digitalRead(rightSensor1); int right2 = digitalRead(rightSensor2); if (left1 == LOW && left2 == HIGH && right1 == HIGH && right2 == LOW) { motor1.setSpeed(200); motor1.run(FORWARD); motor2.setSpeed(200); motor2.run(BACKWARD); motor3.setSpeed(200); motor3.run(FORWARD); motor4.setSpeed(200); motor4.run(BACKWARD); } else if (left1 == HIGH && left2 == LOW && right1 == LOW && right2 == HIGH) { motor1.setSpeed(200); motor1.run(BACKWARD); motor2.setSpeed(200); motor2.run(FORWARD); motor3.setSpeed(200); motor3.run(BACKWARD); motor4.setSpeed(200); motor4.run(FORWARD); } else if (left1 == LOW && left2 == HIGH && right1 == LOW && right2 == HIGH) { motor1.setSpeed(200); motor1.run(FORWARD); motor2.setSpeed(200); motor2.run(BACKWARD); motor3.setSpeed(200); motor3.run(BACKWARD); motor4.setSpeed(200); motor4.run(FORWARD); } else if (left1 == HIGH && left2 == LOW && right1 == HIGH && right2 == LOW) { motor1.setSpeed(200); motor1.run(BACKWARD); motor2.setSpeed(200); motor2.run(FORWARD); motor3.setSpeed(200); motor3.run(FORWARD); motor4.setSpeed(200); motor4.run(BACKWARD); } else { motor1.setSpeed(0); motor1.run(RELEASE); motor2.setSpeed(0); motor2.run(RELEASE); motor3.setSpeed(0); motor3.run(RELEASE); motor4.setSpeed(0); motor4.run(RELEASE); } } ``` 该代码使用了AFMotor库来控制电机的运动方向和速度,同时使用了4个红外循迹模块来检测小车的位置。根据不同的红外循迹模块的状态,小车会做出相应的运动方向和速度调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热爱嵌入式的小佳同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值