目錄
前言
一、材料
二、連接配接
三、詳解
中斷:
類:
紅外避障子產品:
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;
}
}
總結
這些就是我做的藍牙智能小車的全部内容,歡迎各位有興趣的朋友點評、交流