เบิร์น Bootloader ATmega328P
การจะทำให้ ATmega328P ใช้งานเป็น Arduino ได้นั้น จำเป็นที่จะต้องมี Bootloader ก่อน ซึ่งเจ้า Bootloader นี่มันคือ firmware ที่ทำหน้าที่ช่วยในการ upload sketch ที่เราเขียนผ่านทางสาย USB โดยไม่ต้องมีเครื่องโปรแกรมนั่นเอง
ซึ่งเจ้า Bootloader ของ Arduino นี้ก็ไม่ใช่เฉพาะ ATmega328P เท่านั้น แต่ชิปในกลุ่ม 328 ตั้งแต่ ATmega8 ATmega48 ATmega88 ATmega168 ATmega328 ล้วนแต่ลง Bootloader ของ Arduino ได้ทั้งสิ้น
โดยบทความนี้จะแสดงวิธีการ ขั้นตอนการเบิร์น Bootloader ลงบน ATmega328P ด้วยการโปรแกรมแบบ ISP (In System Programming) จาก บอร์ด Arduino UNO
การส่งข้อมูลแบบ บัส SPI (Serial Peripheral Interface Bus)
http://arduinole.blogspot.com/
SPI Bus (Serial Peripheral Interface Bus) เป็นรูปแบบหนึ่งของการสื่อสารข้อมูลระหว่างอุปกรณ์แบบดิจิทัลที่พบเห็นได้บ่อย และใช้กับอุปกรณ์ได้มากกว่าสองขึ้นไปและนำมาต่อกันเป็นบัส (Bus) บัส SPI ส่งและรับข้อมูลทีละบิต (Bit Serial) และใช้สัญญาณ Clock เป็นตัวกำหนดจังหวะการทำงาน (ดังนั้นจึงเรียกว่า Synchronous, Bit-Serial Data Communication) มีการกำหนดบทบาทในการทำงานของอุปกรณ์ในระบบบัส แบ่งเป็น SPI Masterและ SPI Slave โดยที่ SPI Master เป็นฝ่ายเริ่มการสื่อสารข้อมูล และสร้างสัญญาณ Clock (มักใช้ชื่อสัญญาณว่า SCK) มากำหนดจังหวะการส่งและรับข้อมูล และด้าน SPI Slave จะเป็นฝ่ายคอยตอบสนอง และในระบบบัส SPI อาจมีอุปกรณ์ที่เป็น SPI Slaveได้มากกว่าหนึ่ง (Single-Master, Multi-Slave)
การใช้งาน ISP (In System Programming)
- MOSI == Master Out Slave In: data input
- MISO == Master In Slave out : data output
- SCK == Serial ClocK : clock input
- RST == RESET: used to activate the serial Programming
จากข้างบนจะเห็นว่า ขาที่เป็น MOSI นั้น จะเป็นขาส่งข้อมูลออก ( Output ) ของตัวแม่ ( Master )
MISO นั้น เป็นขาที่รับข้อมูล (Input ) ที่ส่งมาจากลูก ( Slave )
SCK นั้น เป็นตัวนาฬิกาคอยให้จังหวะการส่งข้อมูล
ขาสุดท้ายก็คือ RST นั้น คือตัวที่เริ่มให้มีการเขียนโปรแกรมลง Chip
ขั้นตอนการทำงาน ISP (In System Programming) ผ่าน บัส SPI
ขั้นตอนการเขียนโปรแกรม ( Code ) ลงบน Chip นั้นจะส่งข้อมูลเป็นแบบ Serial หรือ ISP จะเริ่มต้นทำงานด้วยขณะที่ขา RST ถูกปรับให้มีค่า Logic High ( ระดับสัญญาณ เท่ากับ VCC )
สำหรับขา RST นั้น ปกติ ใช้สำหรับ Reset โปรแกรม กล่าวคือสัญญาณ Reset จะหยุดโปรแกรมและเริ่มต้นการทำงานใหม่ โดยเราทำให้ขา RST มีระดับสัญญาณต่ำ ( Logic Low )
เมื่อขา RST ถูกตั้งให้เป็น High คำสั่งพิเศษที่เรียกว่า Programming Enable Instruction จะทำงานก่อน
สำหรับการรับส่งข้อมูลแบบ Serial คือการส่งข้อมูลจาก Arduino ด้วยช่องสัญญาณเพียงช่องเดียว หรือ ขาสัญญาณขาเดียว ในที่นี้คือขาสัญญาณ MISO และ MOSI
โดยข้อมูลจะส่งผ่าน MOSI ทีละ bit โดยแต่ละ bit สัญญาณจาก SCK จะเป็นตัวควบคุมจังหวะของการรับส่ง และทางขา MISO ใช้สำหรับรับข้อมูลจากลูกส่งกลับไปยังต้วแม่
โดยเริ่มจากข้อมูลใน Chip จะถูกลบหมด (Chip Erase) การลบข้อมูลใน Flash Memory และจะตามด้วยการเขียนค่า เลขฐานสิบหก (Hexadecimal Number) ลงไปในแต่ละตำแหน่งใน Flash หรือ Ram Memory ของ Chip
ความเร็วของสัญญาณนาฬิกา ของ ISP จะถูกกำหนดโดยสัญญาณนาฬิกาอ้างอิงจาก External Clock หรือ Crystal โดยมีข้อกำหนดว่า ความเร็วของขา SCK นั้นจะเร็วไม่เกิน 1/16 ของ ความเร็วของ Crystal ไม่ได้
รายการอุปกรณ์
- 1. ชุดคิทต่อวงจร Minimum ATmega328P Circuit
- 2. Arduino UNO R3
- 3. Breadboard 700 Points SYB-120
- 4. Jumper (M2M) cable 10cm Male to Male
- 5. Jumper (M2M) cable 20cm Male to Male
การเบิร์น Bootloader ให้กับ ATmega328P มีขั้นตอนดังนี้
1 : เชื่อมต่อวงจร
เชื่อมต่อวงจร Minimum ATmega328P Circuit ตามรูปด้านล่าง
เขื่อมต่อสาย จาก Arduino UNO R3 ไปที่ ATmega328P ตามรูปด้านล่าง
VCC – เชื่อมต่อ Arduino ขา 5V กับ ขา 7 ของ ATmega328
GND – เชื่อมต่อ Arduino ขา GND กับ ขา 8 ของ ATmega328
SCK – เชื่อมต่อ Arduino ขา 13 กับ ขา 19 ของ ATmega328
MISO – เชื่อมต่อ Arduino ขา 12 กับ ขา 18 ของ ATmega328
MOSI – เชื่อมต่อ Arduino ขา 11 กับ ขา 17 ของ ATmega328
RTS – เชื่อมต่อ Arduino ขา 10 กับ ขา 1 ของ ATmega328
2. ติดตั้งโปรแกรม Arduino IDE
สำหรับการเขียนโปรแกรมของ Arduino IDE นั้นจะใช้ภาษา C/C++ ซึ่งเป็นรูปแบบภาษาซีประยุกต์แบบหนึ่ง ที่มีโครงสร้างการทำงานของตัวภาษาโดยรวม คล้ายกับ ภาษาซีมาตรฐาน (ANSI-C) ทั่วๆไป เพียงแต่ได้มีการปรับปรุงเพื่อลดความยุ่งยากในการใช้งานลง เพื่อให้ผู้ใช้สามารถใช้งาน เขียนโปรแกรมได้ง่าย และสะดวกมากกว่าเขียนภาษาซี แบบมาตรฐาน
Arduino integrated development environment หรือเรียกสั้นๆว่า โปรแกรม Arduino IDE เป็นโปรแกรมที่ “แจกฟรี” ภายใต้เงื่อนไขในการใช้งานลักษณะ Open source ซึ่ง Arduino IDE จะทำหน้าที่ ติดต่อ ระหว่าง คอมพิวเตอร์ ของเรา (Windows, Mac OS และ Linux) กับ บอร์ด Arduino UNO R3 ซึ่งโปรแกรมนี้ออกแบบให้ง่ายต่อการเขียนโค้ดและอัปโหลดโค้ดที่เราเขียน เข้าสู่ บอร์ด Arduino UNO R3
โดย Download ตัวติดตั้งได้จาก
https://www.arduino.cc/en/Main/Software
เลือก Windows Win 7 and newer
เมื่อดาวน์โหลดเสร็จแล้ว ให้ติดตั้งตามที่โปรแกรมแนะนำ
เลือก I Agree
เลือก Next >
เลือก Install
โปรแกรมใช้งานได้แล้ว เลือก Close เพื่อปิดโปรแกรมลงไป
3 : ตรวจสอบไดร์เวอร์ ของ ATmega16U2
บอร์ดนี้มีตัวสื่อสารกับ พอร์ต USB ของคอมพิวเตอร์ เป็นชิป ATmega16U2 ซึ่งแปลงสัญญาณ USB เป็นแบบอนุกรม เพื่อช่วยให้คอมพิวเตอร์ของสามารถอัพโหลดโปรแกรมและสื่อสารกับชิป ATMEGA328P ได้
เชื่อมต่อสาย USB จาก คอมพิวเตอร์ ไปที่บอร์ด Arduino UNO R3
คลิกขวา ที่ Start เลือกไปที่ Device Manager
ไปที่ Ports (COM & LPT) จะพบ Arduino Uno ในตัวอย่างเป็น (COM3) แสดงว่าคอมพิวเตอร์ของเราสามารถ ติดต่อสื่อสารกับ บอร์ด Arduino UNO R3 ได้แล้ว
4 : อัพโหลดโค้ด ให้ Arduino UNO เป็น เครื่องเขียนโปรแกรม
เปิดไฟล์ ArduinoISP โดยไปที่ File -> Examples -> 11.ArduinoISP -> ArduinoISP
ไปที่ Tools -> Board -> Arduino AVR Boards -> Arduino Uno
เลือก Port โดยไปที่ Tools -> Port -> COM3 (Arduino Uno)
(โดย COM3 แต่ละเครื่องจะไม่เหมือนกัน ให้เลือกตามที่ปรากฎ)
คลิกที่ Upload
รอจนกระทั่งขึ้น Done uploading. ที่แถบด้านล่าง แสดงว่าเราอัพโหลดโปรแกรมลงบอร์ดได้สำเร็จแล้ว และถึงขั้นตอนนี้ บอร์ด Arduino UNO ก็พร้อมที่จะเป็น เครื่องเขียนโปรแกรม แล้ว
5 : เบิร์น Bootloader ให้กับ ATmega328P
ไปที่ Tools -> Programmer -> เลือกเป็น Arduino ISP
ไปที่ Tools -> Burn Bootloader
รอจนกระทั่งขึ้น Done burning bootloader. ที่แถบด้านล่าง แสดงว่าเราเบิร์น Bootloader ให้กับ ATmega328P ที่ทำงานแบบ Arduino Uno R3 ได้สำเร็จแล้ว
บทความต่อไป C1: โปรแกรมแรก กับ ATmega328P >>>