硬核!用Arduino打造纯机械装置模拟数字时钟
本文轉(zhuǎn)載自程序員極客實(shí)驗(yàn)室
本項(xiàng)目是一個(gè)真正意義上的「機(jī)械時(shí)鐘」,由 3D 打印部件、25 個(gè) Arduino Nano 和 48 個(gè)步進(jìn)電機(jī)構(gòu)建。每個(gè)時(shí)鐘面都是用 Eagle 設(shè)計(jì)的 PCB。
時(shí)鐘的靈感來(lái)自幾年前我在波士頓一家商店里看到的時(shí)鐘,叫 ClockClock 24,成本約為 6000 美元,非常漂亮。
完成這個(gè)項(xiàng)目,將學(xué)習(xí)到 3D 打印、Arduino 編程、原理圖和 PCB 設(shè)計(jì)、機(jī)械方面的技能,還有一定的調(diào)試技巧。
?
材料和成本
完整的材料清單文件(ClockPartsList.xlsx)在文末的項(xiàng)目文件庫(kù)中可以下載。
-
工具清單
-
3D 打印機(jī)
-
烙鐵
-
螺絲刀
-
剪線鉗和壓線鉗
-
粘膠
?
費(fèi)用大約是 500 美元。也可以通過采購(gòu)更便宜的零件來(lái)降低成本。電子表格中的描述是可單擊的鏈接。如果鏈接失效,可以在 google 中搜索鏈接中的單詞。
3D 打印
整個(gè)項(xiàng)目的打印使用 PLA 材料,所用的 3D 打印機(jī)是 Creality Ender 3 Pro。利用 Cura 的免費(fèi)版本切成薄片。
大約花費(fèi)了 1 個(gè)月的時(shí)間打印。其中,每個(gè)時(shí)鐘模塊底板大約需要 9 個(gè)小時(shí)的打印時(shí)間。如果每天打印 2 張,需要 12 天,如果使用兩臺(tái) 3D 打印機(jī),速度會(huì)更快。
所有零件均在標(biāo)準(zhǔn)溫度下以 20% 的填充率進(jìn)行打印。
這個(gè)項(xiàng)目上有很多關(guān)于 3D 打印的知識(shí):
機(jī)床需要每隔幾天調(diào)平一次。否則,零件將從機(jī)床上抬起或損壞。
噴嘴需要隔一段時(shí)間清洗一次。否則,打印件將變得很薄。
PLA 線軸需要保持緊繃,以使打印時(shí)的長(zhǎng)絲不會(huì)束縛和卡住。
3D 打印部件清單(Clock 3D Printed Parts List.xlsx)和打印所需的 STL 文件(stls.zip),在文末的項(xiàng)目文件庫(kù)中可以下載。
原理圖和 PCB 文件
原理圖是用 Autodesk 的 Eagle 繪制的。
需要注意的是,最初使用的是光電模塊而不是磁檢測(cè)器模塊,這就是在原理圖和電路板上都能看到光電模塊的原因。
每個(gè)磁性霍爾效應(yīng)傳感器都連接到 PCB 板上的 5V,Gnd 和 模擬引腳(O_0 或 O_1)。
更多信息參見組裝詳情。
原理圖文件(analog_clock_rev2.sch),在文末的項(xiàng)目文件庫(kù)中可以下載。
該項(xiàng)目需要 25 個(gè) PCB 板。此處所附的 Gerber 文件,可以在任何 PCB 廠制造電路板。要打開壓縮成 .gz 的文件,推薦 7Zip 解壓縮程序。
原理圖文件(H2W-312555_Analog_clock_Rev2.zip.gz),在文末的項(xiàng)目文件庫(kù)中可以下載。
Arduino 編程
項(xiàng)目的 Arduino 文件有兩個(gè):主控文件和從屬設(shè)備文件。
主控代碼僅使用一次,控制所有從屬設(shè)備。從屬設(shè)備代碼使用 24 次。
RTC(實(shí)時(shí)時(shí)鐘)庫(kù) .zip 文件也包含在 .gz 文件中。通過執(zhí)行以下操作,可以將 .zip 文件添加到 Arduino IDE:
sketch -> include library -> add .zip library.
要對(duì) Arduino 進(jìn)行編程,請(qǐng)選擇:
tools -> Boards: Arduino Nano
tools -> Processor Atmega328 (舊的引導(dǎo)程序)
tools -> port (選擇端口)
代碼文件(HartClock_Arduino_Code.zip.gz),在文末的項(xiàng)目文件庫(kù)中可以下載。
Arduino SW 介紹
主控的 Arduino 將 I2C 串行命令發(fā)送到位于每個(gè)時(shí)鐘面后面的 24 個(gè)從屬 Arduino。從屬 Arduino 將 I2C 命令解碼為時(shí)鐘運(yùn)動(dòng)。
主機(jī)到從機(jī)可能的 Arduino I2C 命令:
0= IDLE, 1= Calibrate, 2= Arm_go_clockwise, 3= Arm_go_counter_clockwise
(0 = 空閑,1 = 校準(zhǔn),2 = 順時(shí)針旋轉(zhuǎn),3 = 逆時(shí)針旋轉(zhuǎn))
如圖所示,時(shí)鐘有 8 個(gè)可能的位置。
重置后,主機(jī)將向每個(gè) Arduino 發(fā)送一個(gè)校準(zhǔn)命令,使其到達(dá)與時(shí)鐘位置 8 相對(duì)應(yīng)的原始位置。每個(gè)時(shí)鐘后面的齒輪中都有歸位磁鐵,還有一個(gè)霍爾效應(yīng)傳感器,用于檢測(cè)磁鐵是否歸位。
PCB 焊接
PCB 板中有 24 個(gè)需要焊接,必要時(shí)可求助朋友:)
切記要從電動(dòng)機(jī)隨附的小型驅(qū)動(dòng)板的插座中拔出 ULN2003 驅(qū)動(dòng)器 IC。
將每個(gè)元件插入電路板,并稍微彎曲引腳,以免它們掉落,將元件引腳焊接到板上。
注意:每塊板上焊接有 6 條跳線。此處未使用圖片中顯示的綠色 4 針端子,直接焊接了板間線路,這樣壓降較低且更可靠。
設(shè)置撥碼開關(guān)
每個(gè) PCB 板上都有一個(gè)撥碼開關(guān)。將每個(gè)時(shí)鐘的撥碼開關(guān)設(shè)置為圖片中所示的值,以便主控器可以分別尋址每個(gè)從屬時(shí)鐘模塊。
組裝 PCB 主板
Arduino 主板包含 Real Time Clock(RTC)板和 Arduino nano。每當(dāng)主 Arduino 通過其 USB 進(jìn)行編程時(shí),RTC 就會(huì)使用當(dāng)前計(jì)算機(jī)時(shí)間進(jìn)行編程,并將時(shí)間數(shù)據(jù)通過 RTC 電池保存起來(lái)。
可以將 RTC 板熱粘合或用雙面膠帶粘貼到主 PCB 上。焊接連接使其牢固。
使用 3D 打印支架將主板固定在時(shí)鐘上。
將 RTC Vcc 連接到板上的 +5 引腳。
將 RTC Gnd,SCL 和 SDA 連接到 PCB 板上的相應(yīng)名稱。
在 RTC 板 Vcc 和 SDA 之間的 I2C 上焊接 1 個(gè) 1.3k(或接近值)的上拉電阻。
在 RTC 板 Vcc 和 SCL 之間的 I2C 上焊接 1 個(gè) 1.3k(或接近值)的上拉電阻。
用 4 根導(dǎo)線焊接 +6V、Gnd、SDA 和 SCL,預(yù)留長(zhǎng)度大約為 6 英寸,以便將來(lái)與其他電路板連接。
用 10 英寸長(zhǎng)導(dǎo)線對(duì)焊接 D2 引腳和地,通過按鈕增加時(shí)間。
用 10 英寸長(zhǎng)導(dǎo)線對(duì)焊接 D3 引腳和地,通過按鈕減少時(shí)間。
注意:在關(guān)閉電源之前,應(yīng)從主 Arduino Nano 上拔下 USB 線。這是一條潛在電流路徑,在電源關(guān)閉時(shí)其他 Arduino 會(huì)嘗試用 USB 電源供電,主機(jī)上的微型 7805 穩(wěn)壓器可能會(huì)燒壞。如果發(fā)生這種情況,請(qǐng)購(gòu)買功率更大的 7805 穩(wěn)壓器并將其焊接到主板上。這里需執(zhí)行此操作。
時(shí)鐘模塊組裝
通過使用霍爾效應(yīng)傳感器模塊(連接到 5V 電源或小型電池組)進(jìn)行測(cè)試,確定磁體朝上。這里使用了 4.5V 電池組供電。方向正確時(shí),指示燈應(yīng)變?yōu)榫G色。
用 Cyanoacrylate Krazy 粘膠將磁鐵粘上。
如圖所示,組裝時(shí)鐘。
將 4 根鉤形導(dǎo)線切成約 6 英寸長(zhǎng)。將導(dǎo)線兩端剝開約 1/4 英寸,并將它們絞合在一起。將它們焊接到 PCB 的 +6V、Gnd、SDA、SCL 點(diǎn)的一側(cè)。安裝數(shù)字時(shí),它們將用于焊接到相鄰的時(shí)鐘。
單個(gè)時(shí)鐘 Arduino 代碼測(cè)試
建議在組建每個(gè)時(shí)鐘模塊后對(duì)其進(jìn)行測(cè)試。為此,請(qǐng)確保時(shí)鐘模塊已完全組裝好,并且(臨時(shí))將撥碼開關(guān)設(shè)置為大于 23 的值。這將在通電后強(qiáng)制 Arduino 從代碼運(yùn)行校準(zhǔn)。視頻僅供參考,這樣可以檢查時(shí)鐘的運(yùn)動(dòng)是否良好和磁鐵是否正確歸位。USB 電源能夠?yàn)樵摐y(cè)試的兩個(gè)電動(dòng)機(jī)供電,因此不需要電源連接。
插入 USB 線并加載從 Arduino 代碼。應(yīng)該會(huì)看到它在每個(gè)臂上都進(jìn)行了校準(zhǔn)。每個(gè)臂校準(zhǔn)后,將臂移動(dòng)到頂部的 8 點(diǎn)鐘位置。按下 Arduino Nano 上的 Reset(重置)按鈕幾次,以確保它可以正常工作。
完成操作后,請(qǐng)不要忘記將撥碼開關(guān)設(shè)置為正確的值(0 到 23)。在時(shí)鐘背面的沙皮紙上寫下時(shí)鐘編號(hào),以便于組裝。
電源連接
如圖,電源設(shè)備需要用連接器壓接并連接到電源和供電線上,為此使用了延長(zhǎng)線。將電壓調(diào)節(jié)到 7.5V,并在調(diào)節(jié)旋鈕上纏上膠帶,以免被意外轉(zhuǎn)動(dòng)。
直流電壓線將通過開關(guān)連接到主板。
此處每個(gè) 28BYJ48 步進(jìn)電機(jī)均由 7.5V 電壓驅(qū)動(dòng)。繞組分別為 70 歐姆。
因此,通過每個(gè)繞組的電流為 7.5V/70 歐姆 = 107mA
每個(gè)步進(jìn)電機(jī)主動(dòng)驅(qū)動(dòng)時(shí)有 2 個(gè)繞組。因此,每個(gè)電機(jī) 2 * 107mA = 214mA
如果所有 48 臺(tái)電動(dòng)機(jī)都在運(yùn)動(dòng),則為 48 * 214mA = 10.2Amps。
那是相當(dāng)大的電流,這里顯示的 10Amp 電源可以提供該電流。
僅供參考,當(dāng)電動(dòng)機(jī)未處于主動(dòng)驅(qū)動(dòng)狀態(tài)時(shí),Arduino 代碼會(huì)關(guān)閉繞組,因此在電動(dòng)機(jī)不運(yùn)動(dòng)時(shí)不會(huì)向電動(dòng)機(jī)施加電流。且 Arduino Nano 和霍爾效應(yīng)傳感器使用的電流很小。
單個(gè)時(shí)鐘數(shù)字 Arduino 主控代碼測(cè)試
測(cè)試由 6 個(gè)時(shí)鐘模塊組成的數(shù)字。
在每個(gè)結(jié)點(diǎn)使用 2 個(gè)側(cè)面連接器件并用螺絲擰緊,將 6 個(gè)時(shí)鐘模塊組裝成一個(gè)數(shù)字。
此處稱為 debug_master_counter.ino 的 Arduino 代碼已加載到主 PCB 中。到現(xiàn)在為止,所有從時(shí)鐘模塊均應(yīng)已加載 Analog_clock_slave.ino。
撥碼開關(guān)應(yīng)設(shè)置為:(0 至 5)或(6 至 11)或(12 至 17)或(18 至 23)
可以一次建立一個(gè)數(shù)字,對(duì)其進(jìn)行測(cè)試并通過焊接將 6 個(gè)時(shí)鐘連接起來(lái)。
暫時(shí)將這 4 個(gè)主模塊導(dǎo)線焊接到該時(shí)鐘的 +6V、Gnd、SDA、SCL空點(diǎn)進(jìn)行測(cè)試。
確保主模塊已連接電源(暫時(shí)不帶開關(guān))并設(shè)置為 7.5V。由于沒有連接器,暫時(shí)將其焊接以進(jìn)行此測(cè)試。
主模塊上電并初始化所有 6 個(gè)時(shí)鐘。如果尚未將手臂移到頂部(8 點(diǎn)鐘位置),則需要將它們移到頂部。然后,它將發(fā)送指令顯示從 0 到 9 的遞增計(jì)數(shù),如圖所示。
測(cè)試完所有數(shù)字后,請(qǐng)使用正確的 master_clock_slave.ino 加載主 PCB Arduino。
測(cè)試用的代碼文件(debug_master_counter.ino),在文末的項(xiàng)目文件庫(kù)中可以下載。
安裝全部時(shí)鐘數(shù)字
組裝完所有模塊后,就可以開始使用連接器鏈接組裝完整的時(shí)鐘。每段連接需要 2 個(gè)連接器鏈節(jié),然后將螺絲插入鏈節(jié)的每一側(cè),把部件固定在一起,如圖操作。
時(shí)鐘放在一起后,焊接每個(gè)模塊之間的導(dǎo)線。最初,在每塊板上都有綠色螺絲端子,但后來(lái)切換為焊接連接,因?yàn)槁萁z端子在每個(gè)螺絲處引入電阻,導(dǎo)致 6V 線路和地上的電壓下降。
請(qǐng)注意,如果不連接框架,則完整的 3×8 大時(shí)鐘不穩(wěn)定。
安裝邊框
添加框架,框架增加了支撐,讓時(shí)鐘整體將變穩(wěn)定。
有 4 種框架。2 種角件和 2 種邊件。嘗試時(shí),要看它們的適合程度。
給長(zhǎng)框架打孔。組裝框架時(shí),將 3 個(gè)開關(guān)安裝在鉆出的孔中。將時(shí)鐘放置在底部框架的中心。
如圖所示組裝框架。
下面固定 Arduino PCB 主板。
將主 Arduino PCB 固定(粘)在 master_support 支架上,然后如圖所示,在中心找到一個(gè)合適的位置。擰入 2 個(gè)螺釘固定它。
主控的反向選項(xiàng)
Arduino 主代碼具有反轉(zhuǎn)時(shí)鐘方向的功能。某些 28BYJ-48 步進(jìn)電機(jī)的運(yùn)行方向是反向的。那么可以在代碼中控制它。如圖,在 Arduino 主代碼中設(shè)置 appropriate bits = 1 就好了。
調(diào)試和維修
推薦步驟:
1)組建并測(cè)試 24 個(gè)時(shí)鐘模塊(一個(gè)一個(gè)測(cè))。
2)用 6 個(gè)時(shí)鐘模塊建立一個(gè)數(shù)字,并使用特殊的測(cè)試主控代碼進(jìn)行測(cè)試。
3)組建時(shí)鐘整體,并使用正確主控代碼對(duì)其進(jìn)行測(cè)試。
如果主控時(shí)鐘有問題,請(qǐng)檢查接線,并確保時(shí)鐘模塊之間的焊接正確。確保電線從 clk0 到 clk23 貫穿整個(gè)時(shí)鐘。
如果遇到通信問題,請(qǐng)確保主機(jī)上有 I2C 上拉電阻。可使用示波器檢查 I2C 信號(hào)是否正常。
常見問題
1)為什么不用一個(gè)微控制器,并使用多路復(fù)用器在每個(gè)時(shí)鐘之間切換?
組建這東西時(shí),總要做出工程復(fù)雜度上的權(quán)衡。可以將單個(gè)微控制器與多路復(fù)用器配合使用,但一次只能移動(dòng)一個(gè)時(shí)鐘。實(shí)際上有一個(gè)這樣的想法,使用伺服器并一次移動(dòng)一個(gè)模擬時(shí)鐘面。也可以用具有許多 IO 的 FPGA(現(xiàn)場(chǎng)可編程門陣列)來(lái)代替許多從屬控制器,但這會(huì)貴得多,且需要額外技能。
2)為什么不用某種步進(jìn)芯片替代 24 個(gè)從機(jī)的 Arduino Nano 呢?
Arduino nano 的價(jià)格在 2 美元。作為從機(jī),每個(gè)都對(duì) 2 個(gè)電機(jī)執(zhí)行步進(jìn)控制,并且讀取每個(gè)電機(jī)齒輪的霍爾效應(yīng)模擬信號(hào)以進(jìn)行校準(zhǔn)。很難找到價(jià)格便宜的芯片來(lái)完成這兩個(gè)功能。
3)為什么不使用霍爾效應(yīng)傳感器芯片,而使用 $1.50 的霍爾效應(yīng)傳感器模塊?
單個(gè)霍爾效應(yīng)傳感器芯片更便宜,但它們需要添加一個(gè)電阻,因此每個(gè)霍爾效應(yīng)傳感器都必須放在 PCB 上。這需要另外的 3D 打印部件,并將 3 條導(dǎo)線焊接到小型設(shè)備的每個(gè)引腳上。而只安裝 1 個(gè)螺釘?shù)幕魻栃?yīng)模塊 PCB 板,使組裝變得更加容易。
4)為什么用那么多 Arduino 而不用一個(gè)芯片?
將需要一個(gè)具有以下功能的 Arduino(或FPGA)芯片:
48 個(gè)電機(jī) 4 個(gè)步進(jìn)信號(hào) + 48 個(gè)電機(jī) 2 個(gè)用于校準(zhǔn)的霍爾效應(yīng)傳感器 = 288 pin。Arduino 做不到,FPGA 可以。
5)在主控 Arduino 上增加 3 端穩(wěn)壓器的目的是什么?
3 端穩(wěn)壓器是添加到主控制器中的 7805 穩(wěn)壓器,當(dāng)主控 Arduino 連接到其他電路板,關(guān)閉電源時(shí),會(huì)燒。關(guān)閉電源之前,應(yīng)先從主機(jī)上拔下 USB。
6)如果 RTC 模塊的時(shí)間出現(xiàn)誤差,如何調(diào)整?
可以使用按鈕開關(guān)調(diào)整時(shí)區(qū)的小時(shí)數(shù)。要更改 RTC 芯片上的時(shí)鐘時(shí)間,需要對(duì) Arduino 主程序進(jìn)行重新編程。
可以將代碼修改為允許通過藍(lán)牙無(wú)線訪問主機(jī)和調(diào)整 RTC。
這個(gè)項(xiàng)目耗時(shí)三年,現(xiàn)在可以享受成果了。
總結(jié)
以上是生活随笔為你收集整理的硬核!用Arduino打造纯机械装置模拟数字时钟的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EPON OLT光模块RSSI问题分析报
- 下一篇: java位数不足自动左补0