2015年4月27日 星期一

Arduino之做出名堂 - MRT計時手表


在台北搭捷運是沒有時刻表的,因為班距短,而且真要看的話,進了捷運站螢幕上有跑馬燈會顯示下一班捷運還有多久發車,趕的話估計一下時間就小跑步也就趕上了。但是有兩條支線 - 北投到新北投,以及七張到小碧潭是按照時刻表發車的,而且班距較長(可能會到20分鐘一般),所以有時候你需要看看時刻表估計是否可以趕上下一班捷運,太久的話可能等公車還比較快,而捷運站有印時刻表讓旅客自取以參考時間,上網找並沒有相對的App,所以乾脆自己做一支手錶,可以倒數計時看下一班捷運還有多久發車,這樣在車站外就可以估計要不要去搭捷運了。

規劃手表應有之功能:日期跟時鐘是最基本的,還有MRT倒數計時功能,可以輸入時刻表,由目前時間推算下一班MRT還有幾分鐘,另外手錶還加上偵測溫度氣壓Sensor,用來推算目前高度,也算是多點附加價值。

規劃好功能後,接下來是硬體採購,要做一支手錶應該會有:

  • 螢幕 - 我用了1.3吋白色OLED的螢幕,支援3.3/5V
  • 主版 - 體積要儘量小,Arduino Pro Mini ATmega328 3.3V,我買了號稱可跑16Mhz的,不過感覺不出來有啥不一樣
  • RTC(Real Time Clock) - 從網上找了一塊DS1307晶片的Tiny RTC,支援3.3V及I2C,原本它還帶CR2032電池座,但是因為太占空間,就解焊掉換接小一點的紐扣電池
  • 感測器 - BMP180,可測溫度及氣壓換算為高度
  • 電池 - 為了縮小體積,買了個僅130mAh的3.7V鋰電池
  • 兩個按鈕 - 用來切換時間及MRT倒數顯示畫面,以及切換螢幕休眠
  • 表殼錶帶 - 這部份就比較傷腦筋,不會有現成的商品可用,不是想辦法用3D列印或手工DIY自製一個

軟體部分,首先是如何讓OLED顯示內容,螢幕分為文字跟圖型兩種,一般網站上示範的通常都是文字型的LCD,這種LCD只要指定文字內容及位置(哪一行),它就會把文字顯示在螢幕上。但繪圖型的支援畫點線圖型等,文字可指定font size及位置(x, y),使用起來相對比較困難一點。購買OLED時要注意一下賣家的軟體支援程度,以免買回來點都點不亮。我買的是相容SSD1306晶片132x64的1.3吋OLED,接腳除Vcc及GND之外,另外五個接腳分別接Arduino的pin腳為D0->10, D1->9, CS->12, DC->11, RST->13。




使用的是u8glib的程式庫,它可以掛很多字型,但要小心不要把Arduino給撐爆了,Pro Mini約有30,720 bytes空間可用,所以字型也不能用太多。左上角的icon圖案是ASCII字元,基本上就是用SetPrintPos(x, y) 指定位置,然後用u8g.print(字串)列印出變數,這裡值得注意的是u8g網頁上的範例都是用u8g.drawStr("字串"),但這不適用於變數字串,要使用u8g.print指令。另外畫線就用u8g.drawHLine(x, y, 長度 )決定起始點以及畫多少pixel。

螢幕點亮也可以繪圖了,接下來就要讓它顯示資料了。才發現讀取Array及處理字串比平常讓Arduino送個訊號給某pin腳的程式難多了,以我的程度只能用比較笨的方法,把每個小時的 MRT幾分有的班表建一個Array(像這樣M6[] = {11, 27, 43, 56,  9},表示6點11, 27, 43, 59及7點9分有捷運發車)然後用現在的時跟分去比對計算剩多少分鐘下一班捷運會發車,功力好一點的人可以寫出更簡單的程式才是。

再來就是RTC,在更換電池時保持系統的時間正確,常在很多電子產品內出現。它是使用I2C介面連接Arduino,在Pro Mini -> RTC是A4->SDA, A5->SCL連接這兩個pin腳。BMP180也是一樣,購買時要注意是支援3.3V的,這樣才能靠一顆鋰電池供電。RTC的電池需要3V的紐扣電池,原本使用的CR2032體積太大,查了一下這種電池的規格才發現以前我們叫他水銀電池,但其實老早就不用水銀改為鋰電池了,而這幾年來還出了可充電的規格。簡單的說CR開頭的電壓都是3V,前面兩碼20表示直徑20mm,後面兩碼32表示厚度3.2mm,所以只要買CR開頭的都可以用,大小厚度可以自己選,這樣可以縮小維持時間的電池體積(根據購買網站上說LIR2032充完電可以用一年,但我用1225大概只能撐2個月)。

右邊綠色的是熱縮套,把電池包起來

關於BMP180,是一塊能讀取溫度及氣壓的感測器,也是透過I2C來傳輸資料。首先它會先獲取溫度,然後利用「目前海平面氣壓」來換算成高度。問題是海平面氣壓會隨時改變,低氣壓來臨時比較低,天氣一好又升高,所以高度其實不太準;專業一點的高度計也需要隨時校正,在登山時看到目前標高就校正一下高度計,才會得到比較準確的高度。

最後,把所有元件焊接起來,鋰電池跟Arduino Pro Mini則是用JSP2.0接頭連接,有些鋰電池買來就已經有接好這種接頭,如下圖:


關於電腦與Arduino Pro Mini連接的方法,請參考另一篇文章Arduino Pro Mini上傳程式
至於Arduino Sketch,在這兒,程式碼蠻長的,Arduino IDE如何分頁(Tab)請參考這一篇

做完第一版之後有些感想:

  • 這些板子雖小,但用線焊接起來的話卻還蠻麻煩又占空間,所以重新設計一塊電路板才能節省空間,又能自己安排按鈕位置以及充電等線路。
  • 電池130mAh太小了,大概24小時都撐不到,可以從優化程式(螢幕暗時感測器不動作),以及關掉Arduino的timer之類的方式來節電。並且我發現經過十次左右將鋰電池耗盡再充滿,會讓電池的容量越來越小,而讓手錶越來越快就沒電了,是因為電池本身保護線路不佳,還是充電器電路設計的問題還需要研究一下。
  • 外殼是最麻煩的事,從設計開始就應該考量尺寸等相關問題。
  • 下一版應加上藍牙晶片,讓手錶有通訊的功能才能真的叫做Smart watch

2 則留言:

  1. 一般的電子錶或手錶,待機電流是uA等級(通常小於50uA),所以換一次電池可以撐超過一年,但是Arduino的晶片待機電流是mA等級,差1千倍,所以撐不到一天就沒電,光Arduino板子上的貼片led,耗電量就超過1mA以上了,除非把led 解焊拿掉,並用更省電的晶片來做,不然待機是個問題,或者每天充電

    回覆刪除
  2. 感謝你的資訊!用Arduino來做電子錶本來就太奢侈了,要做穿戴式設備可能要用其它的Solution,或者外接比較大的電池啦。
    話說回來,這個專案的主要目的是將MCU、螢幕、sensor、RTC、電池等電子產品中常見的元件給串接起來,耗電量這個議題就值得另外好好研究啦。

    回覆刪除