ต่อโมดูล Real Time Clock เข้ากับ Pi เพื่อให้เวลาตรง

วันที่ 15 กุมภาพันธ์ 2563

ในตอนนี้เราจะลองต่อโมดูล DS3231 ซึ่งทำหน้าที่ Real Time Clock (RTC) เข้ากับ Raspberry Pi เพื่อทำให้อุปกรณ์ มีเวลาใกล้เคียงกับมาตรฐาน แม้จะไม่ได้ต่ออินเทอร์เน็ตก็ตาม

Raspberry Pi DS3231 Connection

เนื่องจาก Raspberry Pi ถูกออกแบบมาให้มีขนาดเล็ก และราคาถูก จึงตัดโมดูลต่างๆ ที่ไม่จำเป็นจริงๆ ออกไป รวมทั้งโมดูล Real Time Clock (RTC) ซึ่งทำหน้าที่จ่ายเวลาจริงให้กับเครื่องคอมพิวเตอร์

หากเราเพิ่งต่อสายไฟแล้วเปิดอุปกรณ์ Raspberry Pi ขึ้นมาตอนแรก ลองใช้คำสั่ง date เพื่อดูเวลา เวลาจะไม่ตรงกับปัจจุบัน ถึงแม้ว่าเราจะใช้คำสั่ง date เพื่อตั้งเวลาให้กับ Pi ตรงกับปัจจุบัน แต่ถ้าลองปิดเครื่องแล้วถอดสายไฟออก แล้วลองต่อสายไฟเปิดขึ้นมาใหม่ เวลาก็ไม่เดินต่อ เหมือนกับเครื่องคอมพิวเตอร์ทั่วไปที่มี Real Time Clock ถูกติดตั้งเป็นมาตรฐานมาอยู่แล้ว สังเกตดูเครื่องคอมพิวเตอร์ทั่วไปจะมีถ่านนาฬิกาก้อนแบนอยู่บนเมนบอร์ด ทำหน้าที่จ่ายไฟให้กับโมดูล RTC

ถ้าอุปกรณ์ Raspberry Pi สามารถเชื่อมต่อกับอินเทอร์เน็ตได้ตลอดเวลา ตัวโปรเซส systemd จะทำหน้าที่ปรับเวลาของอุปกรณ์ให้เป็นเวลามาตรฐานได้ โดยใช้โปรโตคอล ntp แต่ถ้าไม่สามารถเชื่อมต่อได้ตลอดเวลา หรือมีการปิด/เปิด อุปกรณ์ Pi อยู่เป็นระยะ แนะนำให้ต่อโมดูล Real Time Clock เพิ่มเติม

ในที่นี้เราจะใช้โมดูล DS3231 ซึ่งสามารถหาซื้อได้ทั่วไป ราคาไม่แพง (ไม่ถึง 100 บาท) ต่อเข้ากับ Raspberry Pi โดยเชื่อมต่อแบบ I2C

การเชื่อมต่อ

รูปแบบการเชื่อมต่อสายระหว่างโมดูล DS3231 กับ Raspberry Pi

     /---------\     /-----------------\
     | DS3231  |     | Raspberry Pi    |
     +---------+     +-----------------+
     | SCL     |-----| Port #05 SCL    |
     | SDA     |-----| Port #03 SDA    |
     | VCC     |-----| Port #01 3.3v   |
     | GND     |-----| Port #06 Ground |
     \---------/     \-----------------/

คอนฟิก I2C

หลังจากต่อสายเสร็จเรียบร้อย บู๊ต Pi ขึ้นมา ลองใช้คำสั่ง lsmod จะเห็นว่ามีโมดูล rtc_ds1307 ถูกโหลดขึ้นมาอัตโนมัติ

หมายเหตุ ถึงแม้เราจะใช้โมดูล DS3231 แต่ตัว Raspbian จะมองเป็นโมดูล ds1307 ซึ่งสามารถเรียกใช้งานได้เหมือนกัน

$ lsmod  | grep rtc
rtc_ds1307             24576  0
hwmon                  16384  3 rtc_ds1307,raspberrypi_hwmon,ads7846

Raspberry Pi สามารถเชื่อมต่อแบบ I2C เข้ากับโมดูลได้หลายตัว โดยอ้างอิงจากที่อยู่ (address) ซึ่งสามารถดูค่าได้จากคำสั่ง i2cdetect

$ 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: -- -- -- -- -- -- -- 57 -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

จากผลลัพธ์ด้านบน 68 คือที่อยู่ (address) ที่เราจะใช้อ้างอิง เพื่อให้ Pi อ่านค่าเวลามาจากโมดูล RTC

พิมพ์คำสั่ง sudo su - เพื่อรันเป็น root แล้วใช้คำสั่ง echo เพื่อใส่ค่ารุ่นและที่อยู่อ้างอิงเข้าไปในไฟล์ new_device ตามตัวอย่างด้านล่าง

$ sudo su - 
# echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device

รันคำสั่ง hwclock

ลองใช้คำสั่ง date เพื่อดูเวลาปัจจุบันของ Pi

# date
Fri 14 Feb 2020 11:46:31 AM +07

ลองใช้คำสั่ง hwclock -r เพื่ออ่านค่าเวลาจากโมดูล Real Time Clock

# hwclock -r
2020-02-14 12:48:23.709763+07:00

สังเกตว่าเวลาไม่ตรงกัน

เราสามารถใช้คำสั่ง hwclock -s เพื่อกำหนดเวลาของ Pi โดยอ่านจากโมดูล Real Time Clock ได้

# hwclock -s

ตอนนี้เวลาของ Raspberry Pi ก็จะตรงกับเวลาของโมดูล Real Time Clock แล่้ว

# date
Fri 14 Feb 2020 12:49:06 PM +07