การปรับแต่ง AVR Studio ให้สามารถพัฒนาโปรแกรม Arduino ได้

การปรับแต่ง AVR Studio ให้สามารถพัฒนาโปรแกรม Arduino ได้    

    ในงานพัฒนาไมโครคอนโทรลเลอร์ตระกูล Arduino นั้น ทางผู้พัฒนาโปรแกรมได้สร้าง Arduino IDE ซึ่งพัฒนาด้วยภาษา JAVA แต่เนื่องจากตัว IDE ดังกล่าวไม่สามารถตอบสนองความต้องการในการเขียนโปรแกรม ไม่ว่าจะเป็นการไล่ดูซอร์สโค๊ด หรือการมี intellisense มาช่วยในการเขียนโปรแกรมได้รวดเร็ว และผิดพลาดน้อยลง ซึ่งทำให้มีนักพัฒนาหลายๆ คนเลือกที่จะไปใช้ IDE ค่ายอื่นๆ  แต่ก็ต้องมาติดกับปัญหาการกำหนดให้ IDE ค่ายอื่นๆ นั้น ต้องเรียกใช้ Compiler และ Linker ให้ถูกต้องตามหลักของ Arduino อีก  

วันนี้ผมจะพาเพื่อนมาติดตั้งสภาวะแวดล้อมการพัฒนาโปรแกรม Arduino บน AVR Studio 6 IDE แทน Arduino IDE กันครับ 

สิ่งที่เราจะต้่องมี ที่ต้องเตรียมก็คือ 

-AVR Studio 6 ซึ่งในที่นี้ ผมได้ทดลองกับ Version 6.0.1843 หากยังไม่มีให้ดาวน์โหลด คลิก http://www.atmel.com/tools/atmelstudio.aspx?tab=overview

-Arduino IDE V1.0.1 หากยังไม่มีให้ดาวน์โหลด คลิก http://arduino.cc/en/main/software

- บอร์ด Arduino UNO หรือรุ่นใดๆ ก็ได้ที่ Arduino IDE รองรับ ในที่นี้ผมมีบอร์ด Freeduino V1.16 ซึ่งใน Arduino IDE มองเห็นเทียบเท่าบอร์ด Arduino Duemilanove w/ ATmega328

    ในการติดตั้ง AVR Studio 6 จะต้องทำการ register หน้าเว็บ แล้วทาง Atmel จะทำการส่งลิ้งค์ไปให้ทางอีเมล์ จากนั้น เราก็สามารถทำการดาวน์โหลดและติดตั้งตามปกติทั่วไปได้ ซึ่งในชุดที่ดาวน์โหดลดมานั้น จะมีชุด Compiler GCC ติดมาด้วย ซึ่งสะดวกกว่า เวอร์ชั่น 4 ที่เราจะต้องทำการดาวน์โหลดแยกต่างหาก แต่นั่นเราจะไม่พูดถึงเวอร์ชั่น 4 

    ส่วนการติดตั้ง Arduino IDE นั้น เพียงแค่ดาวน์โหลดไฟล์บีบอัดมา แล้วทำการแตกไฟล์เก็บไว้ที่ใดก็ได้ ไม่จำเป็นต้องเป็น Drive C: แต่แนะนำว่าควรจะเป็น Hard Drive ไม่ควรเป็น Flash Drive นะครับ ซึ่งเมื่องแตกไฟล์เรียบร้อยแล้ว การเรียกใช้งาน Arduino IDE ก็เพียงแต่ดับเบิลคลิกไฟล์ arduino.exe ก็เรียกใช้งานได้แล้ว ใน Arduino IDE นี้ เราต้องการ header file library ของ Arduino ซึ่งจะทำให้เราเรียกฟังก์ชั่นต่างๆ ของ Arduino ได้ง่าย และต้องการ AVRDUDE ที่ติดมากับ Arduino IDE นี้ เพื่อใช้ในการโปรแกรม hex file ผ่าน USB/Serial ที่อยู่บนบอร์ด Arduino ไปลงที่ตัวไมโครคอนโทรลเลอร์นั่นเอง 

    เมื่อติดตั้งโปรแกรมท้งสองเรียบร้อยแล้ว ให้ทำการเปิดโปรแกรม Arduino IDE ขึ้นมาด้วยการดับเบิลคลิกที่ไฟล์ arduino.exe จากนั้นทำการตั้งค่าโดยคลิกที่เมนู File->Preference แล้วติ๊กที่ช่อง compilation และ upload ตามรูป

    ทำการเชื่อมต่อบอร์ด Arduino เข้ากับคอมพิวเตอร์ของเรา จากนั้นทำการตรวจสอบ Comport ที่คอมพิวเตอร์มองเห็น โดยเช็คจาก Device Manager ในที่นี้ของผมมองเห็นเป็น  COM6 ซึ่งเราจะต้องไปเลือกค่านี้ที่ Arduino IDE ให้ตรงกัน (ใน Arduino IDE ที่เมนู Tool->Serial Port ให้เลือกไปที่ COM6 ไว้เช่นกัน )

    ทำการเปิดไฟล์ตัวอย่างจากใน Arduino IDE ไปที่ File->Examples->01.Basics-->Blink แล้วทำการกดปุ่ม Verify หรือการ Compile เพื่อที่จะหาตำแหน่งของ hex file แต่เราจะเข้าไปเอาไฟล์ที่ชื่อ core.a เมื่อเราได้ตำแหน่งไฟล์ blick.cpp.hex มาแล้วให้เข้าไปตาม path ที่แสดงไว้ จากในรูปจะได้ว่า C:\Users\.....\AppData\Local\Temp\build7058557518763075139.tmp ในโฟลเดอร์นี้ จะมีไฟล์ ที่ชื่อ core.a ให้เราทำการก๊อปปี้ไฟล์นี้ออกมา โดยไปสร้างโฟวล์เดอร์แยกต่างหากไว้ ในที่นี้ ผมไปสร้างไว้ที่ E:\Dropbox\SourceCode_Micro\Arduino\ArduinoCore วางไฟล์ core.a จากนั้นทำการเปลี่ยนชื่อไฟล์ จาก core.a ไปเป็น libcore.a 

ปล. ในขั้นตอนนี้ อย่าเพิ่งปิด Arduino IDE นะครับ 

    ขั้นตอนต่อไป เราจะเข้าไปเอา header file ของไลบรารี่ Arduino โดยเข้าไปที่ C:\Program Files (x86)\arduino-1.0.1\hardware\arduino\cores\arduino ซึ่งผมได้แตกไฟล์บีบอัดโปรแกรม Arduino IDE ไว้ที่  C:\Program Files (x86)\ (ซึ่งของเพื่อนๆ ไม่จำเป็นต้องเหมือนกันนะครับ แต่สำคัญคือต้องไปที่ arduino-1.0.1\hardware\arduino\cores\arduino จะพบเจอไฟล์ *.h , *.cpp และไฟล์ *.c ในที่นี้ ให้ก๊อปปี้ไฟล์ไปให้หมดก่อนนะครับ โดยก๊อปปี้ทั้งหมดไปไว้ที่ E:\Dropbox\SourceCode_Micro\Arduino\ArduinoCore จากนั้นให้ลบไฟล์ที่ก๊อปปี้มา ให้เหลือเฉพาะ header file ซึ่งก็คือไฟล์ที่ลงท้ายด้วยนามสกุล .h นั่นเอง

    ต่อมา เราจะเอาไฟล์สุดท้ายที่ชื่อ pins_arduino.h ซึ่งไฟล์นี้จะมีที่เก็บแยกจากกัน ขึ้นอยู่กับว่าตอนนี้ เรากำลังใช้กับบอร์ด Arduino Compatible รุ่นไหนอยู่ ซึ่งเราจะรู้ได้จากไฟล์ C:\Program Files (x86)\arduino-1.0.1\hardware\arduino\boards.txt เมื่อเปิดไฟล์นี้ดู ให้สังเกตที่ uno.build.variant ซึ่งจะเป็นตัวบอกว่าไฟล์ pins_arduino.h ที่เราต้องใช้ อยู่ที่โฟลเดอร์อะไร ในที่นี้ ผมใช้บอร์ด Freeduino V1.16 ซึ่ง Compatible กับบอร์ด Arduino Duemilanove w/ ATmega328 จากในไฟล์ boards.txt บอกไว้ว่า ผมต้องไปเอาไฟล์ pins_arduino.h จากโฟลว์เดอร์ atmega328.build.variant=standard ซึ่งก็คือที่อยู่ที่นี่  C:\Program Files (x86)\arduino-1.0.1\hardware\arduino\variants\standard จะมีไฟล์ pins_arduino.h ให้ก๊อปปี้ไฟล์นี้ไปไว้ที่เดียวกันคือ E:\Dropbox\SourceCode_Micro\Arduino\ArduinoCore

    ทำการสร้างโปรเจค ไปที่หน้าต่าง AVR Studio6 ที่เมนู  File->New->Project จะปรากฏหน้าต่าง New Project ให้เราเลือกตามรูปภาพที่แสดง 

Name : HelloWorld 

Location : E:\Dropbox\SourceCode_Micro\Arduino

Solution Name : HelloWorld

ทำการเลือก Device เป็น ATmega328P เพราะบนบอร์ด Freeduino ใช้ชิพ ATmega328P แล้วกด OK เป็นอันเสร็จสิ้นการสร้างโปรเจค

    มาถึงขั้นตอนการกำหนดค่า Compiler , Linker , Library ของโปรเจคนี้กันก่อนนะครับ ก่อนที่เราจะไปเขียนโค๊ด แล้วก็ทดสอบ Build Project กัน โดยคลิกที่เมนู Project->HelloWorld Properties.. หรือจะกด ALT+F7 ก็ได้ 

ไปที่ TAB Tool Chain ด้านซ้ายมือ  แล้วกำหนดให้ Configuration เป็น All Configurations

    ที่หัวข้อหลัก AVR/GNU C Compiler

-Directories กำหนดไปที่ E:\Dropbox\SourceCode_Micro\Arduino\ArduinoCore และให้เอาเครื่องหมายถูกที่ Relative Path ออก 

-Optimization กำหนดให้ Optimization level เท่ากับ  Optimize for size (-Os)และเช็คเครื่องหมายถูกที่ช่อง Prepare functions for garbage collection

    ในทำนองเดียวกัน เราก็กำหนดค่าที่ AVR/GNU C++ Compiler เหมือนกันกับ AVR/GNU C Compiler ในหัวข้อ Directories และ Optimization เหมือนกันทุกประการ 

    ส่วนที่ AVR/GNU C++ Linker เราจะทำการกำหนด Libraries ให้ไปเรียกไลบรารี่ libcore ซึ่งทำได้โดยการคลิก Add Items ที่  Libraries     แล้วใส่คำว่า libcore เข้าไป  ในส่วนของ  Libraries Search Path ให้กำหนดไปที่ E:\Dropbox\SourceCode_Micro\Arduino\ArduinoCore และให้เอาเครื่องหมายถูกที่ Relative Path ออก  ส่วนค่า Optimization ให้ทำเครื่องหมายถูกที่ช่อง Garbage collect unused sections

เรียบร้อยแล้ว ให้กดปุ่ม Save All ด้านบน Toolbar 

กลับไปที่ชีท  HelloWorld.cpp ของเรา ให้ทำการแก้ไขโค๊ด ดังนี้ 

#define F_CPU 16000000

#define ARDUINO 100

#include "../ArduinoCore/Arduino.h"

void setup();

void loop();

void setup() {

pinMode(13, OUTPUT);

Serial.begin(9600);

}

void loop() {

digitalWrite(13, HIGH);

delay(500);

digitalWrite(13, LOW);

delay(500);

Serial.println("Hello World!");

}

ให้สังเกตว่า เราจะต้องอ้างแบบ relative ไปที่ Arduino.h ด้วยการ #include "../ArduinoCore/Arduino.h" เนื่องจากไฟล์ Arduino.h อยู่ที่โฟวเดอร์ ArduinoCore ซึ่งไม่ได้อยู่โฟวเดอร์เดียวกันกับโปรเจคนี้ 

และกำหนดให้ #define F_CPU 16000000 เท่ากับค่า Crystal บนบอร์ด Arduino ซึ่งน่าจะเท่ากับ 16MHz 

ซึ่งเมื่อเรียบร้อยแล้ว ให้ทำการกดปุ่ม F7 เพื่อทำการ Build Solution ถ้าหากทุกอย่างเรียบร้อย ก็น่าจะมีข้อความว่า 

Build succeeded.

========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ==========

    เราจะได้ไฟล์ HelloWorld.hex ที่อยู่ใน E:\Dropbox\SourceCode_Micro\Arduino\HelloWorld\HelloWorld\Debug ซึ่งสามารถนำไปเบิร์น หรืออัดลงไปที่ตัวไอซี ATmega328P ได้ต่อไป 

    ซึ่งในตอนต่อไป ผมจะแสดงวิธีการกำหนดให AVR Studio6 ทำการเรียก AVRDUDE มาทำการโปรแกรม hex file ลงไปที่ตัว  Arduino โดยผ่าน USB/Serial ที่อยู่บนบอร์ด Arduino และจะแสดงวิธีการเรียกใช้ Terminal Window ในการติดต่อสื่อสารผ่านทาง Serial Communication เหมือนใน Arduino IDE เพียงแต่ว่า ครั้งนี้ เราจะเรียกผ่าน AVR Studio 6 ครับ 

reference : http://www.jayconsystems.com/tutorial/atmerpt2/