遙控車玩起來總是很有趣,我個人是這些遙控車的忠實粉絲, 并且已經(仍然)廣泛地玩過它們。如今,這些汽車中的大多數都提供了巨大的扭矩來應對崎嶇的地形,但有些東西總是滯后,它的速度!!。。 所以,在這個項目中,我們將 使用 Arduino 構建一個完全不同類型的 RC 汽車,主要這輛車的目標是達到最高速度,因此我決定為遙控車試用 無芯直流電機。這些電機通常用于無人機,額定轉速為 39000 RPM 這應該足以滿足我們對速度的渴望。該車將由一塊小型鋰電池供電,并可使用 nRF24L01 射頻模塊進行遠程控制。
遙控車用無芯直流電機
該項目中使用的無芯直流電機如下圖所示。您可以輕松找到它們,因為它們廣泛用于迷你無人機。只需尋找 8520 磁性微型空心杯電機,您就會找到這些。
現在,將直流電機用于遙控車存在某些缺點。首先是它們提供非常低的啟動扭矩,因此我們的遙控車應該盡可能輕巧。這就是為什么我決定使用 SMD 組件在 PCB 上構建整個汽車并盡可能減小電路板尺寸的原因。第二個問題是它的高速,39000 RPM(軸的 RPM)很難處理,所以我們需要在 Arduino 端使用 MOSFET 構建的速度控制電路。第三件事是這些電機將由單個鋰聚合物電池供電,工作電壓在 3.6V 至 4.2V 之間,因此我們必須將電路設計為在 3.3V 上工作。這就是我們使用3.3V Arduino Pro mini的原因作為我們遙控車的大腦。理清了這些問題,我們來看看搭建這個項目所需要的材料。
所需材料
3.3V Arduino Pro Mini
Arduino納米
NRF24L01 – 2 個
操縱桿模塊
SI2302 MOSFET
1N5819 二極管
無鐵芯 BLDC 電機
AMS1117-3.3V
鋰聚合物電池
連接線
使用 Arduino 的遙控車射頻操縱桿
如前所述,遙控車將使用射頻操縱桿進行遠程控制。該操縱桿也將使用 Arduino 和 nRF24L01 RF 模塊構建,我們還使用操縱桿模塊在所需方向控制我們的 RC。如果您對這兩個模塊完全陌生,您可以考慮閱讀使用 nRF24L01 連接 Arduino和使用 Arduino 連接操縱桿的文章,以了解它們的工作原理以及如何使用它們。要構建您的Arduino RF 遠程操縱桿,您可以按照下面的電路圖進行操作。
RF 操縱桿電路可以使用納米板的 USB 端口供電。nRF24L01 模塊僅在 3.3V 上運行,因此我們在 Arduino 上使用了 3.3V 引腳。我在面包板上構建了電路,如下所示,如果需要,您也可以為此創建一個 PCB。
RF 操縱桿電路的Arduino 代碼非常簡單,我們必須從操縱桿中讀取 X 值和 Y 值并通過 nRF24L01 將其發送到 RC 車。該電路的完整程序可以在本頁底部找到。我們不會對此進行解釋,因為我們已經在上面共享的接口項目鏈接中討論了它。
Arduino RC 汽車電路圖
我們的遙控 Arduino 汽車的完整電路圖如下所示。電路圖還包括向我們的汽車添加兩個 TCRT5000 IR 模塊的選項。這是為了讓我們的遙控車能夠作為線跟隨機器人工作,這樣它就可以獨立工作而不受外部控制。但是,為了這個項目,我們不會專注于它,請繼續關注另一個項目教程,我們將在其中嘗試構建“Fastest Line Follower Robot”。為了便于構建,我將兩個電路組合在一個 PCB 上,您可以忽略該項目的 IR 傳感器和運算放大器部分。
遙控車將由連接到終端 P1 的鋰電池供電。AMS117-3.3V用于為我們的 nRF24L01 和我們的專業迷你板調節 3.3V。我們也可以直接在原始引腳上為 Arduino 板供電,但 pro mini 上的板載 3.3V 穩壓器將無法為我們的射頻模塊提供足夠的電流,因此我們使用了外部穩壓器。
為了驅動我們的兩個 BLDC 電機,我們使用了兩個 SI2302 MOSFET。確保這些 MOSFET 可由 3.3V 驅動非常重要。如果您找不到完全相同的部件號,您可以尋找具有以下傳輸特性的等效 MOSFET
電機可以消耗高達 7A 的峰值電流(在負載下連續測試為 3A),因此 MOSFET 漏極電流應為 7A 或更高,并且應在 3.3V 時完全開啟。正如您在此處看到的,我們選擇的 MOSFET 即使在 2.25V 下也可以提供 10A,因此它是一個理想的選擇。
為 Arduino 遙控車制造 PCB
構建這個項目的有趣部分是 PCB 開發。這里的 PCB 不僅形成電路,而且還充當我們汽車的底盤,因此我們為它設計了一個看起來像汽車的形狀,并且可以選擇輕松安裝我們的電機。您也可以嘗試使用上面的電路設計自己的 PCB,或者您可以使用我的 PCB 設計,完成后如下所示。
如您所見,我設計的 PCB 可以輕松安裝電池、電機和其他組件。
組裝印刷電路板
我打開焊條并開始組裝電路板。由于腳印、焊盤、通孔和絲網印刷的形狀和尺寸都非常完美,因此組裝電路板沒有問題。從開箱開始,僅用了 10 分鐘,電路板就準備好了。
焊接后的幾張電路板圖片 如下所示。
3D 打印輪子和電機支架
正如您在上圖中可能已經注意到的那樣,我們需要對機器人的電機支架和輪子進行 3D 建模。如果您使用了我們上面共享的 PCB Gerber 文件,那么您不妨從這個thingiverse 鏈接下載它來使用 3D 模型。
我使用 Cura 對我的模型進行切片并使用 Tevo Terantuala 打印它們,沒有支撐和 0% 填充以減輕重量。您可以更改適合我們打印機的設置。由于電機旋轉得非???,我發現設計一個與電機軸緊密貼合的輪子非常困難。因此,我決定在輪子內使用無人機葉片,如下所示
我發現這更可靠和堅固,但是,嘗試不同的車輪設計,并在評論部分告訴我什么對你有用。
對 Arduino 進行編程
該項目的完整程序(Arduino nano 和 pro mini)可以在本頁底部找到。你的RC程序的解釋如下
我們通過包含所需的頭文件來啟動程序。請注意,nRF24l01 模塊需要將庫添加到您的 Arduino IDE,您可以使用此鏈接從 Github 下載 RF24 庫。除此之外,我們已經為我們的機器人定義了最小速度和最大速度。最小和最大范圍分別為 0 到 1024。
#define min_speed 200 #define max_speed 800 #include#include "RF24.h" RF24 myRadio (7, 8);
然后在 setup 函數中,我們初始化我們的 nRF24L01 模塊。我們使用了 115 個頻段,因為它不擁塞,并且已將模塊設置為低功耗運行,您也可以使用這些設置。
無效設置(){ 串行.開始(9600); myRadio.begin(); myRadio.setChannel(115); //115頻段以上WIFI信號 myRadio.setPALevel(RF24_PA_MIN); //MIN 功率低范圍 myRadio.setDataRate(RF24_250KBPS); //最低速度 }
接下來在主循環函數中,我們將只執行 ReadData 函數,我們將使用該函數不斷讀取從 Transmitter 操縱桿模塊發送的值。注意程序中提到的管道地址應該和發射器程序中提到的一樣。我們還打印了我們收到的用于調試目的的值。成功讀取值后,我們將執行 Control Car 功能,根據從
Rf 模塊接收到的值來控制我們的 RC 汽車。
無效讀取數據() { myRadio.openReadingPipe(1, 0xF0F0F0F0AA); //讀取哪個管道,40位地址 myRadio.startListening(); //停止傳輸并開始接收 if (myRadio.available()) { 而(myRadio.available()) { myRadio.read( &data, sizeof(data) ); } Serial.print("\n收到:"); 序列號.println(data.msg); 收到 = data.msg; 控制車(); } }
在 Control Car 函數中,我們將使用模擬寫入函數控制連接到 PWM 引腳的電機。在我們的發射器程序中,我們將 Nano 的 A0 和 A1 引腳的模擬值轉換為 1 到 10、11 到 20、21 到 30 和 31 到 40,分別用于控制汽車的前進、后退、左轉和右轉。下面的程序用于控制機器人的前進方向
if (received>=1 && received <=10) // 前進 { int PWM_Value = map (收到, 1, 10, min_speed, max_speed); 模擬寫入(R_MR,PWM_Value); 模擬寫入(L_MR,PWM_Value); }
同樣的,我們也可以多寫三個函數來進行反向、左、右控制,如下圖。
if (received>=11 && received <=20) // 中斷 { int PWM_Value = map (收到, 11, 20, min_speed, max_speed); 類比寫入(R_MR,0); 類比寫入(L_MR,0); } if (received>=21 && received <=30) // 左轉 { int PWM_Value = map (收到, 21, 30, min_speed, max_speed); 模擬寫入(R_MR,PWM_Value); 類比寫入(L_MR,0); } if (received>=31 && received <=40) // 右轉 { int PWM_Value = map (收到, 31, 40, min_speed, max_speed); 類比寫入(R_MR,0); 模擬寫入(L_MR,PWM_Value); }
Arduino 遙控車的工作
完成代碼后,將其上傳到您的專業迷你板上。通過 FTDI 模塊取出電池和電路板進行測試。啟動您的代碼,打開串行電池,您應該會收到來自發射器操縱桿模塊的值。連接你的電池,你的電機也應該開始旋轉。
射頻遙控操縱桿
/*將射頻值傳輸到 Arduino 的代碼
*
* 引腳連接
* CE - 7
MISO - 12
MOSI - 11
SCK - 13
CS - 8
A0 - JoyX
A1 - JoyY
*/
#include
#include "RF24.h "
RF24 myRadio (7, 8);
結構包
{
int msg = 0;
};
字節地址[][6] = {"0"};
typedef struct package 封裝;
包裝資料;
無效設置()
{
序列.開始(9600);
myRadio.begin();
myRadio.setChannel(115); //115頻段以上WIFI信號
myRadio.setPALevel(RF24_PA_MAX); //MAX power long 憤怒
myRadio.setDataRate(RF24_250KBPS); //最小速度
延遲(500);
Serial.print("遠程初始化");
}
向前詮釋;
逆向;
int左;
詮釋正確;
無效循環()
{
int xValue = 模擬讀?。ˋ0);//讀取JoyX值
int yValue = analogRead(A1); //讀取JoyY值
//Serial.print(xValue); 序列號.print(" , "); Serial.println(yValue);
if (xValue>560 && xValue<1000) // 為向上過濾 JoyX
{
forward = map (xValue, 560, 1000, 1, 10); //將 Joyx-up 轉換為 0-10
//Serial.print("F="); Serial.println(轉發);
data.msg = 轉發;寫入數據();延遲(50);
}
if (xValue<500 && xValue > 10) // 過濾 JoyX 的 break
{
reverse = map (xValue, 10, 500, 20, 11); //將JoyX-down轉換為11-20
//Serial.print("B="); Serial.println(反向);
data.msg = 反向;寫入數據();延遲(50);
}
else if (yValue>600 && yValue<1000) // 為右過濾 JoyY
{
right = map (yValue, 600, 1000, 21, 30); //將 JoyY-right 轉換為 21-30
//Serial.print("R="); Serial.println(右);
data.msg = 對;寫入數據();延遲(50);
}
else if (yValue<450 && yValue > 10) // 過濾 JoyY 為 left
{
left = map (yValue, 10, 450, 40, 31); //將JoyY-left轉換為31-40
//Serial.print("
data.msg = 左;寫入數據();延遲(50);
}
/* else
{
Serial.println("Rest");
數據.msg = 0; 寫入數據();延遲(50);
}
*/
}
void WriteData()
{
myRadio.stopListening(); //停止接收并開始發送
myRadio.openWritingPipe(0xF0F0F0F0AA); //在這個 40 位地址上發送數據
myRadio.write(&data, sizeof(data));
//Serial.print("\nSent:");
//Serial.println(data.msg);
延遲(50);
}
void ReadData()
{
myRadio.openReadingPipe(1, 0xF0F0F0F066); // 讀取哪個管道,40 位地址
myRadio.startListening(); //停止傳輸并開始接收
if ( myRadio.available())
{
while (myRadio.available())
{
myRadio.read( &data, sizeof(data) );
}
Serial.print("\n收到:");
序列號.println(data.msg);
}
}
無刷直流電機
/*CE - 7
MISO - 12
MOSI - 11
SCK - 13
CS - 8
最近用 nano 測試
*/
/*PIN DEFANITIONS*/
#define R_IR 3
#define L_IR 4
#define L_MR 5
#define R_MR 6
#define min_speed 200
#定義 max_speed 800
#include
#include "RF24.h"
RF24 myRadio (7, 8);
結構包
{
int msg;
};
typedef struct package 封裝;
包裝資料;
字節地址[][6] = {"0"};
無效設置(){
pinMode(R_IR,輸入);
pinMode(L_IR,輸入);
pinMode(L_MR,輸出);
pinMode(R_MR,輸出);
串行.開始(9600);
myRadio.begin();
myRadio.setChannel(115); //115頻段以上WIFI信號
myRadio.setPALevel(RF24_PA_MIN); //MIN 功率低
范圍 myRadio.setDataRate( RF24_250KBPS ) ; //最低速度
}
int received;
無效循環(){
讀取數據();
}
void Control_Car()
{
if (received>=1 && received <=10) // 向前移動
{
int PWM_Value = map (received, 1, 10, min_speed, max_speed);
模擬寫入(R_MR,PWM_Value);
模擬寫入(L_MR,PWM_Value);
}
if (received>=11 && received <=20) // 中斷
{
int PWM_Value = map (收到, 11, 20, min_speed, max_speed);
類比寫入(R_MR,0);
類比寫入(L_MR,0);
}
if (received>=21 && received <=30) // 右轉
{
int PWM_Value = map (received, 21, 30, min_speed, max_speed);
模擬寫入(R_MR,PWM_Value);
類比寫入(L_MR,0);
}
if (received>=31 && received <=40) // 右轉
{
int PWM_Value = map (received, 31, 40, min_speed, max_speed);
類比寫入(R_MR,0);
模擬寫入(L_MR,PWM_Value);
}
}
void ReadData()
{
myRadio.openReadingPipe(1, 0xF0F0F0F0AA); //讀取哪個管道,40位地址
myRadio.startListening(); //停止傳輸并開始接收
if ( myRadio.available())
{
while (myRadio.available())
{
myRadio.read( &data, sizeof(data) );
}
Serial.print("\n收到:");
序列號.println(data.msg);
收到 = data.msg;
控制車();
}
else //如果不是來自 RF 的數據
{
//analogWrite(R_MR,0);
//analogWrite(L_MR,0);
}
}
void WriteData()
{
myRadio.stopListening(); //停止接收并開始發送
myRadio.openWritingPipe(0xF0F0F0F066);//在這個 40 位地址上發送數據
myRadio.write(&data, sizeof(data));
Serial.print("\n已發送:");
序列號.println(data.msg);
延遲(300);
}
-
nRF24L01
+關注
關注
17文章
330瀏覽量
69475 -
遙控車
+關注
關注
9文章
81瀏覽量
23729 -
Arduino
+關注
關注
188文章
6469瀏覽量
187070
發布評論請先 登錄
相關推薦
評論