亚博 Arduino智能小车实践报告
一. 程序安装准备
首先安装了Arduino板载USB转串口CH340驱动安装包,然后安装了Arduino开发软件arduino-1.0.5-windows。为小车的制作在软件上做好了准备。其中要注意端口号的一一对应。
二. 小车硬件安装
根据小车安装视频教程依次完成了电机固定,电池盒固定,上电测试和电池使用说明,万向轮与拓展面包板固定,开发板与小车底板的固定,舵机云台的安装。后面还有液晶屏的安装以及红外探头的安装,完成上述工作小车的雏形已经完成,十分美观可爱。
三. 软件编程与试运行
黑白线识别模块调试
由W3(W4)电位器,L2(L3)信号指示灯左光电传感器组成。 L2(L3)信号灯没有接接收到红外信号时会不亮(输出高电平1),当 接到到红外反馈信号后,指示灯亮起(输出低电平0)。
避障模块调试
由W1(W2)电位器,L4(L5)信号指示灯左(右)光电传感器组成。 当L4信号灯没有接收到红外信号时不亮(输出高电平1),当接到红 外反馈信号后,指示灯亮起(输出低电平0)。
电机模块调试:
测试条件,把EN1/EN2接到5V 正电源上。 IN1接到VCC(正5V 电源)(右电机反转信号线,高电平有效) IN2接到VCC(正5V 电源)(右电机正转信号线,高电平有效) EN1接到VCC(正5V 电源)(电机使能信号,高电平有效) EN2接到VCC(正5V 电源)(电机使能信号,高电平有效) IN3接到VCC(正5V 电源)(左电机正转信号线,高电平有效) IN4接到VCC(正5V 电源)(左电机反转信号线,高电平有效)
2.智能小车电路图和L293D内部等效图(双H桥路简单讲解)
对小车电路图和L293D内部等效图进行了一些简单的学习。
3.智能小车前进实验
智能小车前进实验
int Left_motor_back=8; //左电机后退(IN1)
int Left_motor_go=9; //左电机前进(IN2)
int Right_motor_go=10; // 右电机前进(IN3)
int Right_motor_back=11; // 右电机后退(IN4)
void setup()
{
//初始化电机驱动IO为输出方式
pinMode(Left_motor_go,OUTPUT); // PIN 8 (PWM)
pinMode(Left_motor_back,OUTPUT); // PIN 9 (PWM)
pinMode(Right_motor_go,OUTPUT);// PIN 10 (PWM)
pinMode(Right_motor_back,OUTPUT);// PIN 11 (PWM)
}
void run(int time) // 前进
{
digitalWrite(Right_motor_go,HIGH); // 右电机前进
digitalWrite(Right_motor_back,LOW);
analogWrite(Right_motor_go,200);//PWM比例0~255调速,左右轮差异略增减
analogWrite(Right_motor_back,0);
digitalWrite(Left_motor_go,HIGH); // 左电机前进
digitalWrite(Left_motor_back,LOW);
analogWrite(Left_motor_go,200);//PWM比例0~255调速,左右轮差异略增减
analogWrite(Left_motor_back,0);
delay(time * 100); //执行时间,可以调整
}
void loop()
{
delay(500);
run(10); //前进
}
小车直行这个实验特别简单只需读懂一些简单的代码即可,注意调节转速,以免损坏小车,一定注意在烧录例程的过程中一定要主要断开vcc。
4.智能小车前后左右综合实验
void left(int time) //左转(左轮不动,右轮前进)
{
digitalWrite(Right_motor_go,HIGH); // 右电机前进
digitalWrite(Right_motor_back,LOW);
analogWrite(Right_motor_go,200);
analogWrite(Right_motor_back,0);//PWM比例0~255调速
digitalWrite(Left_motor_go,LOW); //左轮不动
digitalWrite(Left_motor_back,LOW);
analogWrite(Left_motor_go,0);
analogWrite(Left_motor_back,0);//PWM比例0~255调速
delay(time * 100); //执行时间,可以调整
}
void spin_left(int time) //左转(左轮后退,右轮前进)
{
digitalWrite(Right_motor_go,HIGH); // 右电机前进
digitalWrite(Right_motor_back,LOW);
analogWrite(Right_motor_go,200);
analogWrite(Right_motor_back,0);//PWM比例0~255调速
digitalWrite(Left_motor_go,LOW); //左轮后退
digitalWrite(Left_motor_back,HIGH);
analogWrite(Left_motor_go,0);
analogWrite(Left_motor_back,200);//PWM比例0~255调速
delay(time * 100); //执行时间,可以调整
}
void right(int time) //右转(右轮不动,左轮前进)
{
digitalWrite(Right_motor_go,LOW); //右电机不动
digitalWrite(Right_motor_back,LOW);
analogWrite(Right_motor_go,0);
analogWrite(Right_motor_back,0);//PWM比例0~255调速
digitalWrite(Left_motor_go,HIGH);//左电机前进
digitalWrite(Left_motor_back,LOW);
analogWrite(Left_motor_go,200);
analogWrite(Left_motor_back,0);//PWM比例0~255调速
delay(time * 100); //执行时间,可以调整
}
void spin_right(int time) //右转(右轮后退,左轮前进)
{
digitalWrite(Right_motor_go,LOW); //右电机后退
digitalWrite(Right_motor_back,HIGH);
analogWrite(Right_motor_go,0);
analogWrite(Right_motor_back,200);//PWM比例0~255调速
digitalWrite(Left_motor_go,HIGH);//左电机前进
digitalWrite(Left_motor_back,LOW);
analogWrite(Left_motor_go,200);
analogWrite(Left_motor_back,0);//PWM比例0~255调速
delay(time * 100); //执行时间,可以调整
}
void back(int time) //后退
{
digitalWrite(Right_motor_go,LOW); //右轮后退
digitalWrite(Right_motor_back,HIGH);
analogWrite(Right_motor_go,0);
analogWrite(Right_motor_back,150);//PWM比例0~255调速
digitalWrite(Left_motor_go,LOW); //左轮后退
digitalWrite(Left_motor_back,HIGH);
analogWrite(Left_motor_go,0);
analogWrite(Left_motor_back,150);//PWM比例0~255调速
delay(time * 100); //执行时间,可以调整
}
增加了向左转和向右转,向左转主要是控制左轮不动,邮轮前进,而向右转则是右轮不动左轮前进,后退则是给两个轮子后退高电平,注意不能同时给前进和后退高电平,这样会烧坏电机,同样烧录例程时要断开vcc,以免小车乱跑影响实验。
5.智能小车指定花式动作
void spin_left(int time) //左转(左轮后退,右轮前进)
{
digitalWrite(Right_motor_go,HIGH); // 右电机前进
digitalWrite(Right_motor_back,LOW);
analogWrite(Right_motor_go,200);
analogWrite(Right_motor_back,0);//PWM比例0~255调速
digitalWrite(Left_motor_go,LOW); //左轮后退
digitalWrite(Left_motor_back,HIGH);
analogWrite(Left_motor_go,0);
analogWrite(Left_motor_back,200);//PWM比例0~255调速
delay(time * 100); //执行时间,可以调整
}
void spin_right(int time) //右转(右轮后退,左轮前进)
{
digitalWrite(Right_motor_go,LOW); //右电机后退
digitalWrite(Right_motor_back,HIGH);
analogWrite(Right_motor_go,0);
analogWrite(Right_motor_back,200);//PWM比例0~255调速
digitalWrite(Left_motor_go,HIGH);//左电机前进
digitalWrite(Left_motor_back,LOW);
analogWrite(Left_motor_go,200);
analogWrite(Left_motor_back,0);//PWM比例0~255调速
delay(time * 100); //执行时间,可以调整
}
主要是加了一些花式玩法,比如原地左转或原地右转,再加上左转右转的一些组合,完成了一套花式动作。切记烧录例程时应断开vcc。
6.智能小车按键启动和蜂鸣器报警
主要是对小车进行蜂鸣器和启动键的安装
安装开关是为了在烧录过程中及时不断开vcc,小车也不会乱跑,以后每次烧录都不必断开vcc。
int key=7;//定义按键 数字12 接口
int beep=12;//定义蜂鸣器 数字7 接口
void keysacn()
{
int val;
val=digitalRead(key);//读取数字7 口电平值赋给val
while(!digitalRead(key))//当按键没被按下时,一直循环
{
val=digitalRead(key);//此句可省略,可让循环跑空
}
while(digitalRead(key))//当按键被按下时
{
delay(10); //延时10ms
val=digitalRead(key);//读取数字7 口电平值赋给val
if(val==HIGH) //第二次判断按键是否被按下
{
digitalWrite(beep,HIGH); //蜂鸣器响
while(!digitalRead(key)) //判断按键是否被松开
digitalWrite(beep,LOW); //蜂鸣器停止
}
else
digitalWrite(beep,LOW);//蜂鸣器停止
}
}
7.智能小车黑线循迹实验
利用小车下端两个探头对光的不同反应来确定小车行驶路线,主要是当探测到白时小车行驶电机转动,当左侧压到黑线及探测到黑时小车向左行驶,当右侧探头探测到黑时则向行驶,只需在之前的程序上加一个判定的过程,十分简单
const int SensorRight = 3; //右循迹红外传感器(P3.2 OUT1)
const int SensorLeft = 4; //左循迹红外传感器(P3.3 OUT2)
SR = digitalRead(SensorRight);//有信号表明在白色区域,车子底板上L3亮;没信号表明压在黑线上,车子底板上L3灭
SL = digitalRead(SensorLeft);//有信号表明在白色区域,车子底板上L2亮;没信号表明压在黑线上,车子底板上L2灭
if (SL == LOW&&SR==LOW)
run(); //调用前进函数
else if (SL == HIGH & SR == LOW)// 左循迹红外传感器,检测到信号,车子向右偏离轨道,向左转
left();
else if (SR == HIGH & SL == LOW) // 右循迹红外传感器,检测到信号,车子向左偏离轨道,向右转
right();
else // 都是白色, 停止
brake();
8.智能小车红外避障实验1&2&3(基础避障)
与黑线实验类似,只是将判定写到了红外探头中,当红外探头探测到障碍时小车停止或者转向或者跟随障碍物行驶指向哪里走到哪里。
遇到障碍物后退
SR_2 = digitalRead(SensorRight_2);
SL_2 = digitalRead(SensorLeft_2);
if (SL_2 == HIGH&&SR_2==HIGH)
run(); //调用前进函数
else if (SL_2 == HIGH & SR_2 == LOW)// 右边探测到有障碍物,有信号返回,向左转
left();
else if (SR_2 == HIGH & SL_2 == LOW) //左边探测到有障碍物,有信号返回,向右转
right();
else // 都是有障碍物, 后退
back(3);
遇到障碍物跟随
SR_2 = digitalRead(SensorRight_2);
SL_2 = digitalRead(SensorLeft_2);
if (SL_2 == LOW&&SR_2==LOW)
run(); //调用前进函数
else if (SL_2 == HIGH & SR_2 == LOW)// 右边探测到有障碍物,有信号返回,向右转
right();
else if (SR_2 == HIGH & SL_2 == LOW) //左边探测到有障碍物,有信号返回,向左转
left();
else // 没有障碍物,停
brake();
遇到障碍物转向
SR_2 = digitalRead(SensorRight_2);
SL_2 = digitalRead(SensorLeft_2);
if (SL_2 == HIGH&&SR_2==HIGH)
run(); //调用前进函数
else if (SL_2 == HIGH & SR_2 == LOW)// 右边探测到有障碍物,有信号返回,向左转
left();
else if (SR_2 == HIGH & SL_2 == LOW) //左边探测到有障碍物,有信号返回,向右转
right();
else // 都是有障碍物, 后退
{
back(4.5);//后退
spin_right(4.5);//有旋转,调整方向
9.智能小车超声波测距实验
给小车安装液晶板与声波探头,对距离进行测量
void Distance_test() // 量出前方距离
{
digitalWrite(Trig, LOW); // 给触发脚低电平2μs
delayMicroseconds(2);
digitalWrite(Trig, HIGH); // 给触发脚高电平10μs,这里至少是10μs
delayMicroseconds(10);
digitalWrite(Trig, LOW); // 持续给触发脚低电
float Fdistance = pulseIn(Echo, HIGH); // 读取高电平时间(单位:微秒)
Fdistance= Fdistance/58; //为什么除以58等于厘米, Y米=(X秒*344)/2
// X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
Serial.print("Distance:"); //输出距离(单位:厘米)
Serial.println(Fdistance); //显示距离
Distance = Fdistance;
}
10.智能小车超声波避障实验(无舵机)
这里只是比之前多了一个转向遇到障碍物可以转向躲避,并测出距离
Distance_test();//测量前方距离
Distance_display();//液晶屏显示距离
if(Distance < 60)//数值为碰到障碍物的距离,可以按实际情况设置
while(Distance < 60)//再次判断是否有障碍物,若有则转动方向后,继续判断
{
right(1);//右转
brake(1);//停车
Distance_test();//测量前方距离
Distance_display();//液晶屏显示距离
}
else
run();//无障碍物,直行
11.智能小车超声波避障实验(有舵机)
在无舵机的试验中往往遇到小车被卡住,那是因为声波探头探测范围小而小车体积很大,所以探测有盲区,加上一个舵机之后,小车行驶前会转动舵机对左右两边的距离进行测量,若左右两边都为安全距离,则小车直行,若左边探测非安全距离而右侧在安全距离,比对后转向右侧,反之同理。这里还对舵机的转速进行了定义,并且注意小车速度,防止损坏舵机,超声波探头以及液晶显示屏。
while(1)
{
front_detection();//测量前方距离
if(Front_Distance < 32)//当遇到障碍物时
{
back(2);//后退减速
brake(2);//停下来做测距
left_detection();//测量左边距障碍物距离
Distance_display(Left_Distance);//液晶屏显示距离
right_detection();//测量右边距障碍物距离
Distance_display(Right_Distance);//液晶屏显示距离
if((Left_Distance < 35 ) &&( Right_Distance < 35 ))//当左右两侧均有障碍物靠得比较近
spin_left(0.7);//旋转掉头
else if(Left_Distance > Right_Distance)//左边比右边空旷
{
left(3);//左转
brake(1);//刹车,稳定方向
}
else//右边比左边空旷
{
right(3);//右转
brake(1);//刹车,稳定方向
}
}
else
{
run(); //无障碍物,直行
12.智能小车红外遥控实验
给小车安装红外探头,并给遥控器定义,即可完成控制过程
long run_car = 0x00FF18E7;//按键2
long back_car = 0x00FF4AB5;//按键8
long left_car = 0x00FF10EF;//按键4
long right_car = 0x00FF5AA5;//按键6
long stop_car = 0x00FF38C7;//按键5
long left_turn = 0x00ff30CF;//按键1
long right_turn = 0x00FF7A85;//按键3
if (millis() - last > 250) //确定接收到信号
{
on = !on;//标志位置反
digitalWrite(13, on ? HIGH : LOW);//板子上接收到信号闪烁一下led
dump(&results);//解码红外信号
}
if (results.value == run_car )//按键2
run();//前进
if (results.value == back_car )//按键8
back();//后退
if (results.value == left_car )//按键4
left();//左转
if (results.value == right_car )//按键6
right();//右转
if (results.value == stop_car )//按键5
brake();//停车
if (results.value == left_turn )//按键1
spin_left();//左旋转
if (results.value == right_turn )//按键3
spin_right();//右旋转
last = millis();
irrecv.resume(); // Receive the next value
13.智能小车黑线循迹&超声波避障综合实验
是对黑线实验和超声波实验的一个综合,具体可参照上文
四. 心得与不足
这次实验是一人完成,过程比较艰辛,主要是在安装液晶板时出现了问题,经历了两三个小时对液晶板反复的安装,最终克服困难,线路繁琐,工具不够是主要困难,对编程有了新的认识
五. 总结
这次完成智能小车是一个有趣的事,本以为自己根本无法完成,因为自己基础很差,但是经过努力,经过自学最总完成小车,并且第一个完成,什么事没有不可能的,只要努力,这次的实验我学到了很多,不仅仅是在知识上,最后附上小车帅照一张。
原文:http://www.cnblogs.com/wuxiyao/p/4923721.html