無線遙控技術在人們日常生活中的使用範圍非常廣泛。相較于傳統的有線控制,無線遙控十分便捷,尤其是在遠距離控制場景中,例如拆彈機器人進行拆彈作業、衛星變軌、好奇号火星探索器等。作為一名創客老師,本着“自己動手,豐衣足食”的創客精神,使用無線遙控技術,就開始構思設計一個遙控車。
項目分析在設計之初,我希望設計的是一款能夠多向運動的遙控車,同時可以使用常見的手柄來控制。
考慮到遙控車的移動需要比較靈活來應對複雜的地形,選擇使用麥克納姆輪,遙控車可以實現豎直運動、水平運動、斜向運動、角旋轉、中心旋轉、邊旋轉等。
遙控車使用Arduino作為主控闆,使用PCA9685模塊來作為電機驅動,HC-05模塊來進行藍牙通訊。使用4路直流電機作為動力輸出。遙控手柄使用PS2手柄來控制小車的運動。
硬件設計
為了保證電機運動的穩定性,需要設計穩壓電路,采用5V 2A的穩壓輸出。
Arduino中常用的馬達驅動無法精确控制電機運動,而PCA9685模塊,主要起到精确控制電機運動的作用,采用I2C通訊,隻需要幾根I2C線就可以控制16路PWM,周期和占空比都可控。
電機這裡使用的是TT馬達。
使用HC-05藍牙模塊進行通訊。
使用PS2手柄來發送運動指令。
Arduino與PCA9685模塊通過I2C進行通訊。
硬件準備
Arduino主控闆*1
PCA9685集成電路闆*1
PS2手柄藍牙接收器*1
PS2手柄*1
TT馬達*4
麥克納姆輪*4和車架*1
18650電池盒*1
18650電池*2
模型搭建
Step 1、先将TT馬達安裝在底座上。
Step 2、安裝麥克納姆輪
Step 3、安裝Arduino底座
Step 4、安裝Arduino
Step 5、安裝PCA9685集成電路闆
Step 6、安裝藍牙接收器,并接線
Step 7、将電池盒中安上電池,底部貼上雙面膠,粘在底闆上
程序編寫
全向麥輪控制原理
編程軟件使用Mixly,項目使用的是1.2.5版本,加載MotorShield拓展庫。拓展庫地址:
鍊接:
https:///s/1ZpXFBouasjTgFojlXRJqPA
提取碼:mld4
先編寫各個方向的運動程序。需要編寫的運動程序有:
1. 前進(moveForward)
2. 後退(moveBackward)
3. 左轉(moveLeft)
4. 右轉(moveRight)
5. 45°方向移動(move45)
6. 135°方向移動(move135)
7. 順時針旋轉(turnAroundCW)
8. 逆時針旋轉(turnAroundCCW)
9. 停止(moveStop)
手柄按鍵與運動方向的對應關系,如下圖所示。
參考程序如下:
參考C 代碼:
#include <Wire.h>
#include <PS2X_lib.h>
#include <Adafruit_MS_PWMServoDriver.h>
#include "QGPMaker_MotorShield.h"
#include "QGPMaker_Encoder.h"
QGPMaker_MotorShield AFMS = QGPMaker_MotorShield();
PS2X ps2x;
QGPMaker_DCMotor *DCMotor_1 = AFMS.getMotor(1);
QGPMaker_DCMotor *DCMotor_2 = AFMS.getMotor(2);
QGPMaker_DCMotor *DCMotor_3 = AFMS.getMotor(3);
QGPMaker_DCMotor *DCMotor_4 = AFMS.getMotor(4);
void moveForward() {
DCMotor_1->setSpeed(200);
DCMotor_1->run(FORWARD);
DCMotor_2->setSpeed(200);
DCMotor_2->run(FORWARD);
DCMotor_3->setSpeed(200);
DCMotor_3->run(FORWARD);
DCMotor_4->setSpeed(200);
DCMotor_4->run(FORWARD);
}
void move45() {
DCMotor_1->setSpeed(200);
DCMotor_1->run(FORWARD);
DCMotor_3->setSpeed(200);
DCMotor_3->run(FORWARD);
DCMotor_2->setSpeed(0);
DCMotor_2->run(RELEASE);
DCMotor_4->setSpeed(0);
DCMotor_4->run(RELEASE);
}
void move135() {
DCMotor_2->setSpeed(200);
DCMotor_2->run(FORWARD);
DCMotor_4->setSpeed(200);
DCMotor_4->run(FORWARD);
DCMotor_1->setSpeed(0);
DCMotor_1->run(RELEASE);
DCMotor_3->setSpeed(0);
DCMotor_3->run(RELEASE);
}
void moveBackward() {
DCMotor_1->setSpeed(200);
DCMotor_1->run(BACKWARD);
DCMotor_2->setSpeed(200);
DCMotor_2->run(BACKWARD);
DCMotor_3->setSpeed(200);
DCMotor_3->run(BACKWARD);
DCMotor_4->setSpeed(200);
DCMotor_4->run(BACKWARD);
}
void turnAroundCW() {
DCMotor_1->setSpeed(200);
DCMotor_1->run(FORWARD);
DCMotor_2->setSpeed(200);
DCMotor_2->run(BACKWARD);
DCMotor_3->setSpeed(200);
DCMotor_3->run(BACKWARD);
DCMotor_4->setSpeed(200);
DCMotor_4->run(FORWARD);
}
void turnAroundCCW() {
DCMotor_1->setSpeed(200);
DCMotor_1->run(BACKWARD);
DCMotor_2->setSpeed(200);
DCMotor_2->run(FORWARD);
DCMotor_3->setSpeed(200);
DCMotor_3->run(FORWARD);
DCMotor_4->setSpeed(200);
DCMotor_4->run(BACKWARD);
}
void moveLeft() {
DCMotor_1->setSpeed(200);
DCMotor_1->run(BACKWARD);
DCMotor_2->setSpeed(200);
DCMotor_2->run(FORWARD);
DCMotor_3->setSpeed(200);
DCMotor_3->run(BACKWARD);
DCMotor_4->setSpeed(200);
DCMotor_4->run(FORWARD);
}
void moveRight() {
DCMotor_1->setSpeed(200);
DCMotor_1->run(FORWARD);
DCMotor_2->setSpeed(200);
DCMotor_2->run(BACKWARD);
DCMotor_3->setSpeed(200);
DCMotor_3->run(FORWARD);
DCMotor_4->setSpeed(200);
DCMotor_4->run(BACKWARD);
}
void moveStop() {
DCMotor_1->setSpeed(0);
DCMotor_1->run(RELEASE);
DCMotor_2->setSpeed(0);
DCMotor_2->run(RELEASE);
DCMotor_3->setSpeed(0);
DCMotor_3->run(RELEASE);
DCMotor_4->setSpeed(0);
DCMotor_4->run(RELEASE);
}
void setup() {
AFMS.begin(50);
int error = 0;
do {
error = ps2x.config_gamepad(13, 11, 10, 12, true, true);
if (error == 0) {
break;
} else {
delay(100);
}
} while (1);
for (size_t i = 0; i < 50; i ) {
ps2x.read_gamepad(false, 0);
delay(10);
}
}
void loop() {
ps2x.read_gamepad(false, 0);
delay(3);
if (ps2x.Button(PSB_PAD_UP)) {
moveForward();
}
if (ps2x.Button(PSB_PAD_DOWN)) {
moveBackward();
}
if (ps2x.Button(PSB_PAD_LEFT)) {
moveLeft();
}
if (ps2x.Button(PSB_PAD_RIGHT)) {
moveRight();
}
if (ps2x.Button(PSB_CROSS)) {
moveStop();
}
if (ps2x.Button(PSB_CIRCLE)) {
turnAroundCW();
}
if (ps2x.Button(PSB_TRIANGLE)) {
move45();
}
if (ps2x.Button(PSB_SQUARE)) {
turnAroundCCW();
}
}
參考程序鍊接:
鍊接:
https:///s/1JzGkEWGkdWmkXn1dES2s7g
提取碼:aq8n
常見問題
問:遙控車,無法前進、後退。
答:遙控車接線錯誤,參考接線圖如下,将旋轉錯誤的引腳反接到另一端。
問:遙控車無法左移、右移。
答:在安裝時,需要注意麥克納姆輪的安裝順序,參考下圖修改麥克納姆輪的安裝。
外觀設計與安裝
麥克納姆輪小車的整體功能已經完畢,裸露的電線和主闆,并不美觀,對于一個作品來說,美的外觀也是重要的。先對麥克納姆輪小車的車殼進行3D建模。使用Rhino 7 來進行建模。Rhino是是美國Robert McNeel & Assoc.開發的PC上強大的專業3D造型軟件,它可以廣泛地應用于三維動畫制作、工業制造、科學研究以及機械設計等領域。建模完成導出stl格式。
打開FlashPrint軟件,使用的是閃鑄的打印機,因此使用了FlashPrint軟件,導入stl文件,進行切片。
放入到打印機中,進行打印。
3D打印之後,模型就已經具備了,接下來需要對模型進行吸塑,制作外殼,吸塑使用的是iForm桌面式智能真空成型機。
取一張1.0mm的HIPS,放入到吸塑機當中。旋轉把手,将HIPS耗材放入到上下夾闆 當中。
擡升把手到頂部,将模型放入到吸塑平台當中,并設置吸塑參數為HIPS、1.0mm、 175℃、吹氣開,對耗材進行加熱。
等待加熱完畢,下壓把手,進行吸塑,吸塑結束後,系統會自動進行冷卻并吹塑。
取出模型,模型的細節也被很好地吸塑出來。
裁剪多餘的耗材,将小車外殼裁剪下來。
對小車外殼進行彩繪。在HIPS耗材上進行彩繪,丙烯顔料無法良好地附着在耗材上,需要先使用油漆進行預處理,再使用丙烯顔料繪制,這裡使用了黃色油漆,并在油漆上有黑色丙烯顔料繪制。
最後在外殼底部粘上雙面膠,将外殼與車架粘在一起。别忘了打開電池開關,和手柄開關。就可以愉快地試驗了。
結束語
整個作品通過Arduino、3D打印、iForm吸塑機來實現,将創客領域常用的工具結合在一起。Arduino造就了作品的靈魂,3D打印賦予作品更多外延的結構,而iForm吸塑機對模型更加便捷地翻模制作、二次加工。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!