Arduino智能避障小车避障程序

合集下载

基于Arduino和超声波传感器避障小车制作方案

基于Arduino和超声波传感器避障小车制作方案

基于Arduino和超声波传感器避障小车制作方案避障小车是一种智能设备,可以自动感知前方的障碍物,并通过朝另一个方向转动来避开障碍物。

该设计允许小车通过避免碰撞在未知环境中导航,这是任何自主移动小车的主要要求。

避障小车的应用不受限制,现在大多数军事组织都使用它,这有助于执行许多士兵无法完成的危险工作。

在本篇文章中,我们将使用Arduino和超声波传感器制作一个避障小车。

这里,超声波传感器用于通过计算机器人和障碍物之间的距离来感测路径中的障碍物。

如果机器人发现任何障碍物,它会改变方向并继续移动。

超声波传感器如何用于避免障碍物在制作之前,了解超声波传感器的工作原理非常重要,因为这种传感器在检测障碍物方面起着重要作用。

超声波传感器工作的基本原理是记录传感器在撞击表面后传输超声波束和接收超声波束所需的时间。

然后使用该公式计算距离。

在本文中,使用了广泛使用的HC-SR04超声波传感器。

因此,HC-SR04的Trig引脚高至少10 us。

声波束以8个40KHz的脉冲传输。

然后信号撞击表面并返回并由HC-SR04的接收器Echo引脚捕获。

Echo引脚在发送高电平时为高电平。

光束返回所用的时间保存在变量中,并使用如下所示的适当计算转换为距离距离=(时间x空气中声音的速度(343 m / s))/ 2可轻松找到避免机器人的障碍物的组件。

为了搭建底盘,可以使用任何玩具底盘或者可以定制。

需要的组件● Arduino NANO或Uno开发板● HC-SR04超声波传感器● LM298N电机驱动器模块● 5V直流电动机● 电池● 车轮● 机壳● 跳线电路原理图避障小车的Arduino编程在本文末尾处将给出了完整程序。

该程序将包括设置HC-SR04模块并将信号输出到电机引脚以相应地移动电机方向。

此项目中不会使用任何库。

首先在程序中定义HC-SR04的TRIG和ECHO引脚。

在本文中,trig引脚连接到GPIO9,echo引脚连接到Arduino NANO的GPIO10。

基于ArduinoUNO和L298N的避障小车DIY制作

基于ArduinoUNO和L298N的避障小车DIY制作

基于ArduinoUNO和L298N的避障小车DIY制作一、壁障小车的制作1、制作避障小车的准备工作硬件:Arduino UNO、L298N驱动模块、超声波模块、小车底盘、舵机模块、一块面包板、一些杜邦线。

软件: Arduino UNO的程序下载软件下面来一张安装好的的图2、舵机模块的解析认识本次用的是简单实用的9克小舵机。

它的扭力不是很大,但是对于咱们想用作扫描超声测距探头来说足够了。

一般舵机的旋转角度范围都是0-180度旋转的,也有一种数字电机可以在电机和舵机这两种状态下切换,既可以控制精确的旋转角度也可以连续旋转作为电机使用。

舵机转动的角度是由控制器的脉冲宽度决定的,假如舵机处在中间位置(90度),这时的脉冲宽度设定为1.5ms那么我们想让舵机转动到0度的时候可以给他1ms的脉冲,如果想让它转动到180度的时候可以给2ms的脉冲,这就是舵机角度控制的基本原理了。

3、超声波模块的解析认识本次用的超声波模块如图所示模块工作原理:1、采用IO触发测距,给至少10us的高电平信号;2、模块自动发送8个40KHz的方波,自动检测是否有信号返回;3、有信号返回,通过IO输出一高电平,高电平持续的时间就是超声波从发射到返回的时间.测试距离=(高电平时间*声速(340m/s))/2;4、L298N模块的解析认识本次用的L298N模块如图所示1.驱动芯片:L298N双H桥直流电机驱动芯片2.驱动部分端子供电范围Vs:+5V~+35V ;如需要板内取电,则供电范围Vs:+7V~+35V3.驱动部分峰值电流Io:2A4.逻辑部分工作电流范围:0~36mA6.控制信号输入电压范围(IN1 IN2 IN3 IN4):低电平:-0.3V≤Vin≤1.5V高电平:2.3V≤Vin≤Vss7.使能信号输入电压范围(ENA ENB):低电平:-0.3≤Vin≤1.5V(控制信号无效)高电平:2.3V≤Vin≤Vss(控制信号有效)8.最大功耗:20W(温度T=75℃时)9.存储温度:-25℃~+130℃10.驱动板尺寸:58mm*40mm12.其他扩展:控制方向指示灯、逻辑部分板内取电接口。

智能避障小车原理图及源程序,诺基亚显示屏显示信息

智能避障小车原理图及源程序,诺基亚显示屏显示信息

智能小车原理图及源程序智能小车避障、圣光报警程序/*用T0计时器中断进行对小车方向的调节用INT0外部中断进行声光报警用INT1外部中断进行超声避障用T1计时器进行对时间的测量*/#include<reg52.h>#include<stdio.h>sbit P00=P1^0; //循迹口sbit P01=P1^1;sbit P02=P1^2;sbit P03=P0^3; //声光信号P03接蜂鸣器,P04接LED sbit P04=P0^4;sbit P20=P2^0; //电机1 左轮sbit P21=P2^1;sbit P22=P2^2; //电机2sbit P23=P2^3;void zhuanxiang(char,char,char);void delay1ms(void);void delaynms(int);unsigned int i=0,j=0; //特殊情况旗标void kongzhi(void) interrupt 1 //PWM信号进行电机控制{if(P00==0&&P01==1&&P02==0) //小车直线快走定时0.02ms{TH0=0X1F;TL0=0XEC;P20=0; //电机1 左轮P21=1;P22=1; //电机2 右转P23=0;}if(P00==0&&P01==0&&P02==1) //小车右转定时0.05ms {TH0=0X1F;TL0=0XCE;P20=1; //电机1 左轮P21=1;P22=1; //电机2P23=0;i=1;}if(P00==0&&P01==0&&P02==0&&i==1) // 特别{TH0=0X1F;TL0=0XCE;P20=1;P21=1;P22=1;P23=0;j=0;}if(P00==1&&P01==0&&P02==0) //小车左转定时0.05ms {TH0=0X1F;TL0=0XCE;P20=0; //电机1P21=1;P22=1; //电机2P23=1;j=1;}if(P00==0&&P01==0&&P02==0&&j==1) // 特别{TH0=0X1F;TL0=0XCE;P20=0;P21=1;P22=1;P23=1;i=0;}if(P00==1&&P01==1&&P02==1){ //全部检测到黑线时车停TH0=0X1F;TL0=0XCE;P20=1;P21=1;P22=1;P23=1;}}void shengguang(void) interrupt 0 //停车并产生声光2s{unsigned int i,j;P20=1;P21=1;P22=1;P23=1;delaynms(500);for(i=0;i<20;i++){P04=0;for(j=0;j<100;j++){P03=0;delay1ms();P03=~P03;}}P03=1; //关闭声光P04=1;delaynms(500);P20=0;//继续行车P21=1;P22=1;P23=0;}void chaoshengbo(void) interrupt 2 //超声波测距避障程序{}void main(){while(1){P20=1;P21=1;P22=1;P23=1;//小车停P03=1;P04=1;PX0=1;TMOD=0X10;//T0用方式0,T1用方式1EA=1; //开启中断总开关EX0=1;//T0中断EX1=1; //T1中断ET0=1;//INT0中断ET1=1; //INT1中断TR1=1; //开启T1计时器zhuanxiang(P00,P01,P02);}}void zhuanxiang(char P00,char P01,char P02){if(P00==0&&P01==1&&P02==0) // 小车直走{ //0.01msTH0=0X1F;TL0=0XF6;;TR0=1;}if(P00==0&&P01==0&&P02==1) //小车右转定时0.05ms{TH0=0X1F;TL0=0XCE;TR0=1;}if(P00==1&&P01==0&&P02==0) //小车左转定时0.05ms {TH0=0X1F;TL0=0XCE;TR0=1;}if(P00==1&&P01==1&&P02==1) //全部检测到黑线时车停{TH0=0X1F;TL0=0XCE;TR0=1;}}void delay1ms(void){int i;for(i=0;i<120;i++);}void delaynms(int n){int i,j;for(i=0;i<n;i++)for(j=0;j<120;j++);}诺基亚显示程序:#include <reg51.h>#include <stdio.h>#include<string.h>sbit SCLK = P1^5; // pin 2 header 5sbit SDIN = P1^4; // pin 3 header 4sbit LCD_DC = P1^3; // pin 4 header 3sbit LCD_CE = P1^2; // pin 5 header 2sbit LCD_RST = P1^1; // pin 9 header 1void LCD_init(void);void LCD_clear(void);void LCD_write_chinese_string(unsigned char X, unsigned char Y,unsigned char ch_with,unsigned char num,unsigned char line,unsigned char row);void LCD_write_char(unsigned char c);void LCD_write_byte(unsigned char dat, unsigned char dc);void LCD_set_XY(unsigned char X, unsigned char Y);void delay_1us(void);unsigned char font6x8[5][4]={{'a','s','d','f'},{'j','k','f','e'},{'j','y','i','o'},{'t','f','j','g'},{'d','s',' ','g'}}; unsigned char write_chinese[3][1]={{'1'},{'g'},{'h'}};void main(void){LCD_init(); //初始化液晶LCD_clear();while(1){LCD_init();//设置基本功能LCD_clear();//清屏LCD_set_XY(0,0);//设置坐标X:0-83,Y:0-5LCD_write_chinese_string(12,4,12,4,0,5);//写入汉字}}void LCD_init(void){// 产生一个让LCD复位的低电平脉冲LCD_RST = 0;delay_1us();LCD_RST = 1;// 关闭LCDLCD_CE = 0;delay_1us();// 使能LCDLCD_CE = 1;delay_1us();LCD_write_byte(0x21, 0); // 使用扩展命令设置LCD模式LCD_write_byte(0xc8, 0); // 设置偏置电压LCD_write_byte(0x06, 0); // 温度校正LCD_write_byte(0x13, 0); // 1:48LCD_write_byte(0x20, 0); // 使用基本命令LCD_clear(); // 清屏LCD_write_byte(0x0c, 0); // 设定显示模式,正常显示// 关闭LCDLCD_CE = 0;}void LCD_clear(void) //LCD_clear : LCD清屏函数{unsigned int i;LCD_write_byte(0x0c, 0);LCD_write_byte(0x80, 0);for (i=0; i<504; i++)LCD_write_byte(0, 1);}/* LCD_set_XY : 设置LCD坐标函数输入参数:X :0-83Y :0-5*/void LCD_set_XY(unsigned char X, unsigned char Y){LCD_write_byte(0x40 | Y, 0); // columnLCD_write_byte(0x80 | X, 0); // row}/*-----------------------------------------------------------------------LCD_write_char : 显示英文字符输入参数:c :显示的字符;*/void LCD_write_char(unsigned char c){unsigned char line;c -= 32;for (line=0; line<6; line++)LCD_write_byte(font6x8[c][line], 1);}/*----------------------------------------LCD_write_chinese_string: 在LCD上显示汉字输入参数:X、Y :显示汉字的起始X、Y坐标;ch_with :汉字点阵的宽度num :显示汉字的个数;line :汉字点阵数组中的起始行数row :汉字显示的行间距例如:LCD_write_chi(0,0,12,7,0,0);-------------------------------------------*/void LCD_write_chinese_string(unsigned char X, unsigned char Y,unsigned char ch_with,unsigned char num,unsigned char line,unsigned char row){unsigned char i,n;LCD_set_XY(X,Y); //设置初始位置for (i=0;i<num;){for (n=0; n<ch_with*2; n++) //写一个汉字{if (n==ch_with) //写汉字的下半部分{if (i==0) LCD_set_XY(X,Y+1);elseLCD_set_XY((X+(ch_with+row)*i),Y+1);}LCD_write_byte(write_chinese[line+i][n],1);}i++;LCD_set_XY((X+(ch_with+row)*i),Y);}}/*-----------------------------------------------------------------------LCD_write_byte : 使用SPI接口写数据到LCD输入参数:data :写入的数据;command :写数据/命令选择;-----------------------------------------------------------------------*/void LCD_write_byte(unsigned char dat, unsigned char command) {unsigned char i;//PORTB &= ~LCD_CE ; // 使能LCDLCD_CE = 0;if (command == 0)// PORTB &= ~LCD_DC ; // 传送命令LCD_DC = 0;else// PORTB |= LCD_DC ; // 传送数据LCD_DC = 1;for(i=0;i<8;i++){if(dat&0x80)SDIN = 1;elseSDIN = 0;SCLK = 0;dat = dat << 1;SCLK = 1;}// SPDR = data; // 传送数据到SPI寄存器//while ((SPSR & 0x80) == 0); // 等待数据传送完毕//PORTB |= LCD_CE ; // 关闭LCDLCD_CE = 1;}。

基于Arduino典型传感器智能避障小车的设计开发

基于Arduino典型传感器智能避障小车的设计开发

0&0&0&0&0&0&0©0令0°0j设计与开发II I0&0&0&0©0°0&0&0°0&0基于Arduino典型传感器智能避障小车的设计开发付晓云(沈阳理工大学机械工程学院实验中心沈阳110159)摘要以Arduino UNO开发板为核心,以红外传感器、超声波传感器、电机、车轮等外部固件,小车能实现自主避障的功能,该装置通过红外传感器监控,经由Arduino处理器处理,控制智能避障小车躲避障碍。

主要讨论以Arduino UNO开发板为核心的超声避障小车制作过程,它是由4个直流电机和L298n电机驱动模块控制行驶方向,辅以舵机和超声波传感器组成的超声避障模块实现避障功能,用Arduino IDE编程软件编写总体程序。

智能避障小车具有实际意义,在一些非常危险的情况下它能够代替人进行工作;特别是避障小车的探测功能,在抗震救灾中能够起到极大的作用。

关键词Arduino IDE Arduino UNO智能避障小车智能车领域以美国、意大利、法国等国家处于领先地位,在智能车领域有着一系列研究成果。

车辆与控制人员之间能够进行信息交流利用的是无线电及光缆技术,操作人员可以根据反馈的信息远程遥控车辆。

与上述这些在智能车领域处于前沿的国家相比,我国在智能车方面的起步比较晚,但目前也取得了很大进步,清华大学研制的“THMR-V”的智能车就是其中之一。

“THMR-V”的智能车能够在标准路面自动追踪车道线,在复杂的路面能够根据实际情况自行避障。

但此智能车也有不足,只能在结构化道路上画有清晰白线处进行车道跟踪。

国防科技大学在车辆的自动驾驶技术方面起步较早,CITAVT系列无人驾驶车是其主要的研究成果,其中CITAVT-IV型视觉导航自主车的主要目标是研究在结构化道路环境下的自主驾驶技术[1]o 此类型无人驾驶车在视觉识别方面有所缺陷,有时不能正确识别道路出口。

基于Arduino的智能小车自动避障系统设计与研究

基于Arduino的智能小车自动避障系统设计与研究

基于Arduino的智能小车自动避障系统设计与研究基于Arduino的智能小车自动避障系统设计与研究引言随着人工智能和机器人技术的不断发展,智能小车系统已经成为当前热门的研究领域之一。

智能小车的自动避障功能是其中的重要组成部分。

本文将介绍基于Arduino的智能小车自动避障系统的设计与研究,并对系统的原理和实现进行详细的探讨。

一、智能小车自动避障系统设计的需求分析智能小车自动避障系统设计的目标是实现小车在行进过程中自动感知并避开障碍物。

这一功能在实际应用中非常重要,可以用于无人驾驶汽车、智能家居服务机器人等领域。

在需求分析阶段,我们首先考虑到了以下几个关键需求: 1. 高精度的障碍物感知能力:智能小车需要能够精确地感知到前方的障碍物并进行判断。

2. 高速响应能力:避障系统需要能够实时地对感知到的障碍物做出反应,并给出合适的控制指令。

3. 稳定性:系统需要具备较高的稳定性,能够在各种复杂环境下稳定运行。

二、基于Arduino的智能小车自动避障系统设计方案基于以上需求分析,我们选择了Arduino作为智能小车自动避障系统的控制平台。

Arduino是一款简单易用且功能强大的开源电子平台,具备较高的可扩展性和稳定性。

系统的基本设计思路如下:1. 硬件设计:- 小车底盘:选择合适的底盘作为基础,具备足够的承载能力和稳定性。

- 传感器:使用超声波传感器作为主要感知器件,用于测量与障碍物的距离。

- 控制器:选择Arduino作为控制器,通过编程实现系统的逻辑功能。

2. 软件设计:- 障碍物感知算法:根据传感器的测量结果,确定与障碍物的距离,并将其作为输入。

- 避障决策算法:根据传感器测量结果和当前状态,通过算法决策小车的运动方向。

- 控制指令生成算法:输出合适的控制指令,控制小车运动。

三、系统实现与验证基于以上设计方案,我们进行了系统的实现与验证。

具体步骤如下:1. 硬件搭建:将选择的底盘与超声波传感器连接,并接入Arduino控制器。

基于Arduino的智能越障小车设计

基于Arduino的智能越障小车设计

• 122•基于Arduino的智能越障小车设计岭南师范学院物理科学与技术学院 林佳纯广州鱼窝头中学 梁士儒岭南师范学院物理科学与技术学院 周小燕本文基于智能机器人设计这一方向,针对当前越障机器人结构的局限,设计一款八轮驱动,具备自主反应、防倒退的越障小车。

实验以Arduino为控制中心,集合红外传感器、碰撞传感器和超声波传感器等多种传感器,采用可伸缩八轮式结构,结合分步越障的运行模式,对障碍准确快速做出反应。

通过多次实验测试,该小车能够很好适应复杂的环境。

应用于非结构性环境中的智能机器人一直以来都是技术研究的重点(汤天骄.基于DSTAR和神经网络的未知环境移动机器人路径规划方法:哈尔滨工业大学,2010,23-40)。

越障小车作为典型的智能越障机器人,集合机械、电子控制、车辆工程等相关领域的研究,能够工作在险恶地形上,协助人类完成任务。

目前现有的越障机器人按越障功能实现的原理主要分为腿式、履带式、轮式等几类(徐国华,谭民.移动机器人的发展现状及其趋势:机器人技术与应用,2011(3):7-14),而后又衍生了诸如轮履式(曹冲振,王凤芹,张吉亮.虾形六轮机器人尾部越障性能分析:机械设计与制造,2009(11):164-166)、轮腿式(唐鸿儒,宋爱国,章小兵.基于传感器信息融合的移动机器人自主爬楼梯技术研究:传感技术学报,2005(04):828-833)、铰接式(任常吉,贺继林,周烜亦.铰接式串联八轮机器人越障机理研究:机械科学与技术)等复合式行走机构。

由于结构上的设计限制了越障的尺度,在稳定性和自我恢复性上不能很好地适应复杂的地形结构。

本文设计的越障小车采用可伸缩八轮式结构,其结构如图1所示。

小车在平坦地面行驶时,八轮着地,其中第一、四组轮作为主动轮带动其余轮组前进。

当遇障碍物时,具备升降功能的第二、四组轮分别做出反应,固定在车身上的舵机驱动轮腿使轮组升起实现越障功能。

1 系统工作原理小车的工作流程如图2所示。

基于Arduino的智能双传感器避障小车设计

基于Arduino的智能双传感器避障小车设计

基于Arduino的智能双传感器避障小车设计【摘要】以Arduino为基础,应用超声波反射与红外线反射原理设计智能避障小车。

当小车在运行过程中,通过超声波传感器检测到的障碍物位置比较,选择无障碍方向行进一段距离。

当小车在行进时遇到障碍物停止但又未及时停下,小车与障碍物距离将缩短会发生碰撞,此时,当快要碰撞时,小车上的红外传感器感应到近距离变化,便启动电机反转给小车一个克服运动惯性的动力,使其脱离碰撞的可能,从而完成一系列的避障动作。

【关键词】Arduino单片机;超声波;红外,避障随着机械技术,越来越多产品要求轻薄小巧节省能源,同时还要求高性能智能化,而微电子技术的高速发展,使微电子技术在机械系统中应用的越来越广泛,满足了对产品智能化的要求,出现了各式各样的机电一体化系统。

机电一体化的内容并不是简单的组合,而是彼此互补,有机结合,从而使机构和性能达到最优化。

作为机电一体化的应用,本文介绍的基于Arduino的智能避障小车就是一个机电一体化结合的例子。

在2005年,意大利一家高科技设计学校两位教师Massimo Banzi跟David Cuartielles为解决学生在实验过程中找不到便宜好用的微处理器的问题,创建了Arduino开源项目,从此,开源硬件平台Arduino诞生了。

Arduino的硬件是一个包含Atmel AVR单片机为核心的开发板和其他各种I/O 电路板,软件的开发工具是使用基于Java框架编写的IDE,由于Arduino是在Atmel A VR单片机基础上的封装,所以编程语言风格与C语言类似。

Arduino其调用的类库都做过二次封装,有C语言的基础就能够进行软件程序的编写,这也是Arduino较为流行的原因。

一、Arduino板本小车的控制由Arduino UNO板(图1)来完成。

图1开发板采用Ateml AvR ATmega328处理器,本质就是一个将CPU、内存、外设等封装好的单芯片计算机。

基于Arduino开发板的自动循迹避障智能车控制系统设计

基于Arduino开发板的自动循迹避障智能车控制系统设计

基于Arduino开发板的自动循迹避障智能车控制系统设计作者:闫博扬李玉衡姚磊来源:《软件》2020年第07期Avoidance Antelligent VehicleControl System Based on Arduino Development Board0 引言在高度現代化的今天,AI及自动化技术广泛应用,却还有许多小工厂、物流中心,在用人力搬运货物。

耗费了大量的人力物力在搬运货物这种简单机械的工作,现有的运货机器人有造价高、维护难等问题。

故想开发一款低成本,易维护的可循迹避障的货运智能自控车系统。

该自控智能车具有循迹黑线,超声避障,以及利用摄像头追踪捕获彩色物块功能,可应用于人工智能领域里,参与智能运输[1]。

1 系统硬件环境1.1 运行测试赛道如图1为基于arduino开发板的自动循迹避障智能车系统测试赛道。

赛道分为从三部分,第一部分为循迹部分,最左端虚线为出发点,智能小车从虚线端出发,首先进入循迹段,利用红外传感器进行PID算法循迹;第二部分为避障路段,该路段有五个相同的合适挡板作为障碍物,智能小车利用超声波模块进行避障前进;第三部分为彩色小球追踪识别路段,智能小车利用openmv摄像头进行颜色形状识别,运动到小球附近一定距离范围内后停止运行,整个赛道测试完成[2-5]。

1.2 智能车整体结构板球平衡控制系统的框架如图2所示,由电源模块,主控模块,摄像头模块,红外模块以及超声波模块构成,利用主控器件和各传感器得到的处理信息对电机控制,完成路段功能测试。

2 系统软件环境系统主体设计流程图如图3所示。

对于模拟测试赛道三个不同路段,分别对应不同的控制算法。

3 控制原理及算法设计通过在小车的各个位置加装红外传感器、超声波传感器等。

收集小车的自身位置信息,将其传输给处理器处理后,通过控制PWM波,改变小车的运动状态,达到自动控制通过路段的目的。

利用智能摄像头的图像识别以及测距原理,对小车进行追踪控制。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Arduino智能避障小车避障程序首先建立一个名为modulecar.ino的主程序。

// modulecar.ino,玩转智能小车主程序#include <Servo.h> //导入舵机库#include <NewPing.h> //导入NwePing库// 对照系统配线方案依次指定各I/Oconst int ENA = 3 ; //左电机PWMconst int IN1 = 4 ; //左电机正const int IN2 = 5 ; //左电机负const int ENB = 6 ; //右电机PWMconst int IN3 = 7 ; //右电机正const int IN4 = 8 ; //右电机负const int trigger = 9 ; //定义超声波传感器发射脚为D9 const int echo = 10 ; //定义传感器接收脚为D10 const 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); //把D11分配给舵机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(); //调用readDistance()函数读出前方距离Serial.println("AHEAD:");Serial.println(read_ahead); //串行监视器显示机器人前方距离if (read_ahead < no_good) //如果前方距离小于警戒值{fastStop(); //就令机器人紧急刹车waTch(); //然后左右查看,分析得出最佳路线goForward(); //*此处调用看似多余,但可以确保机器人高速运转下动作的连贯性}else goForward(); //否则就一直向前行驶}主程序用到了两个库,Servo库是IDE自带的,NwePing库是第三方库,需要下载安装。

接下来建立一个名为move.ino的标签。

//move.ino,机动模块。

//刹车void fastStop(){Serial.println("STOP"); //串行监视器显示机器人状态为STOP(停止)//左电机急停(注:L298N和L293D均带有刹车功能,在使能成立的条件下,同时向两相写入高电平可令电机急停,详见芯片手册)digitalWrite(ENA, HIGH);digitalWrite(IN1, HIGH);digitalWrite(IN2, HIGH);//右电机急停digitalWrite(ENB, HIGH);digitalWrite(IN3, HIGH);digitalWrite(IN4, HIGH); }//前进void goForward(){Serial.println("FORWARD"); //串行监视器显示机器人状态为FORWARD(前进) //左电机逆时针旋转analogWrite(ENA,106); //左电机PWM,可微调这个数值使小车左右两侧车轮转速相等,右电机同理digitalWrite(IN1, LOW);digitalWrite(IN2, HIGH);//右电机顺时针旋转analogWrite(ENB,118);digitalWrite(IN3, HIGH);digitalWrite(IN4, LOW);}//原地左转void turnLeft(){Serial.println("LEFT"); //串行监视器显示机器人状态为LEFT(向左转) //左电机正转analogWrite(ENA,106);digitalWrite(IN1, HIGH);digitalWrite(IN2, LOW);//右电机正转analogWrite(ENB,59); //*微调这个数值,使转弯时内侧车轮起主导作用。

相当于让小车向后打一把轮再拐弯。

右转同理digitalWrite(IN3, HIGH);digitalWrite(IN4, LOW);delay (205); //*延迟,数值以毫秒为单位,调节此值可使机器人动作连贯}//原地右转void turnRight(){Serial.println("RIGHT"); //串行监视器显示机器人状态为RIGHT(向右转) //左电机反转analogWrite(ENA,53);digitalWrite(IN1, LOW);digitalWrite(IN2, HIGH);//右电机反转analogWrite(ENB,118);digitalWrite(IN3, LOW);digitalWrite(IN4, HIGH);delay (205); //*调节此值可使机器人动作连贯}//原地掉头(暂时用不到)void turnAround(){Serial.println("TURN 180"); //串行监视器显示机器人状态为TURN 180(原地顺时针旋转180?)//左电机反转analogWrite(ENA,106);digitalWrite(IN1, LOW);digitalWrite(IN2, HIGH);//右电机反转analogWrite(ENB,118);digitalWrite(IN3, LOW);digitalWrite(IN4, HIGH);delay (500); //*}// ping.ino,测距模块int readDistance(){delay(30); //声波发送间隔30ms,大约每秒探测33次。

受系统所限,此值不可小于29msint cm = sensor.ping() / US_ROUNDTRIP_CM; //把Ping值(μs)转换为cm return(cm); //readDistance()返回的数值是cm}最后是驱动云台扫描并分析左右两侧距离的watch.ino模块。

//watch.ino,查看模块void waTch(){//测量右前方距离。

//*注意舵机旋转方向,SG5010为逆时针旋转sensorStation.write(20); //*舵机右转至20?。

调节此值会影响传感器扫描区域,夹角越小,机器人转弯越谨慎delay(1200); //延迟1.2s待舵机稳定int read_right = readDistance(); //调用readDistance()函数读出右前方距离Serial.print("RIGHT:");Serial.println(read_right);//sensorStation.write(90); //*舵机复位至90度。

廉价舵机大角度旋转会产生抖动,要加上这两行以求读数准确。

//delay (500); //延迟0.5s//测量左前方距离sensorStation.write(160); //舵机左转至160?delay(1200); // 延迟1.2s待舵机稳定。

int read_left = readDistance(); //调用函数读出距离左前方距离。

Serial.print("LEFT:");Serial.println(read_left);sensorStation.write(90); //这一行确保只要小车处于行驶状态,传感器就面向正前方delay (500); //延迟0.5s。

// 分析得出最佳行进路线。

if (read_right > read_left) //如果右前方距离比较大{turnRight(); //就向右转,}else turnLeft(); //否则就向左转//此处也可以加入另一层逻辑:如果左右两侧读数相等就调用turnAround()原地掉头。

但实际上触发的几率不大。

}2C液晶测试程序,Arduino版本1.5.6-r2,LiquidCrystal_I2C库版本2.0 // I#include <Wire.h> 2#include "LiquidCrystal_I2C.h" //导入IC液晶库2LiquidCrystal_I2C lcd(0x27,16,2); //设定IC地址及液晶屏参数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"); //串行监视器显示机器人状态为FORWARD(前进) //左电机逆时针旋转int val1 = analogRead(A0); //手动调整左电机转速。

电位器两端分别接至+5V和GND,中心抽头接至A0int leftSpeed = map(val1,0,1023,0,255); //把读数映射为PWManalogWrite(ENA,leftSpeed); //写入速度。

下面的右电机同理digitalWrite(IN1, LOW);digitalWrite(IN2, HIGH);// 右电机顺时针旋转int val2 = analogRead(A1);int rightSpeed = map(val2,0,1023,0,255);analogWrite(ENB,rightSpeed);digitalWrite(IN3, HIGH);digitalWrite(IN4, LOW); }// ping.ino,红外测距模块// trigger脚沿用D9,echo脚换成A3int readDistance(){digitalWrite(trigger,HIGH); //点亮红外发射管delayMicroseconds(200); //给接收管留出200μs响应时间IRvalue=analogRead(echo); //读取自然光和红外线下反射值的总和digitalWrite(trigger,LOW); //关闭红外发射管以读取自然光下的反射值delayMicroseconds(200); //留出200μs响应时间IRvalue=IRvalue-analogRead(echo); //刨除自然光得出实际值(红外发射管产生的部分)return map(IRvalue,120,930,30,0); //用map()函数把读数转换为距离 }代码1:HC-SR04超声波传感器典型代码digitalWrite(TrigPin, LOW);delayMicroseconds(2);digitalWrite(TrigPin, HIGH);//发送10μs的高电平触发信号delayMicroseconds(10);digitalWrite(TrigPin, 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);Serial.println("Ultrasonic sensor:");}void loop() {//产生一个10μs的高脉冲去触发TrigPindigitalWrite(TrigPin, LOW);delayMicroseconds(2);digitalWrite(TrigPin, HIGH);delayMicroseconds(10);digitalWrite(TrigPin, LOW);// 检测脉冲宽度,并计算出距离distance = pulseIn(EchoPin, HIGH) /58.00;Serial.print(distance);Serial.print("cm");Serial.println();delay(1000);}代码3:具有温度补偿的超声波测距代码#include <OneWire.h>#include <DallasTemperature.h> //设定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.begin(9600);pinMode(TrigPin, OUTPUT);//要检测引脚上输入的脉冲宽度,需要先设置为输入状态pinMode(EchoPin, INPUT);sensors.begin();}void loop() {//产生一个10μs的高脉冲去触发TrigPinsensors.requestTemperatures();temperature_value = sensors.getTempCByIndex(0);Serial.print("temperature = ");Serial.print(temperature_value);Serial.print("C ");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();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方式,控制两支直流电机的运行行为,实现直行、后退、左转和右转动作。

相关文档
最新文档