日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

送女朋友一朵 “电子” 花,手把手教你!

發(fā)布時間:2023/12/19 编程问答 70 豆豆
生活随笔 收集整理的這篇文章主要介紹了 送女朋友一朵 “电子” 花,手把手教你! 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

大家好,我是張巧龍,今天是七夕。

總得給女朋友/老婆送點(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)樗苋菀准庸?#xff0c;鉛筆可以在上面畫畫。

單瓣是模板表面的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ī)則六邊形。將所有鉸鏈(管道)焊接到六邊形上。

從模板中心出來的光線將幫助你將花瓣焊接到正確的位置。花瓣的中心需要跟隨從六邊形中心出來的射線。最后,當(dāng)你關(guān)閉花瓣時,你將擁有最后的花朵形狀。

4.制作閥桿和推桿(1小時)

首先完成了開花內(nèi)部的機(jī)制,然后添加了一個桿和推桿。它為制作增添了許多痛苦。有一次,我?guī)缀跸氚阉鼇G棄,永不回頭。花瓣的移動是由1毫米黃銅推桿在黃銅管內(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),它需要在花的中心出來。花點(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)够ò暌苿印cq鏈位于一個桿上(見下圖),該桿與平行于其底座的每個花瓣焊接在一起。花瓣銷需要位于花瓣表面之上,以便在動畫中看到它完全打開。

用管子的鉸鏈制作一個這樣的棒,并將其焊接到第一個花瓣上。這將需要大量試驗(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)閉并打開花朵。不要驚慌如果你沒有做第一次嘗試的完美形狀。它只意味著所有的花瓣都不完全一樣。可能需要進(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)在將所有電線收集在閥桿管的上端附近,并使用捆扎帶固定它們。不要過度擰緊,讓電線穿過它。現(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小時)

這是組裝的最后一步!你緊張嗎?將花莖再次插入基座的孔中。現(xiàn)在,這是重要的一步。在切割前測量兩次!打開盛開的花朵。并切斷從閥桿出來的推桿的末端與閥桿齊平。

現(xiàn)在,當(dāng)你再次關(guān)閉花朵時,推桿應(yīng)從莖桿中拔出。垂直于推桿焊接短管。這將是連桿與舵機(jī)臂的鉸鏈。當(dāng)你放開花和桿時,它應(yīng)該完全打開,因?yàn)楣艿酪矔鳛橥V埂?/p>

你現(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 <Adafruit_NeoPixel.h> #include <Adafruit_TiCoServo.h> #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() && done;done = openPetals() && done;done = petalsBloom(counter) && done;if (done) {changeMode(MODE_BLOOMED);}break;case?MODE_FADE://prepareCrossFade(0, 0, 0, 800);changeMode(MODE_FADING);break;case?MODE_FADING:done = crossFade() && done;done = closePetals() && done;done = petalsFade(counter) && done;if (done) {changeMode(MODE_FADED);}break;case?MODE_FADED://prepareCrossFade(140, 70, 0, 140);changeMode(MODE_FALLINGASLEEP);break;case?MODE_FALLINGASLEEP:done = crossFade() && done;done = closePetals() && done;if (done) {changeMode(MODE_SLEEPING);}break;case MODE_RAINBOW:rainbow(counter);break;}counter++;delay(speed); } void?changeMode(byte?newMode)?{if (mode != newMode) {mode = newMode;counter = 0;} } void?_touchISR()?{if (mode == MODE_SLEEPING) {changeMode(MODE_BLOOM);}else if (mode == MODE_BLOOMED) {changeMode(MODE_FADE);} } //?petals?animations boolean petalsBloom(int j) {if (j < 250) {return false; // delay}if (j > 750) {return true;}int val = (j - 250) / 2;for (int i = 0; i < 6; i++) {SoftPWMSet(petalPins, val);}return false; } boolean?petalsFade(int?j)?{if (j > 510) {return true;}for (int i = 0; i < 6; i++) {SoftPWMSet(petalPins, (510 - j) / 2);}return false; } //?animations void?prepareCrossFadeBloom(unsigned?int?duration)?{byte color = random(0, 5);switch (color) {case 0: // whiteprepareCrossFade(140, 140, 140, duration);break;case 1: // redprepareCrossFade(140, 5, 0, duration);break;case 2: // blueprepareCrossFade(30, 70, 170, duration);break;case 3: // pinkprepareCrossFade(140, 0, 70, duration);break;case 4: // orangeprepareCrossFade(255, 70, 0, duration);break;} } void?rainbow(int?j)?{uint16_t i;byte num = pixels.numPixels() - 1;pixels.setPixelColor(pixels.numPixels() - 1, 100, 100, 100);for?(i?=?0;?i?<?num;?i++)?{pixels.setPixelColor(i, colorWheel(((i * 256 / num) + j) & 255));}pixels.show(); } //?servo?function boolean?openPetals()?{if (servoPosition >= SERVO_OPEN) {return true;}servoPosition ++;servo.write(servoPosition);return false; } n?closePetals()?{if (servoPosition <= SERVO_CLOSED) {return true;}servoPosition --;servo.write(servoPosition);return false; } //?utility?function void?pixelsUnifiedColor(uint32_t?color)?{for (unsigned int i = 0; i < pixels.numPixels(); i++) {pixels.setPixelColor(i, color);}pixels.show(); } void prepareCrossFade(byte red, byte green, byte blue, unsigned int duration) {float rchange = red - currentRGB[RED];float gchange = green - currentRGB[GREEN];float?bchange?=?blue?-?currentRGB[BLUE];changeRGB[RED] = rchange / (float) duration;changeRGB[GREEN] = gchange / (float) duration;changeRGB[BLUE]?=?bchange?/?(float)?duration;newRGB[RED] = red;newRGB[GREEN] = green;newRGB[BLUE]?=?blue;Serial.print(newRGB[RED]);Serial.print(" ");Serial.print(newRGB[GREEN]);Serial.print(" ");Serial.print(newRGB[BLUE]);Serial.print(" (");Serial.print(changeRGB[RED]);Serial.print(" ");Serial.print(changeRGB[GREEN]);Serial.print(" ");Serial.print(changeRGB[BLUE]);Serial.println(")"); } boolean crossFade() {if (currentRGB[RED] == newRGB[RED] && currentRGB[GREEN] == newRGB[GREEN] && currentRGB[BLUE] == newRGB[BLUE]) {return true;}for (byte i = 0; i < 3; i++) {if (changeRGB > 0 && currentRGB < newRGB) {currentRGB = currentRGB + changeRGB;}else if (changeRGB < 0 && currentRGB > newRGB) {currentRGB = currentRGB + changeRGB;}else {currentRGB = newRGB;}}pixelsUnifiedColor(pixels.Color(currentRGB[RED], currentRGB[GREEN], currentRGB[BLUE]));/*Serial.print(currentRGB[RED]);Serial.print(" ");Serial.print(currentRGB[GREEN]);Serial.print(" ");Serial.print(currentRGB[BLUE]);Serial.println();*/return false; } uint32_t colorWheel(byte wheelPos) {// Input a value 0 to 255 to get a color value.// The colours are a transition r - g - b - back to r.wheelPos = 255 - wheelPos;if (wheelPos < 85) {return pixels.Color(255 - wheelPos * 3, 0, wheelPos * 3);}if (wheelPos < 170) {wheelPos -= 85;return pixels.Color(0, wheelPos * 3, 255 - wheelPos * 3);}wheelPos -= 170;return pixels.Color(wheelPos * 3, 255 - wheelPos * 3, 0); }

  • /*?原文作者:jiripraus ,?

    /*?翻譯:?Arduino_xy?

    /*?地址:https://create.arduino.cc/projecthub/jiripraus/ever-blooming-mechanical-tulip-1b0323

    -END-

    大家好,我是張巧龍,一名教電子的大學(xué)老師,歡迎關(guān)注!

    總結(jié)

    以上是生活随笔為你收集整理的送女朋友一朵 “电子” 花,手把手教你!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。