在這個項目中,我們將使用 Arduino 構(gòu)建一個動畫眼睛。在網(wǎng)上尋找新的項目創(chuàng)意時,我萌生了制作動畫眼睛的想法,這個項目立即引起了我的注意。首先,它看起來很酷,并且有一個簡單的機(jī)制,我在做這個項目時學(xué)到了很多關(guān)于機(jī)電一體化的知識。非常感謝Will Cogley構(gòu)建 3D 模型并讓社區(qū)可以訪問所有源文件,用他的話來說,他想設(shè)計它,以便制造商社區(qū)更容易訪問它。這個動畫眼睛設(shè)計有兩個版本,一個簡單的和一個高級的,對于這個項目,我們認(rèn)為構(gòu)建簡單的,在這個過程中,我們會告訴你構(gòu)建經(jīng)驗以及我們遇到的問題。
構(gòu)建 3D 打印電子動畫眼睛所需的組件
這個項目的 BOM 非常小,因為所有的辛苦工作都是由 3D 打印機(jī)完成的,我們只需要一些螺絲和粗體,大部分你可以在當(dāng)?shù)氐膼酆蒙痰暾业?。下面給出了 BOM 的完整列表。
六臺SG90伺服電機(jī)
螺釘 M2、M3 和 M4
Arduino UNO
跨接電纜
面包板
針頭機(jī)
PLA 燈絲和 3D 打印機(jī)
后處理和組裝 - 電子動畫眼睛機(jī)構(gòu)
要使用這個項目,我們需要首先打印所有 3D 模型,您可以在Ikkalebob instructables中找到 3D 模型。打印完所有 3D 部件后,您需要打磨眼睛和其他一些順利合作所需的部件,一旦這些部件完成,我們就可以繼續(xù)進(jìn)行組裝過程。如果您正確打印了每個部分,您的產(chǎn)品應(yīng)該類似于下圖。
我們將通過將 6 個伺服電機(jī)中的 5 個連接到Servo_Block模塊來開始構(gòu)建,如下圖所示。為了捕捉圖像,我必須使用黑色作為背景,因為它增加了圖像的細(xì)節(jié)層次。
現(xiàn)在我們將Servo_Block連接到Main_Base,如下圖所示。我們還使用了四個 12 毫米 M3 內(nèi)六角螺釘來制作設(shè)備的支腿。
接下來,我們將為雙眼連接 Eye-Adaptor 和 Fork。完成后,我們將 Eye-Holder 與 Eye-Adaptor 和Three-point_Connector與 Fork 連接。完成所有這些過程后,它將如下圖所示。
完成后,我們將第六個和最后一個伺服器連接到Sub_Base,然后用螺絲將Sub_Base連接到Main_Base。在此之后,我們將 PlaceHolder Eye 彈出到眼睛適配器。我們還用螺釘連接了 X 臂和 Y 臂。
現(xiàn)在我們將眼瞼連接器連接到眼瞼,我們使用 M3 螺釘從兩側(cè)將眼瞼固定到位。
如果您已正確完成所有操作,圖像將類似于上圖所示的圖像 ,您可以看到我們已將所有眼瞼與眼瞼連接器連接起來,并且我們已將它們與伺服電機(jī)的臂擰緊。完成后,我們可以進(jìn)入編碼過程。
3D打印的Animatronic眼睛電路圖
DIY 3D 打印的仿真眼示意圖如下圖所示,您可以看到它非常簡單易懂。雖然項目設(shè)計者和作者提供的原理圖中使用了 PCA9685 IC,一個 16 通道 12 位 PWM 伺服電機(jī)驅(qū)動器,但我們不會在這個項目中使用它,因為 Arduino 的伺服庫可以輕松處理六個伺服器。
正如我們之前所說,硬件連接非常簡單。我們使用 Arduino 的六個引腳來控制六個伺服電機(jī)。如果我們快速瀏覽一下 Arduino 的規(guī)格,您會發(fā)現(xiàn) Arduino 有六個 PWM 引腳,我們正在使用所有這些引腳來控制所有六個伺服電機(jī)。
用于控制動畫眼睛的 Arduino 代碼
動畫眼睛 Arduino 代碼非常簡單易懂。為了使這段代碼正常工作,我們將使用 Arduino 的Servo.h 庫。
我們通過包含所需的庫并定義控制所有六個伺服電機(jī)所需的所有實例來開始我們的代碼。
#include <伺服.h> 伺服 top_left_eyelid; 伺服底部_左眼瞼; 伺服 top_right_eyelid; 伺服bottom_right_eyelid; 伺服紗線; 伺服 Xarm;
接下來,我們有我們的setup()函數(shù)。在 setup 函數(shù)中,我們已經(jīng)聲明了眼睛的哪個部分連接到 Arduino 的哪個引腳。這非常有用,因為我們可以拔下所有連接器并按原樣連接。
top_left_eyelid.attach(10); bottom_left_eyelid.attach(11); top_right_eyelid.attach(5); bottom_right_eyelid.attach(6); Yarm.attach(9); Xarm.attach(3);
接下來,我們初始化串口進(jìn)行調(diào)試,并調(diào)用一些函數(shù)以保持眼睛睜開并位于中心,我們還添加了一些延遲以保持穩(wěn)定性。
序列號.開始(9600); 開眼(); 眼球中心(); 延遲(2000);
接下來,我們有我們的loop()函數(shù),但在我們解釋循環(huán)函數(shù)之前,我們將解釋一些更重要的函數(shù),這些函數(shù)對于理解循環(huán)函數(shù)內(nèi)部的內(nèi)容是必要的。這些功能是最重要的功能,有了這些,我們將移動系統(tǒng)的眼球。首先,我們有open_eye()函數(shù)。如果你看硬件,你需要順時針移動一個伺服器,逆時針方向移動另一個伺服器,我們對左右眼瞼都做同樣的事情。
無效的開眼(){ top_left_eyelid.write(55); bottom_left_eyelid.write(36); top_right_eyelid.write(2); bottom_right_eyelid.write(160); }
接下來是close_eye()函數(shù),在close_eye函數(shù)中,我們將做與open_eye函數(shù)完全相同的事情,但相反。
無效 close_eye() { top_left_eyelid.write(2); bottom_left_eyelid.write(120); top_right_eyelid.write(46); bottom_right_eyelid.write(55); }
接下來,我們有l(wèi)ook_up()和look_down()函數(shù)。如果您查看硬件,移動設(shè)備的 Y 臂會使眼球上下移動。
無效查找(){ Yarm.write(132); } 無效look_down(){ Yarm.write(45); }
接下來,我們有eye_ball_left()和eye_ball_right()函數(shù),它們與 up 和 down 函數(shù)相同,唯一的區(qū)別在于設(shè)備的角度。
無效 eye_ball_left() { Xarm.write(50); } 無效的eye_ball_right(){ Xarm.write(130); }
接下來我們有eye_ball_centert()函數(shù)。在此功能中,我們將 X 臂和 Y 臂設(shè)置為 90 度角,以便我們可以將眼睛移動到死點。
無效的eye_ball_centert(){ Xarm.write(90); Yarm.write(90); }
現(xiàn)在我們有了一些我編寫的其他函數(shù),以使我們的生活更輕松。在該列表中,我們首先有synchronous_close()函數(shù),調(diào)用此函數(shù)將關(guān)閉并打開一次眼睛。
無效同步關(guān)閉(){ close_eye(); 延遲(420); 開眼(); 延遲(222); }
然后我們有random_close()函數(shù),它將隨機(jī)打開和關(guān)閉眼睛。這將產(chǎn)生很酷的效果。
無效隨機(jī)關(guān)閉(){ close_eye(); 延遲(隨機(jī)(220、880)); 開眼(); 延遲(隨機(jī)(220、880)); }
接下來,我們有random_movement()函數(shù)。在這個函數(shù)中,我們在延遲函數(shù)中使用了 Arduino 的random()函數(shù)來使眼睛隨機(jī)移動。
無效隨機(jī)運動(){ Xarm.write(60); 延遲(隨機(jī)(250、340)); Yarm.write(80); 延遲(隨機(jī)(250、340)); Xarm.write(120); 延遲(隨機(jī)(250、340)); Yarm.write(140); Xarm.write(60); 延遲(隨機(jī)(250、340)); Yarm.write(80); 延遲(隨機(jī)(250、340)); Xarm.write(120); 延遲(隨機(jī)(250、340)); Yarm.write(140); 眼球中心(); 延遲(300); 同步關(guān)閉(); 隨機(jī)關(guān)閉(); }
現(xiàn)在我們將解釋 void 循環(huán)功能,它是 Arduino 的主要功能。在這個函數(shù)中,我們將眼睛向左、向右和居中移動,然后上下移動,然后我們會讓眼睛眨眼。我們將這樣做幾次并做出隨機(jī)動作。最后,我們有兩個 for 循環(huán)。for 循環(huán)是如何實現(xiàn)平滑運動或移動眼球的示例。
無效循環(huán)(){ eye_ball_left(); 延遲(680); eye_ball_right(); 延遲(680); 眼球中心(); 延遲(450); 同步關(guān)閉(); 眼球中心(); 延遲(450); 抬頭(); 延遲(400); 向下看(); 延遲(400); 眼球中心(); 延遲(300); 隨機(jī)關(guān)閉(); 延遲(450); 抬頭(); 延遲(400); 向下看(); 延遲(400); 隨機(jī)運動(); 延遲(400); 眼球中心(); 延遲(300); top_left_eyelid.write(2); bottom_left_eyelid.write(120); 延遲(200); top_left_eyelid.write(55); bottom_left_eyelid.write(36); 延遲(200); 開眼(); 延遲(500); 對于 (int i = 60; i < 120; i++) { Xarm.write(i); Yarm.write(i - 5); 延遲(10); } 眼球中心(); 延遲(400); 同步關(guān)閉(); for (int i = 120; i > 60; i--) { Xarm.write(i); Yarm.write(i - 5); 延遲(10); } }
這標(biāo)志著代碼部分的結(jié)束,我們可以繼續(xù)閱讀本文的下一部分。
測試和調(diào)試 3D 打印的電子動畫眼睛
由于項目的機(jī)械部分有點忙,有很多事情在第一次開始時沒有奏效,所以在本節(jié)中,我想討論這些話題。
我們遇到的第一個問題是eye_place_holders移動不順暢,并且eye_place_holders和eye_lids之間存在很多摩擦。
解決此問題的方法是丟失固定眼支架和設(shè)備底座的螺釘,這些螺釘是上面所示的標(biāo)記螺釘。
下一個問題是如何將伺服臂連接到eye_lid和X-arm和Y-arm 的臂。這是一個大問題,因為如果沒有適當(dāng)?shù)慕宇^,設(shè)備將無法順利工作,因此在下圖中您可以看到所有伺服臂的圖片。
代碼
#include <伺服.h>
伺服 top_left_eyelid;
伺服底部_左眼瞼;
伺服 top_right_eyelid;
伺服bottom_right_eyelid;
伺服紗線;
伺服 Xarm;
無效設(shè)置(){
top_left_eyelid.attach(10);
bottom_left_eyelid.attach(11);
top_right_eyelid.attach(5);
bottom_right_eyelid.attach(6);
Yarm.attach(9);
Xarm.attach(3);
序列號.開始(9600);
開眼();
眼球中心();
延遲(2000);
}
無效循環(huán)(){
eye_ball_left();
延遲(680);
eye_ball_right();
延遲(680);
眼球中心();
延遲(450);
同步關(guān)閉();
//同步關(guān)閉();
眼球中心();
延遲(450);
抬頭();
延遲(400);
向下看();
延遲(400);
眼球中心();
延遲(300);
隨機(jī)關(guān)閉();
延遲(450);
抬頭();
延遲(400);
向下看();
延遲(400);
隨機(jī)運動();
延遲(400);
眼球中心();
延遲(300);
top_left_eyelid.write(2);
bottom_left_eyelid.write(120);
延遲(200);
top_left_eyelid.write(55);
bottom_left_eyelid.write(36);
延遲(200);
開眼();
延遲(500);
對于 (int i = 60; i < 120; i++)
{
Xarm.write(i);
Yarm.write(i - 5);
延遲(10);
}
眼球中心();
延遲(400);
同步關(guān)閉();
for (int i = 120; i > 60; i--) {
Xarm.write(i);
Yarm.write(i - 5);
延遲(10);
}
}
無效隨機(jī)運動(){
Xarm.write(60);
延遲(隨機(jī)(250、340));
Yarm.write(80);
延遲(隨機(jī)(250、340));
Xarm.write(120);
延遲(隨機(jī)(250、340));
Yarm.write(140);
Xarm.write(60);
延遲(隨機(jī)(250、340));
Yarm.write(80);
延遲(隨機(jī)(250、340));
Xarm.write(120);
延遲(隨機(jī)(250、340));
Yarm.write(140);
眼球中心();
延遲(300);
同步關(guān)閉();
隨機(jī)關(guān)閉();
}
無效隨機(jī)關(guān)閉(){
close_eye();
延遲(隨機(jī)(220、880));
開眼();
延遲(隨機(jī)(220、880));
}
無效同步關(guān)閉(){
close_eye();
延遲(420);
開眼();
延遲(222);
}
無效 eye_ball_left() {
Xarm.write(50);
}
無效的eye_ball_right(){
Xarm.write(130);
}
無效的eye_ball_centert(){
Xarm.write(90);
Yarm.write(90);
}
無效查找(){
Yarm.write(132);
}
無效look_down(){
Yarm.write(45);
}
無效 close_eye() {
top_left_eyelid.write(2);
bottom_left_eyelid.write(120);
top_right_eyelid.write(46);
bottom_right_eyelid.write(55);
}
無效的開眼(){
top_left_eyelid.write(55);
bottom_left_eyelid.write(36);
top_right_eyelid.write(2);
bottom_right_eyelid.write(160);
}
-
Arduino
+關(guān)注
關(guān)注
188文章
6468瀏覽量
186912 -
DIY設(shè)計
+關(guān)注
關(guān)注
2文章
59瀏覽量
19800 -
3D打印
+關(guān)注
關(guān)注
26文章
3546瀏覽量
109008
發(fā)布評論請先 登錄
相關(guān)推薦
評論