arduino nano一个(Uno太大,所以选择了体积较小的Nano)
L298N电机驱动模块一个
直流减速电机两个
万向轮一个
亚克力板
轮胎两个
TCRT5000寻迹传感器四个
(速成可直接跳到三,连线部分)
(1)arduino nano
下面看一张Nano的图,比较生涩难懂,没关系,我也没搞懂。在本项目中只需要大家知道GDN(Ground)是接地的,3v3和5v是输出电压的(给Nano板通电及能用)。图中曲线的引脚(D3,D5,D6,D9,D10,D11)可进行PWM输出。(通俗的讲:这几个引脚可以输出低电压到高电压中间的任何一个值,而其他的引脚要么输出高电压,要么输出低电压)
(2)L298N电机驱动模块
具体长这样(图来自tb)注意红色圈出的地方:写有ENA,IN1,IN2,IN3,IN4,ENB。ENA相当于EN1,EN2的总开关,ENB对应IN3,IN4的总开关。例:让ENA为高电平,IN1,IN2脚位给什么信号就是什么信号,若ENA为低电平,IN1,IN2无论给什么信号这两个脚位都是低电平。(注:仅是可以这样理解,ENA和ENB有它专门的名字叫使能)
(3)直流减速电机,万向轮,亚克力板
我用的是这样的(图来自tb),当然也还有很多直流电机供大家选择,图示应该是最便宜的了。
(4)TCRT5000寻迹传感器
注意到图中有四个引脚,该项目中要用到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开发板就选择另外两个试试。
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上花费太多的时间。