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