目录
前言
一、材料
二、连接
三、详解
中断:
类:
红外避障模块:
L298N:
HC-06蓝牙模块
四、图片
五、代码
1.行动的代码
2.避障的代码。
3.主代码
总结
前言
最近学了些许Arduino知识,加之老师要求用Arduino做出一点东西用来展示,所以自己做了一个Arduino小车来玩玩,使用了类与中断的概念,若有不足,敬请指正。
一、材料
- 4节南孚电池。
- L298N电机驱动板。
- 面包板一块。
- Arduino uno 。
- 两个红外避障模块。
- 四个直流电机。
- 小车套装。
- 若干杜邦线。
二、连接
将电源连接在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蓝牙模块:
通过四个引脚(VCC、GND、R/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;
}
}
总结
这些就是我做的蓝牙智能小车的全部内容,欢迎各位有兴趣的朋友点评、交流