天天看點

基于紅外遙控的arduino遙控小車

遙控小車是每個人童年的最愛,不僅好奇它的奇妙,更是喜歡它帶來的刺激。小編為大家帶來幾篇部落格,來給大家講講制作遙控小車的程式。

看大标題可知我們一共有五個方法去制作一款帶有遙控功能的小車,小編分開來給大家講解。

本文是基于arduino的紅外遙控小車

​​基于arduino的手機藍牙遙控小車​​

​​基于arduino的紅外遙控小車​​

​​基于arduino的無線NRF24L01遙控小車​​

​​基于ardunio的無線搖桿遙控小車​​

​​基于ardunio的有線搖桿遙控小車​​

從0到1教你做:基于紅外遙控子產品的Arduino的遙控小車

bilibili:​​https://www.bilibili.com/video/av74669242/​​

3、關注微信公衆号下載下傳:

     ① 關注微信公衆号:Tech雲  

     ②

基于紅外遙控的arduino遙控小車

紅外遙控小車,用的就是遙控器來控制小車的移動,遙控部分分為發射端和接收端。如下圖

基于紅外遙控的arduino遙控小車
基于紅外遙控的arduino遙控小車

第一個是遙控器為發射端,第二個為接收端。

我們隻需要記錄下來每個按鍵對應的碼值,然後就可以像按鍵那樣寫程式啦,就是if(序列槽接收到是) 那麼......

那麼如何測出每個按鍵的碼值呢?

我們先來連接配接線路吧

一、接線:

(1)紅外遙控接線:

基于紅外遙控的arduino遙控小車
基于紅外遙控的arduino遙控小車

(2)電機接線:

基于紅外遙控的arduino遙控小車

四個邏輯通道從左到右(即IN1到IN4)分别接5、6、9、10

12v供電,5伏輸出給arduino供電

注意:此處驅動一定要和arduino共地!!!否則無法傳輸資料。

輸出A接左邊電機,輸出B做右邊電機

二、書寫代碼:

然後複制以下代碼到編譯器:

#include <IRremote.h>  // 使用IRRemote函數庫
///選擇///
#define choose 2    //1為通過序列槽列印碼值模式  
                    //2為主函數運作模式



//-------------------------------------------------------------------//
//*******************************************************************//
///
//電機設定/
///

#define leftA_PIN 5
#define leftB_PIN 6
#define righA_PIN 9
#define righB_PIN 10
void motor_pinint( );     //引腳初始化
void forward( );          //前進
void back( );             //後退
void turnLeftOrigin( );   //原地左
void turnRightOrigin( );  //原地右
void turnRightforword( ); //右前
void turnLeftforword( );  //左前
void turnLeftback( );     //左後
void turnRightback( );    //右後
void _stop();             //停車

//-------------------------------------------------------------------//
//*******************************************************************//
///
//紅外遙控/
///

const int irReceiverPin = 2;  // 紅外接收器的 OUTPUT 引腳接在 PIN2 接口 定義irReceiverPin變量為PIN2接口
IRrecv irrecv(irReceiverPin); // 設定irReceiverPin定義的端口為紅外信号接收端口
decode_results results;    // 定義results變量為紅外結果存放位置
void rev(void); 
void scan(void);

//-------------------------------------------------------------------------//

void setup()
{
  Serial.begin(9600); //9600(PC端使用)
  motor_pinint();        //電機引腳初始化
  irrecv.enableIRIn();   // 啟動紅外解碼

}
void loop()
{
  if(choose==1) scan();
  else if(choose==2) rev();  
}

/*電機引腳初始化*/
void motor_pinint( )
{
  pinMode (leftA_PIN, OUTPUT); //設定引腳為輸出引腳
  pinMode (leftB_PIN, OUTPUT); //設定引腳為輸出引腳
  pinMode (righA_PIN, OUTPUT); //設定引腳為輸出引腳
  pinMode (righB_PIN, OUTPUT); //設定引腳為輸出引腳
  }
/**************************************************
forward子函數——前進子函數
函數功能:控制車前進
**************************************************/
void forward( )
{
  analogWrite(leftA_PIN,180);      
  analogWrite(leftB_PIN,0);         //左輪前進
  analogWrite(righA_PIN,180);      
  analogWrite(righB_PIN,0);         //右輪前進
}
/**************************************************
back子函數——後退子函數
函數功能:控制車後退
**************************************************/
void back( )
{
  analogWrite(leftA_PIN,0);      
  analogWrite(leftB_PIN,180);        //左輪後退
  analogWrite(righA_PIN,0);      
  analogWrite(righB_PIN,180);        //右輪後退
}
/**************************************************
turnLeftOrigin子函數——原地左轉子函數
函數功能:控制車原地左轉
**************************************************/
void turnLeftOrigin( )
{
  analogWrite(leftA_PIN,0);      
  analogWrite(leftB_PIN,120);        //左輪後退
  analogWrite(righA_PIN,120);      
  analogWrite(righB_PIN,0);          //右輪前進
}
/**************************************************
turnRightOrigin子函數——原地右轉子函數
函數功能:控制車原地右轉
**************************************************/
void turnRightOrigin( )
{
  analogWrite(leftA_PIN,120);      
  analogWrite(leftB_PIN,0);        //左輪前進
  analogWrite(righA_PIN,0);      
  analogWrite(righB_PIN,120);      //右輪後退
}
/**************************************************
turnRightforword子函數——右前運動子函數
函數功能:控制車右前
**************************************************/
void turnRightforword( )
{
  analogWrite(leftA_PIN,200);      
  analogWrite(leftB_PIN,0);        //左輪快前進
  analogWrite(righA_PIN,120);      
  analogWrite(righB_PIN,0);        //右輪慢前進
}
/**************************************************
turnLeftforword子函數——左前運動子函數
函數功能:控制車左前
**************************************************/
void turnLeftforword( )
{
  analogWrite(leftA_PIN,120);      
  analogWrite(leftB_PIN,0);       //左輪慢前進
  analogWrite(righA_PIN,200);      
  analogWrite(righB_PIN,0);       //右輪快前進
}
/**************************************************
turnRightforword子函數——右後運動子函數
函數功能:控制車右後
**************************************************/
void turnRightback( )
{
  analogWrite(leftA_PIN,0);      
  analogWrite(leftB_PIN,200);        //左輪快後退
  analogWrite(righA_PIN,0);      
  analogWrite(righB_PIN,120);        //右輪慢後退
}
/**************************************************
turnLeftforword子函數——左後運動子函數
函數功能:控制車左後
**************************************************/
void turnLeftback( )
{
  analogWrite(leftA_PIN,0);      
  analogWrite(leftB_PIN,120);        //左輪慢後退
  analogWrite(righA_PIN,0);      
  analogWrite(righB_PIN,200);        //右輪快後退
}
/**************************************************
stop子函數—停止子函數
函數功能:控制車停止
**************************************************/
void _stop()
{
  analogWrite(leftA_PIN,0);      
  analogWrite(leftB_PIN,0);         //左輪靜止不動
  analogWrite(righA_PIN,0);      
  analogWrite(righB_PIN,0);         //右輪靜止不動
}

void rev(void)
{
  if   (irrecv.decode(&results)) {   // 解碼成功,把資料放入results.value變量中
  if   ((results.value==16718055)||(results.value==1033561079))
       {forward( )         ;delay(500);_stop();}//2前進
  else if((results.value==465573243)||(results.value==16730805)||(results.value==304335233)||(results.value==891929274)||(results.value==93040025))
       {back( )            ;delay(500);_stop();}//8後退
  else if((results.value==16724175)||(results.value==814588342)||(results.value==2534850111)||(results.value==16724175))
       {turnLeftforword( ) ;delay(500);_stop();}//1左前
  else if((results.value==16743045)||(results.value==1635910171)||(results.value==16743045))     
       {turnRightforword( );delay(500);_stop();}//3右前
  else if((results.value==1209942246)||(results.value==851901943)||(results.value==16728765)) 
       {turnLeftback( )    ;delay(500);_stop();}//7左後
  else if((results.value==16732845)||(results.value==1623741183))    
       {turnRightback( )   ;delay(500);_stop();}//9右後
  else if((results.value==2351064443)||(results.value==16716015)||(results.value==3640844469)||(results.value==3606423579))    
       {turnLeftOrigin( )   ;delay(250);_stop();}//4原地左轉
  else if((results.value==16734885)||(results.value==71952287))    
       {turnRightOrigin( )   ;delay(250);_stop();}//6原地右轉
    irrecv.resume();    // 繼續等待接收下一組信号
  }if(results.value==0x16) 
  delay(600); //延時600毫秒,做一個簡單的消抖
}
void scan(void)
{
 if (irrecv.decode(&results)) {   // 解碼成功,把資料放入results變量中
    // 把資料輸入到序列槽
    Serial.print("irCode: ");            
    Serial.print(results.value, DEC); // 顯示紅外編碼
    Serial.print(",  bits: ");           
    Serial.println(results.bits); // 顯示紅外編碼位數
    irrecv.resume();    // 繼續等待接收下一組信号
  }if(results.value==0x16)
  digitalWrite(9, HIGH);  
  delay(600); //延時600毫秒,做一個簡單的消抖
}      

将以下截圖中的2改為1,即開始測碼值,然後下載下傳程式

基于紅外遙控的arduino遙控小車

然後打開序列槽螢幕,波特率設定為9600,使用遙控器對着紅外頭按下按鍵,序列槽螢幕上就會出來目前按鍵的紅外編碼與位數。

基于紅外遙控的arduino遙控小車

顯示irCode:FFFFFFFF,bits:32是因為遙控器上沒有做中斷,誤碼導緻,隻要按一下松開,再按一下松開就沒問題。

這樣我們就能獲得每個按鍵的碼值啦。

小編用的是遙控器上的1-9九個按鍵,分别對應着小車的不同狀态如下圖:

基于紅外遙控的arduino遙控小車

然後開始一個按鍵一個按鍵進行測試記錄資料,将資料填入程式中即可(下圖對應按鍵資料的紅圈)

基于紅外遙控的arduino遙控小車

由于小編手頭的材料比較劣質,是以往往是一個按鍵對應多個碼值,為了減少誤碼,特意多寫了幾個資料;如下圖:

基于紅外遙控的arduino遙控小車

将這部分資料測量更改後,準備工作就結束啦!

将以下截圖中的1改為2,即開始主程式,然後下載下傳程式

然後感受下,小車的轉速、轉角是否符合心意,如果想更改,請去每個按鍵對應的運動指令下,分别更改PWM和延時(對應下圖的綠圈和紅圈)

基于紅外遙控的arduino遙控小車
基于紅外遙控的arduino遙控小車

這樣一個紅外遙控小車就做完啦!

如果大家在制作過程中有什麼問題或者思路可以在下方留言和我一起交流噢!

如果發現本文有錯誤,也請在下方評論區指出,感激不盡!

繼續閱讀