用arduino制作蓝牙遥控小车_第1页
用arduino制作蓝牙遥控小车_第2页
用arduino制作蓝牙遥控小车_第3页
用arduino制作蓝牙遥控小车_第4页
用arduino制作蓝牙遥控小车_第5页
已阅读5页,还剩9页未读, 继续免费阅读

下载本文档

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

文档简介

本文格式为Word版,下载可任意编辑——用arduino制作蓝牙遥控小车

·1·

现如今是智能手机的天下,好多手机性能已经能够媲美PC了,那么用智能机遥控一台小车自然不在话下了。这里我们用arduinouno开发板协同HC-05蓝牙透传模块制作一辆手机控制的小车,使小车能够发射激光,控制舵机,测量距离并回传到手机,体验一下无线操控的乐趣吧。

首先,手头准备好以下材料:

图10.1arduinouno板一块图10.2arduinosensorsheildv5.0传感器扩展板,带蓝牙直插接口,便利

组装模块

图10.3L9110电机驱动板一块

(注意:这种是两路电机驱动板,相对于L298N更为小巧,但不支持pwm调速,假使需要驱动四个电机需要两块,这里我们就用两轮驱动)

图10.4HC-05主从一体蓝牙透传模块图10.5超声波测距模块

·2·

图10.6普通模拟舵机图10.7小车轮胎(带直流电机)图10.8激光灯

首先,我们来简单了解一下HC-05蓝牙模块的引脚。图10.9HC-05的引脚图示表10.1HC-05的引脚定义123456VCCGNDTXDRXDKEYLED电源(3.3v~5v)接地模块串口发送脚,接uno的RX引脚。模块串口接收脚,接uno的TX引脚。用于进入AT指令状态,可直接悬空不做设置。配对状态输出;配对成功输出高电平,未配对则输出低电平。这里我们只需要连接1、2、3、4引脚,5、6悬空即可。

模块上电后指示灯快闪则表示模块等待配对,用手机探寻蓝牙能探寻到“H-C-2023-06-01〞,默认初始密码为1234,连接后指示灯慢闪开始工作。

注意此模块不需任何程序,与arduino直接连接就能用。

为了使小车能够进入避障模式自动工作,我们使用了US100超声波测距模块,下面简单介绍一下此模块。

·3·

正面图后面图

图10.10US100超声波测距模块

此模块分串口工作模式和电平触发工作模式。串口模式下向模块发送0x55,则返回探测到的距离,发送0x50则返回当前温度。电平模式下通过向Triq引脚发送一个大于10us的高电平,模块开始测距,超声波在空中传播的时间就是Echo引脚高电平持续的时间,所以通过检测Echo引脚的高电平持续时间,由公式:(检测的时间*340m/s)/2得出距离。

注意:由于ArduinoUno只有一个串口,所以超声波模块和蓝牙模块共用一个串口时易发生冲突,所以我们在这里采用电平触发模式。

我们可以使用舵机l连续的摇摆摇动一面小红旗,也可以在舵机上加一个小毛刷让小车能够边走边扫地,那么下面就简单介绍一下普通模拟舵机的控制原理。

图10.11模拟舵机

图为市面上常见的模拟舵机,之所以称为模拟舵机,是由于它是通过输入pwm波这种模拟量来控制角度的。舵机每20ms接收一次信号脉冲,高电平范围在0.5ms~2.5ms内舵机响应。

Arduino自带舵机函数库,通过调头文件,我们可以直接引用以下几个常用函数:

1、attach(接口)——设定舵机的接口,uno上只有带‘#’号的引脚具备pwm输出功能

2、write(角度)——用于设定舵机旋转角度的语句,模拟舵机可设定的角度范围是0°到180°,数码舵机角度不受限制。

3、read()——用于读取舵机角度的语句,可理解为读取最终一条write()命令中的值。

·4·

4、attached()——判断舵机参数是否已发送到舵机所在接口。

5、detach()——使舵机与其接口分开,该接口可继续被用作PWM接口。下面我们开始编写程:

#include//舵机库头文件//*****************************************************************************

#defineSERVO3//定义3引脚接一个舵机

/******************************************************************************

********电机模块引脚定义,电机1的转动方向取决于A1B1引脚*************的状态,其中(A1,B1)赋值(1,0)为正转,赋值(0,1)*************为反转,赋值(1,1)或(0,0)则不转***********************************************************************************/

#defineINT_A19#defineINT_B18#defineINT_A211#defineINT_B210

/****************************************************************************

*****US100超声波测距模块引脚定义,拔去短路帽后为电平触发模式,**********只需要在Trig/TX管脚输入一个10US以上的高电平,系统便可发出8个**********40KHZ的超声波脉冲,然后检测回波信号。当检测到回波信号后,模块**********还要进行温度值的测量,然后根据当前温度对测距结果进行校正,**********将校正后的结果通过Echo/RX管脚输出。**********在此模式下,模块将距离值转化为340m/s时的时间值的2倍,**********通过Echo端输出一高电平,可根据此高电平的持续时间来计算距离值。**********即距离值为:(高电平日间*340m/s)/2。**********************************************************************************/#defineTriq5#defineEcho4

#defineLASER6//定义激光灯在12引脚#defineLASER_ONdigitalWrite(LASER,1)//简化程序,便利操作#defineLASER_OFFdigitalWrite(LASER,0)Servomyservo;//定义舵机名称floatdistance;//定义测量的距离值byteBT_COM;//定义蓝牙接收到的参数值byteBT_PWM=75;//定义输入舵机的角度值byteLASER_Flag;//判断激光开关的标志值/***************初始化*******************/

voidsetup(){

pinMode(Triq,OUTPUT);//设置Triq引脚为输出模式pinMode(Echo,INPUT);//设置Echo引脚为输入模式

·5·

pinMode(LASER,OUTPUT);//设置激光灯引脚为输出模式myservo.attach(3);//在引脚3上添加一个舵机Serial.begin(38400);//蓝牙模块的默认传输速率}

/**************主函数*******************/

voidloop(){

if(Serial.available())//判断串口是否接收到数据{

BT_COM=Serial.read();//读蓝牙串口的数据switch(BT_COM)//数据选择{

case'a':forward();//发送’a’,小车前进break;case'b':turnright();//发送’b’,小车右转break;case'c':backup();//发送’c’,小车后退break;case'd':turnleft();//发送’d’,小车左转break;case'e':stopcar();//发送’e’,小车中止break;case'f':BT_SERVO_REDUCE();//发送’f’,舵机左转break;case'g':BT_SERVO_ADD();//发送’g’,舵机右转break;case'h':BiZhang();//发送’h’,小车进入避障模式自动工作break;

case'i':MY_DISTANCE();//发送’i’,小车测距并返回给手机距离值break;case'j':if(LASER_Flag==0)LASER_ON_SWITCH();elseif(LASER_Flag==1)LASER_OFF_SWITCH();

break;//发送’j’,先判断当前激光灯是否亮起,若//亮起则关闭激光灯,若不亮则开启激光灯}}}

/***********************************************************************

**********舵机转动函数,由于蓝牙每次接收的是字符,无法直接给*********************舵机输入的pwm值赋值,所以通过下面两个舵机的左右转向*********************函数使舵机连续转动。再通过中止命令终止转动,从而使*********************舵机转动到任意角度***********

·6·

***********************************************************************/

voidBT_SERVO_REDUCE()//舵机左转

{

while(!Serial.available())//若无指令到来,则循环执行本条程序{

BT_PWM-=2;

if(BT_PWM150)BT_PWM=150;myservo.write(BT_PWM);delay(50);}}

/***********激光灯开关函数*************/

voidLASER_ON_SWITCH()//开启激光灯{

LASER_Flag=1;//先判断当前激光灯状态,1则当前关//闭,0则当前开启while(!Serial.available()){

LASER_ON;//开启激光灯

}}

voidLASER_OFF_SWITCH()//关闭激光灯,原理同上{

LASER_Flag=0;

while(!Serial.available()){

LASER_OFF;}}

/************测距模块工作函数***********/voidMY_DISTANCE(){

·7·

digitalWrite(Triq,LOW);//先向Triq引脚输送一个大于10us的高电平delayMicroseconds(2);digitalWrite(Triq,HIGH);delayMicroseconds(10);

distance=pulseIn(Echo,HIGH);//检测Echo高电平持续时间,返回单位是usdistance=distance*0.018;//由时间转换成距离

Serial.print(\//串口打印〞distance=〞这几个字符Serial.print(distance);//串口打印测得的距离值Serial.println(\//串口打印单位cm

}

/************电机转向函数**************/

voidturnleft()//通过给(A1,B1,A2,B2)引脚赋值(0,1,1,0),使小车左转//赋0表示引脚低电平,赋1表示引脚高电平{

digitalWrite(INT_A1,0);digitalWrite(INT_B1,1);digitalWrite(INT_A2,1);digitalWrite(INT_B2,0);}

voidturnright()//通过给(A1,B1,A2,B2)引脚赋值(1,0,01),使小车右转//赋0表示引脚低电平,赋1表示引脚高电平{

digitalWrite(INT_A1,1);digitalWrite(INT_B1,0);digitalWrite(INT_A2,0);digitalWrite(INT_B2,1);}

voidforward()//通过给(A1,B1,A2,B2)引脚赋值(0,1,0,1),使小车前进//赋0表示引脚低电平,赋1表示引脚高电平{

digitalWrite(INT_A1,0);digitalWrite(INT_B1,1);digitalWrite(INT_A2,0);digitalWrite(INT_B2,1);}

voidbackup()//通过给(A1,B1,A2,B2)引脚赋值(1,0,1,0),使小车后退//赋0表示引脚低电平,赋1表示引脚高电平

·8·

{

digitalWrite(INT_A1,1);digitalWrite(INT_B1,0);digitalWrite(INT_A2,1);digitalWrite(INT_B2,0);}

voidstopcar()//通过给(A1,B1,A2,B2)引脚赋值(0,0,0,0),使小车中止//赋0表示引脚低电平,赋1表示引脚高电平{

digitalWrite(INT_A1,0);digitalWrite(INT_B1,0);digitalWrite(INT_A2,0);digitalWrite(INT_B2,0);}

/***注意赋值可能由于电机的连接方式不同而有所改动,具体可自己试验得出正确赋值***/

/****************避障模式****************/

voidBiZhang(){

while(!Serial.available()){

MY_DISTANCE();//引用测距函数先测量距离

delay(50);

if(

温馨提示

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

评论

0/150

提交评论