?
● 電路部分主要由一塊Arduino板和一塊Adafruit Motorshield板組成。通常電機和Arduino板不宜使用同一個電源供電,但是在這個DIY中電機的功率很小,只需要很小的電壓就能驅動。所以我就插了根跳線,讓arduino板的電源同時給Motorshield供電。
● 接下來又做了幾根4針腳的延長線,因為我的步進電機恰好有幾個那樣的接口,只是接口上的線稍細了些。
● 我對步進電機了解也不太深,只能大致給童鞋們說一說基本原理:步進電機中都有兩個線圈,對兩個線圈輸入一定頻率和極性的脈沖信號,就能驅動轉子向指定方向旋轉。在我所用的步進電機上,這兩個線圈是相互獨立的,所以電機上引出了四根線。關于這種型號步進電機的詳細介紹可以查閱 下面 這篇文章。
?
● 兩根線連接到一個線圈上,另外兩根連到另一個線圈。借助萬用表確定怎樣正確連線。然后一個線圈的兩根線連到Motorshield板的1、2輸出端上,另一線圈連到4 、5輸出端。這里要注意線的極性,不要接反。
● 測試程序時無需等待,可以直接把程序中millisPerSecond的值改為200,它的轉速就會變成原來的5倍。你也可以改變步長,步長變化會改變每個周期電機移動的步數。
程序中有三個內部時間定義,由三個整型變量組成:currentSeconds, currentMinutes 和 currentHours。這三個時間在程序開始前預置,并隨著程序運行自動累加。
程序的主循環語句記錄開始時間,然后連續檢測時間是否超過1000毫秒。如果超過的話,內部時鐘時間加1(doTick()),然后觸發子程序使時鐘上的指針移動(renderTime())。
doTick()子程序負責累加時間,由秒到分鐘,由分鐘到小時,并且在必要時重置時間。
renderTime()子程序的作用是把累加的時間轉換成時鐘面板上的時分秒的位置,更準確的說就是步進電機轉動的步數。這個程序能判斷指針當前位置,(啟動時設定在00:00的位置,也就是時鐘最左邊的位置),通過指針當前位置和初始位置的比較來決定步進電機的運動方向。
使用Arduino的內部計時器有時會不太可靠。這個問題有很多解決方法, Arduino主頁 中也介紹了一些讓計時更準確的方法,也可以使用時間函數庫??紤]到這僅僅是一臺測試機,我采用了一種比較簡略的解決方案(這貌似是我想偷懶時的一貫借口哦)。
因為我使用的是Adafruit公司的Motorshield板,所以便用AFMotor函數庫來驅動電機。如果你通過其他電路驅動步進電機,也可以選用Arduino步進電機函數庫中的其他一些子程序來加快編程。如果你下載了我的程序,記得文件必須保存為.pde后綴,文件名可以自己修改。
你所選的步進電機不一定和我用的相同,為了使程序適用于不同的電機要進行修改,主要有以下幾處:
1、改變電機聲明變量的參數
AF_Stepper hourHand(20, 1); // hours
AF_Stepper minuteHand(20, 2); // minutes
第一行,改變數值20可以設定電機旋轉一圈移動的步數。一般可設置為200(就是每步1.8度)。如果你沒有所用電機的參數資料,那就只能通過實驗來檢測了,我相信你肯定能夠設法得到這個數據。
2、改變stepsPerClock的參數
int stepsPerClock = 592;
這一步可能比較復雜,因為這個數據取決于線性時鐘的長度,電機每轉一圈的步數以及繞線輪的直徑,需要利用公式計算出來。我只計算了電機移動100步時滑動塊的移動距離,通過它就能方便的算出滑動塊移動整個時鐘長度時,電機需要移動多少步。這里注意應在時鐘兩端留出余量,防止滑動塊從時鐘兩端滑落。
3、調整當前時間:
這個版本的程序中設置初始時間不太方便,下一版本中會進行修改,使我們能用Arduino板上的按鈕來改變時間。
int currentSeconds = 0;
int currentMinutes = 55;
int currentHours = 11;
如果按照上面的值設定,時鐘啟動時指針會指向11點55分。有不少改進方法使設置初始時間更加智能,但是在原型中這個程序已經夠用了。
我通常設置的初始時間比當前時刻晚一分鐘,這樣就留出了往arduino板上燒寫程序的時間,刷新完程序等到恰好一分鐘時再按下復位按鈕。時鐘剛啟動時,分針可能會有些錯位,偏離整分鐘的位置,不用擔心,用手調整到準確位置就可以了。
4、調整時間速度
通過下面這一行代碼可以改變計時的速度。在測試時我把計時速度調整為實際的5倍。
int const millisPerSecond = 200;
上面這段代碼設定每秒鐘為200毫秒,而實際應該是1000毫秒,因此若想調回實際時間時,只要把200再改為1000即可。
?
● 我最開始設想的時鐘使用彈簧作驅動,用石英機芯作時鐘信號源,再通過電磁鐵和齒輪傳動鏈來帶動表針移動。
● 線性時鐘的原型完工后,我開始考慮如何改進。它想走進千家萬戶的話就必須要能適應多種環境,所以我就想制作一個更實用的改進版來對部件進行測試。
?
● 在改進版本中,我將一段兩米長的鋁制滑軌鋸成兩段,代替原來的pvc滑軌。我原本以為鋁制的滑軌更牢固,因此時鐘就能做的更長??墒窃跍y試中,情況并非如此,鋁制滑軌帶來的改進并不明顯。原因是鋁制滑軌并非在所有部分都那么光滑,尤其端部十分粗糙,因為硬度高,想打磨光滑也很困難。如果最后還要對時鐘進行包裝的話,那金屬滑軌就更沒有什么明顯的好處了。
?
● 從卷簾上找一條珠鏈----因為時鐘長一米,所以要把它連成一米長的圓環---也就是說,所找的珠鏈至少要有兩米才行,這樣才可能連成這個鏈環。
?
● 可是有個問題,卷簾上只有一個珠鏈輪,所以我測繪了它,并和兩個支架和一些安裝在導軌上的滑動塊一同進行3D打印。
● 我在http://www.shapeways.com 上把設計圖3D打印成實體零件,下面就是這些零件的STL文件,我相信它們會對你有幫助的。
?
● 剛開始我還用輕木做了兩個滑輪。它們雖然可以工作,但是邊緣做不圓滑,所以就放棄了。
?
● 這些設計似乎看上去很棒,樣子很漂亮,表面也十分光滑。但正如我猜的那樣,它們有個缺陷,那就是太重,那兩個小電機根本奈何不了它們。如果電機的轉矩能再大一點兒那就是絕配,所以雖然這想法十分簡潔,現在我也只能放棄。
?