课设报告基于Arduino单片机的实物设计Word格式文档下载.docx
《课设报告基于Arduino单片机的实物设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《课设报告基于Arduino单片机的实物设计Word格式文档下载.docx(21页珍藏版)》请在冰点文库上搜索。
6.L298N电机驱动板1个;
7.ARDUINOUNO328控制板1个;
8.ARDUINO传感器扩展板1个;
9.云台1个;
10.舵机1个;
11.超声波模块1个;
12.三组寻线模块;
13.红外接收传感器;
14.单片机遥控器;
15.2000MA18650充电电池2节;
16.18650电池盒一个;
17.18650充电器一个。
3.2硬件设计说明
结合实际、根据需要,将系统分为四个模块,即电机驱动模块,循迹模块,避碰模块,红外模块,分开做,自后将其综合起来。
3.3电机驱动模块
3.3.1L298N说明
L298N是一个驱动模块,就是单片机的驱动电流太小无法驱动电动机,因此L298N其起到一个放大器作用。
通过控制L298NI1I2I3I4接口,控制电机的正转,反转,转弯和停顿。
3.3.2L298N连接图
如以下图所示:
3.4循迹模块
3.4.1寻线功能
使小车沿着黑线走,根据黑线的位置选着行走的状态。
3.4.2寻线传感器与实验连接图
TCRT5000红外对管的工作原理是利用红外线对颜色的反射率不一样,将反射信号的强弱转化成电流信号。
黑白寻迹模块在检测到黑色高电平有效,检测到白色是为低电平有效,检测高度为0—3cm。
使用方法
1.传感器接口有3根排针,分别是GND,VCC,OUT。
VCC和GND为供电端,OUT是信号输出端。
2.检测到物体,信号端输出低电平;
未检测到物体,信号端输出高电平。
3.主要判断信号输出端是0或者1,就能判断物体是否存在。
性能参数:
1:
检测距离,检测白纸时约为2厘米。
视颜色的不同距离有所不同,白色最远。
2.供电电压:
2.5V~12V,不要超过12V。
(注意:
最好用低电压供电,供电电压太高传感器的寿命会变短。
5V供电为佳。
)3.工作电流,5V时18~20ma。
经大量测试,传感器硬件设置为18~20ma工作电流时性能最佳,主要表现在抗干扰能力上。
4.检测到物体,信号端输出低电平;
5.传感器输出TTL电平,能直接与3.3V或者5V单片机IO口相连。
黑线或者白线检测原理1.利用黑色对光线的反射率小这个特点,当平面的颜色不是黑色时,传感器发射出去的红外光被大局部反射回来。
于是传感器输出低电平0。
2.当平面有一黑线,传感器在黑线上方时,因黑色的反射能力很弱,反射回来的红外光很少,达不到传感器动作的水平,所以传感器还输出1。
3.我们只要用单片机判断传感器的输出端是0或者是1,就能检测黑线。
4.检测白线的原理和检测黑线的原理一样,检测白线时,白线周边的颜色也要比较接近黑色,然后调节红外传感器上面的可调电阻,将灵敏度调低,一直调到刚好周边的颜色检测不到为止,那样就能检测白线了。
连接参考图如下:
3.5避碰模块
3.5.1超声波模块
超声波智能避障实现方便、计算简单、易于做到实时控制,并且在测量精度方面能到达实用的要求,因此成为常用的避障方法。
3.5.2实验连接图
3.6红外模块
3.6.1红外模块说明
实验前须知:
1.先把IRremote函式库资料夹放进Arduinolibraries目录底下
2.开启IrReceive.pde测得自己的红外线遥控的码〔在SerialMonitor可显示IRcode〕,再将IRcode记录下来,然后到程式里面修改成自己的红外线码即可。
3.6.2实物图
四、模块软件设计
4.1循迹模块程序
intMotorRight1=8;
//IN1
intMotorRight2=9;
//IN2
intMotorLeft1=7;
//IN4
intMotorLeft2=6;
//IN3
intspeedpin=11;
//定义EA(PWM调速)
intspeedpin1=10;
//定义EB(PWM调速)接口
constintSensorLeft=5;
//左感測器輸入腳
constintSensorMiddle=4;
//中感測器輸入腳
constintSensorRight=3;
//右感測器輸入腳
intSL;
//左感測器狀態
intSM;
//中感測器狀態
intSR;
//右感測器狀態
voidadvance(inta)//前进
{digitalWrite(MotorRight1,LOW);
digitalWrite(MotorRight2,HIGH);
digitalWrite(MotorLeft1,LOW);
digitalWrite(MotorLeft2,HIGH);
delay(a*50);
}
voidleft(inti)//左转
digitalWrite(MotorLeft2,LOW);
delay(i*30);
voidright(intc)//右转
digitalWrite(MotorRight2,LOW);
delay(c*30);
voidstopp(intd)//停顿
{
digitalWrite(MotorRight1,LOW);
delay(d*10);
voidback(intg)//后退
{digitalWrite(MotorRight1,HIGH);
digitalWrite(MotorLeft1,HIGH);
delay(g*100);
voidre(intx)//右大转
delay(x*25);
voidle(inth)//左打转
delay(h*25);
voidsetup()
{Serial.begin(9600);
pinMode(MotorRight1,OUTPUT);
//腳位8(PWM)
pinMode(MotorRight2,OUTPUT);
//腳位9(PWM)
pinMode(MotorLeft1,OUTPUT);
//腳位7(PWM)
pinMode(MotorLeft2,OUTPUT);
//腳位6(PWM)
pinMode(speedpin,OUTPUT);
pinMode(speedpin1,OUTPUT);
pinMode(SensorLeft,INPUT);
//左感測器
pinMode(SensorMiddle,INPUT);
//中感測器
pinMode(SensorRight,INPUT);
//右感測器
}
voidloop()
SL=digitalRead(SensorLeft);
SM=digitalRead(SensorMiddle);
SR=digitalRead(SensorRight);
SL=digitalRead(SensorLeft);
if(SM==HIGH){
if(SR==LOW&
SL==HIGH)//向左
{left
(1);
stopp
(2);
}elseif(SL==LOW&
SR==HIGH)
{right
(1);
stopp
(2);
elseif(SL==HIGH&
SR==HIGH)
{if(count<
des-1)
{advance
(1);
stopp(50);
count=count+1;
if(count==des-1)
{le(12);
SM=digitalRead(SensorMiddle);
SR=digitalRead(SensorRight);
}elseif(count>
=des){digitalWrite(MotorRight1,LOW);
delay(50000);
}elseadvance
(2);
else//直進
}}
if(SM==LOW)
{if(SR==LOW&
SL==HIGH)
}elseif(SL==LOW&
SR==HIGH)
{right
(1);
if((SL==LOW&
SR==LOW&
SM==LOW))
{
le
(1);
}}}
4.2红外模块程序
longadvence=0x00FF629D;
longback=0x00FFA857;
longstopp=0x00FF02FD;
longleft=0x00FF22DD;
longright=0x00FFC23D;
IRrecvirrecv(RECV_PIN);
decode_resultsresults;
voiddump(decode_results
*results)
{intcount=
results->
rawlen;
if(results->
decode_type==UNKNOWN){Serial.println("
Couldnotdecodemessage"
);
else{if(results->
decod_type==NEC)Serial.print("
DecodedNEC:
"
}elseif(results->
decode_type==SONY){Serial.print("
DecodedSONY:
}elseif(results->
decode_type==RC5){Serial.print("
DecodedRC5:
decode_type==RC6){Serial.print("
DecodedRC6:
Serial.print(results->
value,HEX)Serial.print("
("
Serial.print(resuls->
bits,DEC);
Serial.println("
bits)"
}Serial.print("
Raw("
Serial.print(count,DEC);
Serial.print("
):
for(inti=0;
i<
count;
i++){if((i%2)==1)Serial.print(results->
rawbuf[i]*USECPERTICK,DEC);
}else{Serial.print(-(int)results->
rawbuf[i]*USECPERTICK,DEC);
}Serial.print("
}Serial.println("
"
{Serial.begin(9600);
irrecv.enableIRIn();
//Startthereceiver
}inton=0;
unsignedlonglast=millis();
void(loop)
{i(irrecv.decode(&
results))}
if(millis()-last>
250){on=!
on;
digitalWrite(13,on?
HIGH:
LOW);
dump(&
result)
if(results.value==?
){}
}}
4.3避碰模块程序
主程序
{myservo.write(90);
//测量
detection();
//测量角度
if(directionn==2)//假设directionn(方向)=2(倒車)
{back(5);
//倒退
stopp();
//停顿
while
(1);
}if(directionn==8)
{advance
(2);
}}
五、综合设计与调试
5.1流程图
红外信号
障碍物
路径1
路径2
终点
开场
5.2软件设计
#include<
IRremote.h>
#include<
Servo.h>
intRECV_PIN=12;
intMotorRight1=8;
constintSensorLeft=2;
constintSensorRight=5;
intSM;
intinputPin=A0;
intoutputPin=A1;
intFspeedd=0;
intdirectionn=0;
Servomyservo;
intdelay_time=250;
intFgo=8;
intBgo=2;
intcount=0;
intdes=0;
intf=0;
//******红外控制局部********
longb=0x00FFA857;
longs=0x00FF02FD;
longl=0x00FF22DD;
longr=0x00FFC23D;
voiddump(decode_results*results)
{intcount=results->
decode_type==UNKNOWN)
{Serial.println("
else{if(results->
decode_type==NEC){Serial.print("
decode_type==SONY)
{Serial.print("
}elseifresults->
decode_type==RC5)
{Serial.print("
}elseif(results->
decode_type==RC6){
Serial.print("
}Serial.print(results->
value,HEX);
Serial.print(results->
Serial.println("
bits)"
Raw("
for(inti=0;
i++)
{if((i%2)==1)
{Serial.print(results->
else{Serial.print(-(int)results->
inton=0;
pinMode(SensorMiddle,INPUT);
pinMode(speedpin1,OUTPUT);
Serial.begin(9600);
pinMode(inputPin,INPUT);
pinMode(outputPin,OUTPUT);
myservo.attach(3);
voiddetection()
{intdelay_time=250;
ask_pin_F();
if(Fspeedd<
3)
{directionn=Bgo;
else{directionn=Fgo;
voidask_pin_F()
{myservo.write(90);
digitalWrite(outputPin,LOW);
delayMicroseconds
(2);
digitalWrite(outputPin,HIGH);
delayMicroseconds(10);
floatFdistance=pulseIn(inputPin,HIGH);
Fdistance=distance/5.8/10;
Fspeedd=Fdistance;
voidadvance(inta)
{digitalWrite(MotorRight1,LOW);
digitalWrite(MotorRight2,HIGH);
digitalWrite(MotorLeft1,LOW);
digitalWrite(MotorLeft2,HIGH);
delay(a*50);
voidleft(inti)
digitalWrite(MotorLeft2,LOW);
}voidright(intc)
digitalWrite(MotorRight2,LOW);
voidstopp(intd)
}voidback(intg)
{digitalWrite(MotorR