天天看點

Arduino藍牙避障小車(新手做)前言一、材料二、連接配接三、詳解中斷:四、圖檔五、代碼總結

目錄

前言

一、材料

二、連接配接

三、詳解

中斷:

類:

紅外避障子產品:

L298N:

HC-06藍牙子產品

四、圖檔

五、代碼

1.行動的代碼

2.避障的代碼。

3.主代碼

總結

前言

最近學了些許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藍牙子產品:

  通過四個引腳(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();

四、圖檔

Arduino藍牙避障小車(新手做)前言一、材料二、連接配接三、詳解中斷:四、圖檔五、代碼總結

五、代碼

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;
}
}
           

總結

這些就是我做的藍牙智能小車的全部内容,歡迎各位有興趣的朋友點評、交流

繼續閱讀