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

下载本文档

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

文档简介

1、首先建立一个名为modulecar.ino的主程序。/ modulecar.ino,玩转智能小车主程序#include /导入舵机库#include /导入NwePing库/ 对照系统配线方案依次指定各I/Oconst int ENA = 3 ; /左电机PWM const int IN1 = 4 ; /左电机正const int IN2 = 5 ; /左电机负const int ENB = 6 ; /右电机PWMconst int IN3 = 7 ; /右电机正const int IN4 = 8 ; /右电机负const int trigger = 9 ; /定义超声波传感器发射脚为D9co

2、nst int echo = 10 ; /定义传感器接收脚为D10const int max_read = 300; /设定传感器最大探测距离。int no_good = 35; /*设定35cm警戒距离。int read_ahead; /实际距离读数。Servo sensorStation; /设定传感器平台。NewPing sensor(trigger, echo, max_read); /设定传感器引脚和最大读数/系统初始化void setup() Serial.begin(9600); /启用串行监视器可以给调试带来极大便利 sensorStation.attach(11); /把D1

3、1分配给舵机 pinMode(ENA, OUTPUT); /依次设定各I/O属性 pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); pinMode(trigger, OUTPUT); pinMode(echo, INPUT); sensorStation.write(90); /舵机复位至90 delay(6000); /上电等待6s后进入主循环/主程序void loop() read_ahead = readDistance

4、(); /调用readDistance()函数读出前方距离 Serial.println(AHEAD:); Serial.println(read_ahead); /串行监视器显示机器人前方距离 if (read_ahead read_left) /如果右前方距离比较大turnRight(); /就向右转,else turnLeft(); /否则就向左转/此处也可以加入另一层逻辑:如果左右两侧读数相等就调用turnAround()原地掉头。但实际上触发的几率不大。/ I2C液晶测试程序,Arduino版本1.5.6-r2,LiquidCrystal_I2C库版本2.0#include #inc

5、lude LiquidCrystal_I2C.h /导入I2C液晶库LiquidCrystal_I2C lcd(0x27,16,2); /设定I2C地址及液晶屏参数void setup() lcd.init(); / 始化液晶屏 lcd.backlight(); lcd.print(Hello, world!); /开始打印信息 lcd.setCursor(3,1); /设定显示位置,第3列,第1行 lcd.print(ZANG.HAIBO);void loop()/前进void goForward() Serial.println(FORWARD); /串行监视器显示机器人状态为FORWAR

6、D(前进) /左电机逆时针旋转 int val1 = analogRead(A0); /手动调整左电机转速。电位器两端分别接至+5V和GND,中心抽头接至A0 int leftSpeed = map(val1,0,1023,0,255); /把读数映射为PWM analogWrite(ENA,leftSpeed); /写入速度。下面的右电机同理 digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); / 右电机顺时针旋转 int val2 = analogRead(A1); int rightSpeed = map(val2,0,1023,0,255)

7、; analogWrite(ENB,rightSpeed); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);/ ping.ino,红外测距模块/ trigger脚沿用D9,echo脚换成A3int readDistance() digitalWrite(trigger,HIGH); /点亮红外发射管 delayMicroseconds(200); /给接收管留出200s响应时间 IRvalue=analogRead(echo); /读取自然光和红外线下反射值的总和 digitalWrite(trigger,LOW); /关闭红外发射管以读取自然

8、光下的反射值 delayMicroseconds(200); /留出200s响应时间 IRvalue=IRvalue-analogRead(echo); /刨除自然光得出实际值(红外发射管产生的部分) return map(IRvalue,120,930,30,0); /用map()函数把读数转换为距离代码1:HC-SR04超声波传感器典型代码digitalWrite(TrigPin, LOW);delayMicroseconds(2);digitalWrite(TrigPin, HIGH);/发送10s的高电平触发信号delayMicroseconds(10);digitalWrite(Tr

9、igPin, LOW);distance = pulseIn(EchoPin, HIGH)*340/60/2; / 检测脉冲宽度即为超声波往返时间代码2:简易超声波测距代码const int TrigPin = 2; const int EchoPin = 3; /设定SR04连接的Arduino引脚float distance; void setup() / 初始化串口通信及连接SR04的引脚 Serial.begin(9600); pinMode(TrigPin, OUTPUT); / 要检测引脚上输入的脉冲宽度,需要先设置为输入状态 pinMode(EchoPin, INPUT); Se

10、rial.println(Ultrasonic sensor:); void loop() /产生一个10s的高脉冲去触发TrigPin digitalWrite(TrigPin, LOW); delayMicroseconds(2); digitalWrite(TrigPin, HIGH); delayMicroseconds(10); digitalWrite(TrigPin, LOW); / 检测脉冲宽度,并计算出距离 distance = pulseIn(EchoPin, HIGH) /58.00; Serial.print(distance); Serial.print(cm); S

11、erial.println(); delay(1000); 代码3:具有温度补偿的超声波测距代码#include #include /设定SR04连接的Arduino引脚const int TrigPin = 2; const int EchoPin = 3; float distance; float temperature_value; #define ONE_WIRE_BUS 4OneWire oneWire(ONE_WIRE_BUS);DallasTemperature sensors(&oneWire);void setup() /初始化串口通信及连接SR04的引脚 Serial.b

12、egin(9600); pinMode(TrigPin, OUTPUT); /要检测引脚上输入的脉冲宽度,需要先设置为输入状态 pinMode(EchoPin, INPUT); sensors.begin();void loop() /产生一个10s的高脉冲去触发TrigPin sensors.requestTemperatures(); temperature_value = sensors.getTempCByIndex(0); Serial.print(temperature = ); Serial.print(temperature_value); Serial.print(C );

13、digitalWrite(TrigPin, LOW); delayMicroseconds(2); digitalWrite(TrigPin, HIGH); delayMicroseconds(10); 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();

14、delay(1000);代码4:基于GP2D12的红外测距系统代码int i;float val;void setup() Serial.begin(9600);void loop() i=analogRead(A0); val=2547.8/(float)i*0.49-10.41)-0.42; Serial.println(val,2);/蓝牙遥控小车/Arduino源程序/定稿日期:2016-3-16/程序功能简介:/程序采用软件PWM方式,控制两支直流电机的运行行为,实现直行、后退、左转和右转动作。/操作者使用Android手机的蓝牙功能发出指令,操控小车动作。/操作者还通过蓝牙对小车的

15、动作参数进行调试。/使用自定义串口收发数据/使用软件PWM,输出引脚可任意制定/使用Atmega48芯片/Arduio版本1.0.5#include #include #include #include usart.hunsigned int counter; /PWM计数器unsigned char wCnt = 0; /接收字计数unsigned int pwm_LH; /左电机高电平计数unsigned int pwm_RH; /右电机高电平计数unsigned char lDirect;/左电机运转方向unsigned char rDirect;/右电机运转方向unsigned int

16、 LP = 0;unsigned int RP = 0;unsigned int LD = 0;unsigned int RD = 0;unsigned int PWM6; /存放当前PWM参数的整数型数组,全局变量unsigned char inputString8; /存输入数据字符串变量boolean stringComplete = false;/数据串结束标志/定时器2初始化函数void timer2_init()cli();TCCR2B = 0x00; /TCNT2 = 0xF6; /TCCR2A = 0x00;TCCR2B = 0x02; /TIMSK2 = 0x01; /定时器

17、2中断允许sei();/定时器2中断服务函数/PWM波形产生器ISR(TIMER2_OVF_vect)TCNT2 = 0xF6; /counter+;if(counter = 0x3ff) if (rDirect = 1) bitSet(PORTD,5); else bitSet(PORTD,4); if (lDirect = 1) bitSet(PORTD,7); else bitSet(PORTD,6); counter = 0;if(counter = pwm_RH) bitClear(PORTD,4); bitClear(PORTD,5);if(counter = pwm_LH) bi

18、tClear(PORTD,6); bitClear(PORTD,7);/电机运行函数void Move(unsigned int LS,unsigned charLD,unsigned int RS,unsigned char RD) asm(BCLR 7);/关中断pwm_LH = LS;pwm_RH = RS;lDirect = LD;rDirect = RD;asm(BSET 7);/开中断 /获取EEPROM数据函数/功能:从EEPROM里顺序读出六个PWM参数,存入PWM数组void GetData()unsigned char bytes2; /暂时存放PWM参数的字节数组,全局变

19、量unsigned char i;unsigned char j;unsigned char k;for(i = 0;i 6;i+) /for循环,读六个参数 for (j = 0;j 2;j+) /内循环,每次读两个字节 k = i * 2 + 1 - j; /地址计算 bytesj = EEPROM.read(k); /EEPROM读操作 PWM= word(bytes0, bytes1); /将读出的两个字节合成一个PWM整数数据/数据发送函数/功能:将一个整数拆分成四个ASCII代码,通过蓝牙串口发出的函数。/例如:整数784,将拆分成; ,7,8,4四个字符void Number(i

20、nt val)inttmp; /中间变量unsigned char i; /循环计数变量unsigned char buf4; /存字符数组tmp= val / 1000;buf0 = tmp + 0x30;/获得千位val= val % 1000;tmp= val / 100;buf1 = tmp + 0x30;/获得百位val= val % 100;tmp= val / 10;buf2 = tmp + 0x30;/获得十位val= val % 10;buf3 = val + 0x30; /获得个位for(i = 0;i 4;i+) if (buf= 0x30) /从高位整理,如果是0,则转

21、换成空格。 buf= 0x20; else break;Usart_Transmit(buf0); /通过蓝牙串口连续发出四个字符。Usart_Transmit(buf1);Usart_Transmit(buf2);Usart_Transmit(buf3);void setup() timer2_init();Usart_Init(9600);sei();PORTD = 0x00;DDRD= 0xF0;GetData(); /初始化PWM参数void loop() unsigned char buf6; /存连续字符的数组unsigned char index = 0; /存索引值变量unsi

22、gned char i;unsigned char k;unsigned int para; /存PWM数据变量delay(500);if(stringComplete = true) /分解手机传过来的参数 /格式是:#n%dddd k= 0; /其中:n为索引(地址);dddd为数据 index = 0; for (i = 0;i = wCnt ;i+) if (inputString= %) index = inputStringi-1 - 0x30; /获得索引 k = 0; else bufk = inputString- 0x30; /获得数据 k+; para = 0; for (i = 0;i k-1;i+) para = para * 10 + buf; PWMindex = para; /将得到的整数参数立即存入对应的PWM数组单元,修改当前运行参数 buf1 = lowByte(para); /将整数转换成两个字节。 buf0 = highByte(para); index = index * 2; /计算EEPROM地址 EEPROM.write(index, buf1);/写入EEPROM低位在前 index+; EEPROM.write(index, buf0);/高位在后 stringComplete = false; wCnt

温馨提示

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

评论

0/150

提交评论