极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 35665|回复: 8

基于蓝牙控制的超声波避障及热释电传感小车 ——————————感谢极客工坊这段...

[复制链接]
发表于 2016-1-12 10:47:31 | 显示全部楼层 |阅读模式
本帖最后由 小小生 于 2016-1-12 10:53 编辑

基于蓝牙控制的超声波避障及热释电传感小车
——————————感谢极客工坊这段时间对我们组的帮助
实验器材:
1.Uno开发板*2
2.拓展版*1
3.L298N电机驱动模块 *1
4.小车底盘 *1
5.热释电传感器*1
6.超声波传感器*1
7.蓝牙模块 *1
8.舵机*2
9.激光发射器*1
10.电源(7~9V)*2
11.导线 若干



实验目标:
基于模块化设计的理念,将小车分为两个模块。
1.动力控制系统,顾名思义,L298N电机与蓝牙模块,以及超声波避障模块接与开发板1.外界9v电源.
2.热释电监控系统,将热释电传感器,激光发射器及二个舵机(可实现两个维度)接于开发板2,外界9v电源2.


实验原理:
1.        动力控制系统:
○1L298N电机,INT1,2,3,4分别接开发板的4,5,6,7引脚,ENA(左轮调速),ENB(右轮调速)接引脚9,10.电机输出OUT1,2接右轮,电机输出OUT3,4接左轮。外接9v电源正极接电机vcc,负极接电机GN.开发板GND接于电机GND(开发板与电机共地),开发板正极接于电机5v接口。
○2蓝牙模块,vcc接开发板5v,GND接开发板GND,TX接开发板RX,RX接开发板TX.
○3超声波避障。Vcc接电机5v(接开发板没用),GND接开发板GND,TrigPin接开发板引脚2,EchoPin接开发板引脚3。
2.        热释电监控系统:
○1热释电传感器,中间借口为vcc接开发板5v,GND接开发板GND,vcc右边借口为VCC接开发板引脚2。
○2激光发射器,正极接引脚10负极接地。
○32维度舵机,通过两个1维度舵机组装而成实现上下左右扫射功能,舵机vcc接开发板5v,GND接开发板GND,信号输出分别接引脚8,9。


实验功能:
1.        动力控制系统,基于蓝牙控制,通过蓝牙手机或电脑控制小车的移动,通过改变代码中ENA,ENB的值调节速度(蓝牙控制调速暂不实现),修正小车前进是出现的偏差。通过超声波传感器反馈的前方障碍距离,实现避障。当前方有障碍时可通过手动或自动避障。
2.        热释电监控系统,核心部件热释电传感器,通过传感器探测前方热源移动,进而引发舵机的转动及激光发射器(武器或灯光功能),对前方进行火力覆盖或灯光探照,监控人员移动。可添加蜂鸣器或摄像头等实现监控功能。


实验代码:
1.        动力控制系统:
#define IN1 4
#define IN2 5     //定义In1接arduino的4引脚,In2接5引脚
#define IN3 6
#define IN4 7
int Rspeed=60;
int pwmleft=9;
int pwmright=10;//定义IN3接arduino的6引脚,IN4接7引脚
const int TrigPin = 2;
const int EchoPin = 3;
int cm;

void forward( );
void back( );
void turnLeft( );
void turnRight( );
void turnbackLeft( );
void turnbackRight( );
void turnLeftOrigin( );
void turnRightOrigin( );
void _stop();          //这里是把我们用到的函数都声明一遍

void setup()
{
  pinMode(TrigPin, OUTPUT);
  pinMode(EchoPin, INPUT);
  pinMode(IN1,OUTPUT);
  pinMode(IN2,OUTPUT);
  pinMode(IN3,OUTPUT);
  pinMode(IN4,OUTPUT);
  pinMode(pwmleft,OUTPUT);
  pinMode(pwmright,OUTPUT);
  Serial.begin(9600);
}
int i;
void loop()
{
  digitalWrite(TrigPin, LOW); //低高低电平发一个短时间脉冲去TrigPin
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);

cm = pulseIn(EchoPin, HIGH) / 58; //将回波时间换算成cm

Serial.print(cm);
Serial.print("cm");
Serial.println();
delay(1000);   

    if(Serial.available())
    {
      i=Serial.read();
      
      switch(i)
      {
         
        case'1':
          {turnLeft( );  break; }
        case'2':
          {forward( ); break; }
        case'3':
          {turnRight( );   break;}
        case'4':
          {turnLeftOrigin( );   break;}
        case'5':
          {_stop();   break;}
        case'6':
          {turnRightOrigin( );   break;}
        case'7':
          {turnbackLeft( );   break;}
        case'8':
          {back( );   break;}
        case'9':
          {turnbackRight( );   break;}
      }
    }  
  
if(cm<60)                //自动避障模块
{
  turnLeft( );
delay(800);
back( );         
delay(1000);
_stop();
delay(800);
turnRight( );
delay(800);
_stop();
delay(800);
back( );
}
}

/**************************************************
forward子函数——前进子函数
函数功能:控制车前进
**************************************************/
void forward( )
{
  digitalWrite(IN1,HIGH);      
  digitalWrite(IN2,LOW);         //左轮前进
  digitalWrite(IN3,HIGH);      
  digitalWrite(IN4,LOW);    //右轮前进
   analogWrite(pwmleft,89);
  analogWrite(pwmright,87);
}


/**************************************************
back子函数——后退子函数
函数功能:控制车后退
**************************************************/
void back( )
{
  digitalWrite(IN1,LOW);      
  digitalWrite(IN2,HIGH);        //左轮后退
  digitalWrite(IN3,LOW);      
  digitalWrite(IN4,HIGH);        //右轮后退
  analogWrite(pwmleft,88);
  analogWrite(pwmright,97);
}

/**************************************************
turnLeft子函数——左转子函数
函数功能:控制车左转
**************************************************/
void turnLeft( )
{
  digitalWrite(IN1,LOW);      
  digitalWrite(IN2,LOW);         //左轮静止不动
  digitalWrite(IN3,HIGH);      
  digitalWrite(IN4,LOW);         //右轮前进
  analogWrite(pwmright,80);
  
}


/**************************************************
turnbackLeft子函数——左后转弯子函数
函数功能:控制车左后转弯
**************************************************/
void turnbackLeft( )
{
  digitalWrite(IN1,LOW);      
  digitalWrite(IN2,LOW);         //左轮静止不动
  digitalWrite(IN3,LOW);      
  digitalWrite(IN4,HIGH);         //右轮后退
analogWrite(pwmright,100);  
}

/**************************************************
turnRight子函数——右后转弯转子函数
函数功能:控制车右后转弯
**************************************************/
void turnRight( )
{
  digitalWrite(IN1,HIGH);      
  digitalWrite(IN2,LOW);         //左轮前进
  digitalWrite(IN3,LOW);      
  digitalWrite(IN4,LOW);         //右轮静止不动
  analogWrite(pwmleft,80);
}

/**************************************************
turnbackRight子函数——右转子函数
函数功能:控制车右转
**************************************************/
void turnbackRight( )
{
  digitalWrite(IN1,LOW);      
  digitalWrite(IN2,HIGH);         //左轮后退
  digitalWrite(IN3,LOW);      
  digitalWrite(IN4,LOW);         //右轮静止不动
  analogWrite(pwmleft,100);  
}
/**************************************************
turnLeftOrigin子函数——原地左转子函数
函数功能:控制车原地左转
**************************************************/
void turnLeftOrigin( )
{
  digitalWrite(IN1,LOW);      
  digitalWrite(IN2,HIGH);        //左轮后退
  digitalWrite(IN3,HIGH);      
  digitalWrite(IN4,LOW);         //右轮前进
  analogWrite(pwmleft,100);
  analogWrite(pwmright,100);
   
}


/**************************************************
turnRightOrigin子函数——原地右转子函数
函数功能:控制车原地右转
**************************************************/
void turnRightOrigin( )
{
  digitalWrite(IN1,HIGH);      
  digitalWrite(IN2,LOW);        //左轮前进
  digitalWrite(IN3,LOW);      
  digitalWrite(IN4,HIGH);       //右轮后退
  analogWrite(pwmleft,100);
  analogWrite(pwmright,100);
  
}



/**************************************************
stop子函数—停止子函数
函数功能:控制车停止
**************************************************/
void _stop()
{
  digitalWrite(IN1,LOW);      
  digitalWrite(IN2,LOW);         //左轮静止不动
  digitalWrite(IN3,LOW);      
  digitalWrite(IN4,LOW);         //右轮静止不动
   analogWrite(pwmleft,0);
   analogWrite(pwmright,0);
}


2.        热释电监控系统:
int ledPin = 10;       // LED 模块接于数字口10
int sensor = 2;       //红外热释传感器模块接于数字口2
int val = 0;          //暂存传感器信息


int servopin=8;//定义数字接口8 连接伺服舵机信号线
int a=9;//定义数字接口9 连接伺服舵机信号线
int myangle;//定义角度变量
int pulsewidth;//定义脉宽变量
int vat=1;//读取串行端口的值;
int x=1;
void servopulse(int servopin,int myangle)//定义一个脉冲函数
{
pulsewidth=(myangle*11)+500;//将角度转化为500-2480 的脉宽值
digitalWrite(servopin,HIGH);//将舵机接口电平至高
delayMicroseconds(pulsewidth);//延时脉宽值的微秒数
digitalWrite(servopin,LOW);//将舵机接口电平至低
delay(20-pulsewidth/1000);
}
void setup()
{
  pinMode(servopin,OUTPUT);//设定舵机接口为输出接口
  pinMode(a,OUTPUT);//设定舵机接口为输出接口
Serial.begin(9600);//连接到串行端口,波特率为9600
Serial.println("servo=o_seral_simple ready" ) ;
  
  pinMode(ledPin, OUTPUT);      // 设置数字接口为输出模式
  digitalWrite(ledPin,HIGH);    //初始化熄灭灯
  
  pinMode(sensor, INPUT);       // 设置数字接口为输入模式
}
void loop()
{
  val = digitalRead(sensor);   // 读传感器信息
  if(HIGH == val)//如果检测到人移动
{

digitalWrite(ledPin,HIGH);
{
  vat=5*(180/9);//将数字转化为角度
Serial.print("moving servo to ");
Serial.print(vat,DEC);
Serial.println();
for(int i=0;i<=15;i++) //给予舵机足够的时间让它转到指定角度
{
servopulse(a,vat);//引用脉冲函数
}
vat=2*(180/9);//将数字转化为角度
Serial.print("moving servo to ");
Serial.print(vat,DEC);
Serial.println();
for(int i=0;i<=30;i++) //给予舵机足够的时间让它转到指定角度
{
servopulse(servopin,vat);//引用脉冲函数
}
vat=8*(180/9);//将数字转化为角度
Serial.print("moving servo to ");
Serial.print(vat,DEC);
Serial.println();
for(int i=0;i<=30;i++) //给予舵机足够的时间让它转到指定角度
{
servopulse(servopin,vat);//引用脉冲函数
}
}
{
vat=4*(180/9);//将数字转化为角度
Serial.print("moving servo to ");
Serial.print(vat,DEC);
Serial.println();
for(int i=0;i<=15;i++) //给予舵机足够的时间让它转到指定角度
{
servopulse(a,vat);//引用脉冲函数
}   
vat=2*(180/9);//将数字转化为角度
Serial.print("moving servo to ");
Serial.print(vat,DEC);
Serial.println();
for(int i=0;i<=30;i++) //给予舵机足够的时间让它转到指定角度
{
servopulse(servopin,vat);//引用脉冲函数
}
vat=8*(180/9);//将数字转化为角度
Serial.print("moving servo to ");
Serial.print(vat,DEC);
Serial.println();
for(int i=0;i<=30;i++) //给予舵机足够的时间让它转到指定角度
{
servopulse(servopin,vat);//引用脉冲函数
}
}

{
  vat=5*(180/9);//将数字转化为角度
Serial.print("moving servo to ");
Serial.print(vat,DEC);
Serial.println();
for(int i=0;i<=15;i++) //给予舵机足够的时间让它转到指定角度
{
servopulse(a,vat);//引用脉冲函数
}
vat=2*(180/9);//将数字转化为角度
Serial.print("moving servo to ");
Serial.print(vat,DEC);
Serial.println();
for(int i=0;i<=30;i++) //给予舵机足够的时间让它转到指定角度
{
servopulse(servopin,vat);//引用脉冲函数
}
vat=8*(180/9);//将数字转化为角度
Serial.print("moving servo to ");
Serial.print(vat,DEC);
Serial.println();
for(int i=0;i<=30;i++) //给予舵机足够的时间让它转到指定角度
{
servopulse(servopin,vat);//引用脉冲函数
}
}
{
vat=4*(180/9);//将数字转化为角度
Serial.print("moving servo to ");
Serial.print(vat,DEC);
Serial.println();
for(int i=0;i<=15;i++) //给予舵机足够的时间让它转到指定角度
{
servopulse(a,vat);//引用脉冲函数
}   
vat=2*(180/9);//将数字转化为角度
Serial.print("moving servo to ");
Serial.print(vat,DEC);
Serial.println();
for(int i=0;i<=30;i++) //给予舵机足够的时间让它转到指定角度
{
servopulse(servopin,vat);//引用脉冲函数
}
vat=8*(180/9);//将数字转化为角度
Serial.print("moving servo to ");
Serial.print(vat,DEC);
Serial.println();
for(int i=0;i<=30;i++) //给予舵机足够的时间让它转到指定角度
{
servopulse(servopin,vat);//引用脉冲函数
}
}
  }

//如果没有检测到人移动
  else
  {digitalWrite(ledPin,LOW);    // 熄灭LED灯

  }
}

到这里一个完整的小车就实现了,这些也是我们组在极客工坊的帮助下作的成果。在老师同学及工坊中各位的帮助下,几天时间从刚接触ardunio平台到做出小车感到非常自豪。再次感谢大家,同时希望我们做的能给大家一点帮助。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2016-1-12 10:58:41 | 显示全部楼层
还有不足之希望大家多提意见,有不懂得也可以相互交流学习。
回复 支持 反对

使用道具 举报

发表于 2016-1-12 11:12:47 | 显示全部楼层
视频上传一个啊
回复 支持 反对

使用道具 举报

发表于 2016-1-12 11:32:03 | 显示全部楼层
建议来一个避障视频
回复 支持 反对

使用道具 举报

发表于 2016-1-12 13:35:37 | 显示全部楼层
建议用锂电池,南孚太奢侈啦。
回复 支持 反对

使用道具 举报

发表于 2016-1-12 16:46:24 | 显示全部楼层
电池用充电的啊,用南孚,太豪了···
回复 支持 反对

使用道具 举报

发表于 2016-3-29 22:32:12 | 显示全部楼层
请问群主的这些东西都是什么型号 啊
回复 支持 反对

使用道具 举报

发表于 2020-4-7 17:28:41 | 显示全部楼层
请问你这个可以实现手动模式和自动模式的切换吗
回复 支持 反对

使用道具 举报

发表于 2020-4-27 16:26:13 | 显示全部楼层
能不能用一块arduino板来实现这个功能呢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-28 22:19 , Processed in 0.050418 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表