资源描述
基于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循迹模块程序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为核心.完成寻线,避障,红外遥控和蓝牙遥控的功能,.套件包含了大量的趣味程序,并可扩展外置的电路模块,从而增加小车的使用功能.旨在让使用者在学习 ARDUINO 单片机时能脱离枯燥的理论知识,在玩乐中获取单片机系统开发的能力。 2.2参数说明 1.电机参数:电压范围:1.5-12V,电机轴长10mm,转速 100rpm/min. 2.控制电机选用L298N驱动模块,与单片机真正隔离. 3.三组寻线模块,检测黑白线,精度更高,也可用与防跌落控制. 4.红外遥控通信模块,组成智能小车遥控系统. 5.超声波模块,小车避障系统. 5.蓝牙无线模块,可以和手机蓝牙配对遥控机器人. 6.可接入外部712V的电压。并能搭载多款传感器模块,根据您的想象力实现各种功能.三、 硬件设计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硬件设计说明 结合实际、根据需要,将系统分为四个模块,即电机驱动模块,循迹模块,避碰模块,红外模块,分开做,自后将其综合起来。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红外对管的工作原理是利用红外线对颜色的反射率不一样,将 反射信号的强弱转化成电流信号。黑白寻迹模块在检测到黑色高电平有效,检测到白色是为 低电平有效,检测高度为 03cm。使用方法1.传感器接口有3根排针,分别是GND ,VCC,OUT。VCC和GND为供电端,OUT是信 号输出端。 2.检测到物体,信号端输出低电平;未检测到物体,信号端输出高电平。 3.主要判断信号输出端是0或者1,就能判断物体是否存在。 性能参数: 1:检测距离,检测白纸时约为2厘米。视颜色的不同距离有所不同,白色最远。 2.供电电压:2.5V12V,不要超过12V。(注意:最好用低电压供电,供电电压太高传感器的寿命会变短。5V供电为佳。) 3.工作电流,5V时1820ma。经大量测试,传感器硬件设置为1820ma工作电流时性能最 佳,主要表现在抗干扰能力上。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 函式库资料夹放进 Arduino libraries 目录底下2.开启 IrReceive.pde 测得自 己的红外线遥控的码(在 Serial Monitor 可显示 IRcode) , 再将IRcode 记录下来, 然后到程式里面修改成自 己的红外线码即可。3.6.2实物图四、模块软件设计4.1循迹模块程序第 9 页 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; /右感測器輸入腳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); 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(MotorRight2,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(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); 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); /右感測器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 if (SL = LOW & SR = HIGH) right(1);stopp(2); else if(SL = HIGH & SR = HIGH ) if(count=des) digitalWrite(MotorRight1,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) le(1); 第 16 页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)Serial.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 (results-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 = 0; i 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;unsigned 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); / 倒退 stopp(); /停止 while(1); if(directionn = 8) advance(2); 五、综合设计与调试5.1流程图 开始 红外信号 障碍物 路径1 路径2 终点 终点 开始5.2软件设计 #include #include int RECV_PIN = 12;int MotorRight1=8;/IN1int MotorRight2=9;/IN2int MotorLeft1=7;/IN4int MotorLeft2=6;/IN3int speedpin=11;int speedpin1=10;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 = 0x00FF629D;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 (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 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 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); pinMode(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.attach(3); void detection() int delay_time = 250; ask_pin_F(); if(Fspeedd 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 (results.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(des!=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(SL = HIGH & SR = HIGH ) if(count=des) digitalWrite(MotorRight1,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) 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 (SL = LOW & SR = HIGH) right(1); stopp(2); else if(SL = HIGH & SR = HIGH ) if(countdes-1) advance(2); stopp(50); count=count+1; if(count=des)digitalWrite(MotorRight1,LOW);digitalWrite(MotorRight2,LOW); digitalWrite(MotorLeft1,LOW);digitalWrite(MotorLeft2,LOW); 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) re(1); 六、总结6.1遇到问题及解决办法1、 硬件问题 刚拿到手的器件,我以为都是好用的,然而并不是,只有经过自己的实践才知道是否好用。只有对自己的硬件充分了解知道自己的硬件性能才能少走歪路,才能将编相应的程序结合自己的硬件完成任务。舵机毁坏:舵机没法转弯,但是根据任务,并不需要转弯,故对任务没影响;PWM口:单片机I/O口9、10、11PWM口在循迹程序中可用,但在避碰程序、红外线程序中不能用。PWM不能用硬件性能不好,只能用更好的额软件程序来弥补(难度大大增加)性能的缺失。2、 软件问题软件设计难度设计的增加问题是硬件问题性能不良带来的。小车运行不稳:由于只能输出高低电平,转弯尾部摆动大。用延时停止等到重新检测后判断重新执行来保证调整实践的适当解决。黑点检测不稳:用延时检测停止判断。转弯容易掉头:检测到黑点后直行延时2ms,再转弯这样可以保证转到规定路线上。6.2个人感悟这是课设分到的任务是基于ARDUINO的智能小车。在这两周的学习与操作中学到了很多,不仅仅是对ARDUINO单片机的初步了解(其实也没怎么去了解,它不像51单片机好多函数需要自己编,这个是集成化的,方便灵活),更重要的是这个过程让我意识到了一些非知识技能的技能。从我拿到硬件到完成任务,这个过程其实是可以分步来的,第一组装硬件;第二测试硬件;第三编软件;最后调试。然而这个过程中会出现很多自己不期望的现象,这就需要去改,改的首先步骤是发现导致该现象问题所在,这是最根本也是最难的,很多情况就是盲调,并没有科学的方法,让我意识到花时间去找问题与解决问题同等重要。 总之,通过这次课设我收获最大的就是让我意识到:根据现象用简便的方法找到问题所在,才能根本解决问题,才能学到东西,发现问题也是一种技能。
展开阅读全文