Arduino智能避障小车避障程序_第1页
Arduino智能避障小车避障程序_第2页
Arduino智能避障小车避障程序_第3页
Arduino智能避障小车避障程序_第4页
Arduino智能避障小车避障程序_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

1、首先建立一个名为modulecar.ino的主程序。/modulecar.ino,玩转智能小车主程序#include/导入舵机库#include/导入NwePing库/对照系统配线方案依次指定各I/OconstintENA=3;/左电机PWMconstintIN1=4;/左电机正constintIN2=5;/左电机负constintENB=6;/右电机PWMconstintIN3=7;/右电机正constintIN4=8;/右电机负constinttrigger=9;/定义超声波传感器发射脚为D9constintecho=10;/定义传感器接收脚为D10constintmax_read=300

2、;/设定传感器最大探测距离。intno_good=35;/*设定35cm警戒距离。intread_ahead;/实际距离读数。ServosensorStation;/设定传感器平台。NewPingsensor(trigger,echo,max_read);/设定传感器引脚和最大读数/系统初始化voidsetup()Serial.begin(9600);/启用串行监视器可以给调试带来极大便利sensorStation.attach(11);/把D11分配给舵机pinMode(ENA,OUTPUT);/依次设定各I/O属性pinMode(IN1,OUTPUT);pinMode(IN2,OUTPUT

3、);pinMode(ENB,OUTPUT);pinMode(IN3,OUTPUT);pinMode(IN4,OUTPUT);pinMode(trigger,OUTPUT);pinMode(echo,INPUT);sensorStation.write(90);/舵机复位至90delay(6000);/上电等待6s后进入主循环/主程序voidloop()read_ahead=readDistance();调用readDistance()函数读出前方距离Serial.println(AHEAD:);Serial.println(read_ahead);/串行监视器显示机器人前方距离if(read_

4、aheadread_left)/如果右前方距离比较大turnRight();/就向右转,elseturnLeft();/否则就向左转此处也可以加入另一层逻辑:如果左右两侧读数相等就调用turnAround()原地掉头。但实际上触发的几率不大。/I2C液晶测试程序,Arduino版本1.5.6-r2,LiquidCrystal_I2C库版本2.0#include#includeLiquidCrystal_I2C.h/导入I2C液晶库LiquidCrystal_I2Clcd(0 x27,16,2);设定I2C地址及液晶屏参数voidsetup()lcd.init();/始化液晶屏lcd.backl

5、ight();lcd.print(Hello,world!);/开始打印信息lcd.setCursor(3,1);/设定显示位置,第3列,第1行lcd.print(ZANG.HAIBO);voidloop()/前进voidgoForward()Serial.println(FORWARD);串行监视器显示机器人状态为FORWARD(前进)/左电机逆时针旋转intvail=analogRead(AO);手动调整左电机转速。电位器两端分别接至+5V和GND,中心抽头接至A0intleftSpeed=map(val1,0,1023,0,255);把读数映射为PWManaiogWrite(ENA,ie

6、ftSpeed);/写入速度。下面的右电机同理digitalWrite(IN1,LOW);digitalWrite(IN2,HIGH);/右电机顺时针旋转intval2=analogRead(A1);intrightSpeed=map(val2,0,1023,0,255);analogWrite(ENB,rightSpeed);digitalWrite(IN3,HIGH);digitalWrite(IN4,LOW);/ping.ino,红外测距模块/trigger脚沿用D9,echo脚换成A3intreadDistance()digitalWrite(trigger,HIGH);/点亮红外发射

7、管delayMicroseconds(200);给接收管留出200卩s响应时间IRvalue=analogRead(echo);/读取自然光和红外线下反射值的总和digitalWrite(trigger,LOW);/关闭红外发射管以读取自然光下的反射值delayMicroseconds(200);留出200卩s响应时间IRvalue=IRvalue-analogRead(echo);/刨除自然光得出实际值(红外发射管产生的部分)returnmap(IRvalue,120,930,30,0);用map()函数把读数转换为距离超声波模块呂忘凹与超声波模块呂忘凹与Ainuiri崔接:TRIO接Dig

8、ital5D-融发测距;:ECHO接Digit日14匚k接收距离信号程序代码:irtinputPin=4:7/定裟超声波信号接收接口ECHO接4口int皿t叫tPin=5;&定丸超声液信号发出接口TRIG接&口voidsetupQjSerial.begin(9600);,pinMode(inputPin,INPUTjpinMode(outputPin,OUTPUT);voidloop()#H才digitalWite(outputPin.LOW);使媛出发匕超声波信号接口底电平2圧delayMicrosecond5(?;);digitalWrite(outputPin,HI总T);使发出叢出超声

9、波信吕接口高电平10ms,这里杲至夾1口片dElayMic.rosEcondsf.JOJ;digitalWrite(outputPin,LOW);保持发出超声波信号接口诜自平intdistance=叫IselnfirputPin,HIGH):谀出麻沖时闾distance=dgtance/58;将脉沖时间转化闷距离(单位;匣米Serial.prinLln(distance);/隔出距离值delay(50);代码1:HC-SR04超声波传感器典型代码digitalWrite(TrigPin,LOW);delayMicroseconds(2);digitalWrite(TrigPin,HIGH);/

10、发送10卩s的高电平触发信号delayMicroseconds(lO);digitalWrite(TrigPin,LOW);distance=pulseIn(EchoPin,HIGH)*340/60/2;/检测脉冲宽度即为超声波往返时间代码2:简易超声波测距代码constintTrigPin=2;constintEchoPin=3;/设定SR04连接的Arduino引脚floatdistance;voidsetup()/初始化串口通信及连接SR04的引脚Serial.begin(9600);pinMode(TrigPin,OUTPUT);/要检测引脚上输入的脉冲宽度,需要先设置为输入状态pin

11、Mode(EchoPin,INPUT);Serial.println(Ultrasonicsensor:);voidloop()产生一个10卩s的高脉冲去触发TrigPindigitalWrite(TrigPin,LOW);delayMicroseconds(2);digitalWrite(TrigPin,HIGH);delayMicroseconds(lO);digitalWrite(TrigPin,LOW);/检测脉冲宽度,并计算出距离distance=pulseIn(EchoPin,HIGH)/58.00;Serial.print(distance);Serial.print(cm);S

12、erial.println();delay(1000);代码3:具有温度补偿的超声波测距代码#include#include设定SR04连接的Arduino引脚constintTrigPin=2;constintEchoPin=3;floatdistance;floattemperature_value;#defineONE_WIRE_BUS4OneWireoneWire(ONE_WIRE_BUS);DallasTemperaturesensors(&oneWire);voidsetup()初始化串口通信及连接SR04的引脚Serial.begin(9600);pinMode(TrigPin,

13、OUTPUT);要检测引脚上输入的脉冲宽度,需要先设置为输入状态pinMode(EchoPin,INPUT);sensors.begin();voidloop()产生一个10卩s的高脉冲去触发TrigPinsensors.requestTemperatures();temperature_value=sensors.getTempCByIndex(O);Serial.print(temperature=);Serial.print(temperature_value);Serial.print(C);digitalWrite(TrigPin,LOW);delayMicroseconds(2);

14、digitalWrite(TrigPin,HIGH);delayMicroseconds(lO);digitalWrite(TrigPin,LOW);检测脉冲宽度,并计算出距离distance=pulseIn(EchoPin,HIGH)*(331.4+0.6*temperature_value)/2;Serial.print(distance=);Serial.print(distance);Serial.print(cm);Serial.println();delay(1000);代码4:基于GP2D12的红外测距系统代码inti;floatval;voidsetup()Serial.beg

15、in(9600);voidloop()i=analogRead(AO);val=2547.8/(float)i*0.49-10.41)-0.42;Serial.println(val,2);1路开关愷号指示IEDL路接收悸倭口1路开关愷号指示IEDL路接收悸倭口1器发射管蟻口2酸魂探口2躍W管接口2施幵关信钮旨示LED电源指示LED-VCC电販正扱MD接屯舷破路幵关信銅出端仙开灼麺出端蓝牙遥控小车/Arduino源程序/定稿日期:2016-3-16/程序功能简介:/程序采用软件PWM方式,控制两支直流电机的运行行为,实现直行、后退、左转和右转动作。/操作者使用Android手机的蓝牙功能发出指

16、令,操控小车动作。/操作者还通过蓝牙对小车的动作参数进行调试。/使用自定义串口收发数据/使用软件PWM,输出引脚可任意制定/使用Atmega48芯片/Arduio版本1.0.5#include#include#include#includeusart.hunsignedintcounter;/PWM计数器unsignedcharwCnt=0;/接收字计数unsignedintpwm_LH;/左电机高电平计数unsignedintpwm_RH;/右电机高电平计数unsignedcharlDirect;/左电机运转方向unsignedcharrDirect;/右电机运转方向unsignedintL

17、P=0;unsignedintRP=0;unsignedintLD=0;unsignedintRD=0;unsignedintPWM6;存放当前PWM参数的整数型数组,全局变量unsignedcharinputString8;/存输入数据字符串变量booleanstringComplete=false;/数据串结束标志/定时器2初始化函数voidtimer2_init()cli();TCCR2B=0 x00;/TCNT2=0 xF6;/TCCR2A=0 x00;TCCR2B=0 x02;/TIMSK2=0 x01;/定时器2中断允许sei();/定时器2中断服务函数/PWM波形产生器ISR(T

18、IMER2_OVF_vect)TCNT2=0 xF6;/counter+;if(counter=0 x3ff)if(rDirect=1)bitSet(PORTD,5);elsebitSet(PORTD,4);if(lDirect=1)bitSet(PORTD,7);elsebitSet(PORTD,6);counter=0;if(counter=pwm_RH)bitClear(PORTD,4);bitClear(PORTD,5);if(counter=pwm_LH)bitClear(PORTD,6);bitClear(PORTD,7);/电机运行函数voidMove(unsignedintLS

19、,unsignedcharLD,unsignedintRS,unsignedcharRD)asm(BCLR7);/关中断pwm_LH=LS;pwm_RH=RS;lDirect=LD;rDirect=RD;asm(BSET7);/开中断/获取EEPROM数据函数/功能:从EEPROM里顺序读出六个PWM参数,存入PWM数组voidGetData()unsignedcharbytes2;/暂时存放PWM参数的字节数组,全局变量unsignedchari;unsignedcharj;unsignedchark;for(i=0;i6;i+)/for循环,读六个参数for(j=0;j2;j+)/内循环,

20、每次读两个字节k=i*2+1-j;/地址计算bytesj=EEPROM.read(k);/EEPROM读操作PWM=word(bytes0,bytes1);将读岀的两个字节合成一个PWM整数数据/数据发送函数功能:将一个整数拆分成四个SCII代码,通过蓝牙串口发岀的函数。/例如:整数784,将拆分成;,7,8,4四个字符voidNumber(intval)inttmp;/中间变量unsignedchari;/循环计数变量unsignedcharbuf4;/存字符数组tmp=val/1000;buf0=tmp+0 x30;/获得千位val=val%1000;tmp=val/100;buf1=tm

21、p+0 x30;/获得百位val=val%100;tmp=val/10;buf2=tmp+0 x30;/获得十位val=val%10;buf3=val+0 x30;/获得个位for(i=0;i4;i+)if(buf=0 x30)/从高位整理,如果是0,则转换成空格。buf=0 x20;elsebreak;Usart_Transmit(buf0);/通过蓝牙串口连续发岀四个字符。Usart_Transmit(buf1);Usart_Transmit(buf2);Usart_Transmit(buf3);voidsetup()timer2_init();Usart_Init(9600);sei()

22、;PORTD=0 x00;DDRD=0 xF0;GetData();初始化PWM参数voidloop()unsignedcharbuf6;unsignedcharindex=0;unsignedchari;unsignedchark;unsignedintpara;delay(500);if(stringComplete=true)k=0;/voidloop()unsignedcharbuf6;unsignedcharindex=0;unsignedchari;unsignedchark;unsignedintpara;delay(500);if(stringComplete=true)k=0;/存连续字符的数组/存索引值变量存PWM数据变量/分解手机传过来的参数格式是:#n%dddd其中:n为索引(地址);dddd为数据index=0;for(i=0;i=wCnt;i+)if(inputString=%)index=inputStringi-1-0 x30;/获得索引k=0;elsebufk=inputString-0 x30;/获得数据k+;para=0;for(i=0;ik-1;i+)para=para*10+buf;PWMindex=para;将得到的整数参数立即存入对应的WM数组单元,修改当前运行参数buf1=lowByte(para);/将整数转换成两

温馨提示

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

评论

0/150

提交评论