2013年3月26日 星期二

[AlaMode] RTC 晶片 (DS3231) 使用說明

需要選購 AlaMode 可至露天賣場,賣場網址如下:

{ AlaMode } 完全兼容於 Arduino 可直接嵌入 Arduino 擴充板的 Raspberry Pi (樹莓派) 擴充板

AlaMode 入門套件 - 在樹莓派開發你 (妳) 熟悉的 Arduino

樹莓派連線 AlaMode 的 RTC 模組

本文是接續 "AlaMode: Get Started (中文入門說明)",指令可以連貫下來。不過對於要在樹莓派設定其他 RTC 晶片的使用者,卻可視為獨立的使用說明。

本篇所使用的作業系統版本是:2013-02-09-wheezy-raspbian。不一定要跟我一樣,因為步驟只要對了就可以。

AlaMode 與樹莓派間的通訊連接有 I2C、SPI 和串列 UART 這幾種,其中程式燒錄使用串列通訊,而 RTC 晶片與樹莓派使用 I2C 通訊協定且為 Slave。

要瞭解 AlaMode 首先就是要看懂與清楚電路圖,才能正確連接外掛線路與使用,下面提供一個另外匯出為 PDF 清晰的 AlaMode 電路圖,給需要了解線路的看倌一個方便。

下載或觀看清晰的 AlaMode 電路圖 (原始電路圖使用 KiCAD 繪製,可以上網找原始檔案,不過下載不方便,請使用版本控制軟體 (建議 SmartSVN) 同步下載 )

AlaMode 的 RTC 晶片 ( DS3231 ) 在樹莓派中如何設置 ? 有兩種方法:一種是手動設置,但每次都要自行輸入指令才能開啟,不過對於熟悉整個開啟 RTC 流程很有幫助;另一個就是自動模式,藉由修改三個系統檔案,使其相關檔案與設定能在樹莓派開機時自動載入。

詳細設定說明,就請繼續往下看!
AlaMode 的 RTC 晶片 ( DS3231 ) 是使用 I2C 與設莓派做通訊且做為 Slave,由於整段線路 ( SDA 和 SCL Page1:ATMEGA328-PU, Page3:DS3231N, Page4:BCM2835_GPIO  )上已使用了 10K 上拉電阻 (Page1:ATMEGA328-PU),因此可以直接使用;而在訊號通訊方面,樹莓派與 AlaMode 的通訊傳輸使用 level shifter ( TXS0108 ) 做為中介,將 5V0 與 3V3 的訊號做雙向自動轉換。

因此,若是使用其他 RTC 模組或是晶片時 ( 使用 I2C 通訊 ),首先就是必須知道該 RTC 模組是否已裝上了上拉電阻,因為樹莓派在其 I2C 接腳 ( P1, 接腳 3 和 5) 已預先裝上 (如下圖),所以必須撤掉 RTC 模組上的這兩個上拉電阻才能使用。另外就是需要知道通訊準位,若是不同就必須要做電壓準為準位才能使用。

以上就是使用 RTC 與樹莓派做連接必須注意的地方,提供給不是使用 AlaMode 的使用者做參考。
Raspberry Pi Model B revision 2 (512 MB), GPIO P1

看過上面的介紹之後,使用 AlaMode 上的 RTC 只要負責通訊部分就好,不需要注意到硬體線路這一塊,而須注意到的是,您必須手動安裝軟體,以及手動設定系統時間到 RTC 晶片,之後才可以設定為自動模式,否則拔掉網路線之後 RTC 的時間還是不會正確的。


RTC 手動開啟與測試方法:

在手動設定 RTC 之前,樹莓派一定要插上網路線,且 AlaMode 必須裝上 CR1625 的鈕扣電池再往下做;另外,建議您與本文一樣使用 SSH 連線至樹莓派,直接使用終端機做指令操作。

下面是手動設置 AlaMode 的 RTC 設定流程。同一層的方塊完成之後才能到下一個步驟,因為上一步驟的設定與結果影響下一步驟的設定;每一個小方塊上方的文字就是設定指令;沒有箭頭符號的小方塊,表示這些指令使用上並無特別順序,可用來測試 RTC 設定之後的結果。
AlaMode 的 RTC 手動設定流程

接下來,就將此手動設置步驟分述如下:

手動和自動前置步驟 - 開啟樹莓派 I2C 功能與安裝 I2C 套件:

這一步驟是手動與自動模式設定時一定要先做的步驟,因此都在此說明。
手動與自動前置步驟流程圖

輸入下面指令,打開限制樹莓派 I2C 通訊的檔案
pi@raspberrypi ~ $ sudo nano /etc/modprobe.d/raspi-blacklist.conf

如下面截取畫面,將 spi-bcm2708i2c-bcm2708 前面都加上 # 符號,修改後存檔 ( Ctrl + O ) 離開 ( Ctrl + X )
修改 /etc/modprobe.d/raspi-blacklist.conf

接著輸入下面指令 (下面指令是一連貫的),先更新套件列表 ( 如果已經更新過了,這一行可以跳過 ) 再確認軟體版本( 文中是安裝 3.1.0-2 ),然後安裝 i2c-tool 套件
pi@raspberrypi ~ $ sudo apt-get update
... << 中間省略 >> ...
pi@raspberrypi ~ $ sudo apt-cache show i2c-tools
Package: i2c-tools
Version: 3.1.0-2
Architecture: armhf
Maintainer: Aurelien Jarno <aurel32@debian.org>
Installed-Size: 218
Depends: libc6 (>= 2.13-28), perl, adduser, udev | makedev
Suggests: libi2c-dev, python-smbus
Conflicts: lm-sensors (<< 1:3.0.0-1)
Homepage: http://www.lm-sensors.org
Priority: extra
Section: utils
Filename: pool/main/i/i2c-tools/i2c-tools_3.1.0-2_armhf.deb
Size: 59528
SHA256: 90c4f138b8b7a3836580e79888a46f9575d1fbbd08d309b84e8ce214a6c38e16
SHA1: c7ace4a833c4b0555daf723a751beff014865f43
MD5sum: 10114c1ae5ef1d949d2aca6fc10893ba
Description: heterogeneous set of I2C tools for Linux
 This package contains a heterogeneous set of I2C tools for Linux: a bus
 probing tool, a chip dumper, register-level access helpers, EEPROM
 decoding scripts, and more.

pi@raspberrypi ~ $ sudo apt-get install i2c-tools
正在讀取套件清單... 完成
正在重建相依關係
正在讀取狀態資料... 完成
The following packages were automatically installed and are no longer required:
  libblas3gf liblapack3gf
Use 'apt-get autoremove' to remove them.
建議套件:
  libi2c-dev python-smbus
下列【新】套件將會被安裝:
  i2c-tools
升級 0 個,新安裝 1 個,移除 0 個,有 0 個未被升級。
需要下載 59.5 kB 的套件檔。
此操作完成之後,會多佔用 223 kB 的磁碟空間。
下載:1 http://mirrordirector.raspbian.org/raspbian/ wheezy/main i2c-tools armhf 3.1.0-2 [59.5 kB]
取得 59.5 kB 用了 1s (38.2 kB/s)
選取了原先未選的套件 i2c-tools。
(讀取資料庫 ... 目前共安裝了 64296 個檔案和目錄。)
解開 i2c-tools(從 .../i2c-tools_3.1.0-2_armhf.deb)...
執行 man-db 的觸發程式 ...
設定 i2c-tools (3.1.0-2) ...
/run/udev or .udevdb or .udev presence implies active udev.  Aborting MAKEDEV invocation.
pi@raspberrypi ~ $ sudo modprobe i2c-dev
pi@raspberrypi ~ $ sudo i2cdetect -y 1 Error: Could not open file `/dev/i2c-1' or `/dev/i2c/1': No such file or directory pi@raspberrypi ~ $ sync;sync;sudo init 6 pi@raspberrypi ~ $ Connection to 192.168.1.5 closed by remote host. Connection to 192.168.1.5 closed. Command terminated. Press <RETURN> to exit this tab...

安裝好 i2c-tools 之後,若以為直接就可以執行 i2cdetect 那就錯了!因為 I2C 硬體還未被開啟,所以就是重開機使其生效。

手動 - 載入 I2C 與 RTC 模組:

i2c-dev 模組的載入可以使用指令 i2cdetect 來偵測 RTC 晶片所在的 I2C 位址,這位址會使用在產生 DS1307 裝置於系統的指令中,使用之前須先再載入 rtc-ds1307 模組。完成模組載入的工作之後,hwclock 指令就可以使用了。
載入 u2c-devrtc-ds1307 模組

樹莓派重新開機完成後,再次使用 SSH 連線後,依序輸入下面指令
  • Line 01 - 02:載入 i2c-dev 模組,再使用指令 i2cdetect 指令尋找 RTC 位址
  • RPi Model B Rev. 1.0:$ sudo i2cdetect -y 0
    RPi Model B Rev. 2.0:$ sudo i2cdetect -y 1
  • Line 12:載入 rtc-ds1307 模組

  • Line 13 - 15:輸入指令建立 DS1307 裝置於系統 ( I2C 的位址就是用在這裡 )
  • 於 Line 14,不同版本的樹莓派輸入指令不一樣
    RPi Model B Rev. 1.0:echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-0/new_device
    RPi Model B Rev. 2.0:echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device

  • Line 17:確認 RTC 裝置是否新增完成且已可正常使用
  • 正常的情形之下,您會看到類似 Line 25 - 27 的輸出文字
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
pi@raspberrypi ~ $ sudo modprobe i2c-dev
pi@raspberrypi ~ $ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
pi@raspberrypi ~ $ sudo modprobe rtc-ds1307
pi@raspberrypi ~ $ sudo bash
root@raspberrypi:/home/pi# echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
root@raspberrypi:/home/pi# exit
exit
pi@raspberrypi ~ $ dmesg | tail
[    8.813576] bcm2835 ALSA chip created!
[    8.818671] bcm2835 ALSA chip created!
[    8.822116] bcm2835 ALSA chip created!
[   17.553276] bcm2835-cpufreq: switching to governor ondemand
[   17.553305] bcm2835-cpufreq: switching to governor ondemand<6>[   17.833829] smsc95xx 1-1.1:1.0: eth0: link up, 100Mbps, full-duplex, lpa 0x41E1
[   20.219443] Adding 102396k swap on /var/swap.  Priority:-1 extents:1 across:102396k SS
[  154.693573] i2c /dev entries driver
[  798.145944] rtc-ds1307 1-0068: rtc core: registered ds1307 as rtc0
[  798.145987] rtc-ds1307 1-0068: 56 bytes nvram
[  798.146039] i2c i2c-1: new_device: Instantiated device ds1307 at 0x68

手動 - 讀取、手動設定和寫入系統時間:

RTC 晶片一旦通電或是加上電池後,如果沒去設定它,時間就會從 2000 年一月開始。而所有的動作都可以經由 hwclock 這個指令完成,更多的資料請輸入指令 man hwclock
經由 I2C 讀取、手動指定和寫入系統時間到 RTC 晶片的方法

接續著上一節的指令繼續輸入:
  • Line 28:讀取 RTC 的時間 (這之前已經有設定過了)
  • Line 30:手動設定時間 ( 如果沒接網路時可自行輸入時間,注意 setdate 前面是個 '-' )
  • Line 33:再次讀取 RTC 模組時間,確認真的有寫入成功
  • Line 35:如果樹莓派有接網路,可以使用網路自動對時的功能,將所讀到的網路時間寫入到 RTC 晶片中
  • Line 37:再次讀取 RTC 模組時間,確認已經寫入系統時間
28
29
30
31
32
33
34
35
36
37
38
pi@raspberrypi ~ $ sudo hwclock -r
2013年03月25日 (週一) 16時52分44秒  -0.619568 seconds
pi@raspberrypi ~ $ sudo hwclock --set --date="2013-03-25 12:34:56"
pi@raspberrypi ~ $ sudo hwclock -r
2013年03月25日 (週一) 12時35分15秒  -0.424018 seconds
pi@raspberrypi ~ $ date
一  3月 25 17:35:51 CST 2013
pi@raspberrypi ~ $ sudo hwclock -w
pi@raspberrypi ~ $ sudo hwclock -r
2013年03月25日 (週一) 17時36分03秒  -0.927838 seconds
pi@raspberrypi ~ $

這樣就完成了手動的設定與測試。緊接著,若是想將上面的手動輸入過程變成開機後就自動載入模組與建立 DS1307 裝至於系統,就繼續下面網頁的說明。


RTC 自動載入設定:

如下圖,是 RTC 自動載入的設定流程。可以清楚了知道,左下方塊必須先完成才能繼續右邊方塊的動作。
AlaMode 的 RTC 自動載入設定流程

RTC 自動載入的設定方法,就是將下面三個文字檔案修改好,重開機確認 RTC 正常運作就可以了。

輸入下面指令依序開啟下面三個檔案做修改,修改後存檔 ( Ctrl + O ) 離開 ( Ctrl + X )
pi@raspberrypi ~ $ sudo nano 檔案完整目錄與名稱
  • /etc/modprobe.d/raspi-blacklist.conf
  • 這個上面就已經設定過了,請參閱上面手動模式的說明。

  • /etc/modules
  • 開機時要自動載入的模組設定。只要載入 i2c-dev rtc-ds1307 兩個模組就可以了
    /etc/modules 檔案內容
  • /etc/rc.local
  • 這是系統管理者使用的 script,在系統所有正常的服務啟動之後執行,在執行結束之後切換到多使用者運作層級,是開機最後執行的程式。

    因為 DS1307 裝置必須先建立才能使用,因此希望在開機的時候讓樹莓派自動幫忙處理。打開 /etc/rc.local 檔案,輸入下面在 fi ... exit 0 之間的程式碼
    /etc/rc.local 檔案內容
上面三個檔案完成之後,請重開機!
pi@raspberrypi ~ $ sync;sync;sudo init 6

開機完成之後再使用 SSH 連線至樹莓派,並輸入下面指令確認最後三行出線的訊息是否包含 RTC 的資訊 (應該跟下面的列表類似)
pi@raspberrypi ~ $ dmesg | tail
[    8.818638] bcm2835 ALSA chip created!
[    8.823526] bcm2835 ALSA chip created!
[    8.827814] bcm2835 ALSA chip created!
[    8.947288] i2c /dev entries driver
[   17.709265] bcm2835-cpufreq: switching to governor ondemand
[   17.901742] smsc95xx 1-1.1:1.0: eth0: link up, 100Mbps, full-duplex, lpa 0x41E1
[   19.751812] Adding 102396k swap on /var/swap.  Priority:-1 extents:1 across:102396k SS
[   20.656161] rtc-ds1307 1-0068: rtc core: registered ds1307 as rtc0
[   20.656190] rtc-ds1307 1-0068: 56 bytes nvram
[   20.656224] i2c i2c-1: new_device: Instantiated device ds1307 at 0x68

之後,即使沒插上網路線也可以讀的到正確的時間了。至於要如何使用程式讀到 RTC 的資料,請參閱 "AlaMode User Guide.pdf" Page 16, Example 3:DS2321 Temperature Copensated Real Time Clock.

以上,就是 AlaMode 的 RTC 模組在樹莓派中的設置!

Have fun !

沒有留言:

張貼留言