遙控小車是每個人童年的最愛,不僅好奇它的奇妙,更是喜歡它帶來的刺激。小編為大家帶來幾篇部落格,來給大家講講制作遙控小車的程式。
看大标題可知我們一共有五個方法去制作一款帶有遙控功能的小車,小編分開來給大家講解。
本文是基于arduino的紅外遙控小車
基于arduino的手機藍牙遙控小車
基于arduino的紅外遙控小車
基于arduino的無線NRF24L01遙控小車
基于ardunio的無線搖桿遙控小車
基于ardunio的有線搖桿遙控小車
從0到1教你做:基于紅外遙控子產品的Arduino的遙控小車
bilibili:https://www.bilibili.com/video/av74669242/
3、關注微信公衆号下載下傳:
① 關注微信公衆号:Tech雲
②
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iN2cjNzUGZzIDO4EGM0gDMzYzX0IDM0ETM2IzLchDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
紅外遙控小車,用的就是遙控器來控制小車的移動,遙控部分分為發射端和接收端。如下圖
第一個是遙控器為發射端,第二個為接收端。
我們隻需要記錄下來每個按鍵對應的碼值,然後就可以像按鍵那樣寫程式啦,就是if(序列槽接收到是) 那麼......
那麼如何測出每個按鍵的碼值呢?
我們先來連接配接線路吧
一、接線:
(1)紅外遙控接線:
(2)電機接線:
四個邏輯通道從左到右(即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,即開始測碼值,然後下載下傳程式
然後打開序列槽螢幕,波特率設定為9600,使用遙控器對着紅外頭按下按鍵,序列槽螢幕上就會出來目前按鍵的紅外編碼與位數。
顯示irCode:FFFFFFFF,bits:32是因為遙控器上沒有做中斷,誤碼導緻,隻要按一下松開,再按一下松開就沒問題。
這樣我們就能獲得每個按鍵的碼值啦。
小編用的是遙控器上的1-9九個按鍵,分别對應着小車的不同狀态如下圖:
然後開始一個按鍵一個按鍵進行測試記錄資料,将資料填入程式中即可(下圖對應按鍵資料的紅圈)
由于小編手頭的材料比較劣質,是以往往是一個按鍵對應多個碼值,為了減少誤碼,特意多寫了幾個資料;如下圖:
将這部分資料測量更改後,準備工作就結束啦!
将以下截圖中的1改為2,即開始主程式,然後下載下傳程式
然後感受下,小車的轉速、轉角是否符合心意,如果想更改,請去每個按鍵對應的運動指令下,分别更改PWM和延時(對應下圖的綠圈和紅圈)
這樣一個紅外遙控小車就做完啦!