第1步:工具和材料
此項目使用了以下工具:
焊鐵和焊絲(鏈接/鏈接)。直流電機已經將電線焊接到其端子上。..。..但它最終會斷裂,您可能需要重新焊接它。所以考慮一下好的烙鐵和電線neaby。
EVA泡沫板(或其他非導電材料)。我在這個項目中使用的機器人底盤是鋁制的,電路板安裝在這個金屬部件上。我在電路板和金屬板之間使用了一層泡沫板,以避免可能的短路。
雙面膠帶。它用于將泡沫板粘合到電路板上,并用于安裝H橋模塊。
剪刀,用于剪切一些泡沫板矩形。
我在項目中使用了以下硬件部件:
基于Arduino Uno的開發板(鏈接/鏈接/鏈接/鏈接)。它被用作機器人的主控制器。它非常易于使用和Arduino IDE編程,非常適合初學者的電子和編程。
L298N雙通道H橋模塊(鏈接/鏈接/鏈接/鏈接)。該模塊允許來自Wemos(或Arduino)的3.3V信號被放大到電機所需的12V。
DIY機器人底盤坦克(鏈接)。這個真棒套件具有制造水箱所需的一切:兩個直流電機,齒輪,軌道,螺栓,螺母等。它已經配備了組裝機箱所需的工具,這對初學者來說非常棒!
PS2無線遙控器(鏈接)。該視頻游戲控制器可以無線發送命令給接收器,接收器可以使用串行通信與微控制器連接。
18650 3.7V電池(x3)(鏈接/鏈接)。我曾經給整個電路供電。這個油箱使用12V電機。我使用了三節串聯的3.7V電池給它們供電。
3S 18650電池座(鏈接/鏈接/鏈接)。它可以容納三個18650電池系列,并且可以很容易地安裝在水箱后部。
18650電池充電器(鏈接/鏈接)。你的電池最終會耗盡電量。當發生這種情況時,電池充電器將為您解救。
跳線(鏈接/鏈接)。我用了6個男女跳線來測量h-bridge和Wemos之間的信號,以及2個用于5V和Gnd的男性 - 男性跳線。如果您計劃添加一些傳感器,則可能需要更多。
B型USB電纜。您需要這個來上傳您的代碼。大多數電路板已經有自己的電纜。
上面的鏈接只是建議您可以在哪里找到本教程中使用的項目(也許可以支持我以后的教程)。您可以隨意在其他地方搜索并在您喜歡的本地或在線商店購買。
第2步:組裝機器人
這個項目的第一部分是機器人結構的組裝。
在以前的項目中我開發了自己的機器人結構,使用方便可訪問的材料(無需復雜的工具,3D打印機或激光切割機)。
后來我決定給一個從網上商店獲得的機器人工具包。
起初看來裝配會很復雜或者我會遇到缺少部件的問題(考慮到組成部件的部件數量)。但是這個套件讓我很驚訝!在我看來,所有的部件質量都很好,并配有幾個備件。因此,在工作臺下方丟失的螺絲將不會使您的項目無法實現,我發現這是非常好的(特別是在丟失幾個螺釘后)。
另一個積極的一點是,所有的安裝機器人所需的工具包含在套件中(一對艾倫扳手和螺絲刀)。我相信這使得該套件非常適合沒有大量工具的初學者!
作為一個消極的方面,我會強調缺乏文檔。機器人的裝配手冊(中文電子表格文件)不是非常用戶友好,并且沒有很多在線教程。所以我決定在上面的視頻中記錄組裝機器人的過程!另一個關注點涉及機器人結構的材料。底座完全由鋁制成,如果印刷電路板的插針接觸框架,可能會導致短路。
您可以使用其他在線套件。您甚至可以制作自己的結構,如下所述。
步驟3:接線電路
機器人背面安裝了一個由三節18650電池組成的電源組。它為機器人提供11.1V(3 x 3.7V)。這足以為12V直流電機供電。
L298N雙通道H橋用于控制電機。它接收Arduino板的一些5V信號,并為電機提供更高的電壓。它還允許電機在兩個方向上運行,取決于這些輸入信號的組合。
根據原理圖連接每個設備。
按照您需要連接的引腳列表:
Arduino Uno輸入/輸出:
數字引腳3 =》 H橋ENA引腳
數字引腳5 =》 H橋IN1引腳
數字引腳4 = 》 H橋IN2引腳
數字引腳8 =》 H橋IN3引腳
數字引腳7 =》 H橋IN4引腳
數字引腳6 =》 H橋ENB引腳
5V引腳=》 H橋5V引腳
Gnd引腳=》 H橋Gnd引腳
數字引腳10 = 》 PS2接收器引腳6
數字引腳11 =》 PS2接收器引腳2
數字引腳12 =》 PS2接收器引腳1
數字引腳13 =》 PS2接收器引腳7
3.3V引腳=》 PS2接收器引腳5
Gnd引腳=》 PS2接收器引腳4
H-橋輸入/輸出:
ENA引腳=》 Arduino數字引腳3
IN1引腳=》 Arduino數字引腳5
IN2 pin =》 Arduino數字引腳4
IN3引腳=》 Arduino數字引腳8
IN4 pi n =》 Arduino數字引腳7
ENB引腳=》 Arduino數字引腳6
5V引腳=》 Arduino 5V引腳
Gnd引腳=》 Arduino Gnd引腳
Gnd pin =》電池組負極線
12V引腳=》電池組正極線
OUT1 =》右電機負極線
OUT2 =》右電機正極線
OUT3 =》左電機正極線
OUT4 =》左電機負極線
PS2接收器:
引腳1(數據)=》 Arduino數字引腳12
引腳2(命令)=》 Arduino數字引腳11
引腳4(接地)=》 Arduino Gnd引腳
引腳5(電源)=》 Arduino 3.3V引腳
引腳6(注意)=》 Arduino數字引腳10
引腳7(時鐘)=》 Arduino數字引腳13
步驟4:設置Arduino IDE
對于這個項目,我使用Arduino IDE對Arduino板進行編程。
您可以在Arduino的網站上找到適用于Windows,Linux或MAC OSX的最新版本:https://www.arduino.cc/en/main/software
免費下載,安裝在你的電腦并啟動它。
2。添加庫
在這個項目中,我使用Arduino PS2X庫。
在https://github.com/madsci1016/Arduino-PS2X下載庫。解壓縮文件,并將文件夾復制到Arduino IDE庫/工具文件夾。
。..。..。..。..
現在您的開發環境已準備好,讓我們繼續下一步!
步驟5:PS2無線控制器庫說明
PS2無線控制器是機器人項目的絕佳工具。它有很多按鈕:20個數字按鈕和2個模擬按鈕。通過這種方式,可以控制機器人。
我使用Bill Porter的PS2X庫(https://github.com/madsci1016/Arduino-PS2X)將控制器連接到Arduino Uno板。
它為控制器定義了一個PS2X類,其中包含一些從操縱桿讀取模擬和數字輸入的方法。使用以下代碼(在設置之前或期間)創建此類的對象:
PS2X ps2x;
定義對象后,必須使用以下鏈接將其鏈接到Arduino I/O引腳以下函數:
error = ps2x.config_gamepad(clock,command,attention,data, pressure?, rumble?);
如果連接或控制器本身出現問題,此函數可能會返回一些錯誤。
庫中使用的主要函數是用于讀取數字和模擬輸入的。要讀取和數字輸入,使用以下方法:
ps2x.Button(button);
其中按鈕是要讀取的按鈕的名稱。每個按鈕都按如下方式進行操作:
方向按鈕:
PSB_PAD_UP = D-pad up按鈕;
PSB_PAD_DOWN = D-pad向下按鈕;
PSB_PAD_LEFT = D-pad左按鈕
PSB_PAD_RIGHT = D-pad右按鈕
動作按鈕:
PSB_GREEN或PSB_TRIANGLE =綠色三角形按鈕
PSB_RED或PSB_CIRCLE =紅色圓圈按鈕
PSB_BLUE或PSB_CROSS =藍色x按鈕
PSB_PINK或PSB_SQUARE =粉紅方形按鈕
觸發:
PSB_L1 =左側觸發按鈕1
PSB_R1 =右側觸發按鈕1
PSB_L2 =左側觸發按鈕2
PSB_R2 =右側觸發按鈕2
棒子:
PSB_L3 =左手按鈕(是的,你可以按下手柄作為按鈕)
PSB_R3 =右鍵按鈕
菜單:
PSB_SELECT =選擇按鈕
PSB_START =啟動按鈕
要讀取棒的模擬值(使用轉換器在0到255之間的整數),請使用以下方法:
其中 stick_axis 表示操縱桿和要讀取的方向,如下所示:
PSS_LY =左撇子的y位置
PSS_LX =左撇子的x位置
PSS_RY =右杖的y位置
PSS_RX =右手的x位置
使用這些基本功能,您就可以在項目中使用PS2控制器!在以下步驟中,我展示了一些組合這些按鈕的Arduino草圖示例!
步驟6:草圖#1 - Dpad按鈕
舊的視頻游戲,如SEGA Master System,Mega Drive和Nintendo SNES,沒有強制敏感按鈕。方向按鈕僅為開/關按鈕。對于這個例子,我想模仿那些控制臺的舊視頻游戲中的那種控件。
對于第一個Sketch,我使用Dpad按鈕作為機器人的輸入。機器人使用每個按鈕執行一項基本動作:向前移動,向右轉,向左轉或向后移動。
這些按鈕具有二進制輸出。這樣,微控制器只會理解按鈕被按下,但不會理解按下它們的難度。這樣,一旦點擊一個給定的按鈕,電機就會全速運轉。
如果按照我的原理圖連接所有電源,你將得到以下輸出:
PSB_PAD_UP =前進
PSB_PAD_DOWN =后退
PSB_PAD_LEFT =左轉
PSB_PAD_RIGHT =右轉
正如我之前所說,電機將以固定速度移動。向左或向右轉動時,電機將在相反的方向上運行,以便機器人繞其軸轉動。
Arduino代碼:
下載代碼并在Arduino IDE上打開它。如果您使用相同的引腳排列,您可能不需要更改代碼上的任何內容(盡管可能需要,如果電機的方向不同
要上傳代碼,請選擇‘ Arduino/Genuino Uno’板,在計算機的USB端口選擇正確的COM端口,插板并上傳代碼。
上傳完成后,拔掉USB線,然后放上電池。代碼將開始運行并且Arduino板將自動連接PS2操縱桿。首次使用時打開串口監視器并檢查連接狀態。如果無法連接操縱桿,有一些事情應該做:
重置Arduino Uno板。嘗試幾次(對我來說,它通常在第三次復位后工作);
檢查操縱桿是否打開(和充電電池)。接收器有一些LED指示燈將指示操縱桿是否配對。同時檢查Arduino的RX和TX引腳是否在接收到新命令時閃爍(并更新狀態串行端口);
檢查連接。..。..組件之間的跳線可能有問題。
代碼說明:
在這個項目中我只需要使用PS2X_lib.h庫。我在代碼的開頭添加了。
#include
定義連接到h橋的Arduino的引腳。如果您使用我所做的相同連接,您將擁有以下配置。如果您選擇使用不同的引腳,請更新代碼的這一部分。
// These are used to set the direction of the bridge driver.
#define ENA 3 //ENA
#define MOTORA_1 4 //IN3
#define MOTORA_2 5 //IN4
#define MOTORB_1 8 //IN1
#define MOTORB_2 7 //IN2
#define ENB 6 //ENB
在設置之前聲明了一些全局變量( p2sx ,錯誤,鍵入和振動)。第一個是PS2X類的實例。連接期間的錯誤狀態將存儲在錯誤整數上。 類型和振動將指示控制器的類型(DualShock或GuitarHero控制器)以及是否應根據給定命令振動。
第一個我在設置過程中做的事情是配置I/O引腳狀態(作為輸出)并將使能引腳設置為低電平。這樣你就可以在啟動時禁用兩個電機,機器人在等待剩下的代碼時不會隨機移動。
// Configure output pins
pinMode(ENA, OUTPUT);
pinMode(MOTORA_1, OUTPUT);
pinMode(MOTORA_2, OUTPUT);
pinMode(ENB, OUTPUT);
pinMode(MOTORB_1, OUTPUT);
pinMode(MOTORB_2, OUTPUT);
// Disable both motors
digitalWrite(ENA,0);
digitalWrite(ENB,0);
然后我啟動了串口通訊(用于驗證代碼)。選擇合適的波特率并在串行監視器上設置相同的速度。
// Start serial communication
Serial.begin(57600);
最后,使用連接到操縱桿接收器的Arduino引腳(分別為時鐘,命令,注意和數據)配置ps2x對象。它可能會返回錯誤(顯示在串行監視器上)。控制器的類型也將顯示(盡管您可能已經知道此時手中的控制器類型:D)。
error = ps2x.config_gamepad(13,11,10,12, true, true); //setup pins and settings: GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error
// Check for error
if(error == 0){
Serial.println(“Found Controller, configured successful”);
}
else if(error == 1)
Serial.println(“No controller found, check wiring or reset the Arduino”);
else if(error == 2)
Serial.println(“Controller found but not accepting commands”);
else if(error == 3)
Serial.println(“Controller refusing to enter Pressures mode, may not support it.”);
// Check for the type of controller
type = ps2x.readType();
switch(type) {
case 0:
Serial.println(“Unknown Controller type”);
break;
case 1:
Serial.println(“DualShock Controller Found”);
break;
case 2:
Serial.println(“GuitarHero Controller Found”);
break;
}
在主循環期間,Arduino將讀取每個D-pad按鈕(UP,DOWN,LEFT和RIGTH)并設置輸出引腳的不同值,以便移動輪子。快速延遲后,將啟動一個新循環。
以下部分顯示如果按下UP按鈕,如何向前移動機器人。 MOTORA_1和MOTORA_2引腳定義電機A的旋轉方向.ENA將定義是否啟用運動(電機開/關)。注意它是一個“模擬”輸出(實際上是PWM輸出)。它的值應該介于0和1023之間。這將調制PWM,并改變h-brigde輸出端的平均電壓(介于0和12V之間)。如果平均電壓太低,電機根本無法移動。
// MOVE FORWARD
if(ps2x.Button(PSB_PAD_UP)) {
digitalWrite(MOTORA_1,LOW);
digitalWrite(MOTORA_2,HIGH);
digitalWrite(MOTORB_1,HIGH);
digitalWrite(MOTORB_2,LOW);
analogWrite(ENB, 1023);
analogWrite(ENA, 1023);
Serial.println(“Move forward”);
}
如果你按照我的方式連接引腳,你將得到以下輸出:
輸出ENAIN1IN2ENBIN3IN4
FORWARD1023 *LOWHIGH1023 *HIGHLOW
BACKWARD1023 * 《無線電通信/》HIGHLOW1023 *LOWHIGH
RIGHT1023 *HIGHLOW1023 *HIGHLOW
LEFT1023 *LOWHIGH0 *LOWHIGH
STOP0 ***0 ***
*我使用了PWM輸出作為ENA和ENB引腳。這樣,1023表示具有最大長度的脈沖(引腳始終接通),0表示不存在脈沖(引腳始終斷開)。如果在這里使用不同的(較小的)值,則預計電機運行較慢,因為它們的端子中的平均電壓會較小。
第7步:草圖#2 - 模擬棒和數字按鈕(L2和R2)
At在給定的時間內,所有控制臺都采用了兩根模擬搖桿的操縱桿。這些新的輸入允許力敏感的輸入產生變速動作并在各種視頻游戲中變得流行。
在第二個例子中,我想使用模擬開關來操縱坦克,并推動一對按鈕作為油門和剎車/倒車。這種配置在許多賽車游戲中非常流行,例如Mario Kart。按下R2按鈕加速水箱,按L2反轉,根據左手的x位置設定運動方向。
我使用的機器人套件沒有很多慣性(如果電機上的電壓設置為0V,它將不會保持運動一段時間)。這樣,就無需定義用于制動機器人的命令。
大部分代碼已在前一步驟中說明。一個不同之處在于我定義了兩個存儲每個電機速度的變量(從0到1023)。
int motor_right_speed = 0;
int motor_left_speed = 0;
在主循環中,Arduino將讀取左搖桿的x位置。它將接收0到255之間的值,并將其映射到-1023和1023之間。
此值將被添加(或減去)到每個電機的速度,以便在速度之間產生差異每個軌道,讓機器人向左或向右轉動。
int nJoyL = ps2x.Analog(PSS_LX); // read left stick
nJoyL = map(nJoyL, 0, 255, 1023, -1023);
motor_right_speed = 1023;
motor_left_speed = 1023;
if (nJoyL 《 0) {
motor_right_speed = motor_right_speed + nJoyL;
}
if (nJoyL 》 0) {
motor_left_speed = motor_left_speed - nJoyL;
}
如果按下R2按鈕,水箱應向前移動。這樣,Arduino就可以為電機引腳設置合適的值。 ENA和ENB為每個電機創建“模擬”輸出,其值與每個電機所需的速度成比例(基于左手桿的x位置)。
L2將執行類似的操作,但會反轉電機的方向。
if(ps2x.Button(PSB_R2)) {
digitalWrite(MOTORA_1,LOW);
digitalWrite(MOTORA_2,HIGH);
digitalWrite(MOTORB_1,HIGH);
digitalWrite(MOTORB_2,LOW);
analogWrite(ENA, motor_right_speed);
analogWrite(ENB, motor_left_speed);
}
if(ps2x.Button(PSB_L2)) {
digitalWrite(MOTORA_1,HIGH);
digitalWrite(MOTORA_2,LOW);
digitalWrite(MOTORB_1,LOW);
digitalWrite(MOTORB_2,HIGH);
analogWrite(ENA, motor_right_speed);
analogWrite(ENB, motor_left_speed);
}
if(!ps2x.Button(PSB_L2) && !ps2x.Button(PSB_R2)) {
analogWrite(ENA, 0);
analogWrite(ENB, 0);
}
如果沒有按下任何按鈕,電機將被禁用。
步驟8:草圖#3 - 左右模擬棒(差分驅動器)
這是我的最愛控制坦克的方法(雖然它在資源方面不是最佳的)!這讓我覺得我用雙手控制著一臺真正的大機器!
在這段代碼中,我用兩根木棍來設定每條軌道的方向和速度。左手桿將命令左側軌道,右側手柄將控制右側軌道。
代碼幾乎與之前描述的相同。但是這次我想要讀取兩根棒的位置:
int nJoyL = ps2x.Analog(PSS_LY); // read left stick
int nJoyR = ps2x.Analog(PSS_RY); // read right stick
nJoyL = map(nJoyL, 0, 255, 1023, -1023);
nJoyR = map(nJoyR, 0, 255, -1023, 1023);
根據棒的位置,代碼將設置數字引腳以設置每個電機的方向。/p》
我在啟用(1023)時使用了固定值,但我根據模擬棒的實際值使用了一個變量值。我定義了一個死區(+ -50),微控制器將禁用電機。
// Perform movements based on both analog sticks
if(nJoyR》50) {
digitalWrite(MOTORA_1,HIGH);
digitalWrite(MOTORA_2,LOW);
analogWrite(ENA, 1023);
}
if(nJoyR《-50) {
digitalWrite(MOTORA_1,LOW);
digitalWrite(MOTORA_2,HIGH);
analogWrite(ENA, 1023);
}
if (abs(nJoyR)《50) {
analogWrite(ENA, 0);
}
步驟9:草圖#4 - 僅限左模擬棒
在此最后一個Sketch應用程序我使用一個操縱桿來控制機器人。它在使用資源方面是優勢(你將有很多按鈕可以配置不同的動作),但很難理解。
每個軌道的速度在x和x上有所不同。 y操縱桿的位置。這樣,可以在每個軌道上應用不同的速度,并以不同的速度/方向移動機器人。
第10步:最后的注意事項
我為這個項目付出了很多努力,使其盡可能清晰和有教育意義。如果你喜歡它,請不要忘記“喜歡”和“分享”它。你的支持對我來說非常重要! :D
-
控制器
+關注
關注
112文章
16423瀏覽量
178880 -
機器人
+關注
關注
211文章
28582瀏覽量
207818
發布評論請先 登錄
相關推薦
評論