您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > ARDUINO教程第四讲
Arduino基础教程——智能车篇广州大学实验中心黄文恺一、智能车相关的传感器1、超声波2、红外寻线传感器组件3、测速传感器1、超声波该超声波测距模块能提供2cm-450cm非接触式感测距离,测距的精度可达3mm,能很好的满足我们正常的要求。该模块包括超声波发送器、接收器和相应的控制电路。模块工作原理简介1、我们先拉低TRIG,然后至少给10us的高电平信号去触发;2、触发后,模块会自动发射8个40KHZ的方波,并自动检测是否有信号返回;3、如果有信号返回,通过ECHO输出一个高电平,高电平持续的时间便是超声波从发射到接收的时间。那么测试距离=高电平持续时间*340m/s*0.5;intinputPin=4;//接超声波ECHO到数字D4脚intoutputPin=5;//接超声波TRIG到数字D5脚voidsetup(){Serial.begin(9600);pinMode(inputPin,INPUT);pinMode(outputPin,OUTPUT);}voidloop(){digitalWrite(outputPin,LOW);delayMicroseconds(2);digitalWrite(outputPin,HIGH);//发出持续时间为10μs到trigger脚驱动超声波检测delayMicroseconds(10);digitalWrite(outputPin,LOW);intdistance=pulseIn(inputPin,HIGH);//接收脉冲的时间distance=distance/58;//将脉冲时间转化为距离值Serial.println(distance);//输出距离值(单位:厘米)delay(50);}2、红外寻线传感器组件由三个寻线传感器组成。背面L、C、R分别为左中右的信号输出。intL=7;//左边传感器接第7脚intC=8;//中间传感器接第8脚intR=9;//右边传感器接第9脚voidsetup(){pinMode(L,INPUT);//均设置为输入pinMode(C,INPUT);pinMode(R,INPUT);Serial.begin(9600);//串口波特率为9600}voidloop(){if(digitalRead(L)==HIGH)Serial.print(“LeftisWhite|”);//若测到高电平则输出白色elseSerial.print(“LeftisBlack|”);//否则输出黑色if(digitalRead(C)==HIGH)Serial.print(CenterisWhite|);elseSerial.print(CenterisBlack|);if(digitalRead(R)==HIGH)Serial.println(RightisWhite);elseSerial.println(RightisBlack);delay(200);//延时200MS方便观察效果}3、测速传感器由两路光折断传感器组成,码盘镂空的地方接收到高电平,码盘遮断的地方接收到低电平。该测速传感器可以用来控制电机的恒速运行编程原理使用中断引脚读取计数。外部中断引脚分别是数字引脚2和3.传感器上的OUT1和OUT2分别接上述引脚。将中断函数设置为下降沿FALLING触发,(如果设置为CHANGE变化触发的话,脉冲计数值除以2,才得到真实的脉冲值)intOUT1=2;//intOUT2=3;//longc1=0,c2=0;;voidsetup(){attachInterrupt(0,COUNT1,FALLING);attachInterrupt(0,COUNT2,FALLING);Serial.begin(9600);}voidloop(){Serial.print(LeftMotoris);Serial.println(c1,DEC);Serial.print(RightMotoris);Serial.println(c2,DEC);delay(200);}voidCOUNT1(){c1++;}voidCOUNT2(){c2++;}二、智能车相关的动力组件1、电池2、电源转换芯片78053、舵机4、电机5、L298电机驱动芯片1、电池磷酸铁锂电池。每个电池满电电压为3.2V.3个电池可以组成9.6V,另一个电池用占位桶填充即可。2、电源稳压芯片7805电池电压为9.6V,需要对电源进行转换方可使用。Arduino板上自带了5V和3.3V转换芯片,以供给单片机和外设使用。由于舵机的功耗比较大,我们一般建议焊多一个7805专门给舵机供电,以保障不会干扰单片机的正常工作。电源模块电路图3、舵机舵机,故名思议,像船尾的舵那样,只能转动固定的角度,一般的舵机最大转角约为180度。也有一些舵机能达到300度的。信号线舵机原理将PPM信号,经信号线传输。PPM信号的频率是50HZ。宽度从0.5MS到2.5MS。舵机库函数介绍调用Servo库,创建一个舵机的对象来控制舵机该库有几个函数1、attach(pin);attach(pin,min,max);2、write(value);3、writeMicroseconds(us);4、detach(pin);5、read(pin);6、readMicroseconds(pin);Servo函数attach(pin);该函数用于为舵机指定一个引脚。例句:Servomyservo1,myservo2;myservo1.attch(1);myservo2.attch(2);attach(pin,min,max);该函数在指定引脚的同时,还可以指定最小角度的脉宽值,单位us,默认最小值为544,对应最小角度为0度;默认最大值为2400,对应最大角度为180度。例如:myservo1.attch(1,1000,2000);该语句限制在较小的转动范围。write(value)该函数可以直接填写需要的角度。例如:myservo1.write(90);该函数精度较低,只能达到1度。writeMicroseconds(us);该函数精度较高,直接填写脉冲值,单位是us.例如:myservo1.writeMicroseconds(1500);舵机指向90度。该函数的角度精度为0.097度detch(pin);该函数用于释放舵机引脚,可以作为其他用途。read(pin);该函数用于返回当前舵机的角度,范围0~180度readMicrosends(pin);该函数用于返回当前舵机的脉冲值,单位us,范围在最大脉冲宽度和最小脉冲宽度之间。例程原理舵机信号线接数字脚3。例程1:用write()函数,控制从0到180度来回的扫描,每次延时20ms,7.2秒完成来回扫动一次。例程2:用writeMicroseconds()函数,控制从544脉冲扫描到2400脉冲,每次延时20ms,2分钟内完成扫动一次.#includeServo.h//调用舵机函数库Servomyservo;inti;voidsetup(){myservo.attach(5);//定义数字第5脚为舵机控制引脚}voidloop(){for(i=0;i=180;i++){myservo.write(i);//写入舵机角度delay(20);}for(i=180;i=0;i--){myservo.write(i);//写入舵机角度delay(20);}}舵机例程1#includeServo.h//调用舵机函数库Servomyservo;inti;voidsetup(){myservo.attach(5);//定义数字第5脚为舵机控制引脚}voidloop(){for(i=544;i=2400;i++){myservo.write(i);//写入舵机脉冲值delay(20);}for(i=2400;i=544;i--){myservo.write(i);//写入舵机脉冲值delay(20);}}舵机例程24、电机电机带减速装置。工作电压3V~12V,建议工作电压6V~9V减速比1:485、L298电机驱动芯片电机驱动控制部分电路图编程原理做双路电机实现10秒加速,然后反转减速10秒,并交替出现的程序。将数字7、8脚接L298模块的的IN1和IN2脚,12、13脚接L298模块的IN3和IN4脚。9和10脚分别接ENA和ENB脚。ENA控制MOTORA的转速,ENB控制MOTORB的转速。7、8脚控制MOTORA的正反转,12、13脚控制MOTORB的正反转。#defineIN13#defineIN24#defineIN36#defineIN47#definePWMA10#definePWMB11voidsetup(){pinMode(IN1,OUTPUT);pinMode(IN2,OUTPUT);pinMode(IN3,OUTPUT);pinMode(IN4,OUTPUT);}voidloop(){inti;for(i=0;i=255;i++){digitalWrite(IN1,HIGH);digitalWrite(IN2,LOW);analogWrite(PWMA,i);//写入左电机速度值digitalWrite(IN3,HIGH);digitalWrite(IN4,LOW);analogWrite(PWMB,i);//写入左电机速度值delay(40);}analogWrite(PWMA,0);//停转analogWrite(PWMB,0);//停转delay(2000);//停转2秒for(i=0;i=255;i++){digitalWrite(IN1,LOW);//改变电机转的方向digitalWrite(IN2,HIGH);//改变电机转的方向analogWrite(PWMA,i);//写入左电机速度值digitalWrite(IN3,LOW);digitalWrite(IN4,HIGH);analogWrite(PWMB,i);//写入左电机速度值delay(40);}}三、综合编程实例1、超声波避障小车2、红外寻线小车1、超声波避障小车编程原理由舵机带动超声波传感器转动,分别检测前方,左边和右边3个方向的是否有障碍物。若前方障碍物大于25厘米则前进,若前方有障碍物,则转动,检测左右的障碍物,哪边的空间大,则往哪边转动。示范例程#includeServo.h//包含舵机的库函数intIN4=8;//定义数字第8腳接右边的MOTOR方向控制位IN4intIN3=9;//定义数字第9腳接右边的MOTOR方向控制位IN3intIN2=10;//定义数字第8腳接左边的MOTOR方向控制位IN2intIN1=11;//定义数字第8腳接左边的MOTOR方向控制位IN1intMotorA=5;//PWMA引脚定义为数字5脚intMotorB=6;//PWMB引脚定义为数字6脚intLspeed=100;//此处可以改速度,尽量让车子走成直线intRspeed=100;//此处可以改速度,尽量让车子走成直线intinputPin=13;//定义超音波信号ECHO接收脚intoutputPin=12;//定义超音波信号发射TRIG脚floatFdistance=0;//前方的障碍物距离floatRdistance=0;//右边障碍物的距离floatLdistance=0;//左边障碍物的距离intdirectionn=0;//前=8後=2左=4右=6Servomys
本文标题:ARDUINO教程第四讲
链接地址:https://www.777doc.com/doc-5572642 .html