arduino的智能小车的功能:巡线功能
材料清单:
上文提到的小车一台;
光电对管两个(也可以多个);
杜邦线若干;
我们设定的是当光电对管检测到黑线的时候做出动作。
当左侧传感器检测到黑线时,小车左转;当右侧传感器检测到黑线时,小车右转;当两个传感器都检测到黑线时,小车停止。
#include <Servo.h>
int mL1=6;//左1
int mL2=5;
int mR1=11;//右1
int mR2=3;
int trac1 = 12; //从车头方向的最右边开始排序
int trac2 = 13;
Servo s; //舵机
void setup() {
Serial.begin(9600);
s.attach(9);//舵机信号线
s.write(68);//舵机初始化角度
pinMode(mL1,OUTPUT);
pinMode(mL2,OUTPUT);
pinMode(mR1,OUTPUT);
pinMode(mR2,OUTPUT);
pinMode(trac1, INPUT);
pinMode(trac2, INPUT);
}
void loop() {
tracing();
}
void motorRun(int cmd)
{
switch(cmd){
case FORWARD:
Serial.println("FORWARD"); //输出状态
analogWrite(mL1,30);
analogWrite(mL2,LOW);
analogWrite(mR1,30);
analogWrite(mR2,LOW);
break;
case BACKWARD:
Serial.println("BACKWARD"); //输出状态
analogWrite(mL1,0);
analogWrite(mL2,40);
digitalWrite(mR1,LOW);
analogWrite(mR2,40);
break;
case TURNLEFT:
Serial.println("TURNLEFT"); //输出状态
analogWrite(mL1,0);
analogWrite(mL2,0);
analogWrite(mR1,60);
analogWrite(mR2,0);
break;
case TURNRIGHT:
Serial.println("TURNRIGHT"); //输出状态
analogWrite(mL1,50);
analogWrite(mL2,0);
analogWrite(mR1,0);
analogWrite(mR2,0);
break;
default:
Serial.println("STOP"); //输出状态
digitalWrite(mR1,LOW);
digitalWrite(mL1,LOW);
digitalWrite(mR2,LOW);
digitalWrite(mL2,LOW);
}
}
void tracing()
{
int data[4];
data[2] = digitalRead(12);
data[3] = digitalRead(13);
if(!data[2] && !data[3]) //左右都没有检测到黑线
{
motorRun(FORWARD);
}
if(data[2]) //左边检测到黑线
{
motorRun(TURNLEFT);
}
if(data[3]) //右边检测到黑线
{
motorRun(TURNRIGHT);
}
if(data[2] && data[3]) //左右都检测到黑线是停止
{
motorRun(STOP);
while(1);
}
}
除此之外,我们还可以使用多个光电对管来进行检测,以此来减少车子的搬动幅度。
ccd巡线也是一个不错的选择。