送女朋友一朵?“電子”?花,手把手教你!
大家好,我是張巧龍,今天是七夕。
總得給女朋友/老婆送點(diǎn)禮物吧,要不看看這個?機(jī)械郁金香雕塑,只需輕輕觸摸即可綻放,可以發(fā)出五彩斑斕的光亮。
一、視頻展示
二、硬件材料
- 1 * Arduino Nano R3
- 1 * SG90舵機(jī)
- 1 * TTP223觸摸模塊
- 1 * 1毫米黃銅線
- 1 * 2毫米黃銅管
- 1 * 0.3mm絕緣銅線
- 7 * WS2812 5050 LED燈
- 30 *?白色貼片1206 LED
三、實(shí)現(xiàn)過程
1. 整體思路在我告訴你如何創(chuàng)造這種美之前,先簡單地談?wù)勊侨绾芜\(yùn)作的。郁金香由6個花瓣組成,每個花瓣有5個貼片白色LED。
每個花瓣都與一個Arduino輸出引腳相連?;ㄈ镫[藏了7個RGBLED。
從電氣的角度來說,整個花是負(fù)電壓的,花瓣中的靜脈是正電壓?;ò晖ㄟ^推桿打開,推桿一直沿著莖桿向底座延伸。推桿由小型舵機(jī)構(gòu)的運(yùn)動控制。
閥桿側(cè)面的小葉片連接到底座內(nèi)的TTP223觸摸傳感器,并創(chuàng)建一個電容式觸摸板。木質(zhì)底座包含舵機(jī),觸摸IC和ArduinoNano。讓我們自己構(gòu)建一個吧!
?
?2. 制作花瓣(4小時)
讓我們從最令人滿意的部分開始- 開花的花瓣。
你需要的第一件事是開花的模板。我用石膏澆注成管模具。干燥后,我把它塑造成郁金香花。你也可以3D打印它,但我沒有3D打印機(jī)。石膏很棒,因?yàn)樗苋菀准庸?,鉛筆可以在上面畫畫。
單瓣是模板表面的1/4,所以最后當(dāng)它們有6個時,它們會略微重疊,形成郁金香花朵的精確外觀。
我用鉛筆在石膏表面畫出花瓣形狀。當(dāng)我對花瓣形狀感到滿意時,我用刀子將它雕刻成石膏,以幫助我在焊接時將桿固定到位。
花瓣由1毫米的黃銅棒組成,一直圍繞著形狀。花瓣內(nèi)部是5個1206白色LED和來自同一根線的“靜脈”結(jié)構(gòu)。首先,創(chuàng)建圓周線,花時間彎曲它。切下一小段管子并將其放在電線的底部平坦部分- 這將是鉸鏈花瓣將四處移動。
焊絲末端焊接在一起,確保不要用焊料填充管子。它需要自由移動。用LED和靜脈結(jié)構(gòu)完成花瓣??次易鲆粋€花瓣。對我感到羞恥,這是我制作這首花的唯一鏡頭。
現(xiàn)在再做5個。所有花瓣都需要完全相同。這真的很重要。否則,它們在關(guān)閉時不會像一個漂亮的郁金香形狀,甚至可能卡住。
?3. 制作開花(1小時)
是時候?qū)⑺谢ò旰附釉谝黄鹆?。花的基部是六角? 6個花瓣?;ò晖ㄟ^鉸鏈固定在六邊形上。然而,六邊形略微不規(guī)則。
我失敗很多次。花瓣需要相互重疊,如果六邊形是規(guī)則的,則不允許。三個花瓣靠近中心(內(nèi)花瓣),另外三個花瓣稍微偏移(外花瓣)。
為此,我創(chuàng)建了一個模板并將其打印在紙上。紅色形狀是由兩個嵌套的正六邊形組成的最終不規(guī)則六邊形。將所有鉸鏈(管道)焊接到六邊形上。
從模板中心出來的光線將幫助你將花瓣焊接到正確的位置?;ò甑闹行男枰S從六邊形中心出來的射線。最后,當(dāng)你關(guān)閉花瓣時,你將擁有最后的花朵形狀。
4.制作閥桿和推桿(1小時)
首先完成了開花內(nèi)部的機(jī)制,然后添加了一個桿和推桿。它為制作增添了許多痛苦。有一次,我?guī)缀跸氚阉鼇G棄,永不回頭?;ò甑囊苿邮怯?毫米黃銅推桿在黃銅管內(nèi)自由移動而產(chǎn)生的。
花瓣通過一個非常小的六邊形與推桿連接,每側(cè)有2mm長的鉸鏈- 推桿頭。六邊形垂直地坐在推桿上,借助穿過六邊形中心的小桿。這是制表師的工作。
為了做推桿頭,我做了第二個模板。首先,彎曲電線以形成微小的六邊形。然后切下2毫米長的小管并將它們放在電線上。焊接電線以完成六邊形形狀。
再次確保不要將管道焊接到電線上。繼續(xù)將焊絲焊接到六邊形的中心。并通過垂直于推桿頭中心焊接1毫米線完成桿。
將黃銅管切成所需長度。而現(xiàn)在是第二個關(guān)鍵部分。莖需要與花的六角形基部完全垂直,需要在其正中心,并且需要有足夠的空間讓推桿頭向下移動以關(guān)閉花瓣。首先,我將兩根電線焊接到閥桿的一端以形成V形膨脹。這些將是連接桿與六邊形基座頂點(diǎn)的6根線中的2根。
因此將花朵倒置并將V形膨脹物焊接到六角形底座的兩個相對頂點(diǎn)。檢查形狀。如果你把桿放在桿內(nèi),它需要在花的中心出來?;c(diǎn)時間在這里完美。這真的是一個至關(guān)重要的部分。當(dāng)你使用它時,在六邊形頂部的其余部分和桿頂部之間焊接4根導(dǎo)線。確保不要焊接管道內(nèi)的孔!
?5. 花瓣機(jī)制(6小時)
我差點(diǎn)把它丟進(jìn)垃圾桶里。你要釘它!對于這一部分,我受到蒸汽機(jī)及其桿,活塞和飛輪的啟發(fā)。
用莖將花固定在向上的位置。將推桿穿過閥桿,頭部朝上。垂直于推桿底端焊接短管,并用1mm黃銅線制成一個小連桿,用于連接舵機(jī)和推桿(見上圖)。應(yīng)該能夠使用舵機(jī)上下推動推桿。連接你的Arduino嘗試一下。
在開始焊接花瓣和推桿頭之間的連桿之前,需要使用Arduino調(diào)整舵機(jī)機(jī)芯。編寫代碼,以便在推桿頭端與開花六角形底座齊平的最頂部位置上下移動推桿。在最低位置,它位于開花V形底座的底部。
為使推桿運(yùn)動盡可能柔軟,請使用最靠近舵機(jī)臂中心的孔。舵機(jī)需要旋轉(zhuǎn)更長但步長更短。當(dāng)推桿向上移動時,推動連桿和花瓣向下。隨著它向下移動它連接桿和花瓣被關(guān)閉。
花瓣目前缺少一個關(guān)鍵部件- 花瓣針。這個鉸鏈?zhǔn)够ò暌苿?。鉸鏈位于一個桿上(見下圖),該桿與平行于其底座的每個花瓣焊接在一起?;ò赇N需要位于花瓣表面之上,以便在動畫中看到它完全打開。
用管子的鉸鏈制作一個這樣的棒,并將其焊接到第一個花瓣上。這將需要大量試驗(yàn)桿的大小及其與花瓣基部的距離,以允許推桿完全打開和關(guān)閉花瓣。使用試錯法。將桿焊接到合適的位置,并在推桿銷和花瓣銷之間添加連桿。
如果你的推桿位于上部位置而你的花瓣處于完全打開的位置,推桿銷和花瓣銷之間的空間就是連桿的長度。
現(xiàn)在嘗試上下推動推桿,看看發(fā)生了什么。如果它沒有任何摩擦工作正常,花瓣可以關(guān)閉和打開你完成(與第一個花瓣)
如果沒有,請嘗試不同長度的連桿或桿的不同位置。為了完成開花,在剩下的5個花瓣上復(fù)制相同的條和連桿。當(dāng)開花開放時,3個外花瓣需要稍低,以允許它們在關(guān)閉時適當(dāng)?shù)刂丿B內(nèi)花瓣。
最后,你應(yīng)該能夠關(guān)閉并打開花朵。不要驚慌如果你沒有做第一次嘗試的完美形狀。它只意味著所有的花瓣都不完全一樣??赡苄枰M(jìn)行大量的微調(diào)才能創(chuàng)造出完美的形狀- 連桿的長度和桿的位置略有不同。
?6. 花蕊(1小時)
在花開的里面,我放了7個LED從內(nèi)部發(fā)光。這些LED只需要控制一根DATA線,并且可以菊花鏈?zhǔn)竭B接。我把它們中的6個焊接在兩個小六邊形之間(當(dāng)然是另一個模板)。
下六邊形是地線,上半部分是正電壓。將適當(dāng)?shù)腘eoPixels引線焊接到這些六角環(huán)上。這些LED放置在45度角下,照射到側(cè)面。
為了使其更好,將第七個LED放入上六角的中心。最后但并非最不重要的是連接DATAIN和OUT導(dǎo)致創(chuàng)建菊花鏈。
這種結(jié)構(gòu)需要兩條線向下到達(dá)基座- VCC和DATA。地面取自花架。將一根0.3的絕緣銅線焊接到上環(huán)用于VCC,第二根焊接到菊花鏈中的第一個LED用于DATA。這些電線最后會到達(dá)基座。
使它們至少是莖長度的3倍。在焊接之前,這些電線的末端需要從它們的透明絕緣層中釋放出來。熱量不會破壞它。用刀子去除絕緣層。你現(xiàn)在可以測試LED以確保它們正常工作。用這些銅線溫和。
如果你不小心剝?nèi)ソ^緣材料以外的其他地方,可能會發(fā)生短路!
將雌蕊結(jié)構(gòu)放在花的中心。稍微偏離開花六角形底座,為花瓣連桿留出足夠的空間。對我來說,它比開花六邊形高1厘米。
用黃銅棒連接所有頂點(diǎn),形成堅固的結(jié)構(gòu)。花完成了!現(xiàn)在測試看看花瓣是否仍能自由移動。
?7.扎根(2小時)
花瓣和LED都需要電源線才能發(fā)光。整個花卉雕塑將是一個地面,但RGBLED有6個花瓣和2個線,需要連接到基座上的Arduino。為此,帶有透明絕緣的0.3毫米細(xì)銅線將纏繞在管桿上。用于LED的兩條線已經(jīng)完成。
將另外6個焊接到鉸鏈附近的每個花瓣上的松散靜脈線上,并使線穿過莖下的花開結(jié)構(gòu)。確保不要以銳角彎曲這些電線,它會很容易斷裂。
現(xiàn)在將所有電線收集在閥桿管的上端附近,并使用捆扎帶固定它們。不要過度擰緊,讓電線穿過它?,F(xiàn)在很好地組織開花內(nèi)的所有電線。
確保花瓣可以自由移動,推桿也不會與導(dǎo)線碰撞。完成了嗎?現(xiàn)在擰緊捆扎帶。
電線現(xiàn)在無法控制地繞著閥桿運(yùn)行。你需要耐心地慢慢地將它們包裹在莖干上。緊密而均勻。我花了至少一個小時才完成這一步。
當(dāng)你在桿的末端時,放置另一條捆扎帶以固定那里的電線并使用透明的強(qiáng)力膠將它們固定在那里。確保不要用推桿密封管道!
最后一根線缺失是一個地線。將另一根銅線焊接到閥桿的底端。你應(yīng)該最終從花中出來9根電線。
現(xiàn)在明智的做法是將所有電線連接到Arduino并測試是否沒有短路并且所有LED都亮起。
?8.制作花盆(2小時)
我希望這朵花能夠從人造花盆中長出來,這也將隱藏所有電子產(chǎn)品。我用了一塊木頭把它加工成一個4厘米高,直徑9厘米的圓筒。我沒有車床,因此我使用圓鋸切割原始形狀,然后使用壓力鉆作為臨時車床。
然后我用手動銑刀雕刻了一個2.5厘米深,直徑7厘米的開口,以適應(yīng)舵機(jī),ArduinoNano和觸摸傳感器IC。在底部,還有一個小開口,可以精確地安裝ArduinoNano USB端口,以便能夠從側(cè)面連接USB線。
如果你有花盆,可以在花朵生長的地方用電線鉆一個直徑為花莖的孔- 可能在中心。盡量適合你的花。電線要小心。如果你以銳角彎曲它們,它們就會斷裂。
最后,我還從底座內(nèi)部添加了一個大孔,為舵機(jī)臂和連桿騰出更多空間。你可以做你喜歡的任何形狀的花盆,請記住你需要適應(yīng)所有的電子設(shè)備。
?9.觸摸葉墊(1小時)
機(jī)械郁金香需要某種互動元素,使人能夠開花。我選擇了TTP223觸摸傳感器。但是哪里放一個觸控板?
我決定在莖的側(cè)面添加一點(diǎn)葉子,既可以使花更自然,也可以作為電容式觸摸板。觸摸時會觸發(fā)TTP223傳感器并告訴Arduino打開花朵。
當(dāng)你完成這么復(fù)雜的雕塑時,這對你來說將是一塊蛋糕。使用與花瓣相同的技術(shù)省略LED。我也為自己創(chuàng)建了一個模板。在桿孔旁邊的基座上鉆一個小孔,將葉子固定在那里。
如果你不想或不能使用電容式觸摸傳感器,可以在底座上添加一個普通的按鈕。它會做同樣的工作。
?10. 把它放在一起(2小時)
這是組裝的最后一步!你緊張嗎?將花莖再次插入基座的孔中?,F(xiàn)在,這是重要的一步。在切割前測量兩次!打開盛開的花朵。并切斷從閥桿出來的推桿的末端與閥桿齊平。
現(xiàn)在,當(dāng)你再次關(guān)閉花朵時,推桿應(yīng)從莖桿中拔出。垂直于推桿焊接短管。這將是連桿與舵機(jī)臂的鉸鏈。當(dāng)你放開花和桿時,它應(yīng)該完全打開,因?yàn)楣艿酪矔鳛橥V埂?/span>
你現(xiàn)在可以將桿粘在底座上。確保閥桿管端與底座內(nèi)側(cè)齊平,以便為舵機(jī)臂留出盡可能多的空間。我再次使用過強(qiáng)力膠水。確保不要將推桿與閥桿粘在一起。這會破壞你的工作!
接下來,膠水在葉墊上。在你將銅線焊接到它之前,能夠?qū)⑷~墊連接到TTP223觸摸傳感器。
將花倒置。雕塑周圍要小心,不要現(xiàn)在打破它!這將是多么浪費(fèi)!首先,將舵機(jī)放入最終位置。它的手臂應(yīng)該已經(jīng)從試驗(yàn)臺準(zhǔn)備好了。只需找到舵機(jī)臂在底座內(nèi)自由移動并將連桿連接到推桿的最佳位置。
為了將舵機(jī)系統(tǒng)固定到位,我使用了一塊金屬板和兩個螺釘。我希望在舵機(jī)故障或放置錯誤的情況下保持靈活性。但如果你有信心可以粘上它。
如果你有TTP223模塊,請將電線焊接到原始TTP223模塊觸摸板(組件所在的另一側(cè))的葉墊上。你需要刮擦保護(hù)性絲綢面膜以暴露銅層。粘貼觸摸模塊。
進(jìn)入基座的最后一個組件是ArduinoNano本身作為郁金香的大腦。將它放入底座的開口中,以便它可以連接到計算機(jī)并與所有其他組件連接:
- 伺服數(shù)據(jù)線——D9
- TTP223觸摸傳感器數(shù)據(jù)——D2(利用中斷)
- 新像素數(shù)據(jù)——A0(任何輸出引腳都可以)
- 花瓣?——D3,D4,D5,D6,D10,D11(任何輸出引腳都可以)
- 花地線?——GND
- VCC線——5V
- TTP223觸摸傳感器GND——GND
- TTP223觸摸傳感器VCC——5V
- 伺服GND?——GND
- 伺服VCC——5V
?11. 編碼(1小時)
#include
#include
#include "SoftPWM.h"
#define?NEOPIXEL_PIN?A0
#define TOUCH_SENSOR_PIN 2
#define?SERVO_PIN?9
//#define SERVO_OPEN 1750
#define SERVO_OPEN 1650
#define SERVO_SAFE_MIDDLE 1000
#define SERVO_CLOSED 775
#define?RED?0
#define GREEN 1
#define BLUE 2
float?currentRGB[]?=?{0,?0,?0};
float changeRGB[] = {0, 0, 0};
byte newRGB[] = {0, 0, 0};
#define?MODE_SLEEPING?0
#define MODE_BLOOM 3
#define MODE_BLOOMING 4
#define MODE_BLOOMED 5
#define MODE_FADE 6
#define MODE_FADING 7
#define MODE_FADED 8
#define MODE_FALLINGASLEEP 9
#define?MODE_RAINBOW?90
byte?mode?=?MODE_FADED;
byte?petalPins[]?=?{3,?4,?5,?6,?10,?11};
Adafruit_NeoPixel?pixels?=?Adafruit_NeoPixel(7,?NEOPIXEL_PIN,?NEO_GRB? ?NEO_KHZ400);
Adafruit_TiCoServo servo;
int?servoChange?=?1;?//?open
int servoPosition = SERVO_SAFE_MIDDLE;
void?setup()?{
Serial.begin(115200);
pixels.begin();
servo.attach(SERVO_PIN, SERVO_CLOSED, SERVO_OPEN);
?pinMode(TOUCH_SENSOR_PIN,?INPUT);
attachInterrupt(digitalPinToInterrupt(TOUCH_SENSOR_PIN), _touchISR, RISING);
??randomSeed(analogRead(A7));
?SoftPWMBegin();
??pixelsUnifiedColor(pixels.Color(0,?0,?0));
//pixelsUnifiedColor(pixels.Color(255, 70, 0));
??prepareCrossFade(140,?70,?0,?140);
servo.write(servoPosition);
}
int?counter?=?0;
byte speed = 15;
void?loop()?{
boolean done = true;
switch (mode) {
case MODE_BLOOM:
prepareCrossFadeBloom(500);
changeMode(MODE_BLOOMING);
break;
????case?MODE_BLOOMING:
done = crossFade()