วันที่ 15 กุมภาพันธ์ 2563
ในตอนนี้เราจะลองต่อโมดูล DS3231 ซึ่งทำหน้าที่ Real Time Clock (RTC) เข้ากับ Raspberry Pi เพื่อทำให้อุปกรณ์ มีเวลาใกล้เคียงกับมาตรฐาน แม้จะไม่ได้ต่ออินเทอร์เน็ตก็ตาม
เนื่องจาก 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 |
\---------/ \-----------------/
หลังจากต่อสายเสร็จเรียบร้อย บู๊ต 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
ลองใช้คำสั่ง 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