Arduino蓝牙避障小车(新手做)

 

 

 


前言

最近学了些许Arduino知识,加之老师要求用Arduino做出一点东西用来展示,所以自己做了一个Arduino小车来玩玩,使用了类与中断的概念,若有不足,敬请指正。


 

一、材料

  1. 4节南孚电池。
  2. L298N电机驱动板。
  3. 面包板一块。
  4. Arduino uno 。
  5. 两个红外避障模块。
  6. 四个直流电机。
  7. 小车套装。
  8. 若干杜邦线。

二、连接

将电源连接在L298n的电源接口上面的电源接口上面(电源跳线不要拔掉否则有可能烧坏板),将左右两个轮字串联连接在控制板上面,将pwm跳线连接5v电源,将其他线接在Arduino板上.将两个红外避障传感器连接在面包板上面,进行连接。

电机买回来是不连接线的,需要拿锡焊,但是没有锡,实测拿热熔枪也可以进行连接,效果也不错。

三、详解

中断:

(使用外部中断:attachInterrupt(digitalPinTolnterrupt(pin,function,mode))

中断分为三种:RESET中断、内部中断、外部中断。

1.RESET管脚接低电平,则中止中断,重启Arduino

2.设定内部定时器,当达到指定时间时,将产出中断请求,常常用于定时。

3.Arduino内部中断管脚的电平变动时,将产生中断请求。

  其类似于在门口放置门铃,不需要一直等待有人敲门,而是做自己的事情,直到有人敲门,停止当前事情,前去开门,再继续自己的事情。

  注:编写ISR时:1.保持短。2.勿使用延时。3.不做连续输出。4.不要开关中断。

类:

“类”是一种特殊的函数,它和普通函数不同,它需要先对象化才能够使用,不管是特殊的函数“类”还是普通的函数,它们可以被打包成一个“库”。

我所认为的类则是自己写库,将一些代码封装在类中,当需要调用他们的时候,则是调用拥有这些代码的函数,这样在进行编程的时候可以更加容易且高效。

“类”就是一堆拥有特殊用途的“函数”,这些函数只能用在某一种特定的问题上。”

特征:1.封装2.继承3.多态。

红外避障模块:

 通过不断发出的红外线感知前方是否有物体,若有,则返回低电平,有则返回高电平。

 中间的调节旋钮可以调节测量距离以及频率。

L298N:

L298n具有两对电机驱动脚、一个电源输入口、GND口一对调速口和两对电机控制口。以他们来控制电机。

调速口打开后,可以使用电机控制口对电机进行PWM调速,它可以控制两个直流电机或者一个步进电机。

IN1/3   IN2/4     状态

  0             1          

  1             0          

HC-06蓝牙模块

HC-06蓝牙模块:

  通过四个引脚(VCCGNDR/TX)与控制板连接。

  VCC:接电源(3.3V~6V)。

  TX:接Arduino RX

  RX:接Arduino TX(3.3V)

  GND:接地。

注:RX须接分压电路防止烧坏!

 

特有库:SoftwareSerial.h

串口:Btserial.begin(9600);

输出:BTserial.print();

 

四、图片

 

五、代码

1.行动的代码

#ifndef _XINGDONG_H_
#define _XINGDONG_H_


#include<Arduino.h>

class movecar
{
public:
   pinjiao(char MODE);//定义模式
   void moves(char modes)  ;
   int getPin();//取得pin口
   void setPin(int userPin);//设置pin口
private:
   int footPin = 2 ; 
   
};

class Pwmval:public movecar//定义子类
{
public:
  int getPwmVal();//获得pwm口
  pwmkaiguan(int pin1);
  void pwmjiao(int pin );  
  void pwmmoshi(int pwmVal);
private:
  int pwmVal = 0;//定义口
};


#endif
#include"xingdong.h"
void movecar::setPin(int userPin)//设置pin口
{
  footPin = userPin;
}

int movecar::getPin()//获得pin口
{
  return footPin;
}
movecar::pinjiao(char MODE)//设置pin脚
{
  pinMode(getPin(),MODE);
}
void movecar::moves(char modes)
{
  digitalWrite(getPin(),modes);
}
Pwmval::pwmkaiguan(int pin1)//选择口打开
{
  pinMode(pin1,OUTPUT);
}

void Pwmval::pwmjiao(int pin )//控制调速口开关
{
  digitalWrite(pin,HIGH);
}
void Pwmval::pwmmoshi(int  userpwm)//第一个调速
{
  pwmVal=userpwm;
  analogWrite(getPin(),pwmVal);
}
int Pwmval::getPwmVal(){
  return pwmVal;
}

2.避障的代码。

#include"xingdong.h"
void movecar::setPin(int userPin)//设置pin口
{
  footPin = userPin;
}

int movecar::getPin()//获得pin口
{
  return footPin;
}
movecar::pinjiao(char MODE)//设置pin脚
{
  pinMode(getPin(),MODE);
}
void movecar::moves(char modes)
{
  digitalWrite(getPin(),modes);
}
Pwmval::pwmkaiguan(int pin1)//选择口打开
{
  pinMode(pin1,OUTPUT);
}

void Pwmval::pwmjiao(int pin )//控制调速口开关
{
  digitalWrite(pin,HIGH);
}
void Pwmval::pwmmoshi(int  userpwm)//第一个调速
{
  pwmVal=userpwm;
  analogWrite(getPin(),pwmVal);
}
int Pwmval::getPwmVal(){
  return pwmVal;
}
#include"bizhang.h"

void bizhang::setPin(int userPin)//设置避障口
{
  bizhangkou = userPin;
}

int bizhang::getPin()//获得避障口
{
return bizhangkou;
}

bizhang::bizhang1pin(int Pin)//选择模式
{
  pinMode(Pin,INPUT);
}

int bizhang::fanshe()

{
  int jieguo=digitalRead(getPin());
  return jieguo;
}

void bizhang::bizhang1(char modes)//启动口
{
  digitalWrite(getPin(),modes);
}

3.主代码

#include <xingdong.h>//定义自己的库
#include<SoftwareSerial.h>//定义库函数
#include<bizhang.h>//定义自己的库
 int tx = 12;//蓝牙write
 int rx = 13;//蓝牙read
SoftwareSerial BTserial(rx,tx);//设置串口输入输出引脚
bizhang mybizhangLeft;//定义两个反射模块名字
bizhang mybizhangRight;//

Pwmval myPwmval1;//定义四个pwm名字
Pwmval myPwmval2;//
Pwmval myPwmval3;//
Pwmval myPwmval4;//
void zuohouzhuan()
{
myPwmval1.moves(HIGH);//定义第一个是开或关。
myPwmval2.moves(LOW);//定义第二个是开或关。

myPwmval1.pwmmoshi(80);
myPwmval2.pwmmoshi(0);

myPwmval3.moves(LOW);//定义第三个是开或关。
myPwmval4.moves(HIGH);//定义第四个是开或关。

myPwmval3.pwmmoshi(0);
myPwmval4.pwmmoshi(250);


  delayMicroseconds(1000000);

}

void youhouzhuan()
{
myPwmval1.moves(LOW);//定义第一个是开或关。
myPwmval2.moves(HIGH);//定义第二个是开或关。

myPwmval1.pwmmoshi(0);
myPwmval2.pwmmoshi(250);

myPwmval3.moves(HIGH);//定义第三个是开或关。
myPwmval4.moves(LOW);//定义第四个是开或关。

myPwmval3.pwmmoshi(80);
myPwmval4.pwmmoshi(0);


  delayMicroseconds(1000000);

}


void zuoganzhi()
{

zuohouzhuan();
  
}

void youganzhi()
{

youhouzhuan();
}

void setup() {


mybizhangLeft.setPin(11);//设置引脚打开
mybizhangRight.setPin(7);//

myPwmval1.setPin(10);//设置引脚*
myPwmval2.setPin(5);
myPwmval3.setPin(6);
myPwmval4.setPin(9);
 
myPwmval1.pinjiao(OUTPUT);//输入左一引脚,选择开或关。*
myPwmval2.pinjiao(OUTPUT);//左二
myPwmval3.pinjiao(OUTPUT);//右一
myPwmval4.pinjiao(OUTPUT);//右二

myPwmval3.pwmkaiguan(8);//开关口
myPwmval4.pwmkaiguan(8);//
myPwmval1.pwmkaiguan(4);//
myPwmval2.pwmkaiguan(4);//

myPwmval1.pwmjiao(4);//左调速
myPwmval2.pwmjiao(4);//左调速
myPwmval3.pwmjiao(8);//右调速
myPwmval4.pwmjiao(8);//右调速
 BTserial.println("hc_06 is started");
BTserial.begin(9600);//蓝牙串口设置
delay(200);//延时200ms之后再行动
Serial.begin(9600);//串口设置



}
void qianjin(int ti)
{
  
myPwmval1.moves(HIGH);//定义第一个是开或关。
myPwmval2.moves(LOW);//定义第二个是开或关。
myPwmval1.pwmmoshi(250);
myPwmval2.pwmmoshi(0);

myPwmval3.moves(HIGH);//定义第三个是开或关。
myPwmval4.moves(LOW);//定义第四个是开或关。

myPwmval3.pwmmoshi(250);
myPwmval4.pwmmoshi(0);

delay(ti*1000);
}
void houtui(int ti)
{
myPwmval1.moves(LOW);//定义第一个是开或关。
myPwmval2.moves(HIGH);//定义第二个是开或关。

myPwmval1.pwmmoshi(0);
myPwmval2.pwmmoshi(250);

myPwmval3.moves(LOW);//定义第三个是开或关。
myPwmval4.moves(HIGH);//定义第四个是开或关。

myPwmval3.pwmmoshi(0);
myPwmval4.pwmmoshi(250);

delay(ti*1000);
}

void zuoqianzhuan(int ti)
{
myPwmval1.moves(LOW);//定义第一个是开或关。
myPwmval2.moves(HIGH);//定义第二个是开或关。

myPwmval1.pwmmoshi(0);
myPwmval2.pwmmoshi(80);

myPwmval3.moves(HIGH);//定义第三个是开或关。
myPwmval4.moves(LOW);//定义第四个是开或关。

myPwmval3.pwmmoshi(250);
myPwmval4.pwmmoshi(0);
delay(ti*1000);
}

void youqianzhuan(int ti)
{
myPwmval1.moves(HIGH);//定义第一个是开或关。
myPwmval2.moves(LOW);//定义第二个是开或关。

myPwmval1.pwmmoshi(250);
myPwmval2.pwmmoshi(0);

myPwmval3.moves(LOW);//定义第三个是开或关。
myPwmval4.moves(HIGH);//定义第四个是开或关。

myPwmval3.pwmmoshi(0);
myPwmval4.pwmmoshi(80);
delay(ti*1000);
}

void tingzhi(int ti)
{
myPwmval1.moves(LOW);//定义第一个是开或关。
myPwmval2.moves(LOW);//定义第二个是开或关。

myPwmval1.pwmmoshi(0);
myPwmval2.pwmmoshi(0);

myPwmval3.moves(LOW);//定义第三个是开或关。
myPwmval4.moves(LOW);//定义第四个是开或关。

myPwmval3.pwmmoshi(0);
myPwmval4.pwmmoshi(0);

delay(ti*1000);
}


void bizhangmove()//定义避障函数
{
  int s=1;
while(s==1)
{

 qianjin();
 
attachInterrupt(digitalPinToInterrupt(2),zuoganzhi,FALLING);
attachInterrupt(digitalPinToInterrupt(3),youganzhi,FALLING);

while(BTserial.available()>0)
s=0;
}
}

void loop() 
{
   char mode;
   mode=BTserial.read();
   switch(mode)
{
case'1':qianjin(1);break;
case'2':zuoqianzhuan(2);break;
case'3':houtui(1);break;
case'4':youqianzhuan(1);break;
case'5':tingzhi(1);break;
case'6':bizhangmove();break;
}
}

 

 

 

 


总结

这些就是我做的蓝牙智能小车的全部内容,欢迎各位有兴趣的朋友点评、交流

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页