สร้างนาฬิกาดิจิตอลจาก arduino

Posted by | May 5, 2009 | MyProject | 16 Comments

กลับมาอีกครั้งแล้ว ยังไม่ได้เลือกว่าจะเอา สาวงามคนไหนส่งเข้าประกวด electoday contest v1 ทำไปเรื่อย ใจรัก

รอบนี้ หาอะไรทำคั่นเวลาก่อน หลังจากที่ผมกับ โปรเจค arduino ไปพักใหญ่ ส่วนมากจะเล่นว่าเล่น พวกจอ LCD กับ การ interface อุปกรณ์ต่างๆ ซึ่งส่วนมากจะเอาแสดงผล เฉยๆ ยังไม่ได้ ทำเกี่ยวกับ human interface เลยสักอัน

ความจริงในโลกปัจจุบัน ส่วนติดต่อผู้ใช้ หรือ human interface มีส่วนสำคัญมากๆ ครับ จะเห็นได้ว่าหน้าตาเหมือนกัน ฟังก์ชั่น ทำได้พอกัน แต่ถ้าใช้งานยาก ก้อไม่ซื้อมาใช้ ดูจาก apple ก้อได้ ที่ออกแบบ ipod และ iphone ก้อได้ มาเหมาะสมกับการใช้งาน

รอบนี้ผมเลย ลองออกแบบส่วน human interface บ้าง ขอเอาแบบ basic กึ่งเบื้องต้นๆ กันเลย คือเอา ปุ่มกด หรือ keypad นี้ล่ะครับ และก้อแถมไปด้วยฟังก์ชั่นนาฬิกา แสดงผลออก 7-segment ไปด้วย

นาฬิกาตัวนี้ ออกจะดูธรรมดาไปสักหน่อยนะครับ เอาไปเขียนโปรแกรม ให้นับถอยหลังนี้ ไปลืมวางไว้ไหน รับรอง งานเข้าแน่ๆ

โปรเจคประกอบไปด้วยอะไรบ้าง

ปุ่ม keypad ผมลองใช้เทคนิค ต่อ 4 ปุ่มผ่าน วงจร R-divider แล้วต่อเข้า analog input ของบอร์ด ซึ่งทำให้ ใช้ช่องสัญญาณ เหลือแค่ช่องเดียว วงจรจะเป็นตามรูปข้างล่าง

โดย keypad เหมือนต่อผ่าน R เหมือนต่อค่า R จะได้ค่าโวลต์ ที่แตกต่างออกไป ถึง 5 ค่าคือ กดปุ่มที่ 1,กดปุ่มที่ 2 ,กดปุ่มที่ 3 ,กดปุ่มที่ 4 และไม่มีการกดปุ่ม ที่ผมใช้ 2K 500ohm, 1k ,2k เพราะเมือ อ่านค่าผ่าน R divider จะได้ค่าประมาณ 1v 2v 3v 4v ครับ ถ้าใช้ R ค่าอื่นได้ครับ ไฟที่อ่านจาก analog out จะเปลี่ยนค่าครับ ซึ่งสามารถทำได้ และต้องทำการปรับเปลี่ยน source code ที่ใช้เทียบกับ ค่า R Divider ใหม่ครับ จากนั้นเอาค่า analog ที่ได้ ต่อเข้า analog input แล้วเขียนโปรแกรม เช็คช่วงโวลต์ที่ได้ เมื่อกดปุ่ม เป็น state การทำงานต่างๆ

โดยเทคนิดดังกล่าว เอามาจาก เวปนี้ครับ (เข้าไปดูได้ เผื่อเขาจะมี อะไร update)

nuelectronics – keypad and lcd

ผมก้อได้ปรับปรุงฟังก์ชั่น กดปุ่ม นิดหน่อย ให้มีกดค้าง แล้วเป็นอีก state การทำงาน ตอนนี้นอกจากโปรแกรมจะรู้ว่าการกดปุ่มไหน แล้ว กดสั้น กับ กดยาว จะได้รูปแบบการทำงานที่ต่างกันอีก

ลักษณะโดยรวมของนาฬิกา
มาดูหน้าตารวมๆก่อน เป็นบอร์ด arduino ต่อเข้า 7-segment ผ่าน digital io ใช้เต็มๆ เลย
D0-7 ต่อเข้า control led แต่ล่ะดวงของ 7-segment และใช้ D8 D9 D10 D11 ควบคุมแต่ละหลัก (พอดีมี โมดุลสำเร็จของ mrt micro-research เลยลองใช้ดูก่อน)

รูปต่อมาเป็น หน้าตาของนาฬิกา เป็นแบบ 4 หลักง่ายๆ ก่อน ส่วนที่ยาก คือการขับ 7-segment เมื่อไม่มีไอชีที่ทำหน้าที่เป็น buffer หมายถึงไม่มีการ hold data เราจะเขียนโปรแกรมให้มีการหยุดรอในโปรแกรม หรือมี delay() ไม่ได้เลย เพราะว่า เราต้องใช้ตัวของ arduino ทำหน้าที่เป็น multiplexer ด้วย

บอร์ดจะควบคุมให้ 7-segment ติดได้ที่ล่ะหลัก แต่ด้วยความเร็วในการสลับการทำงาน จึงทำให้เหมือนติดพร้อม 4 หลัก เพราะฉะนั้นการทำงานจริงจะให้มี delay() หรือ รอการทำงานไม่ได้เลย ต้องใช้เทคนิดนิดหน่อย เป็น state machine เป็นอีกเทคนิคนะครับ

นี้เป็นอีกไอชี DS1307 ซึ่งเป็นไอชี นาฬิกา RTC ครับ มันดีตรงที่ไฟดับ เวลายังทำอยู่ บอร์ด arduino จะอ่านผ่านโดยใช้ i2c

ตัว human interface ใส่แบบเบื้องต้นไว้ โชว์การทำงานปุ่ม ร่วมกับ 7-segment ครับ
ปุ่มจะมี 4 ปุ่มได้แก่ Up(1) ,Down(2) ,OK(3), CANCEL(4)

การใช้งานจะมีีสองโหมด โหมดแรก ทำงานปกติ กับโหมด setup เวลา

ในโหมดแรกปุ่มต่างไม่ได้ใช้งานครับ จะมีแค่ กดปุ่ม ok(3) จะแสดงวันที่ รอสักพักจะกลับ เข้าโหมดแสดงเวลาปกติ
กับอีกโหมด setup เวลา เวลาเข้าจะกดปุ่ม ok(3) ค้างไว้ จะเข้าโหมด setup แล้ว 7-segment ส่วนของชั่วโมงจะกระพริบ บอกว่าเข้าโหมดแล้ว เราก้อตั้งเวลาได้ปกติ

รูปแบบการทำงาน ผม copy ฟังก์ชั่นมาจากนาฬิกาจีนๆ แถวบ้านหม้อเลย ใครอยากได้นาิฬิกา ซื้อเอาดีกว่า 4-5 ร้อยเอง นะ แต่ถ้าอยากเอาไปลองทำ แล้วต่อยอดเป็นอย่างอื่น มันก้อน่าสนใจนะครับ

Source Code สามารถโหลดได้ที่นี้ครับ download here

มาชม วีดีโอการทำงานครับ

เทคนิดเพิ่มเติม เราสามารถทำให้ใช้ ปุ่มมากกว่าเดิม แนะนำด้วย คุณ whoami@@electoday

จากกระทู้ http://www.electoday.com/bbs/viewthread.php?tid=211&extra=page%3D1

whoami@@electoday “เทคนิคการใช้ adc ทำ keypad น่าสนใจมากใ้ช้ bit เดียว น่าจะเป็นประโยชน์กับหลายคน จาก http://www.terra.es/personal/ccossio/atmelAVR2006_10.htm

เอาล่ะครับ มาถึงสรุปสักที่ หลังจากได้เอาเนื้อหาไปใส่ที่ electoday.com ก้อได้ทราบข้อมูลเพิ่มเติม อย่างเช่น ตอนนี้ RTC อย่าง ds1307 จริงไม่จำเป็นต้องใช้ก้อได้เพราะว่า ตัวของ timer ของ ไมโคร สามารถทำ RTC เองได้ แต่การ backup เวลา ต้องใช้ เทคนิดนิดหน่อย เดี่ยวรอบหน้าอยากได้นาฬิกาอีกจะลองใหม่อีกที่ครับ ส่วนในครั้งก้อแค่นี้ก่อนครับ โชดดีครับ

About chang

ชื่อ “ช้าง” ส่วนมากเขาจะเรียกว่า “พี่ช้าง” แล้ว มีความสนใจทางเทคโนโลยีทางคอมพิวเตอร์ อิเล็กทรอนิกส์ และ หุ่นยนต์ เป็นทั้งนักคิด นักประดิษฐ์ ชอบทดลองเล่น จนเดี่ยวนี้รู้สึกว่าจะเล่นมากกว่ามืออาชีพไปสักแล้ว

  • M-I-K-E Electronic

    แหล่มเลยครับ ป๋า ช้างงงง อิอิ

  • @M-I-K-E Electronic
    ขอบคุณครับ

  • sonicm

    can not download code
    please check

  • @sonicm
    แก้ไขแล้วครับ ขอบคุณมากครับ

  • ซื้อบอร์ดจาก arayafun มาตั้งนาน
    ผมยังไปไม่ถึงไหนเลย คงต้องฟิตให้มากกว่านี้

  • แอบทำโปรเจคอลังการณ์แน่ๆเลย อิอิ

    ผมเข้าไปดูเวปท่านแล้วนะ สอนผมถ่ายรูปบ้างสิคับ

  • โปรเจคอลังการณ์อะไรครับ แค่ทำให้ไฟวิ่งกระพริบได้ผมก็ดีใจแล้ว 55+
    จริง ๆ อยากทำโปรเจค darkroom timer เอาไว้ตั้งเวลาฉายแสงหัวอัดภาพขาวดำ แต่ไปไม่ถึงไหนเลย ไม่ได้เริ่มด้วยซ่ำ

    เรื่องถ่ายรูปสงสัยตรงไหนถามได้ครับ ( ถ้าผมตอบได้นะ อิอิ )

  • birdythepooh

    พระเจ้ายอด มันจอร์จมาก

  • Siriwan

    มีวิธีทำนาฬิกาพูดได้ไหมค่ะ
    อยากได้!!

    • ไอเดียน่าสนใจ จะให้พูดว่าอะไรดีครับบ
      เผื่อผมจะได้ไอเดียขำไปทำของแปลกๆ

  • ผมอยากได้โฟฉาทของโปรเจ็คนี้อะคับ พร้อมไฟล์ ISIS 7 รบกวนด้วยคับ ติอต่อกลับด้วยคับ

    • ISIS 7 คืออะไรครับ
      flowchat ไม่ได้ทำไว้ครับ พอดีมันโครงสร้างง่ายๆ

      ว่าแต่คุณน้องจะเอาไปทำอะไรครับ

  • job_TC

    ขอบคุณครับ เเล้วโปรเจ็ก จบ ปวช 3 ของผมจะง่ายขึ้น เเต่น่าจะมาบอกเพิ่มในส่วนของการตั้งปลุกด้วยนะครับ

  • Got1100

    ผมทำโปรเจ็กเรื่องนี่แหละคับ เเต่ยังทำไม่เปงเลย ใครรุ้ช่วยบอกผมที่คับ

  • Mook_tine

    ผมไม่บอกมีรัยม๊ยคัฟ  จากชฟ3/3  ผมแข็งคัฟ

  • Bcb

    คือตอนนี้เขียนโปรแกรมให้เวลามันเดินได้ แต่ต้องการให้มันตั้งเวลาได้จะเขียนโปรแกรมยังไงดีคะ