Maker: Markus Opitz/譯:趣無(wú)盡 Cherry(轉(zhuǎn)載請(qǐng)注明出處)
螞蟻是一種神奇的多足生物,它們只需要很少的資源,就可以做很多事情。本期項(xiàng)目中的螞蟻機(jī)器人是基于 ESP32 開(kāi)發(fā)的。
一般來(lái)說(shuō),許多六條腿的機(jī)器人每條腿最多需要三個(gè)舵機(jī),那么總共就需要 18 個(gè)舵機(jī),這會(huì)消耗了大量的能量,也與螞蟻本身的體型相沖突。
但在這個(gè)項(xiàng)目中只用到三個(gè)舵機(jī)、一個(gè)夾具和一點(diǎn)機(jī)械設(shè)備,就實(shí)現(xiàn)了一只極簡(jiǎn)主義的螞蟻機(jī)器人,除開(kāi)電池,重量約 114 克。
組件清單
SG90 舵機(jī) x 3
ESP32-C3 XIAO 或其他 ESP32/ESP8266 板 x 1
回形針 x 若干
小螺絲 x 若干
5V 降壓轉(zhuǎn)換器 MP1584 x 1
9V 或 7.4LiPo 電池 x 1
3D 打印部件
所有的零部件使用 Tinkercad 設(shè)計(jì)并使用 Ultimaker Cura 制作。
安裝螞蟻軀干部分
使用鉗子或者鋸和銼刀拆下所有舵機(jī)上的凸舌。
如圖所示,將打印底部支架用兩個(gè)尖頭螺釘固定到舵機(jī) 2 上,舵機(jī)的中間是可以擺動(dòng)。它還有一個(gè)小蓋子,稍后用螺絲固定。
再用熱膠固定舵機(jī) 1 和舵機(jī) 3 以及舵機(jī) 2 的蓋子。
安裝腿部零件之前,舵機(jī)必須居中。因此,可以使用小程序 centregs.ino 將舵機(jī)設(shè)置為 90。
安裝舵機(jī)和腿部
每個(gè)舵機(jī)帶動(dòng)一對(duì)腿,前后移動(dòng)幾度。舵機(jī) 1 和舵機(jī) 3 會(huì)同時(shí)移動(dòng),所以可以考慮在微控制器上使用相同的引腳去控制。
舵機(jī) 2 是以相反的方向移動(dòng),并且擺動(dòng)時(shí)會(huì)將腿正確的牽引到地面。這種擺動(dòng)是由連接到舵機(jī) 1 的回形針產(chǎn)生的。
將每個(gè)支腿安裝到舵機(jī)上,可能還需要鉆孔。
安裝機(jī)械部分
安裝時(shí)使用螺釘和回形針,通過(guò)腿的安裝板將舵機(jī) 1 連接到舵機(jī) 2 的蓋子上。這樣就可以跟舵機(jī) 1 同步同角度傾斜。
安裝頭部和夾子
頭部的夾子造型其實(shí)不是必須的,但它有很好的額外功能。
將不帶臂的舵機(jī)安裝到框內(nèi)。首先將舵機(jī)設(shè)置為 90(可參考 centreslegs.ino)。將合適的夾子零件放在齒輪上,并用舵機(jī)螺釘固定。然后把第二部分放在軸上。
用熱膠水將夾子倒置地粘在頭部,然后合上頭部。把頭放在軀干的頂部,并用膠水粘牢。
安裝尾部電池
將尾部連接到軀干上并粘合。它將容納電池和微控制器。
電路和軟件
9V 的電池能夠?yàn)槎鏅C(jī)提供足夠的能量,但電壓必須通過(guò)降壓轉(zhuǎn)換器降低到 5V。
四個(gè)舵機(jī)的電源通過(guò) 5V 并聯(lián)運(yùn)行,數(shù)據(jù)線連接到 ESP32 開(kāi)發(fā)板。它不需要更多的連接。不過(guò),它還可以連接到傳感器或 LED。
將文件名為 “Blue_Ant-RemoteXY.ino” 傳輸?shù)?ESP32 開(kāi)發(fā)板。同時(shí)遙控器已經(jīng)包含在程序中??蓞⒖糋etting-Started-With-ESP32-C3-XIAO
適用于 ESP32-C3 的舵機(jī)庫(kù):ESP32C3Servo
/* / Blue Ant (2023) Markus Opitz */ // ************ RemoteXY ************* #define REMOTEXY_MODE__ESP32CORE_BLE #include#include // RemoteXY connection settings #define REMOTEXY_BLUETOOTH_NAME "ESP32-C3_Remote" // RemoteXY configurate #pragma pack(push, 1) uint8_t RemoteXY_CONF[] = // 43 bytes { 255,3,0,0,0,36,0,16,202,1,5,32,17,37,30,30,2,26,24,4, 128,13,23,37,6,2,78,129,0,3,3,24,6,165,66,108,117,101,32,65, 110,116,0 }; // this structure defines all the variables and events of your control interface struct { // input variables int8_t joystick_1_x; // from -100 to 100 int8_t joystick_1_y; // from -100 to 100 int8_t slider_1; // =0..100 slider position // other variable uint8_t connect_flag; // =1 if wire connected, else =0 } RemoteXY; #pragma pack(pop) // ************************* // ************************* Servos #include Servo servo1; Servo servo2; Servo servo3; // Servo3 is attacheched to same pin as Servo1 !!! Servo Jaws; int pos1, pos2; // variable to store the servo position int centerpos = 90; int minpos = centerpos-12; int maxpos = centerpos+12; int gripper; //int speed1; void setup() { Serial.begin(115200); servo1.attach(2); servo2.attach(3); servo3.attach(4); //Servo3 can be attached to same pin as Servo1 //GPIOs on ESP32-C3! Jaws.attach(5); delay(2); servo1.write(centerpos);servo2.write(centerpos-7);servo3.write(centerpos); //center all servos Jaws.write(centerpos); delay(3000); RemoteXY_Init (); } void loop() { RemoteXY_Handler (); if ((RemoteXY.joystick_1_x) < -30) { //Serial.println("<-- left "); left(16); } if ((RemoteXY.joystick_1_x) > 30) { //Serial.println(" right -->"); right(16); } if ((RemoteXY.joystick_1_y) < -30) { //Serial.println(" backwards "); // not yet installed } if ((RemoteXY.joystick_1_y) > 30) { //Serial.println(" ^forward^ "); forward(16); } gripper = map((RemoteXY.slider_1), 0, 100, 75,105); Jaws.write(gripper); delay(1); } void forward(int speed1) { //speed1 in ms as delay between steps for (pos1 = minpos; pos1 <= maxpos; pos1 += 2) { pos2 = map(pos1, minpos, maxpos, maxpos, minpos); servo1.write(pos1);servo3.write(pos1);Serial.print(pos1);Serial.print(" "); // front/rear legs servo2.write(pos2); Serial.print(pos2); Serial.println(""); // center legs delay(speed1); } for (pos1 = maxpos; pos1 >= minpos; pos1 -= 2) { pos2 = map(pos1, minpos, maxpos, maxpos, minpos); servo1.write(pos1);servo3.write(pos1); // front/rear legs servo2.write(pos2); delay(speed1); } } void right(int speed1) { //speed1 in ms as delay between steps for (pos1 = minpos; pos1 <= maxpos; pos1 += 2) { pos2 = map(pos1, minpos, maxpos, maxpos, minpos); servo1.write(pos1+10);servo3.write(pos1+10); // front/rear legs servo2.write(pos2+10); // center legs delay(speed1); } for (pos1 = maxpos; pos1 >= minpos; pos1 -= 1) { pos2 = map(pos1, minpos, maxpos, maxpos, minpos); servo1.write(pos1+10);servo3.write(pos1+10); // front/rear legs servo2.write(pos2+10); delay(speed1); } } void left(int speed1) { //speed1 in ms as delay between steps //pos2 = maxpos + 1 -7; //-8 is to correct center position for (pos1 = minpos; pos1 <= maxpos; pos1 += 1) { pos2 = map(pos1, minpos, maxpos, maxpos, minpos); servo1.write(pos1-10);servo3.write(pos1-10); // front/rear legs servo2.write(pos2-10); // center legs delay(speed1); } for (pos1 = maxpos; pos1 >= minpos; pos1 -= 2) { pos2 = map(pos1, minpos, maxpos, maxpos, minpos); servo1.write(pos1-10);servo3.write(pos1-10); // front/rear legs servo2.write(pos2-10); delay(speed1); } }
源碼文件在這里可以下載:
https://make.quwj.com/project/475
遠(yuǎn)程控制
遙控器已包含在代碼中。
在 https://remotexy.com/ 中,你可以為智能手機(jī)遙控器創(chuàng)建自己的界面,并將其插入到程序“Blue_Ant-RemoteXY.ino” 中。
在智能手機(jī)上安裝應(yīng)用程序,激活藍(lán)牙,打開(kāi) “RemoteXY”,搜索并與配對(duì) “ESP32-C3_Remote” 。
完成
現(xiàn)在你可以啟動(dòng)這只螞蟻,等待片刻,激活應(yīng)用程序,它就可以跑起來(lái)了。
-
機(jī)器人
+關(guān)注
關(guān)注
210文章
28102瀏覽量
205843 -
機(jī)械
+關(guān)注
關(guān)注
8文章
1502瀏覽量
40420 -
降壓轉(zhuǎn)換器
+關(guān)注
關(guān)注
7文章
1299瀏覽量
86341 -
舵機(jī)
+關(guān)注
關(guān)注
17文章
264瀏覽量
40913 -
ESP32
+關(guān)注
關(guān)注
17文章
950瀏覽量
16992
原文標(biāo)題:僅由三個(gè)舵機(jī)驅(qū)動(dòng)的機(jī)械螞蟻
文章出處:【微信號(hào):趣無(wú)盡,微信公眾號(hào):趣無(wú)盡】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論