- โปรเจ็กต์ที่ควบคุม นาฬิกาควอตซ์แบบอนาล็อกราคาประหยัด ด้วย โมดูล ESP8266 และ Arduino sketch เพื่อซิงก์เวลากับเวลาอินเทอร์เน็ต
- รับเวลาจาก เซิร์ฟเวอร์ NTP ทุก 15 นาทีเพื่อคงความแม่นยำ และมีฟังก์ชัน ปรับเวลาออมแสงอัตโนมัติ
- ดัดแปลงโดยแยก ขดลวดมอเตอร์สเต็ปปิงแบบ Lavet ของนาฬิกาออกมาให้ ESP8266 ควบคุมได้ และใช้ ชิป EERAM เพื่อบันทึกตำแหน่งเข็มชั่วโมง เข็มนาที และเข็มวินาที แม้ไฟดับ
- ตอนตั้งค่าเริ่มต้น สามารถกำหนดตำแหน่งเข็มนาฬิกาผ่าน อินเทอร์เฟซหน้าเว็บ ที่ ESP8266 ให้บริการ และหลังจากนั้นดูสถานะนาฬิกาแบบภาพด้วย SVG หรือ HTML Canvas ได้จากหน้าสถานะ
- เป็นตัวอย่างโอเพนซอร์สของการสร้าง นาฬิกาซิงก์เครือข่ายที่แม่นยำ ด้วยฮาร์ดแวร์ราคาถูก และแสดงให้เห็นการประยุกต์ใช้ เทคโนโลยีควบคุม Embedded IoT ในทางปฏิบัติ
ภาพรวมโปรเจ็กต์
- ESP8266 WiFi Analog Clock คือระบบที่ใช้โมดูล WEMOS D1 Mini ESP8266 และ Arduino sketch เพื่อรับเวลาในท้องถิ่นจากเซิร์ฟเวอร์ NTP(Network Time Protocol) โดยอัตโนมัติและแสดงผล
- เชื่อมต่อกับเซิร์ฟเวอร์ NTP ใหม่ทุก 15 นาทีเพื่อรักษาความแม่นยำของนาฬิกา
- มีฟังก์ชันปรับ Daylight Saving Time อัตโนมัติ
- โปรเจ็กต์นี้อิงกับ นาฬิกาควอตซ์แบบอนาล็อกราคาประหยัด และผสานการดัดแปลงฮาร์ดแวร์เข้ากับการควบคุมด้วยซอฟต์แวร์
ฮาร์ดแวร์
- นาฬิกาที่ใช้คือ นาฬิกาควอตซ์แบบอนาล็อกที่ซื้อจาก Walmart ในราคา 3.88 ดอลลาร์
- เปิด quartz movement ของนาฬิกา แล้วแยก ขดลวดมอเตอร์สเต็ปปิงแบบ Lavet ภายในออกจาก quartz oscillator จากนั้นบัดกรีสายสำหรับเชื่อมต่อ ESP8266 เข้ากับสายแต่ละเส้น
- movement ส่วนใหญ่ประกอบแบบสแน็ปเข้าล็อกโดยไม่มีสกรู
- สายของขดลวดเล็กกว่าขนาดเส้นผม จึงต้องระมัดระวังอย่างมากในการจัดการ
- วงจรที่ประกอบเสร็จแล้ววาง EERAM IC และชิ้นส่วนอื่น ๆ บน perfboard
การทำงานของซอฟต์แวร์
- สเก็ตช์ AnalogClock.ino ทำให้ ESP8266 เปรียบเทียบเวลาจริงกับเวลาที่นาฬิกาแสดงอยู่ 10 ครั้งต่อวินาที
- หากนาฬิกาช้า ก็จะเร่งเข็มวินาทีให้เดินเร็วขึ้นเพื่อซิงก์
- หากนาฬิกาเดินเร็ว ก็จะรอจนกว่าเวลาจริงจะตามทัน
- การขยับเข็มวินาทีทำโดยจ่าย bipolar pulse ให้กับขดลวดมอเตอร์ Lavet
- ต้องปรับ ค่าคงที่ PULSETIME ตามคุณลักษณะของมอเตอร์ และจากการทดลองพบว่า 30ms เหมาะสม
- นาฬิการาคาประหยัดไม่มีระบบฟีดแบ็กตำแหน่งเข็ม จึงสูญเสียข้อมูลตำแหน่งเมื่อไฟดับ
- เพื่อแก้ปัญหานี้จึงใช้ Microchip 47L04 Serial EERAM(4Kbit SRAM + EEPROM backup)
- บันทึกตำแหน่งเข็มชั่วโมง เข็มนาที และเข็มวินาทีทุกวินาที แล้วกู้คืนเมื่อเปิดไฟอีกครั้ง
การตั้งค่าเริ่มต้นและเว็บอินเทอร์เฟซ
- เมื่อรันสเก็ตช์ครั้งแรก ESP8266 จะให้บริการ หน้าเว็บแบบเรียบง่าย เพื่อให้ผู้ใช้กำหนดตำแหน่งเริ่มต้นของเข็มนาฬิกา
- หลังจากนั้น ESP8266 จะจดจำตำแหน่งเข็มโดยใช้ข้อมูลที่บันทึกไว้ใน EERAM
- ระหว่างการทำงาน จะมี หน้าสถานะ (status page) ให้ใช้งาน และรองรับโหมดการแสดงผล 3 แบบดังนี้
- แสดงกราฟิกหน้าปัดแบบ SVG
- แสดงหน้าปัดด้วย HTML Canvas
- แสดงสถานะแบบข้อความล้วน
ใบอนุญาตและข้อมูลทางเทคนิค
- โปรเจ็กต์นี้เผยแพร่ภายใต้ MIT License
- สัดส่วนภาษาหลักคือ C++ 64.1% , C 35.9%
- ที่เก็บบน GitHub มี 252 ดาว (star) และ 2 ฟอร์ก (fork)
- แท็กหัวข้อที่เกี่ยวข้อง: arduino, esp8266, clock, analog-clock, ntp, hardware-construction
ความสำคัญ
- เป็นตัวอย่างเชิงปฏิบัติของการเปลี่ยนนาฬิการาคาถูกให้เป็น นาฬิกาอัจฉริยะแบบซิงก์ Wi‑Fi
- เป็นกรณีศึกษาของ การควบคุมเวลาความแม่นยำสูงและการทำเว็บอินเทอร์เฟซ ด้วย ESP8266 และสภาพแวดล้อม Arduino
- เป็นแหล่งอ้างอิงโอเพนซอร์สสำหรับการเรียนรู้ การดัดแปลงฮาร์ดแวร์ IoT และเทคโนโลยีการซิงก์เฟิร์มแวร์
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ส่วนที่น่าสนใจเป็นพิเศษคือชิป “SRAM with EEPROM backup”
ชิปนี้ทำให้สามารถบันทึกตำแหน่งของเข็มนาฬิกาแบบถาวรได้ทุกครั้งที่มีการขยับ โดยไม่ทำให้ อายุการเขียน ของ EEPROM หมดไปเหมือน EEPROM ทั่วไป
ราคาต่อชิ้นก็ต่ำกว่า 1 ดอลลาร์ จึงเป็นชิ้นส่วนที่มีประโยชน์สำหรับงานอดิเรกหรือโปรเจ็กต์ขนาดเล็ก
มีทั้ง SRAM และ EEPROM อยู่ในแพ็กเกจเดียวกันพร้อมคอนโทรลเลอร์ และมี คาปาซิเตอร์ขนาดเล็ก (4.7µF) อยู่ใกล้ ๆ
SRAM จะเก็บข้อมูลไว้ตราบใดที่ยังมีไฟเลี้ยง ส่วน EEPROM จะเก็บข้อมูลได้ถาวรแม้ไฟดับ แต่มีข้อจำกัดเรื่องจำนวนครั้งในการเขียน
เมื่อคอนโทรลเลอร์ตรวจพบว่าแรงดันไฟเริ่มตก ก็จะดัมพ์ข้อมูลจาก SRAM ลง EEPROM ทันที
คาปาซิเตอร์จะจ่ายพลังงานในช่วงจังหวะนี้เพื่อให้ EEPROM เขียนข้อมูลได้
เมื่อไฟกลับมา ข้อมูลจาก EEPROM ก็จะถูกคัดลอกกลับเข้า SRAM อีกครั้ง
ข้อเสียคือความจุเล็กเพียง 4 กิโลบิต แต่ถ้าแก้ปัญหาแบบนี้ได้ด้วยเงิน 1 ดอลลาร์ ก็ถือว่าคุ้มมาก
โดยเฉพาะถ้าเก็บ debug log เป็น ring buffer ก็จะมีประโยชน์มาก เพราะสามารถเก็บ crash log ของระบบ embedded ได้แม้จะไม่ได้ต่อกับพีซีสำหรับพัฒนา
ลิงก์สินค้า
แต่ที่ที่ผมอยู่ตอนนี้สัญญาณอ่อนเกินไป ทำให้การตั้งเวลาด้วยมือลำบากมาก
เลยเขียน โค้ด Arduino เองเพื่อจำลองสัญญาณนาฬิกาอะตอมิกจากทั่วโลก โดยใช้ ESP32 และเซิร์ฟเวอร์ NTP
การได้ไปดูประวัติและความแตกต่างของสัญญาณออกอากาศนาฬิกาอะตอมิกของแต่ละประเทศก็น่าสนใจไม่น้อย
ความสว่างของโปรเจ็กชันสีแดงกำลังเหมาะสำหรับตอนกลางคืน แต่ไม่มี การซิงก์ผ่าน Wi‑Fi เลยตั้งเวลาให้ตรงด้วย NTP หรือ GPS ไม่ได้
ส่วนโปรเจ็กเตอร์เชื่อมกับตัวเครื่องด้วยสายแพ ribbon cable เลยดูเหมือนจะสนุกดีถ้าได้ลอง reverse engineer
ถ้าเป็นไปได้ก็น่าจะดีถ้าใช้ LED matrix แสดงข้อมูลอื่นนอกจากเวลาไว้บนเพดานได้ด้วย
มีสินค้าลักษณะนั้นอยู่เหมือนกัน แต่แพงมากแบบ buyfrixos.com
ลิงก์บทความที่ผมทำ
ผมเองก็ใช้นาฬิกาแขวนราคาถูกแบบนี้อยู่หลายเรือน และ แทบไม่มีความคลาดเคลื่อนของเวลาเลย
ผมคิดว่ามันอาจมี jitter น้อยกว่า NTP ด้วยซ้ำ
ไม่เคยต้องตั้งเวลาเลยสักครั้ง และมันก็ตรงกับนาฬิกา NTP ภายในไม่เกิน 1 วินาที
แต่กับนาฬิกาเตาอบหรือนาฬิกาไมโครเวฟนี่อยากปิดทิ้งจริง ๆ
ผ่านไปเดือนหนึ่งก็เร็วไปประมาณ 1 นาที เลยอยากให้มันมีฟังก์ชันซิงก์ผ่าน Wi‑Fi
เดี๋ยวนี้สินค้าหลายอย่างปิดระบบมากขึ้นเรื่อย ๆ จนทำให้คิดถึงของเรียบง่ายที่ยังแกะเล่นและดัดแปลงได้
ถ้าวันหนึ่งไม่ต้องทำงานประจำแล้ว ผมอยากทำ เครื่องใช้ไฟฟ้าที่เรียบง่าย เชื่อถือได้ และเป็นมิตรกับแฮ็กเกอร์ ด้วยตัวเอง
เห็นโปรเจ็กต์แบบนี้แล้วน่าทึ่งจริง ๆ
ผมซื้อให้ลูกสาว แต่ตอนนี้พักใช้อยู่ เพราะ เสียงติ๊ก ๆ ที่ไม่สม่ำเสมอ รบกวนตอนอ่านหนังสือ
ถึงอย่างนั้นก็ยังเป็นประสบการณ์ที่สนุกมาก
แต่ถ้าในบ้านมีนาฬิกาหลายเรือน ก็ต้องตั้งใจใช้ดูอยู่เรือนเดียวถึงจะได้ผล
แนะนำ Gents Turret Movement
ผมเคยใช้มันทำ นาฬิกาแม่เหล็กไฟฟ้าแบบใช้ tuning fork
โดยขับมันด้วย tuning fork และลอจิก 74xx แทนแหล่งกำเนิดเวลาที่แม่นยำ
สงสัยว่าทำไม Accutron ถึงยังไม่ทำนาฬิกาแบบนี้อีก
วิธีใช้ความถี่เรโซแนนซ์นั้น คล้ายกับนาฬิกาควอตซ์ แต่ดูน่าดึงดูดกว่ามากในเชิงภาพ
ไม่อย่างนั้นอาจเกิดสไปก์จนทำงานผิดพลาดหรือถึงขั้น ไมโครคอนโทรลเลอร์เสียหาย ได้
ทางที่ดีควรแยกแรงดันเกตด้วย ออปโตทรานซิสเตอร์ และจ่ายไฟให้มอเตอร์แยกต่างหาก
และยังมี โปรเจ็กต์บน GitHub ด้วย
เด็คเก่าหรือคอนโทรลเลอร์ LANC ยังเหลืออยู่เยอะ จึงมีคุณค่าให้นำมาใช้งานต่อได้มาก
ถึงนาฬิกาจะรู้เวลาที่ถูกต้อง แต่ถ้าความเร็วการขับจริงค่อย ๆ เพี้ยน ก็อาจทำให้ความคลาดเคลื่อนสะสมมากขึ้นเรื่อย ๆ
โดยเฉพาะถ้าตั้งค่าคงที่ PULSETIME ผิดไปแค่ 1ms ก็อาจเริ่มเห็นผลต่างภายในวันเดียว
แน่นอนว่ามอเตอร์สเต็ปเปอร์แบบ Lavet ในทางทฤษฎีจะรักษา การก้าวตามความถี่ ได้ค่อนข้างคงที่ แต่ก็อาจมีอคติจากการสึกหรอหรือสัญญาณรบกวนได้
อย่างไรก็ตาม สำหรับระดับนาฬิกาแขวน ความคลาดเคลื่อนนั้นอาจน้อยจนมองข้ามได้
ดู คำอธิบายใน Wikipedia จะเข้าใจได้ง่ายขึ้น
pulsetimeเป็นเพียงเวลาที่ใช้ในการขยับหนึ่งสเต็ปเท่านั้นตราบใดที่ไม่มีสเต็ปตกหล่น ก็จะ ไม่เกิดความคลาดเคลื่อนสะสม
กล่าวคือ แค่รักษาจำนวนสเต็ปให้ถูกต้องก็เพียงพอ