Arduino-循迹小车-保姆级教程

一,所需元件

arduino nano一个(Uno太大,所以选择了体积较小的Nano)
L298N电机驱动模块一个
直流减速电机两个
万向轮一个
亚克力板
轮胎两个
TCRT5000寻迹传感器四个
速成可直接跳到三,连线部分

二,元器件的详细介绍

(1)arduino nano
下面看一张Nano的图,比较生涩难懂,没关系,我也没搞懂。在本项目中只需要大家知道GDN(Ground)是接地的,3v3和5v是输出电压的(给Nano板通电及能用)。图中曲线的引脚(D3,D5,D6,D9,D10,D11)可进行PWM输出。(通俗的讲:这几个引脚可以输出低电压到高电压中间的任何一个值,而其他的引脚要么输出高电压,要么输出低电压)
Arduino-循迹小车-保姆级教程_第1张图片
(2)L298N电机驱动模块
具体长这样(图来自tb)Arduino-循迹小车-保姆级教程_第2张图片注意红色圈出的地方:写有ENA,IN1,IN2,IN3,IN4,ENB。ENA相当于EN1,EN2的总开关,ENB对应IN3,IN4的总开关。例:让ENA为高电平,IN1,IN2脚位给什么信号就是什么信号,若ENA为低电平,IN1,IN2无论给什么信号这两个脚位都是低电平。(注:仅是可以这样理解,ENA和ENB有它专门的名字叫使能
(3)直流减速电机,万向轮,亚克力板
Arduino-循迹小车-保姆级教程_第3张图片
我用的是这样的(图来自tb),当然也还有很多直流电机供大家选择,图示应该是最便宜的了。
(4)TCRT5000寻迹传感器Arduino-循迹小车-保姆级教程_第4张图片
注意到图中有四个引脚,该项目中要用到A0,VCC,GND,三个引脚,VCC和GND为正负极,用来供电,A0来输出检测到的信息。(D0没有用到,也不用接任何线)。

三,连线

TCRT5000寻迹传感器放在小车的前端,从左到右依次编号为Lb,La,Ra,Rb。Lb,La,Ra,Rb的vcc连arduino板的5V,GND连arduino板的GND,其A0脚位分别连arduino的A0,A1,A2,A3脚位。这点在程序中可以清晰的看到。

L298N电机驱动模块的连线也在程序中有所表达,例,ENA=12代表ENA连到arduino的12脚位。OUT1,与OUT2分别连电机的上下端。(这里连的顺序不一样程序也会写的不同)。这里可以自行尝试。

四,程序代码

上传程序之前首先在工具这里把将开发板选择为 Arduino Nano,下面的处理器选项也需要相应改动,一般情况是选择ATmega328P(Old Bootloader),如果是新版的Nano开发板就选择另外两个试试。Arduino-循迹小车-保姆级教程_第5张图片

int ENA=12,IN1=9,IN2=6,IN3=5,IN4=3,ENB=2;
int La,Ra,Lb,Rb; 
void setup() {
     
    //Serial.begin(9600);
    pinMode(2,OUTPUT);
    pinMode(3,OUTPUT);
    pinMode(5,OUTPUT);
    pinMode(6,OUTPUT);
    pinMode(9,OUTPUT);
    pinMode(12,OUTPUT);
}

void loop() {
     
  digitalWrite(ENA,HIGH);
  digitalWrite(ENB,HIGH);
  La=analogRead(A0);
  Ra=analogRead(A1);
  Rb=analogRead(A2);
  Lb=analogRead(A3);
  /*Serial.print(Lb);
  Serial.print(";");
  Serial.print(La);
  Serial.print(";");
  Serial.print(Ra);
  Serial.print(";");
  Serial.println(Rb);
  delay(300);*/
  if(La<=300 && Ra<=320)//均未检测到黑线
         straight();
  if(La>=Ra && Lb<=300 && Rb<=300)//左侧检测到黑线,右侧没有,所以要左转
         straightturnleft();
  if(La<=Ra && Lb<=300 && Rb<=300)//右侧检测到黑线,左侧没有,所以右转
         straightturnright();
  if(La>=300 && Ra>=300)//均检测到黑线
         straight();
  if(Rb>=300)//大右转
         turnright();
  if(Lb>=300)//大左转
         turnleft();        
}
void straight()
{
     
        analogWrite(IN1,0);//左正
        analogWrite(IN2,60);
        analogWrite(IN3,60);//右正
        analogWrite(IN4,0);
}

void straightturnleft()
{
     
        analogWrite(IN1,0);//左正
        analogWrite(IN2,60);
        analogWrite(IN3,100);//右正
        analogWrite(IN4,0);
}
void straightturnright()
{
     
        analogWrite(IN1,0);//左正
        analogWrite(IN2,100);
        analogWrite(IN3,60);//右正
        analogWrite(IN4,0);
}
void turnright()
{
     
        analogWrite(IN1,0);//左正
        analogWrite(IN2,150);
        analogWrite(IN3,60);//右正
        analogWrite(IN4,0);
}
void turnleft()
{
     
        analogWrite(IN1,0);//左正
        analogWrite(IN2,60);
        analogWrite(IN3,150);//右正
        analogWrite(IN4,0);
}

五,一些说明

该代码块中数字300和320是我测得的一个相对可以准确区分是否检测到黑线的值,不一定非常准确,感兴趣的同学也可以使用串口监视器自己测。
将代码中注释掉的那几行重新启用就可进行串口监视了,导入程序后点击右上角的小放大镜查看串口。(Serial打头的那几行)

  if(La<=300 && Ra<=320)//均未检测到黑线
         straight();
  if(La>=Ra && Lb<=300 && Rb<=300)//左侧检测到黑线,右侧没有,所以要左转
         straightturnleft();
  if(La<=Ra && Lb<=300 && Rb<=300)//右侧检测到黑线,左侧没有,所以右转
         straightturnright();
  if(La>=300 && Ra>=300)//均检测到黑线
         straight();
  if(Rb>=300)//大右转
         turnright();
  if(Lb>=300)//大左转
         turnleft();       

这是用arduino做的第一个项目,不出意外的话,也应该是最后一个。最近在学python,也希望各位不忘初心,继续加油。忙于学业,更新随缘。最后arduino在行业中算是较为低端的一种语言,在高中生中比较流行,大家稍作了解即可,不用对此特别深入。用来参加比赛是个不错的选择,但尽量不要在arduino上花费太多的时间。

你可能感兴趣的:(经验分享,arduino,传感器)