LabVIEW Arduino无线蓝牙遥控智能车(项目篇—2)

这篇具有很好参考价值的文章主要介绍了LabVIEW Arduino无线蓝牙遥控智能车(项目篇—2)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1、项目概述

2、项目架构

3、传感器和控制器

3.1、传感器

3.2、控制器

4、硬件环境

5、Arduino功能设计

6、LabVIEW功能设计

6.1、前面板设计

6.2、程序框图设计


1、项目概述

智能小车是以轮子作为移动机构,并且能够实现自主行驶的机器人,又被称为轮式机器人。由于具有智能化的特点,可以应用于不适合人类工作的环境中,例如灾难救援、户外探险等。智能小车有别于遥控小车,因为后者需要操作人员来控制其转向、启停和前进后退,以及控制其速度,常见的模型小车,都属于这类遥控车。智能小车,则可以通过计算机编程来实现其对行驶方向、启停以及速度的控制,无须人工干预,也可以通过修改智能小车的程序来改变它的行驶方式。

LabVIEW Arduino无线蓝牙遥控智能车(项目篇—2)

智能小车的典型特点有:

1、拥有至少一个微控制器,通过微控制器来实现对行驶方向、启停和速度的控制。

2、拥有多个各种功能的传感器,以获取外界环境的情况,以供控制器做出准确的决策。

2、项目架构

本节将要介绍一种基于Arduino与LabVIEW的无线遥控智能小车,可以实现自主(巡线和避障)与遥控两种功能,并且可以在两种功能之间进行切换。智能小车采用Arduino作为控制核心,上位机软件采用LabVIEW,两者通过APC220无线数传模块实现无线通信。无线遥控智能小车总体框图如下图所示:

LabVIEW Arduino无线蓝牙遥控智能车(项目篇—2)

项目资源下载请参见:LabVIEWArduino无线蓝牙遥控智能车【实战项目】-单片机文档类资源 文章来源地址https://www.toymoban.com/news/detail-409034.html

智能小车的车体采用两个驱动轮、一个万向轮的三轮式小车模型,驱动电机采用直流减速电机,电机驱动模块采用VNH2SP30模块,循迹传感器采用OPENJUMPER红外巡线传感器OJ-CG307,避障传感器采用OPENJUMPER红外避障传感器OJ-CG303。

智能小车的巡线场地为白底黑线,线宽约10mm,场地大小约为200cm×300cm。

LabVIEW Arduino无线蓝牙遥控智能车(项目篇—2)

3、传感器和控制器

3.1、传感器

本节介绍的无线遥控智能小车,可以实现自主与遥控两种功能,并且可以在两种功能之间进行切换。当小车处于遥控状态时,操作者通过操作LabVIEW上位机软件,利用APC220串口无线模块向小车上的Arduino控制器发送遥控指令,从而使小车做出指定的行为动作。而当小车处于自主状态时候,小车上的Arduino控制器通过四个红外巡线传感器和一个红外避障传感器获取小车相对于黑线的位置和前面是否有障碍物的信号,并根据程序中设置的逻辑来控制直流减速电机,以实现巡线和避障的功能。

红外巡线传感器模块是利用红外对管检测模块本身发出的红外线的反射光(深色反射弱,浅色反射强),来为循迹机器人提供白线或者黑线的跟踪,既可以检测白底中的黑线,也可以检测黑底中的白线,若检测到白线则输出高电平,若检测到黑线则输出低电平。

红外避障传感器发射红外线并根据反射回来的红外光判断前方是否存在障碍物,无障碍物时输出高电平,有障碍时输出低电平,在信号输出同时有指示灯指示状态,无障碍物时LED为绿,有障碍物时为红。同时内置38kHz的信号发生器,抗干扰能力强。通过调节模块上的2KΩ电位器,可以调节传感器的探测距离。

红外巡线传感器模块如下图所示:

LabVIEW Arduino无线蓝牙遥控智能车(项目篇—2)

红外避障传感器模块如下图所示:

LabVIEW Arduino无线蓝牙遥控智能车(项目篇—2)

3.2、控制器

一般情况下,直流电机需要很大的驱动电流,而像Arduino之类的控制器输出的逻辑电平无法直接驱动直流电机,特别是大功率的减速电机,所以就需要通过驱动器件给直流电机提供工作电流。

Arduino爱好者常用的直流电机驱动模块主要有L298模块和VNH2SP30模块。

L298电机驱动模块价格较为便宜,而且单个L298芯片可以同时驱动两路直流电机,所以在Arduino爱好者制作机器人小车时使用较多,但是其转化效率较低,发热量较大,不适合驱动大电流直流电机,当驱动大电流电机时容易发生芯片"假死"等故障。

LabVIEW Arduino无线蓝牙遥控智能车(项目篇—2)

VNH2SP30模块具有驱动电流大、转换效率高等优点但是单个VNH2SP30芯片只能驱动一路直流电机,如果驱动两路直流电机则需要两个VNH2SP30芯片。 

LabVIEW Arduino无线蓝牙遥控智能车(项目篇—2)

为了使得遥控智能小车具有良好的动力系统,具有一定的载重能力,此处选用直流减速电机作为整个遥控智能小车的动力来源,并选用颗粒轮胎,以提高抓地能力。

LabVIEW Arduino无线蓝牙遥控智能车(项目篇—2)

4、硬件环境

将两个直流减速电机的两端分别接至VNH2SP30电机驱动模块上的OUT1A、OUT1B和OUT2A、OUT2B,无正负极和电机转向之分。若电机转向相反,则在调试过程中将电机的连接线对调连接。将VNH2SP30电机驱动模块的+5V (IN)、GND分别接至Arduino Uno控制板上的+5V、GND,为电机驱动模块提供工作电压。

将VNH2SP30电机驱动模块的1INA、1INB、1PWM分别接至Arduino Uno控制板上的数字端口D7、D6、D5,为电机1提供转向和调速控制信号;将VNH2SP30电机驱动模块的2INA、2INB、2PWM分别接至Arduino Uno控制板上的数字端口D4、D2、D3,为电机2提供转向和调速控制信号。需要注意的是,1PWM和2PWM需要接在具有模拟输出(PWM)功能的数字端口。

Arduino控制器与驱动及电机部分的硬件连接,如下图所示:

LabVIEW Arduino无线蓝牙遥控智能车(项目篇—2)

将一个APC220模块与Arduino Uno控制板相连接,连接方式如下:

APC220 TXD→Arduino Uno控制板RXD,APC220 RXD→Arduino Uno控制板TXD,APC220 VCC→Arduino Uno控制板5V,APC220 GND→Arduino Uno控制板GND。

将另一块APC220模块通过FT232RL转接板相连接,连接方式如下:

APC220 TXD→FT232RL转接板RXD,APC220 RXD→FT232RL转接板TXD,APC220 VCC→FT232RL转接板5V,APC220 GND→FT232RL转接板GND。

将四个红外巡线传感器依次连接至Arduino Uno控制板的数字端口D8、D9、D10、D11,并在将红外巡线传感器安装至智能小车底盘时,对应于左2、左1、右1和右2。将红外避障传感器连接至Arduino Uno控制板的数字端口D12,并将其安装在小车车头的前端。

5、Arduino功能设计

4个红外巡线传感器在智能小车底盘上的安装示意图如下图所示:

LabVIEW Arduino无线蓝牙遥控智能车(项目篇—2)

初始状态为黑线位于左1和右1传感器之间,表明小车处于黑线中间部分;当左1传感器检测到黑线时,表明小车相对于黑线略微偏向右侧,需要小幅度左转以修正偏差;当左2传感器检测到黑线时,表明小车相对于黑线偏向右侧较多,需要大幅度左转以修正偏差;当右1传感器检测到黑线时,表明小车相对于黑线略微偏向左侧,需要小幅度右转以修正偏差;当右2传感器检测到黑线时,表明小车相对于黑线偏向左侧较多,需要大幅度右转以修正偏差。

遥控部分的调速将速度分为5档,分别为低速、中低速、中速、中高速和高速,通过VNH2SP30电机驱动模块的PWM输入信号实现在五档之间切换与调速。

Arduino Uno控制器程序代码如下所示:

#define forward_command   0x00   //前进命令
#define back_command      0x10   //后退命令
#define left_command       0x20   //左转命令
#define right_command      0x30   //右转命令
#define stop_command      0x40   //停止命令

#define speed_1           0x50   //低速命令
#define speed_2           0x60   //中低速命令
#define speed_3           0x70   //中速命令
#define speed_4           0x80   //中高速命令
#define speed_5           0x90   //高速命令

byte comdata[3]={0};   //定义数组数据,用于存放串口命令数据
int flag = 0;           //遥控/自动标志位,默认为遥控模式

int INA1 = 7;
int INB1 = 6;
int PWM1 = 5;      //定义电机1的转向和速度的控制引脚
int INA2 = 4;
int INB2 = 2;
int PWM2 = 3;      //定义电机2的转向和速度的控制引脚

int Trace_sensor_X1=8;
int Trace_sensor_X2=9;
int Trace_sensor_Y1=10;
int Trace_sensor_Y2=11;      //定义四个红外循迹传感器的引脚
int Avoidance_sensor=12;     //定义红外避障传感器的引脚

void receive_data(void);      //接收串口命令数据
void test_do_data(void);      //测试串口命令数据是否正确,并执行命令

void forward(void);     	 //前进子函数
void back(void);        	 //后退子函数
void turn_Left(void);      	//左转子函数
void turn_Right(void);    	 //右转子函数
void stop_car(void);             //停止子函数

void Automatic_mode(void);      //自动模式子函数

void setup()
{
  Serial.begin(9600);             //初始化串口波特率为9600
  pinMode(INA1, OUTPUT);
  pinMode(INB1, OUTPUT);
  pinMode(PWM1, OUTPUT);      //设置电机1的控制引脚为输出状态
  pinMode(INA2, OUTPUT);
  pinMode(INB2, OUTPUT);
  pinMode(PWM2, OUTPUT);      //设置电机2的控制引脚为输出状态
  
  pinMode(Trace_sensor_X1, INPUT);
  pinMode(Trace_sensor_X2, INPUT);
  pinMode(Trace_sensor_Y1, INPUT);
  pinMode(Trace_sensor_Y2, INPUT); //设置红外循迹传感器的控制引脚为输入状态
  pinMode(Avoidance_sensor,INPUT); //设置红外避障传感器的控制引脚为输入状态
  
  analogWrite(PWM1,150); //left motor
  analogWrite(PWM2,150); //ringt motor    //将电机速度设置为中速档位
}

void loop()
{
  if (Serial.available() > 0)      //不断检测串口是否有数据
   {
        receive_data();            //从串口缓冲区接收串口命令数据
        test_do_data();            //测试串口命令数据是否正确并执行命令
   }
   if(flag==1)            //判断是否为自动模式状态
   { 
	Automatic_mode();               	//执行自动模式
	analogWrite(PWM1,150); //left motor 
	analogWrite(PWM2,150); //ringt motor     //将电机速度切换至中速档位
   }
}

void receive_data(void)   //从串口缓冲区接收串口命令数据
{
   int i ;
   for(i=0;i<3;i++)   //命令长度为3个字节,每次读取3个字节
   {
      comdata[i] =Serial.read();   //读取一个字节的数据
      //延时一会,让串口缓存准备好下一个字节,不延时可能会导致数据丢失,
       delay(2);
   }
}

void test_do_data(void)      //测试串口命令数据是否正确并执行命令
{
  if(comdata[0] == 0x55)            //0x55为命令帧头,判断帧头是否正确
   {
     if(comdata[1] == 0xAA)        //0xAA为遥控模式命令
     {
	flag=0;       	      //切换至遥控模式
         switch (comdata[2])         //匹配遥控模式中的具体命令
          {
            case forward_command:      //前进命令
                 forward();
                 break;
            case back_command:         //后退命令
	         back();
                 break ;
            case left_command:          //左转命令
	         turn_Left();
                 break ;
            case right_command:         //右转命令
	         turn_Right();
                 break ;
            case stop_command:         //停止命令
	         stop_car();
                 break ;
	    case speed_1:               //低速命令
	         analogWrite(PWM1,50);
	         analogWrite(PWM2,50);  
                 break;
            case speed_2:                //右转命令
	         analogWrite(PWM1,100); 
	         analogWrite(PWM2,100); 
                 break ;
            case speed_3:                //右转命令
		 analogWrite(PWM1,150); 
		 analogWrite(PWM2,150); 
                 break ;
            case speed_4:                //右转命令
		 analogWrite(PWM1,200); 
		 analogWrite(PWM2,200); 
                 break ;
	    case speed_5:                //右转命令
	         analogWrite(PWM1,250);
		 analogWrite(PWM2,250); 
                 break ;
          }             
       }
      if(comdata[1] == 0xFF)        //0xFF为自主模式命令
      {
        flag=1;       	      //切换至自主模式
        comdata[2] = 0;       	      //清空命令数据
      }
   }
}

void Automatic_mode(void)     //自主模式,循迹和避障
{
	int State_value=0;
	if(digitalRead(Avoidance_sensor)==0)   //避障功能,有障碍物则后退左转
	{
		back();
		delay(1000);
		turn_Left();
		delay(500);
	}
	//读取红外循迹传感器组的状态
	State_value=digitalRead(Trace_sensor_X2)*8+digitalRead(Trace_sensor_X1)*4+digitalRead(Trace_sensor_Y1)*2+digitalRead(Trace_sensor_Y2);
	switch (State_value)     //匹配状态,并调整位置
       	{
            case 8:               //大幅度偏左,大角度右转
		turn_Right();
		delay(200);
                   break;
            case 4:               //小幅度偏左,小角度右转
		turn_Right();			
		delay(100);
                   break ;
            case 2:               //小幅度偏右,小角度左转
		turn_Left();
		delay(100);
                   break ;
            case 1:               //大幅度偏右,大角度左转
		turn_Left();
		delay(200);
                   break ;
            default:               //其他状态,前进
		forward();
		break;
        	}		
}

void forward(void)    //前进
{
	digitalWrite(INA1, LOW); 
	digitalWrite(INB1, HIGH); 
	digitalWrite(INA2, LOW); 
	digitalWrite(INB2, HIGH); 
}
void back(void)    //后退
{
	digitalWrite(INA1, HIGH); 
	digitalWrite(INB1, LOW); 
	digitalWrite(INA2, HIGH); 
	digitalWrite(INB2, LOW); 
}
void turn_Left(void)    //左转
{
	digitalWrite(INA1, LOW); 
	digitalWrite(INB1, HIGH); 
	digitalWrite(INA2, HIGH); 
	digitalWrite(INB2, LOW); 
}
void turn_Right(void)    //右转
{
	digitalWrite(INA1, HIGH); 
	digitalWrite(INB1, LOW); 
	digitalWrite(INA2, LOW); 
	digitalWrite(INB2, HIGH); 
}
void stop_car(void)    //停止
{
	digitalWrite(INA1, LOW); 
	digitalWrite(INB1, LOW); 
	digitalWrite(INA2, LOW); 
	digitalWrite(INB2, LOW); 
}

6、LabVIEW功能设计

LabVIEW上位机部分需要完成以下功能:

1、当从遥控状态切换至自主状态时,向下位机Arduino控制器发送自主状态命令,Arduino控制器通过读取红外巡线传感器和红外避障传感器,以实现巡线和避障的功能。

2、当从自主状态切换至遥控状态时,向下位机Arduino控制器发送遥控状态命令,Arduino控制器通过读取LabVIEW软件发来的操作命令,并实现指定的动作和行为,包括前进、后退、左转、右转、停止和调速。

6.1、前面板设计

LabVIEW前面板分为遥控模式和模式切换两个部分,遥控模式部分用于控制小车的运行状态,包括前进、后退、左转、右转、停止和调速;模式选择部分用于切换遥控模式和自主模式。

无线遥控智能小车的LabVIEW上位机前面板,如下图所示:

LabVIEW Arduino无线蓝牙遥控智能车(项目篇—2)

6.2、程序框图设计

LabVIEW上位机主程序的结构为顺序结构+While循环+事件结构。首先,通过设置的串口号来初始化串口通信;然后,程序进入While循环和事件结构,不断地检测是否有事件得到响应并执行;事件结构有“模式选项"、“前进”、“后退”、“左转"、“右转"、“停止"和“"调速"。最后,关闭串口通信。在程序框图中,我们需要对串口进行配置,并将根据不同的按键按下通过串口发出不同的命令,下位机Arduino Uno收到串口收据,解析出其中的命令代码后执行相应的命令。

为了更好地实现通信,制定如下的通信协议:帧头+命令码+操作码。0x55为帧头,0xAA为遥控命令,0xFF为自主命令,遥控命令的操作码:0x00为前进,0x10为后退,0x20为左转,0x30为右转,0x40为停止,0x50为速度档1,0x60为速度档2,0x70为速度档3,0x80为速度档4,0x90为速度档5。

在“模式选项”事件中,通过读取当前选择的模式,向Arduino控制器分别发送0x55AA和Ox55FF,分别表示切换至遥控模式和自主模式。“模式选项”值改变事件程序框图如下图所示:

LabVIEW Arduino无线蓝牙遥控智能车(项目篇—2)

在“前进"事件中,通过串口向Arduino控制器发送0x55AA00,Arduino控制器将两个直流减速电机均设置为前进方向。“前进"值改变事件程序框图如下图所示:

LabVIEW Arduino无线蓝牙遥控智能车(项目篇—2)

在“后退"事件中,通过串口向Arduino控制器发送0x55AA10,Arduino控制器将两个直流减速电机均设置为后退方向。“后退"值改变事件程序框图如下图所示:

LabVIEW Arduino无线蓝牙遥控智能车(项目篇—2)

在“左转"事件中,通过串口向Arduino控制器发送0x55AA20,Arduino控制器将右侧电机设置为前进方向、左侧电机设置为后退方向,从而实现左转。“左转"值改变事件程序框图如下图所示:

LabVIEW Arduino无线蓝牙遥控智能车(项目篇—2)

在“右转”事件中,通过串口向Arduino控制器发送0x55AA30,Arduino控制器将右侧电机设置为后退方向、左侧电机设置为前进方向,从而实现右转。“右转"值改变事件程序框图如下图所示:

LabVIEW Arduino无线蓝牙遥控智能车(项目篇—2)

均在“停止"事件中,通过串口向Arduino控制器发送0x55AA40,Arduino控制器将左、右两个电机均设置为停止状态,从而实现小车的停止。“停止"值改变事件程序框图如下图所示:

LabVIEW Arduino无线蓝牙遥控智能车(项目篇—2)

在“速度档位"值改变事件中,通过读取当前选择的速度档位,向Arduino控制器分别发送0x55AA50、0x55AA60、0x55AA70、0x55AA80、0x55AA90,分别表示低速、中低速、中速、中高速和高速。“速度档位"值改变事件的程序框图如下图所示:

LabVIEW Arduino无线蓝牙遥控智能车(项目篇—2)

项目资源下载请参见:LabVIEWArduino无线蓝牙遥控智能车【实战项目】-单片机文档类资源 

到了这里,关于LabVIEW Arduino无线蓝牙遥控智能车(项目篇—2)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 104、基于51单片机智能风扇pwm调速红外遥控无线遥控风扇温控风扇系统设计

    毕设帮助、开题指导、技术解答(有偿)见文末。 目录 摘要 一、硬件方案 二、设计功能 三、实物图 四、原理图 五、Protues仿真 六、流程图 七、程序源码 八、资料包括 随着气温的逐渐上升,风扇的需求量也逐渐扩大。传统风扇不能根据外界温度的变化对风扇转速快慢进行

    2024年02月15日
    浏览(72)
  • 基于FPGA的蓝牙遥控,超声波避障,红外循迹的智能小车

            闲来无事整个小车玩玩,设想的小车可以有蓝牙模块来控制模式切换,通过发送指令来更改相对应的功能,当避障的时候可以自动规避障碍物,当处于红外循迹时,可以跟随规划的轨迹前线,当手动遥控时可以控制前进后退左右转向停止等功能。         先介绍一下

    2024年02月07日
    浏览(49)
  • 智能安全帽~生命体征检测与危险气体检测一体化集成设计还是蓝牙无线外挂式方式好?

    生命体征(心率、血氧等)检测上报平台,危险气体采集上报平台,是智能安全帽产品中常见的两种选配件,它们的实现有两种典型的模式: 1)将传感器集成到主板上,做成一体化的智能安全帽形态; 2)采用外挂式模式,典型的就是数据采集后,走蓝牙无线上报到智能安全

    2024年02月09日
    浏览(77)
  • 【Arduino实验14 红外遥控】

    目录 一、实验目的 二、实验设备与环境 三、实验重点 四、实验难点 五、实验内容 5.1实验任务 5.2实验原理 ​5.3实验内容 5.4实验结果 5.5思考题         1熟悉红外遥控发射、接收模块的基本的原理;         2理解红外遥控器的编码原理;         3 编写红外遥控

    2024年02月05日
    浏览(41)
  • STM32蓝牙遥控小车

    前言 一、STM32小车效果图 二、硬件设计 1.电机驱动对比 2.蓝牙模块 3.电机 三、小车程序 总结 STM32小车一直以来都还是众多STM32爱好者的入门设计,门槛不高,值得玩一下。         这是刚开始弄的印度风的小车,丑不拉几。         这个小车结构是:STM32C8T6为主控,1

    2024年02月07日
    浏览(35)
  • 蓝牙遥控器 – 将手机模拟为键盘、鼠标、翻页笔、遥控器

    简介: 一直在寻找将手机模拟为鼠标和键盘的软件,对于有两部手机的人来说,这会使旧手机变废为宝,将其用作主力机的键盘,用来编辑文档写写东西还是非常方便的,一方面,备用机的整个手机屏幕都是键盘,双手操持打字,速度快很多,另一方面,主力机上面没有了虚

    2024年02月13日
    浏览(49)
  • stm32蓝牙遥控小车(hal库)

     我使用的板子是stm32f103rct6,这里我们使用串口1,选择异步模式,注意波特率的选择,一般是9600或者115200,如果波特率选择不对的话是不能进行通讯的(我小车怎么也动不了搞了好久最后发现是波特率选错了,气死了),我用的蓝牙模块是HC-05(ps:我的stm32f103rct6的板子的串

    2024年02月06日
    浏览(47)
  • 5.39 综合案例2.0 - STM32蓝牙遥控小车1(手机APP遥控)

    APP遥控) 点 击 跳 转 点击跳转HaaS506官方最新案例 用STM32单片机做了一辆蓝牙控制的麦轮小车,分享一下小车的原理和制作过程。 控制部分分为手机APP,语音模块控制,Haas506开发板三种。 本文介绍手机APP的控制的方法以及小车的制作。 器件说明 器件 数量 说明 STM32F103C8T6单片

    2024年02月09日
    浏览(58)
  • 基于STM32的最简易蓝牙遥控小车

    本篇博客主要针对的读者为有一定单片机基础,但是第一次自制蓝牙遥控小车的小白同学,所用物件型号选择的是作者最熟悉、最常用的,老手请自行发挥。 硬件包括小车的机械部分、STM32f103c8t6最小系统板、ST-LINK下载器,HC-05蓝牙模块、CH340模块、L298N电机驱动模块,焊接设

    2024年02月04日
    浏览(46)
  • 基于STM32的蓝牙遥控避障小车

    文章目录 前言 一、 组成部分及功能介绍 二、 代码实例 1. main函数 2. 定时器初始化 3.串口部分 4.超声波部分 5.舵机 三、实物效果 总结     这是笔者第一次尝试在CSDN这个平台上编写文章,主要是想借此来记录一下自己做过的一些小项目,算是为生活添加乐趣叭~(^^)  本文

    2023年04月16日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包