课设报告基于Arduino单片机的实物设计_第1页
课设报告基于Arduino单片机的实物设计_第2页
课设报告基于Arduino单片机的实物设计_第3页
课设报告基于Arduino单片机的实物设计_第4页
课设报告基于Arduino单片机的实物设计_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于Arduino单片机的实物设计 题目: 基于Arduino的智能小车(乌龟)设计姓名: 学院: 专业: 班级: 学号: 指导教师: 设计时间: 目录一 、任务设计及要求3二、 Arduino42.1 Arduino简介42.2参数说明4三、 硬件设计43.1所需硬件清单43.2硬件设计说明53.3电机驱动模块53.3.1 L298N说明53.3.2 L298N连接图53.4循迹模块53.4.1寻线功能53.4.2寻线传感器与实验连接图53.5避碰模块73.5.1 超声波模块73.5.2 实验连接图73.6红外模块83.6.1红外模块说明83.6.2实物图8四、模块软件设计84.1循迹模块程

2、序84.2 红外模块程序104.3避碰模块程序11五、综合设计与调试115.1流程图115.2软件设计12六、总结146.1遇到问题及解决办法141、 硬件问题142、 软件问题156.2个人感悟15一 、任务设计及要求 利用Arduino设计智能小车(乌龟)其功能: 1、实现循迹(利用TCRT5000 红外对管); 2、避碰功能(利用超声波); 3、红外遥控功能; 4、综合以上功能实现自动循迹、避障、红外控制的智能小车; 二、 Arduino 2.1 Arduino简介ARDUINO 智能小乌龟是一款单片机学习应用开发系统,以 arduino 单片机系列 atmega-328为核心.完成寻线

3、,避障,红外遥控和蓝牙遥控的功能,.套件包含了大量的趣味程序,并可扩展外置的电路模块,从而增加小车的使用功能.旨在让使用者在学习 ARDUINO 单片机时能脱离枯燥的理论知识,在玩乐中获取单片机系统开发的能力。 2.2参数说明 1.电机参数:电压范围:1.5-12V,电机轴长10mm,转速 100rpm/min. 2.控制电机选用L298N驱动模块,与单片机真正隔离. 3.三组寻线模块,检测黑白线,精度更高,也可用与防跌落控制. 4.红外遥控通信模块,组成智能小车遥控系统. 5.超声波模块,小车避障系统. 5.蓝牙无线模块,可以和手机蓝牙配对遥控机器人. 6.可接入外部712V的电压。并能搭载

4、多款传感器模块,根据您的想象力实现各种功能.三、 硬件设计3.1所需硬件清单1. 金属减速电机 2 个;2.优质轮胎 2 个;3.电机固定件 2 个;4 、牛眼万向轮;5.机器人底盘 2 片;6.L298N 电机驱动板 1 个;7.ARDUINO UNO328 控制板 1 个;8.ARDUINO 传感器扩展板 1 个;9.云台 1 个;10.舵机 1 个;11.超声波模块 1 个;12.三组寻线模块;13.红外接收传感器;14.单片机遥控器;15.2000MA 18650 充电电池 2 节;16.18650 电池盒一个;17.18650 充电器一个。3.2硬件设计说明 结合实际、根据需要,将系

5、统分为四个模块,即电机驱动模块,循迹模块,避碰模块,红外模块,分开做,自后将其综合起来。3.3电机驱动模块 3.3.1 L298N说明 L298N是一个驱动模块,就是单片机的驱动电流太小无法驱动电动机,因此L298N其起到一个放大器作用。通过控制L298N I1 I2 I3 I4接口,控制电机的正转,反转,转弯和停止。 3.3.2 L298N连接图 如下图所示:3.4循迹模块 3.4.1寻线功能 使小车沿着黑线走,根据黑线的位置选着行走的状态。 3.4.2寻线传感器与实验连接图 TCRT5000红外对管的工作原理是利用红外线对颜色的反射率不一样,将 反射信号的强弱转化成电流信号。黑白寻迹模块在

6、检测到黑色高电平有效,检测到白色是为 低电平有效,检测高度为 03cm。使用方法1.传感器接口有3根排针,分别是GND ,VCC,OUT。VCC和GND为供电端,OUT是信 号输出端。 2.检测到物体,信号端输出低电平;未检测到物体,信号端输出高电平。 3.主要判断信号输出端是0或者1,就能判断物体是否存在。 性能参数: 1:检测距离,检测白纸时约为2厘米。视颜色的不同距离有所不同,白色最远。 2.供电电压:2.5V12V,不要超过12V。(注意:最好用低电压供电,供电电压太高传感器的寿命会变短。5V供电为佳。) 3.工作电流,5V时1820ma。经大量测试,传感器硬件设置为1820ma工作电

7、流时性能最 佳,主要表现在抗干扰能力上。4.检测到物体,信号端输出低电平;未检测到物体,信号端输出高电平。 5.传感器输出TTL电平,能直接与3.3V或者5V单片机IO口相连。 黑线或者白线检测原理 1.利用黑色对光线的反射率小这个特点,当平面的颜色不是黑色时,传感器发射出去的红 外光被大部分反射回来。于是传感器输出低电平0。 2.当平面有一黑线,传感器在黑线上方时,因黑色的反射能力很弱,反射回来的红外光很 少,达不到传感器动作的水平,所以传感器还输出1。 3.我们只要用单片机判断传感器的输出端是0或者是1,就能检测黑线。 4.检测白线的原理和检测黑线的原理一样,检测白线时,白线周边的颜色也要

8、比较接近黑 色,然后调节红外传感器上面的可调电阻,将灵敏度调低,一直调到刚好周边的颜色检测 不到为止,那样就能检测白线了。连接参考图如下:3.5避碰模块 3.5.1 超声波模块超声波智能避障实现方便、计算简单、易于做到实时控制,并且在测量精度方面能达到实用的要求,因此成为常用的避障方法。 3.5.2 实验连接图3.6红外模块 3.6.1红外模块说明实验前须知:1.先把 IRremote 函式库资料夹放进 Arduino libraries 目录底下2.开启 IrReceive.pde 测得自 己的红外线遥控的码(在 Serial Monitor 可显示 IRcode) , 再将IRcode 记

9、录下来, 然后到程式里面修改成自 己的红外线码即可。3.6.2实物图四、模块软件设计4.1循迹模块程序欢迎下载 int MotorRight1=8;/IN1int MotorRight2=9;/IN2int MotorLeft1=7;/IN4int MotorLeft2=6;/IN3int speedpin=11;/定义 EA(PWM 调速)int speedpin1=10;/定义 EB(PWM 调速)接口const int SensorLeft = 5; /左感測器輸入腳const int SensorMiddle= 4 ; /中感測器輸入腳const int SensorRight = 3

10、; /右感測器輸入腳int SL; /左感測器狀態int SM; /中感測器狀態int SR; /右感測器狀態void advance(int a) / 前进 digitalWrite(MotorRight1,LOW); digitalWrite(MotorRight2,HIGH); digitalWrite(MotorLeft1,LOW); digitalWrite(MotorLeft2,HIGH); delay(a*50); void left(int i) / 左转 digitalWrite(MotorRight1,LOW); digitalWrite(MotorRight2,HIGH)

11、; digitalWrite(MotorLeft1,LOW); digitalWrite(MotorLeft2,LOW); delay(i*30); void right(int c) / 右转 digitalWrite(MotorRight1,LOW); digitalWrite(MotorRight2,LOW); digitalWrite(MotorLeft1,LOW); digitalWrite(MotorLeft2,HIGH);delay(c*30); void stopp(int d) /停止 digitalWrite(MotorRight1,LOW); digitalWrite(M

12、otorRight2,LOW); digitalWrite(MotorLeft1,LOW); digitalWrite(MotorLeft2,LOW); delay(d * 10); void back(int g) /后退 digitalWrite(MotorRight1,HIGH); digitalWrite(MotorRight2,LOW); digitalWrite(MotorLeft1,HIGH); digitalWrite(MotorLeft2,LOW); delay(g * 100); void re(int x) /右大转 digitalWrite(MotorRight1,LO

13、W); digitalWrite(MotorRight2,HIGH); digitalWrite(MotorLeft1,HIGH); digitalWrite(MotorLeft2,LOW); delay(x * 25); void le(int h) /左打转 digitalWrite(MotorRight1,HIGH); digitalWrite(MotorRight2,LOW); digitalWrite(MotorLeft1,LOW); digitalWrite(MotorLeft2,HIGH); delay(h * 25); void setup()Serial.begin(9600

14、); 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);/中感測器 pinMod

15、e(SensorRight, INPUT); /右感測器void loop() SL = digitalRead(SensorLeft); SM = digitalRead(SensorMiddle); SR = digitalRead(SensorRight); SL = digitalRead(SensorLeft); SM = digitalRead(SensorMiddle); SR = digitalRead(SensorRight);if (SM = HIGH) if (SR = LOW & SL = HIGH) / 向左 left(1); stopp(2); else i

16、f (SL = LOW & SR = HIGH) right(1);stopp(2); else if(SL = HIGH & SR = HIGH ) if(count<des-1) advance(1); stopp(50); count=count+1; if(count=des-1) le(12); SL = digitalRead(SensorLeft);SM = digitalRead(SensorMiddle);SR = digitalRead(SensorRight); else if(count>=des) digitalWrite(MotorRig

17、ht1,LOW); digitalWrite(MotorRight2,LOW); digitalWrite(MotorLeft1,LOW); digitalWrite(MotorLeft2,LOW); delay(50000); else advance(2) ; else / 直進 advance(1); if (SM=LOW) if(SR=LOW & SL=HIGH) left(1); stopp(2); else if(SL=LOW & SR=HIGH) right(1); stopp(2); if(SL = LOW & SR = LOW & SM=LOW

18、) le(1); 欢迎下载4.2 红外模块程序long advence = 0x00FF629D;long back = 0x00FFA857;long stopp = 0x00FF02FD;long left = 0x00FF22DD;long right = 0x00FFC23D;IRrecv irrecv(RECV_PIN);decode_results results;void dump(decode_results *results) int count = results->rawlen; if (results->decode_type = UNKNOWN)Seria

19、l.println("Could not decode message"); elseif(results->decod_type=NEC)Serial.print("Decoded NEC: "); else if (results->decode_type =SONY)Serial.print("Decoded SONY: "); else if (results->decode_type = RC5) Serial.print("Decoded RC5: "); else if (resul

20、ts->decode_type = RC6)Serial.print("Decoded RC6: ");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 (int i

21、= 0; i < count; i+) if (i % 2) =1)Serial.print(results->rawbufi*USECPERTICK,DEC); elseSerial.print(-(int)results->rawbufi*USECPERTICK, DEC); Serial.print(" "); Serial.println(""); void setup() Serial.begin(9600); irrecv.enableIRIn(); / Start the receiver int on = 0;unsig

22、ned long last = 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避碰模块程序主程序void loop() myservo.write(90); /测量 detection(); /测量角度 if(directionn = 2) /假如 directionn(方向) = 2(倒車) back(5);

23、/ 倒退 stopp(); /停止 while(1); if(directionn = 8) advance(2); 五、综合设计与调试5.1流程图 开始 红外信号 障碍物 路径1 路径2 终点 终点 开始5.2软件设计 #include <IRremote.h> #include <Servo.h>int RECV_PIN = 12;int MotorRight1=8;/IN1int MotorRight2=9;/IN2int MotorLeft1=7;/IN4int MotorLeft2=6;/IN3int speedpin=11;int speedpin1=10;

24、const int SensorLeft = 2; const int SensorMiddle= 4 ; const int SensorRight = 5; int SL; int SM; int SR; int inputPin = A0;int outputPin =A1;int Fspeedd = 0; int directionn = 0; Servo myservo; int delay_time = 250;int Fgo = 8; int Bgo = 2; int count=0;int des=0;int f=0;/*红外控制部分*long advence = 0x00FF

25、629D;long b = 0x00FFA857;long s = 0x00FF02FD;long l = 0x00FF22DD;long r = 0x00FFC23D;IRrecv irrecv(RECV_PIN);decode_results results;void dump(decode_results *results)int count = results->rawlen; if (results->decode_type = UNKNOWN) Serial.println("Could not decode message"); else if (

26、results->decode_type = NEC)Serial.print("Decoded NEC: "); else if (results->decode_type = SONY) Serial.print("Decoded SONY: "); else ifresults->decode_type = RC5) Serial.print("Decoded RC5: "); else if (results->decode_type = RC6) Serial.print("Decoded

27、RC6: ");Serial.print(results->value, HEX); Serial.print(" ("); Serial.print(results->bits, DEC);Serial.println(" bits)"); Serial.print("Raw ("); Serial.print(count, DEC); Serial.print("): "); for (int i = 0; i < count; i+) if (i % 2) = 1)Serial.p

28、rint(results->rawbufi*USECPERTICK, DEC); elseSerial.print(-(int)results->rawbufi*USECPERTICK, DEC); Serial.print(" "); Serial.println(""); int on = 0;unsigned long last = millis();void setup()Serial.begin(9600); pinMode(MotorRight1, OUTPUT); pinMode(MotorRight2, OUTPUT); pi

29、nMode(MotorLeft1, OUTPUT); pinMode(MotorLeft2, OUTPUT); pinMode(SensorLeft, INPUT); pinMode(SensorMiddle, INPUT); pinMode(SensorRight, INPUT); pinMode(speedpin,OUTPUT);pinMode(speedpin1,OUTPUT);Serial.begin(9600); irrecv.enableIRIn(); pinMode(inputPin, INPUT); pinMode(outputPin, OUTPUT); myservo.att

30、ach(3); void detection() int delay_time = 250; ask_pin_F(); if(Fspeedd <3 ) directionn =Bgo; else directionn = Fgo; void ask_pin_F() myservo.write(90); digitalWrite(outputPin, LOW); delayMicroseconds(2); digitalWrite(outputPin, HIGH); delayMicroseconds(10); digitalWrite(outputPin, LOW); float Fdi

31、stance = pulseIn(inputPin, HIGH); Fdistance= distance/5.8/10; Fspeedd = Fdistance; void advance(int a)digitalWrite(MotorRight1,LOW);digitalWrite(MotorRight2,HIGH);digitalWrite(MotorLeft1,LOW);digitalWrite(MotorLeft2,HIGH);delay(a*50); void left(int i) digitalWrite(MotorRight1,LOW); digitalWrite(Moto

32、rRight2,HIGH);digitalWrite(MotorLeft1,LOW);digitalWrite(MotorLeft2,LOW); delay(i*30); void right(int c) digitalWrite(MotorRight1,LOW);digitalWrite(MotorRight2,LOW);digitalWrite(MotorLeft1,LOW);digitalWrite(MotorLeft2,HIGH);delay(c*30); void stopp(int d)digitalWrite(MotorRight1,LOW);digitalWrite(Moto

33、rRight2,LOW);digitalWrite(MotorLeft1,LOW);digitalWrite(MotorLeft2,LOW); delay(d * 10); void back(int g) digitalWrite(MotorRight1,HIGH);digitalWrite(MotorRight2,LOW);digitalWrite(MotorLeft1,HIGH);digitalWrite(MotorLeft2,LOW); delay(g * 100); void re(int x) digitalWrite(MotorRight1,LOW); digitalWrite(

34、MotorRight2,HIGH);digitalWrite(MotorLeft1,HIGH);digitalWrite(MotorLeft2,LOW); delay(x * 25); void le(int h) digitalWrite(MotorRight1,HIGH);digitalWrite(MotorRight2,LOW);digitalWrite(MotorLeft1,LOW);digitalWrite(MotorLeft2,HIGH); delay(h * 25); void loop() analogWrite(speedpin,300);analogWrite(speedp

35、in1,300);if (irrecv.decode(&results) if (millis() - last > 250) on = !on;digitalWrite(13, on ? HIGH : LOW);dump(&results); if (results.value = advence )digitalWrite(MotorRight1,LOW);digitalWrite(MotorRight2,HIGH);digitalWrite(MotorLeft1,LOW);digitalWrite(MotorLeft2,HIGH); des=3; if (resul

36、ts.value = b )digitalWrite(MotorRight1,LOW);digitalWrite(MotorRight2,HIGH);digitalWrite(MotorLeft1,LOW);digitalWrite(MotorLeft2,HIGH); des=4;if (results.value = l )digitalWrite(MotorRight1,LOW);digitalWrite(MotorRight2,HIGH);digitalWrite(MotorLeft1,LOW);digitalWrite(MotorLeft2,HIGH); des=5; while(de

37、s!=0) myservo.write(90); detection(); if(directionn = 2) f=1; des=des+2;le(20); if(f=0) SL =digitalRead(SensorLeft);SMdigitalRead(SensorMiddle);SR=digitalRead(SensorRight);if (SM = HIGH)/ if (SR = LOW & SL = HIGH) left(1); stopp(2); else if (SL = LOW & SR = HIGH) right(1); stopp(2); else if(

38、SL = HIGH & SR = HIGH ) if(count<des-1) advance(1) stopp(50); count=count+1; f(count=des-1) le(12); SL = digitalRead(SensorLeft); SM=digitalRead(SensorMiddle); SR=digitalRead(SensorRight); else if(count>=des) digitalWrite(MotorRight1,LOW);digitalWrite(MotorRight2,LOW);digitalWrite(MotorLef

39、t1,LOW);digitalWrite(MotorLeft2,LOW);delay(50000); else advance(2) ; else advance(1); if (SM=LOW) if(SR=LOW & SL=HIGH) left(1);stopp(2); else if(SL=LOW & SR=HIGH) right(1);stopp(2); if(SL = LOW & SR = LOW & SM=LOW) le(1);if(f=1)SL = digitalRead(SensorLeft);SM =digitalRead(SensorMiddle)SR=digitalRead(SensorRight);if (SM = HIGH) if (SR = LOW & SL = HIGH) left(1);stopp(2) else if (S

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论