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