找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 5348|回復: 1
收起左側

arduino交互設計作品2019—害羞的郁金香

[復制鏈接]
ID:487444 發(fā)表于 2019-3-9 16:00 | 顯示全部樓層 |閱讀模式
永遠盛開的郁金香
機械郁金香雕塑,只需輕輕觸摸即可綻放,可以發(fā)出五彩斑斕的光亮。
01.jpg
硬件材料
1 * Arduino Nano R3
1 * SG90舵機
1 * TTP223觸摸模塊
1 * 1毫米黃銅線
1 * 2毫米黃銅管
1 * 0.3mm絕緣銅線
7 * WS2812 5050 LED
30 * 白色貼片1206 LED
故事
         永恒的花朵,永恒的愛。一個完美的不只是情人節(jié)可以送給你所愛的人的禮物。這款郁金香只需輕輕觸摸即可綻放出任何顏色。它的六個花瓣將慢慢打開并點亮。當花瓣關閉時,它們會產(chǎn)生令人難以置信的環(huán)境光線和葉子圖案。
02.jpg
如何實現(xiàn)
        在我告訴你如何創(chuàng)造這種美之前,先簡單地談談它是如何運作的。郁金香由6個花瓣組成,每個花瓣有5個貼片白色LED。每個花瓣都與一個Arduino輸出引腳相連�;ㄈ镫[藏了7RGBLED。從電氣的角度來說,整個花是負電壓的,花瓣中的靜脈是正電壓�;ò晖ㄟ^推桿打開,推桿一直沿著莖桿向底座延伸。推桿由小型舵機構的運動控制。閥桿側面的小葉片連接到底座內的TTP223觸摸傳感器,并創(chuàng)建一個電容式觸摸板。木質底座包含舵機,觸摸ICArduinoNano。讓我們自己構建一個吧!
         我沒有告訴你材料的任何尺寸和花朵的確切形狀。我認為每朵花都應該是獨一無二的。
03.jpg 04.jpg
花瓣(4小時)
讓我們從最令人滿意的部分開始- 開花的花瓣。
你需要的第一件事是開花的模板。我用石膏澆注成管模具。干燥后,我把它塑造成郁金香花。你也可以3D打印它,但我沒有3D打印機。石膏很棒,因為它很容易加工,鉛筆可以在上面畫畫。單瓣是模板表面的1/4,所以最后當它們有6個時,它們會略微重疊,形成郁金香花朵的精確外觀。我用鉛筆在石膏表面畫出花瓣形狀。當我對花瓣形狀感到滿意時,我用刀子將它雕刻成石膏,以幫助我在焊接時將桿固定到位。
花瓣由1毫米的黃銅棒組成,一直圍繞著形狀�;ò陜炔渴�5個1206白色LED和來自同一根線的“靜脈”結構。首先,創(chuàng)建圓周線,花時間彎曲它。切下一小段管子并將其放在電線的底部平坦部分- 這將是鉸鏈花瓣將四處移動。焊絲末端焊接在一起,確保不要用焊料填充管子。它需要自由移動。用LED和靜脈結構完成花瓣。看我做一個花瓣。對我感到羞恥,這是我制作這首花的唯一鏡頭。
07.jpg
現(xiàn)在再做5個。所有花瓣都需要完全相同。這真的很重要。否則,它們在關閉時不會像一個漂亮的郁金香形狀,甚至可能卡住。
06.jpg
開花(
1小時)
是時候將所有花瓣焊接在一起了。花的基部是六角形- 6個花瓣�;ò晖ㄟ^鉸鏈固定在六邊形上。然而,六邊形略微不規(guī)則。我失敗很多次�;ò晷枰嗷ブ丿B,如果六邊形是規(guī)則的,則不允許。三個花瓣靠近中心(內花瓣),另外三個花瓣稍微偏移(外花瓣)。為此,我創(chuàng)建了一個模板并將其打印在紙上。紅色形狀是由兩個嵌套的正六邊形組成的最終不規(guī)則六邊形。將所有鉸鏈(管道)焊接到六邊形上。從模板中心出來的光線將幫助你將花瓣焊接到正確的位置。花瓣的中心需要跟隨從六邊形中心出來的射線。最后,當你關閉花瓣時,你將擁有最后的花朵形狀。
08.jpg
09.jpg
10.jpg
11.jpg

制作閥桿和推桿(1小時)
首先完成了開花內部的機制,然后添加了一個桿和推桿。它為制作增添了許多痛苦。有一次,我?guī)缀跸氚阉鼇G棄,永不回頭�;ò甑囊苿邮怯�1毫米黃銅推桿在黃銅管內自由移動而產(chǎn)生的�;ò晖ㄟ^一個非常小的六邊形與推桿連接,每側有2mm長的鉸鏈- 推桿頭。六邊形垂直地坐在推桿上,借助穿過六邊形中心的小桿。這是制表師的工作。
為了做推桿頭,我做了第二個模板。首先,彎曲電線以形成微小的六邊形。然后切下2毫米長的小管并將它們放在電線上。焊接電線以完成六邊形形狀。再次確保不要將管道焊接到電線上。繼續(xù)將焊絲焊接到六邊形的中心。并通過垂直于推桿頭中心焊接1毫米線完成桿。
12.jpg
13.jpg
將黃銅管切成所需長度。而現(xiàn)在是第二個關鍵部分。莖需要與花的六角形基部完全垂直,需要在其正中心,并且需要有足夠的空間讓推桿頭向下移動以關閉花瓣。首先,我將兩根電線焊接到閥桿的一端以形成V形膨脹。這些將是連接桿與六邊形基座頂點的6根線中的2根。
因此將花朵倒置并將V形膨脹物焊接到六角形底座的兩個相對頂點。檢查形狀。如果你把桿放在桿內,它需要在花的中心出來�;c時間在這里完美。這真的是一個至關重要的部分。當你使用它時,在六邊形頂部的其余部分和桿頂部之間焊接4根導線。確保不要焊接管道內的孔!
花瓣機制(6小時)
我差點把它丟進垃圾桶里。你要釘它!對于這一部分,我受到蒸汽機及其桿,活塞和飛輪的啟發(fā)。
14.jpg
15.jpg
用莖將花固定在向上的位置。將推桿穿過閥桿,頭部朝上。垂直于推桿底端焊接短管,并用1mm黃銅線制成一個小連桿,用于連接舵機和推桿(見上圖)。應該能夠使用舵機上下推動推桿。連接你的Arduino嘗試一下。在開始焊接花瓣和推桿頭之間的連桿之前,需要使用Arduino調整舵機機芯。編寫代碼,以便在推桿頭端與開花六角形底座齊平的最頂部位置上下移動推桿。在最低位置,它位于開花V形底座的底部。為使推桿運動盡可能柔軟,請使用最靠近舵機臂中心的孔。舵機需要旋轉更長但步長更短。當推桿向上移動時,推動連桿和花瓣向下。隨著它向下移動它連接桿和花瓣被關閉。
花瓣目前缺少一個關鍵部件- 花瓣針。這個鉸鏈使花瓣移動。鉸鏈位于一個桿上(見下圖),該桿與平行于其底座的每個花瓣焊接在一起。花瓣銷需要位于花瓣表面之上,以便在動畫中看到它完全打開。用管子的鉸鏈制作一個這樣的棒,并將其焊接到第一個花瓣上。這將需要大量試驗桿的大小及其與花瓣基部的距離,以允許推桿完全打開和關閉花瓣。使用試錯法。將桿焊接到合適的位置,并在推桿銷和花瓣銷之間添加連桿。如果你的推桿位于上部位置而你的花瓣處于完全打開的位置,推桿銷和花瓣銷之間的空間就是連桿的長度。
18.jpg 19.jpg 20.jpg


現(xiàn)在嘗試上下推動推桿,看看發(fā)生了什么。如果它沒有任何摩擦工作正常,花瓣可以關閉和打開你完成(與第一個花瓣)!如果沒有,請嘗試不同長度的連桿或桿的不同位置。為了完成開花,在剩下的5個花瓣上復制相同的條和連桿。當開花開放時,3個外花瓣需要稍低,以允許它們在關閉時適當?shù)刂丿B內花瓣。最后,你應該能夠關閉并打開花朵。不要驚慌如果你沒有做第一次嘗試的完美形狀。它只意味著所有的花瓣都不完全一樣�?赡苄枰M行大量的微調才能創(chuàng)造出完美的形狀- 連桿的長度和桿的位置略有不同。
花蕊(1小時)
在花開的里面,我放了7個LED從內部發(fā)光。這些LED只需要控制一根DATA線,并且可以菊花鏈式連接。我把它們中的6個焊接在兩個小六邊形之間(當然是另一個模板)。下六邊形是地線,上半部分是正電壓。將適當?shù)腘eoPixels引線焊接到這些六角環(huán)上。這些LED放置在45度角下,照射到側面。為了使其更好,將第七個LED放入上六角的中心。最后但并非最不重要的是連接DATAIN和OUT導致創(chuàng)建菊花鏈。
這種結構需要兩條線向下到達基座- VCC和DATA。地面取自花架。將一根0.3的絕緣銅線焊接到上環(huán)用于VCC,第二根焊接到菊花鏈中的第一個LED用于DATA。這些電線最后會到達基座。使它們至少是莖長度的3倍。在焊接之前,這些電線的末端需要從它們的透明絕緣層中釋放出來。熱量不會破壞它。用刀子去除絕緣層。你現(xiàn)在可以測試LED以確保它們正常工作。用這些銅線溫和。如果你不小心剝去絕緣材料以外的其他地方,可能會發(fā)生短路!
將雌蕊結構放在花的中心。稍微偏離開花六角形底座,為花瓣連桿留出足夠的空間。對我來說,它比開花六邊形高1厘米。用黃銅棒連接所有頂點,形成堅固的結構。花完成了!現(xiàn)在測試看看花瓣是否仍能自由移動。
21.jpg
22.jpg
扎根(2小時)
花瓣和LED都需要電源線才能發(fā)光。整個花卉雕塑將是一個地面,但RGBLED有6個花瓣和2個線,需要連接到基座上的Arduino。為此,帶有透明絕緣的0.3毫米細銅線將纏繞在管桿上。用于LED的兩條線已經(jīng)完成。將另外6個焊接到鉸鏈附近的每個花瓣上的松散靜脈線上,并使線穿過莖下的花開結構。確保不要以銳角彎曲這些電線,它會很容易斷裂。
現(xiàn)在將所有電線收集在閥桿管的上端附近,并使用捆扎帶固定它們。不要過度擰緊,讓電線穿過它�,F(xiàn)在很好地組織開花內的所有電線。確�;ò昕梢宰杂梢苿�,推桿也不會與導線碰撞。完成了嗎?現(xiàn)在擰緊捆扎帶。
23.jpg
電線現(xiàn)在無法控制地繞著閥桿運行。你需要耐心地慢慢地將它們包裹在莖干上。緊密而均勻。我花了至少一個小時才完成這一步。當你在桿的末端時,放置另一條捆扎帶以固定那里的電線并使用透明的強力膠將它們固定在那里。確保不要用推桿密封管道!
24.jpg
最后一根線缺失是一個地線。將另一根銅線焊接到閥桿的底端。你應該最終從花中出來9根電線�,F(xiàn)在明智的做法是將所有電線連接到Arduino并測試是否沒有短路并且所有LED都亮起。
25.jpg
26.jpg
花盆(2小時)
我希望這朵花能夠從人造花盆中長出來,這也將隱藏所有電子產(chǎn)品。我用了一塊木頭把它加工成一個4厘米高,直徑9厘米的圓筒。我沒有車床,因此我使用圓鋸切割原始形狀,然后使用壓力鉆作為臨時車床。然后我用手動銑刀雕刻了一個2.5厘米深,直徑7厘米的開口,以適應舵機,ArduinoNano和觸摸傳感器IC。在底部,還有一個小開口,可以精確地安裝ArduinoNano USB端口,以便能夠從側面連接USB線。
27.jpg
如果你有花盆,可以在花朵生長的地方用電線鉆一個直徑為花莖的孔- 可能在中心。盡量適合你的花。電線要小心。如果你以銳角彎曲它們,它們就會斷裂。最后,我還從底座內部添加了一個大孔,為舵機臂和連桿騰出更多空間。你可以做你喜歡的任何形狀的花盆,請記住你需要適應所有的電子設備。
28.jpg

29.jpg
觸摸葉墊(1小時)
機械郁金香需要某種互動元素,使人能夠開花。我選擇了TTP223觸摸傳感器。但是哪里放一個觸控板?我決定在莖的側面添加一點葉子,既可以使花更自然,也可以作為電容式觸摸板。觸摸時會觸發(fā)TTP223傳感器并告訴Arduino打開花朵。當你完成這么復雜的雕塑時,這對你來說將是一塊蛋糕。使用與花瓣相同的技術省略LED。我也為自己創(chuàng)建了一個模板。在桿孔旁邊的基座上鉆一個小孔,將葉子固定在那里。
如果你不想或不能使用電容式觸摸傳感器,可以在底座上添加一個普通的按鈕。它會做同樣的工作。
把它放在一起(2小時)
這是組裝的最后一步!你緊張嗎?將花莖再次插入基座的孔中�,F(xiàn)在,這是重要的一步。在切割前測量兩次!打開盛開的花朵。并切斷從閥桿出來的推桿的末端與閥桿齊平�,F(xiàn)在,當你再次關閉花朵時,推桿應從莖桿中拔出。垂直于推桿焊接短管。這將是連桿與舵機臂的鉸鏈。當你放開花和桿時,它應該完全打開,因為管道也會作為停止。
你現(xiàn)在可以將桿粘在底座上。確保閥桿管端與底座內側齊平,以便為舵機臂留出盡可能多的空間。我再次使用過強力膠水。確保不要將推桿與閥桿粘在一起。這會破壞你的工作!
接下來,膠水在葉墊上。在你將銅線焊接到它之前,能夠將葉墊連接到TTP223觸摸傳感器。
30.jpg
將花倒置。雕塑周圍要小心,不要現(xiàn)在打破它!這將是多么浪費!首先,將舵機放入最終位置。它的手臂應該已經(jīng)從試驗臺準備好了。只需找到舵機臂在底座內自由移動并將連桿連接到推桿的最佳位置。為了將舵機系統(tǒng)固定到位,我使用了一塊金屬板和兩個螺釘。我希望在舵機故障或放置錯誤的情況下保持靈活性。但如果你有信心可以粘上它。
如果你有TTP223模塊,請將電線焊接到原始TTP223模塊觸摸板(組件所在的另一側)的葉墊上。你需要刮擦保護性絲綢面膜以暴露銅層。粘貼觸摸模塊。
31.jpg
進入基座的最后一個組件是ArduinoNano本身作為郁金香的大腦。將它放入底座的開口中,以便它可以連接到計算機并與所有其他組件連接:
伺服數(shù)據(jù)線                       ?D9
TTP223觸摸傳感器數(shù)據(jù)   ?D2(利用中斷)
新像素數(shù)據(jù)                        ?A0(任何輸出引腳都可以)
花瓣                                  ?D3,D4,D5D6,D10,D11(任何輸出引腳都可以)
花地線                               ?GND
VCC                               ?5V
TTP223觸摸傳感器GND     ?GND
TTP223觸摸傳感器VCC      ?5V
伺服GND                           ?GND
伺服VCC                            ?5V
編碼(1小時)
32.jpg
Arduino源代碼
  1. #include <Adafruit_TiCoServo.h>

  2. #define TOUCH_SENSOR_PIN 2

  3. #define SERVO_PIN 9
  4. //#define SERVO_OPEN 1650
  5. #define SERVO_CLOSED 775

  6. #define RED 0
  7. #define BLUE 2

  8. float currentRGB[] = {0, 0, 0};
  9. float]byte newRGB[] = {0, 0, 0};

  10. #define MODE_SLEEPING 0
  11. #define MODE_BLOOMING 4
  12. #define MODE_FADE 6
  13. #define MODE_FADED 8

  14. Adafruit_NeoPixel]Adafruit_TiCoServo servo;

  15. int servoChange = 1; // open

  16.   Serial.begin(115200);
  17.   servo.attach(SERVO_PIN, SERVO_CLOSED, SERVO_OPEN);

  18.   pinMode(TOUCH_SENSOR_PIN, INPUT);

  19.   SoftPWMBegin();

  20.   pixelsUnifiedColor(pixels.Color(0, 0, 0));

  21.   servo.write(servoPosition);
  22. }

  23. byte speed = 15;

  24. void loop() {
  25.   switch (mode) {
  26.       prepareCrossFadeBloom(500);
  27.       break;

  28.     case MODE_BLOOMING:
  29.       done = openPetals() && done;
  30.       if (done) {
  31.       }

  32.       //prepareCrossFade(0, 0, 0, 800);
  33.       break;

  34.     case MODE_FADING:
  35.       done = closePetals() && done;
  36.       if (done) {
  37.       }

  38.       //prepareCrossFade(140, 70, 0, 140);
  39.       break;

  40.     case MODE_FALLINGASLEEP:
  41.       done = closePetals() && done;
  42.         changeMode(MODE_SLEEPING);
  43.       break;

  44.     case MODE_RAINBOW:
  45.       break;

  46.   delay(speed);
  47. }

  48.   if (mode != newMode) {
  49.     counter = 0;
  50. }

  51. void _touchISR() {
  52.     changeMode(MODE_BLOOM);
  53.   else if (mode == MODE_BLOOMED) {
  54.   }
  55. }


  56.   if (j < 250) {
  57.   }
  58.     return true;
  59.   int val = (j - 250) / 2;
  60.     SoftPWMSet(petalPins[ i], val);
  61.   return false;
  62. }

  63.   if (j > 510) {
  64.   }
  65.     SoftPWMSet(petalPins[ i], (510 - j) / 2);
  66.   return false;
  67. }


  68.   byte color = random(0, 5);
  69.     case 0: // white
  70.       break;
  71.       prepareCrossFade(140, 5, 0, duration);
  72.     case 2: // blue
  73.       break;
  74.       prepareCrossFade(140, 0, 70, duration);
  75.     case 4: // orange
  76.       break;
  77. }

  78. void rainbow(int j) {
  79.   byte num = pixels.numPixels() - 1;

  80.     pixels.setPixelColor(i, colorWheel(((i * 256 / num) + j) & 255));
  81.   pixels.show();
  82. }


  83.   if (servoPosition >= SERVO_OPEN) {
  84.   }
  85.   servo.write(servoPosition);
  86. }

  87. boolean closePetals() {
  88.     return true;
  89.   servoPosition --;
  90.   return false;
  91. }

  92. //]
  93.   for (unsigned int i = 0; i < pixels.numPixels(); i++) {
  94. ]  }
  95. ]}

  96. void prepareCrossFade(byte red, byte green, byte blue, unsigned int duration) {
  97.   float gchange = green - currentRGB[GREEN];

  98.   changeRGB[GREEN] = gchange / (float) duration;

  99.   newRGB[GREEN] = green;

  100.   Serial.print(" ");
  101.   Serial.print(" ");
  102.   Serial.print(" (");
  103.   Serial.print(" ");
  104.   Serial.print(" ");
  105.   Serial.println(")");
  106. }

  107.   if (currentRGB[RED] == newRGB[RED] && currentRGB[GREEN] == newRGB[GREEN] && currentRGB[BLUE] == newRGB[BLUE]) {
  108.   }
  109.     if (changeRGB[ i] > 0 && currentRGB[ i] < newRGB[ i]) {
  110.     }
  111.       currentRGB[ i] = currentRGB[ i] + changeRGB[ i];
  112.     else {
  113.     }
  114.   pixelsUnifiedColor(pixels.Color(currentRGB[RED], currentRGB[GREEN], currentRGB[BLUE]));
  115.     Serial.print(currentRGB[RED]);
  116.     Serial.print(currentRGB[GREEN]);
  117.     Serial.print(currentRGB[BLUE]);
  118.   */
  119. }

  120. uint32_t colorWheel(byte wheelPos) {
  121.   // The colours are a transition r - g - b - back to r.
  122.   if (wheelPos < 85) {
  123.   }
  124.     wheelPos -= 85;
  125.   }
  126.   return pixels.Color(wheelPos * 3, 255 - wheelPos * 3, 0);
  127. }
復制代碼


回復

使用道具 舉報

ID:272625 發(fā)表于 2019-3-10 04:38
代碼錯亂

ID:1095433 發(fā)表于 2023-10-8 21:59 | 顯示全部樓層
有電路圖嘛
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表