วันพฤหัสบดีที่ 13 กันยายน พ.ศ. 2555

การติดตั้ง Arduino Sketch ลงในไมโครคอนโทรลเลอร์


ผมสนุกสนานกับการพัฒนาโครงงานเล็ก ๆ น้อย ๆ โดยใช้ Arduino มาระยะหนึ่ง สิ่งที่รบกวนจิตใจมาตลอดก็คือเมื่อจะพัฒนาโครงงานใหม่ ผมจะต้องรื้อโครงงานเก่าเพื่อนำบอร์ด Arduino ออกมาใช้ใหม่เสมอ

จนกระทั่งมีนักศึกษาทักว่าถ้าต้องติดตั้งบอร์ด Arduino ลงไปในโครงงานทุกคราวไปมันจะไม่สิ้นเปลืองไปหน่อยหรือ? คิดในมุมกลับก็คือถ้ามันไม่มีวิธีที่ประหยัดกว่านี้ การพัฒนาชิ้นงานด้วย Arduino ก็ไม่น่าจะได้รับความนิยมกว้างขวางขนาดนี้หรอก เออแฮะ! นั่นก็จริง

เมื่อคิดได้ดังนั้นแล้วก็เลยทำการค้นคว้าข้อมูลอินเตอร์เนตดู จึงพบว่าโครงการ Arduino มีความสามารถที่จะโปรแกรม Sketch ลงไปในไอซีไมโครคอนโทรลเลอร์เพื่อนำไปใช้แบบเดี่ยว ๆ (Standalone) ได้ด้วย ทำให้หลังจากที่เราพัฒนา Sketch บนบอร์ดทดลอง Arduino และทดลองวงจรแล้วเราสามารถติดตั้ง Sketch นั้นกับไอซีไมโครคอนโทรลเลอร์เปล่า ๆ ก็ได้ (เข้าใจผิดมาตั้งนาน) จากนั้นจึงติดตั้งไมโครคอนโทรลเลอร์นั้นลงในวงจรได้เลยโดยที่ไม่ต้องเสียสละบอร์ด Arduino ของเราลงไปในทุกโครงการ ในการนี้เราจำเป็นจะต้องมีอุปกรณ์หลัก 2 สิ่งคือ
  1. บอร์ด Arduino รุ่นใดก็ได้เพื่อใช้เป็นตัวโปรแกรม (Programmer) และ
  2. ไอซีไมโครคอนโทรเลอร์ตระกูล AVR ที่จะใช้แทนบอร์ด Arduino
ไอซีไมโครคอนโทรลเลอร์ที่จะใช้จะต้องสอดคล้องกับบอร์ดที่เราจะเอาไอซีไปใช้แทนด้วย รายการชื่อบอร์ดและไอซีไมโครคอนโทรลเลอร์ที่เข้าคู่กันน่าจะหาได้จากเว็บไซต์ของ Arduino เอง แต่ผมมีข้อเสนอแนะว่าใช้ไอซีพื้น ๆ กับบอร์ดพื้น ๆ นี่แหละ ดีที่สุดเพราะมันจะเป็นไอซีและบอร์ดที่มีคนลองมาแล้วว่าใช้ได้แน่นอนไม่มีปัญหา รายการที่ผมพอทราบว่าใช้การได้ก็มีดังนี้ครับ
  • Diecimila (ET-EASY168, POP-168) ใช้ Atmega168
  • Arduino Mega (ET-EASYMEGA1280) ใช้ Atmega1280
  • Arduino NG w/ Atmega168 ใช้ Atmega168
  • Arduino NG w/ Atmega8 ใช้ Atmega8 <=== ผมใช้ตัวนี้เพราะหาไอซี Atmega8 ได้
กระบวนการนี้มีขั้นตอนสำคัญ 2 ส่วนคือ
  1. ทำให้บอร์ด Arduino ของเรากลายเป็นตัวโปรแกรม
  2. ติดตั้ง Arduino Sketch ของโครงงานของเราลงในไอซี AVR ตัวนั้น ๆ
ที่ผมทดลองทำดูเองนั้น ผมมีบอร์ด ET-EASYMEGA1280 อยู่ตัวหนึ่งและมีไอซี Atmega8 อยู่ตัวหนึ่ง

ทำให้บอร์ด Arduino เป็นตัวโปรแกรม
ในโปรแกรม Arduino IDE รุ่นล่าสุด (1.0.1) จะมี Sketch ตัวอย่างชื่อ ArduinoISP.ino ติดตั้งมาแล้ว โดยอยู่ที่เมนูน File -> Examples -> ArduinoISP Sketch นี้จะทำหน้าทึ่ทำให้บอร์ด Arduino ของเราทำตัวเป็นตัวโปรแกรม
  • ให้เปิด Sketch ArduinoISP ขึ้นมา
  • ให้เลือกบอร์ดจากเมนู Tools -> Board ให้ตรงกับบอร์ดที่เราจะใช้เป็นตัวโปรแกรม ผมจะใช้ ET-EASYMEGA1280 ก็เลือกบอร์ดให้เป็น Arduino Mega
  • สั่งอัพโหลด Sketch
Arduino IDE จะคอมไพล์ Sketch และอัพโหลด ArduinoISP ขึ้นไปที่บอร์ด Arduino เมื่อเสร็จสิ้นบอร์ด Arduino ของเราก็จะกลายเป็นตัวโปรแกรมแล้ว
 

ใช้บอร์ด Arduino เป็น ISP Programmer
หลังจากอัพโหลดเสร็จ บอร์ดของเราก็จะเป็น ISP Programmer แล้ว เราสามารถติดตั้ง Sketch ของเราลงบนไอซีไมโครคอนโทรลเลอร์ได้แล้ว การเชื่อมต่อไอซีกับบอร์ด Arduino ของเราก็ให้ดูตามซอร์สโค้ดของ ArduinoISP คือกรณีของผมซึ่งใช้ ET-EASYMEGA1280 ก็ให้ต่อ
  • ขา 53 ของบอร์ดเข้ากับขา Reset ของไอซี (ขา 1)
  • ขา 51 ของบอร์ดเข้ากับขา MOSI ของไอซี (ขา 17)
  • ขา 50 ของบอร์ดเข้ากับขา MISO ของไอซี (ขา 18)
  • ขา 53 ของบอร์ดเข้ากับขา SCK ของไอซี (ขา 19)
ต่อตัวต้านทานสัก 1 k ระหว่างขา Reset กับ Vcc นอกจากนี้อย่าลืมจ่าย Vcc และ Gnd ให้กับ AVcc และ AGnd ด้วย สุดท้ายใช้คริสตัล 16 MHz และตัวเก็บประจุขนาด 18 pF คู่หนึ่งเพื่อสร้างสัญญาณนาฬิกาให้กับไอซี เราสามารถใช้ Vcc และ Gnd ของบอร์ด Arduino จ่ายให้กับไอซี Atmega8 ได้


สมมติว่าเราจะทดลองติดตั้ง Sketch ชื่อ Blink จากตัวอย่างในโปรแกรม Arduino IDE ลงใน Atmega8 ก็ให้เปิด Sketch ตัวอย่างนั้นขึ้นมา
  • เลือกบอร์ดเป็น Arduino NG w/Atmega8 เพราะมีไอซึ Atmega8 อยู่
  • สั่ง File -> Upload using Programer หรือกด Crtl+Shift+U
Arduino IDE จะคอมไพล์และอัพโหลด Sketch ขึ้นไปบน Atmega8 ที่ต่อไว้ผ่าน ET-EASYMEGA1280 ของเรา

เพิ่มเติม
ข้อมูลจากเว็บ Arduino เองและจากแหล่งอื่น ๆ เช่น http://www.ayarafun.com/2009/04/upload-arduino-with-avrdude-gui/ ระบุตรงกันว่าสามารถอัพโหลดโปรแกรมได้โดยไม่ต้องมีบูตโหลดเดอร์ (Bootloader) ก็ได้

แต่จากการทดลองที่ทำเองมันทำไม่ได้ผล ผมทดลอง 2 แบบครับคือ
  • ติดตั้งบูตโหลดเดอร์ลงใน Atmega8 ก่อน แล้วค่อยอัพโหลดโปรแกรม Blink ขึ้นไป Atmega8 ทำงานได้ตามที่คาดหวัง
  • ไม่ติดตั้งบูตโหลดเดอร์ลงใน Atmega8 อัพโหลดโปรแกรม Blink ขึ้นไปเลย Atmega8 ทำงานผิดปกติ คือไฟกระพริบแต่ว่าด้วยความถี่ต่ำกว่าที่เขียนโปรแกรมมาก
ยังไม่ทราบแน่ชัดว่าเป็นเพราะอะไร แต่ตอนนี้ต้องรีบทำงาน ก็เลยใช้วิธีติดตั้งบูตโหลดเดอร์ลงไปให้มันทำงานได้เสียก่อน เรื่องอื่นค่อยว่ากัน

วิธีการติดตั้งบูตโหลดเดอร์
หลังจากที่ติดตั้งโปรแกรม ArduinoISP บนบอร์ด ET-EASYMEGA1280 แล้ว ต่อวงจรเพื่อติดตั้งบูตโหลดเดอร์เหมือนกับการอัพโหลดโปรแกรมเข้า Atmega8 ตามรูปข้างบนนั่นแหละ

หลังจากเลือกบอร์ดให้เป็น Arduino NG w/ Atmega8 (เพราะผมใช้ Atmega8) จากเมนู Tools -> Board แล้วก็เลือกตัวโปรแกรมเมอร์ให้เป็น Arduino as ISP จากเมนู Tools -> Programmer

เมื่อเสร็จก็สั่งติดตั้งบูตโหลดเดอร์ลงใน Atmega8 ด้วย Tools -> Burn Bootloader ก็เสร็จเรียบร้อยครับ หลังจากนี้จะติดตั้งโปรแกรมอะไรก็ทำได้เลย


แหล่งข้อมูล
http://arduino.cc/en/Tutorial/ArduinoISP
http://arduino.cc/en/Hacking/PinMapping
http://arduino.cc/en/Tutorial/ArduinoToBreadboard

4 ความคิดเห็น:

ไม่ระบุชื่อ กล่าวว่า...


"efuse" memory type not defined for part "ATMEGA8"


คืออะไรคับ

ไม่ระบุชื่อ กล่าวว่า...


"efuse" memory type not defined for part "ATMEGA8"


คืออะไรคับผม

jark กล่าวว่า...

จากที่บันทึกไว้ว่า ถ้าไม่อัพโหลดบูตโหลดเดอร์ลงไป โปรแกรมจะทำงานผิดปกติคือไฟกระพริบจะช้ามากนั้น ผมไปค้นคว้าได้คำตอบมาดังนี้ครับ

ถ้าไม่อัพโหลดบูตโหลดเดอร์ Fuse Bits จะไม่มีการเปลี่ยนแปลง จะคงค่าที่มาจากโรงงาน ทีนี้เจ้า Fuse Bits พวกนี้เป็นตัวกำหนดว่า uC ของเราจะทำงานด้วยสัญญาณนาฬิกาความถี่เท่าใด จากไหน (Int/Ext) ถ้าตั้ง Fuse Bits ผิด uC ก็ทำงานผิด

ในการอัพโหลดบูตโหลดเดอร์จะมีการตั้งค่า Fuse Bits พวกนี้ด้วย ดังนั้นตอนที่ผมไม่อัพโหลดบูตโหลดเดอร์ Fuse Bits ก็ไม่ได้ตั้ง อาจจะทำให้ทำงานที่สัญญาณนาฬิกาผิดกันก็ได้

อันที่จริงแล้ว หากไม่ต้องการให้ uC อ่านและโปรแกรมตัวเองผ่านพอร์ต Serial แล้วไม่จำเป็นต้องอัพโหลดบูตโหลดเดอร์ก็ได้ แต่ต้องหาทางตั้งค่า Fuse Bits ให้ได้

อันที่จริง (อีกครั้ง) เมื่อโปรแกรม uC โดยใช้ ISP แล้วบูตโหลดเดอร์ก็ (น่าจะ) ถูกเขียนทับไปแล้ว ไม่ได้ใช้หรอกครับ

jark กล่าวว่า...

ส่วนที่ถามเรื่อง efuse มานั้น ขอโทษที่ตอบช้าครับ
ป่านนี้ก็ปาเข้าไปตั้งปีแล้วคงจะสายเกินไป

อย่างไรก็ตาม ขอตอบว่าความรู้ยังไม่ถึงครับ
ผมคาดว่าน่าจะเป็นเรื่องของชนิดของ uC กับ
ไฟล์ boards.txt ของ Arduino มั้งครับ