前言:长期以来一直把arduino看为一款比较弱智简单的单片机,好像事实也是如此,小学生基本不会去学51单片机,但是却在学习arduino单片机,因为相当于傻瓜编程,网上程序一扎一大堆,甚至小学生比有的大学生玩的还溜
arduino使用的是专用的编译器arduino IDE,注意使用时下程序前需要选择芯片型号和串口号,此软件自带串口监视器,也就是串口助手,入口在编辑界面的右上角,使用的是C++作为编程语言,有C语言的功底完全可以胜任
循迹小车是单片机项目中,中低级的一个项目,也是一种很好的练手项目,除了需要电机驱动、电池供电、核心板电路板,最重要的是传感器的方案,在本文中,主要介绍传感器的电路和编程,对电机电路,降压电路等等不予介绍
传感器是小车的眼睛,循线的方式有很多种,其中有电磁循线,单条黑胶带循线,双黑胶带循线等等,具体的其他等等可以参考飞思卡尔智能车竞赛,最简单也是成本最低的是使用单条黑胶带循线,使用的传感器是红外黑白传感器,某宝一搜就能见到,传感器模块前有两个二极灯珠,一个是发送端,一个是接收端,后面有滑动变阻器可以调节检测距离,当下面照着的是白色是高电平,当下面是黑色是高电平,不同模块电平可能是反着的,一个能循线的小车最少需要装两个传感器才能识别并且循线
下面就是程序如何编写了,看你是几驱的电机然后写什么样的程序,但是写程序前都要想好思路,程序如何运行,我们写的程序就是告诉小车,传感器检测到什么样的信号时你要对应做出什么动作。比如一种策略(两个传感器),写程序前首先描述出这种策略,有几种运行状况:1.两边都是白色,直行 2.左黑右白,左行 3.左白右黑,右行 4.左检测到黑,右检测到黑之前,一直左拐直到右检测到黑 5.反方向全都对应反过来,使用标志位来记录运行状态
下面列一下三个传感器的程序:
sensorS=digitalRead(sensorP);
if ((digitalRead(tracker_sensor_right) == 0)&& (digitalRead(tracker_sensor_left) == 0)&& (digitalRead(tracker_sensor_straight) == 1) && flag1 ==0 && flag2==0) {moveForward() ; a=1;}
if ((digitalRead(tracker_sensor_right) == 1)&& (digitalRead(tracker_sensor_left) == 0) && flag1 ==0 && flag2==0) {moveRight();a=2;}
if ((digitalRead(tracker_sensor_right) == 0)&& (digitalRead(tracker_sensor_left) == 1) && flag1 ==0 && flag2==0) { moveLeft(); a=3;}
if ((digitalRead(tracker_sensor_right) == 0)&& (digitalRead(tracker_sensor_left) == 0)&& (digitalRead(tracker_sensor_straight) == 0) && flag1 ==0 && flag2==0)
{
if(a==1)moveForward() ;
if(a==2)moveRight() ;
if(a==3)moveLeft() ;
}
if (digitalRead(tracker_sensor_right) == 1&& digitalRead(tracker_sensor_left) == 1&& digitalRead(tracker_sensor_straight) == 1) { flag1 = 1;} //装货
if (sensorS==LOW) { delay(500);flag1 = 0; } //装货结束
if(flag1==1 || flag2 ==1) {delay(5); moveStop();}//过了线再停车
if (sensorS==LOW) { flag1 = 0; } //装货结束
if (digitalRead(tracker_sensor_rightside) == 1 && digitalRead(tracker_sensor_leftside) == 0)
{
flag2 = 1;
myservo.write(55);
delay(1000);
myservo.write(150);
delay(2000);
myservo.write(55);
flag2 = 0;
}