วันอาทิตย์ที่ 11 ธันวาคม พ.ศ. 2554

http://youtu.be/wI-N_qv2sr0

http://youtu.be/wI-N_qv2sr0http://youtu.be/wI-N_qv2sr0

หลุด Beginning Arduino

หลุด Beginning Arduino

[img]http://www.earthshineelectronics.com/Images/astronomy/begardcover.jpg[/img]

Paperback: 472 pages
Publisher: Apress; 1 edition (December 23, 2010)
Language: English
ISBN-10: 1430232404
ISBN-13: 978-1430232407
Product Dimensions: 9.2 x 7.4 x 1.1 inches

[url]http://www.thaigeekshop.com/file/Beginning-Arduino.pdf[/url]

arduino แปลว่า เพื่อนแท้ ในภาษา อิตตาลี

arduino แปลว่า เพื่อนแท้ ในภาษา อิตตาลี
arduino มี lib ที่ใช้ในการติดต่อกับอุปกรณื มากมาย เช่นติดต่อกับ sensor ต่างๆ และ สามารถนำมาใช้ได้โดยไม่ต้องเขียนโปรแกรม เพื่อใช้ติดต่อกับอุปกรณ์เหล่านั้น เพียงแต่เรียกใช้ฟังชั่น ก็สามารถใช้งานอุปกรณ์เหล่านั้นได้ ซี่งส่วนใหญ่ถ้าเรา เขียนโปรแกรมด้วย ภาษาแอสแซมบลี เอาแค่การประมวลผมง่ายๆอย่าง 1+1 = 2 ก็ปวดหัวแล้ว ซี่งถ้าเรารู้จักภาษา c อยู่แล้ว ก็ยิ่งง่ายในการศึกษา แต่ไม่รู้ก็ไม่เป็นไร ลองอ่านบทความนี้ดู          
ในการเขียนโปรแกรม เราต้องใช้ IDE ในการเขียน ซึ่งสามารถ download ได้ที่ http://arduino.cc/en/Main/Software
จัด ไปครับ ในการเขียนโปรแกรมเพื่อให้ ไมโครคอนโทรเลอร์ ทำงานของ arduino ต้องทำการโหลดข้อมูลผ่าน boot loadder  อันนี้เป็นหน้าตาของ ide อะครับ
 
ก่อนเราจะเขียนโปรแกรมเรามาทำความเข้าใจเล็กๆ ในส่วนที่ต้องใช้ในการเขียนโปรแกรมของเรา (ต้องขออภัยหากมีท่านผู้รู้อยู่แล้ว) ข้อมูลที่ เราเข้าใจและใช้ในชีวิตประำวันคือเลขฐานสิบ เช่น 10,9,8,7 แต่ไมโครคอนโทรไม่รู้จักครับ มันรู้จักแต่เลขฐานสอง
ครับผม เช่น 1111 0101 ครับ เราจะมาอธิบายในส่วนนี้กัน ถึงวิธีการแปลงเลขฐานเพื่อเอาไปใช้ประโยชน์กันครับ

ตัวอย่าง
       20(10) เลขฐานสิบ

วิธีการ
      20/2 =  10    เศษ 0
      10/2  =  5     เศษ 0
       5/2   =  4    เศษ 1
       4/2   =  2    เศษ 0
        2/2   = 1   

 เราจะได้ค่าที่แปลงดังนี้คืออ่านจาก ล่างขึ้นบนคือ 1 0100 (2)
  
    จากรูปบันทัดแรก int ledpin = 13
คือกำหนด output port ให้กับ arduino
ใน arduino  เรียก port ต่างๆเป็นหมายเลข
void setup()
{
       

}

ในส่วนนี้ไว้กำหนด ให้ port ทำหน้าที่อะไร
void loop()
{


}


ในส่วนนี้เราไว้เขียนว่าจะให้ทำงานอะไร เรียกใช้ function อะไร


พอเสร็จแล้วเรา save โปรแกรม จะเป็นไฟล์ sketch  ไว้อัพโหลดลง arduino
 
 
 
เรื่องชนิดของตัวแปร
Char    ใช้เก็บข้อมูลที่เป็นตัวอักษร (character) เก็บได้ 256 ค่า
 Int     ใช้เก็บข้อมูลที่เป็นตัวเลขจำนวนเต็ม (integer) ใช้เก็บข้อมูลที่เป็นเลขจำนวนต็มได้ 65536 ค่า
Float    ใช้เก็บข้อมูลที่เป็นเลขทศนิยม
Double   ใช้เก็บข้อมูลที่เป็นเลขทศนิยมแบบละเอียดกว่า float ถึง 2 เท่า
Void   ใช้เก็บข้อมูลแบบไม่มีค่า

ชนิดตัวแปร   จำนวนบิต   ค่าข้อมูลที่เก็บได้
char   8   -128 ถึง +128
int   16    - 32768 ถึง +32767
float   32   3.4E-38 ถึง +3.4 e+38
double   64    1.7e-308 ถึง +1.7+308
void   0   ไม่มีค่า

 สำหรับ มือใหม่คงงงว่าไรหว่า ผมขออธิบายแบบบ้านๆก็แล้วกัน ไมโครชิบไม่รู้จักหรอกครับเลขที่เราใช้กันอยู่ เช่น 10  9  8 อะไรพวกนี้เขาเรียกว่าเลขฐาน 10  มันเข้าใจเฉพาะเลขฐาน 2 และ ฐาน 16  เพราะฉะนั้นเรามาดูกันว่าจำนวนบิตคืออะไร
   ในที่นี้เราใช้ arduino ในการสร้างสรรค์ซอฟแวร์ และใช้ atmega 8 ซึ่งเป็นไมโครขนาด 8 บิต ใน 1 ไบต มี 8 บิต คือ
7   6   5   4   3   2   1   0

   เวลา เราจะเก็บข้อมูลตัวเลขที่เป็นเลขฐาน 10 เช่น 5 ในไมโครก็ใช้การเก็บข้อมูลขนาด 1 ไบต เพราะ 5 แปลงเป็นเลขฐาน 2 ได้ค่าคือ 0000 0101 เห็นไหมครับ มันใช้การเก็บข้อมูลขาด 8 บิต
    ในการเลือกชนิดตัวแปรที่ใช้เก็บข้อมูลนั้นสำคัญมากนะครับมันมีผลทั้งในเรื่องของการคำนวณและหน่วยความจำ

   ใน ภาษา ซี ไม่ได้มีการจำแนกชนิดว่าค่าเป็นบวกหรือเป็นลบ เป็นการเฉพาะแต่จะใช้วิธีการเพิ่มคำสั่งเพื่อกำหนดคุณสมบัติจำเพาะของตัวแปร จะช่วยให้เราประหยัดหน่วยความจำได้  มันมีค่าที่ใช้กำหนดคุณสมบัติของตัวแปรอยู่ 4 คำสั่ง
Unsigned ใช้ระบุตัวแปรที่เป็นบวกเท่านั้น
Signed    ใช้ระบุค่าเลขตัวแปรจำนวนเต็มทั้ง บวก และ ลบ  
Short       ใช้เก็บจำนวนเต็มที่มีค่าน้อยกว่า int
Long       ใช้เก็บค่าตัวแปรที่มีจำนวนมากกว่า int 2 เท่า
 
 
 
 
 
 
ลิงค์เวบไซต์ ที่น่าสนใจ สำหรับ Arduino และ Electronics
    http://www.electoday.com/bbs/               แหล่งความรู้ของคนที่สนใจด้านอิเล็คทรอนิกส์ในไทย
    http://www.ayarafun.com/                         ทุกสิ่งใหม่ๆ ในวงการอิเล็คทรอนิกส์ พร้อมร้านค้าในตัว
    http://www.facebook.com/ThaiEasyElec แหล่งความรู้ของคนที่สนใจด้านอิเล็คทรอนิกส์ในไทย
    http://www.thaiduino.com/                         ร้านขายอุปกรณ์ เกี่ยวกับ Arduino ในไทย มีสินค้าจำนวนหนึ่ง และ

ข้อมูลให้ศึกษา
    http://www.warf.com/                                   ร้านขายอุปกรณ์ อิเล็คทรอนิกส์ และ Controller แทบทุกชนิด มี

บทความให้ความรู้
    http://www.warapcb.com/                           คุณฝัน เค้าสร้างให้...

หนังสือแนะนำ:(ภาษาไทย):
    http://inex.co.th/books/arduino.html                 หนังสือสอน Arduino ฉบับภาษาไทย เล่มแรกๆของไทย
    http://www.etteam.com/product2009/BOOKS/cArduino.html  เรียนรู้และเข้าใจArduino ภาษาไทย

หนังสือแนะนำ:(ภาษาอังกฤษ):
    http://www.arduino.cc/en/Booklet/HomePage  เว็บกลางของโลกนี้่ สำหรับ Arduino
 





MENU bar ของ Arduino จะประกอบด้วย

MENU bar ของ Arduino จะประกอบด้วย

1. Menu File โดยทำหน้าที่บริหารจัดการข้อมูลที่เรียกว่า Sketch File (ไฟล์ที่ทำการเขียนจะเรียกว่า sketch files)

    * New : สร้าง Sketch File ใหม่
    * Sketchbook :

   1. Open : เรียก Sketchbook ที่บันทึกไว้ก่อนหน้านี้
   2. Example :เปิด Sketchbook ตัวอย่างที่มาจาก Library

    * Save : บันทึก Sketch File ณ.ปัจจุบัน
    * Save as : บันทึก Sketch File ในที่ อื่นหรือชื่อใหม่
    * Upload to I/O board : การ burn สู่ MCU(AVR)หลังจากที่เขียนโปรแกรมเสร็จ
    * Preference : ตั้งค่าต่าง ๆ ของArduino IDE


2. Edit Menu ทำหน้าที่แก้ไข wording

    * Undo : ยกเลิกคำสั่งหรือการพิมพ์ครั้งล่าสุด
    * Redo : ทำซ้ำคำสั่งหรือการพิมพ์ครั้งล่าสุด
    * Cut : ตัดข้อความไว้ใน clipboard
    * Copy : คัดลอกข้อความจาก clipboard
    * Paste : แปะข้อความจาก clipboard
    * Select all : เลือก(แรเงา)ข้อความทั้งหมด
    * Find : ค้นหาข้อความ
    * Find Next : ค้นหาข้อความถัดไป


3. Sketch Menu เป็นเมนูที่ใช้คำสั่ง Compile ,เพิ่มLibrary

    * Verify/Compile : Compile ภาษา c/c++ เป็นภาษา Machine
    * Stop : หยุดการ Compile
    * Import Library : เลือก/เพิ่ม Library โดยแทรกในบรรทัดแรก
    * Show Sketch Folders : ทำการแสดงที่เก็บโปรแกรม
    * Add File.. : คัดลอก File เลือก/เพิ่มมาบันทึกรวมใน Folder ปัจจุบัน

4. Tools Menu :ใช้จัด code ,เลือกเบอร์ Microcontroller ,เลือก port serial

    * Auto Format : จัดวาง code ให้เป็นระเบียบสวยงาม ให้อ่านได้ง่ายโดยแยกสี code ที่เป้นคำสั่งและตัวแปร
    * copy to Forum : คัดลอก code ลง clipboard
    * Archive Sketch : สั่งให้บีบอัด Folder ปัจจุบันเป็นไฟล์บีบอัด มีประโยชน์ในการทำ CVS
    * Board : เลือก Hardware Device ที่ใช้งานกับโปรแกรม เช่น Arduino Nano เป็นต้น
    * Serial Ports : เลือก port เพื่อ communication ระหว่าง Hardware Device กับ Arduino IDE
    * Burn Bootloader : เพื่อทำการ bootloadder ให้ Hardware Device โดยต้องมีเครื่อง burn

มาเล่นไมโคร ไม่ง้อเครื่อง burn กันดีกว่า


Oct 20, '08 12:51 PM
สำหรับ ทุกคน
  หลังจากที่พยายามลง ทำบอร์ด ett-stamp เป็น wiring io มาตั้งนาน ตอนนี้ Wiring IO (Version ATmega64) เริ่มทำงานได้ 

แต่ก่อนจะไปถึงขั้นนั้นนะครับ ผมจะมาแนะนำเทคนิคที่น่าสนใจอีกอัน วิธี boot-loader ลงใน mcu ใน blog นี้จะใส่ bootloader ลงใน  ETT-STAMP-64 ครับสำหรับคนที่ชอบ AVR Studio ท่านจะได้ไม่ต้องเปลี่ยนโปรแกรมเลย และยังประหยัดเงิน ไม่ต้องใช้ เครื่องโปรแกรม อีกแล้ว เหมาะมากกับ class หรือ  workshop  จะได้ไม่ต้องมีเยอะ ประหยัดเงิน ไว้ทำซื้ออย่างอื่นดีกว่า ช่วยชาติครับ

Boot loader เป็น firmware ส่วนมากจะทำหน้าที่ ช่วย upload data เข้าไปใน flash หรือ eeprom หรือเรียกให้ง่าย ทำให้ mirco-controller  burn ตัวมันเองได้ (เผาตัวเองได้)

bootloader มีกันหลายแบบ มีทั้ง upload ผ่าน mmc  card ได้ upload ผ่าน lan อย่างพวก Embeded linux
ส่วนอันที่ผมจะมาแนะนำ upload ผ่านสาย serial ครับ หรือจะใช้ usb2serial ก้อได้ notebook เหมาะมาก

วิธีทำก้อไม่ยากครับ  แต่ขอแนะนำว่า ผู้ใช้ต้องคุ้นเคยกับ AVR มาพอสมควรนะครับ บทความนี้ ไม่เหมาะกับมือใหม่มากๆๆ

ส่วน bootloader ผมได้มาจากที่เขาพัฒนา bootloader ไว้แล้วอีกที่ อันนี้ที่ผม เอามาใช้ มาจาก http://www.avride.com/article/wiring/
ของคุณ
Worapoht Kornkaewwattanakul พัฒนาเพิ่มเติมไว้

ผมขออนุญาตินำมาใช้ และ ขออนุญาติ เอามาเผยแพร่ความรู้ ให้สมาชิกในเวปด้วยนะครับ

ส่วนของ bootloader ส่วนนี้จะทำให้ ATmega มี Protocol สื่อสาร แบบเดียวกับ เครื่องโปรแกรม STK-500v2 ของ ATmel ซึ่งทำให้ ท่าน burn เข้า mcu โดยไม่ต้องมีเครื่องโปรแกรมได้

ซึ่งจาก source code เขาไว้ใช้งานกับ ATmega128 ในส่วนใน src เขาได้ทดสอบกับ  ATmega8, ATmega16 ,ATmega32 ,ATmega8515 ,ATmega8535, ATmega162, ATmega128 ซึ่งยังไม่มี ATmega64 ผมเลยพยายามเพิ่มเติมส่วนที่จำเป็น

ผมมีบอร์ด ETT-ATmega64 อยู่นานแล้ว ยังไม่ผ่านจ่ายไฟ เข้า VCC  ซึ่งถ้าท่านใช้ ATmega ตัวอื่นๆ ลองทำต่อวิธีผม น่าจะทำให้นำไปใช้งานได้เลย

วิธีการแก้ไขให้ src  ใช้ ATmega64 ได้นะครับ ต้องแก้ไข file ส่วนของ Makefile กับ stk500boot.c

ใน Makefile

เลือก MCU ใหม่

เปลี่ยน
MCU = atmega128

เป็น
MCU = atmega64

ในส่วน Bootloader Address ครับ ตำแหน่ง start ของ bootloader (ขอบคุณท่าน DEV-Zone ที่วันนั้นแนะนำในเวปบอร์ด)

# Bootloader
# Please adjust if using a different AVR
# 0x0e00*2=0x1C00 for ATmega8  512 words Boot Size
# 0xFC00*2=0x1F800 for ATmega128  1024 words Boot Size
# 0x7C00*2=0x0F800 for ATmega64  1024 words Boot Size
#BOOTLOADER_ADDRESS = 1F800
BOOTLOADER_ADDRESS = 0F800

ผมได้เปลี่ยนจาก
BOOTLOADER_ADDRESS = 1F800

เป็น
BOOTLOADER_ADDRESS = 0F800

ตัวเลขได้มาจากใน datasheet Atmel64 ส่วนของ bootloader support
หัวข้อ ตาราง Boot Size Configuration ขึ้นอยู่กันขนาด bootloader ที่ทำขึ้นมา ซึ่ง firmware นี้ขนาดไม่เกิน 1024 words

boot reset address อยู่ที่ 0x7C00 ซึ่งเปลี่ยน word ทำกันคูณสอง ได้ 0xF800

BOOTSZ1 BOOTSZ0  BootSize  Application          BootLoader    EndApp   BootReset
                                                Flash Section      Flash Section   Section   Address
1              1               512          0x0000-0x7DFF   0x7E00-0x7FFF   0x7DFF   0x7E00
1              0               1024        0x0000-0x7BFF   0x7C00-0x7FFF  0x7BFF   0x7C00
0              1               2048        0x0000-0x77FF   0x7800-0x7FFF    0x77FF    0x7800
0              0               4096        0x0000-0x6FFF   0x7000-0x7FFF    0x6FFF   0x7000
(คัดลอกจาก datasheet ของ ATmega64)

และในส่วนของ source code  stk500boot.c

เพิ่ม Signature Bytes ของ Atmega64 เข้าไป
#define SIGNATURE_BYTES 0x1E9602

ซึ่งดูได้จากใน datasheet อีกเช่นกันครับ

นอกนั้นไม่จำเป็นต้องแก้ไขอะไรครับ ในขั้นนี้ ท่านจะสามารถ compile source ได้แล้ว
compile โดยพิมพ์ make ที่ ไดเร็กทรอรีนั้น  ซึ่งไม่ีมี error เกิดขึ้นก้อใช้งานได้ครับ

ส่วนใน รายละเอียด bootloader จาก src ทำอะไรบ้างให้ท่านศึกษาด้วยตัวเองนะครับ มันละเอียดมาก
โดยสรุปหลักๆ bootloader จะมี LED แสดงผลเมื่อเข้าทำงานในส่วน และการใช้งานbootloader มีสองแบบ

แบบแรก จะ start bootloader ตั้งแต่แรก ที่ จ่ายไฟ ให้ mcu แล้วกลับไปทำงานปกติ ถ้าไม่มีการใช้ภายเวลาที่กำหนด
แบบที่สอง จะ start bootloader เมื่อ pin ที่กำหนด active low

ซึ่งในบางส่วน ท่านอาจจะต้องเพิ่ม hardware LED เพื่อแสดงสถานนะของ mcu หรือ เพื่อ Switch เพื่อ เข้า bootloader

โดย default bootloader นี้ จะใช้ switch กับ LED ผมทดสอบต่อแบบ defalut ก่อนครับ

ท่านอยากแก้ไขอะไร ผมจะตัวอย่างให้ เช่น อยากให้มี LED แสดง ท่านไป comment ในส่วน (ใส่ // หรือ /* .......................... */)

//#define REMOVE_BOOTLOADER_LED            // no LED to show active bootloader

แล้วกำหนด led อยู่ pin ไหน ท่านแก้ไขได้ที่ ส่วนนี้ของไฟล์
/*
 * LED on pin "PROGLED_PIN" on port "PROGLED_PORT"
 * indicates that bootloader is active
 * PG2 -> LED on Wiring board
 */
#define PROGLED_PORT PORTG
#define PROGLED_DDR  DDRG
#define PROGLED_PIN  PING2

อันนี้ อยู่ port G,pin2

นี้เป็นการยกตัวอย่างให้ดูนะครับ จริงๆ เอาละเอียด มันจะเยอะมาก ก้อให้ท่านไปศึกษา ดูกันต่อเอง

ตัวอย่างที่ต่อบน บอร์ดผม Atmega64 เพิ่ม Switch ที่ช่อง E2  กับเพิ่ม LED ที่ช่อง G2 ตามวงจรของ WiringIO ครับ

หลังจากนั้น compile ได้แล้ว ท่านก้อ flash เข้าไปครับ
และกำหนด fusebit ดังนี้ครับ
- กำหนดขนาด firmware อันนี้กำหนด 1kWords  (program BOOTSZ01)
- เลือกให้เข้า BOOT Reset Vector (program BOOTRST)
- Lock Mode 3 ป้องกันเขียนในโปรแกรมส่วน bootloader  (program BootLock 11 and BootLock 12)

เข้าไปดูที่ http://www.avride.com/article/wiring/
ถ้าท่านใช้ pony-prog จะ fusebit ดังรูปครับ

หรือใช้ avr-dude ใช้ fuse-bit แบบนี้นะครับ
(โปรแกรม คำนวณ fuse-bit ส่วนตัว)
Atmega64
High-Byte=0x2c
Low-Byte=0ef
Ext-Byte ใส่ตอนหลังได้

ทดสอบการใช้งาน
ท่าน ต้องทดสอบก่อน compile มาแล้วใช้ได้หรือ ป่าว บาง avr-gcc มันมีปัญหาแปลก อย่าง คอมไฟล์เลอร์ คนล่ะเวอร์ชั่น คอมไฟล์ไฟล์เดียวกันทำงานไม่ได้ ถ้าไม่ได้ อันนี้ ผมเสียใจด้วยนะครับ ผมคงอธิบายทั้งหมดไม่ได้ทั้งหมด มันจะเยอะมาก ต้องพยายามแก้ๆ ไปครับ :D

ทดสอบแรก ถ้าท่านต่อวงจร ถูกต้อง ให้ท่านกด switch prog กับ reset ถ้าไฟ led ติด ก้อ bootloader ทำงานแล้ว
หรือ ท่านใช้แบบ ไม่มีสวิตซ์ ไฟจะกระพริบ สองที่ แสดงว่า bootloader ทำงานแล้วเช่นกัน ดังรูปครับ ไฟ led ติด (สีแดงเล็กๆ) แผ่นวงจรผม อาจจะดูยุ่งๆหน่อยครับ พื้นที่มีจำกัด

ทดสอบใช้งานกับ AVR-Studio

อันแรกต้อง config comport ก่อนครับ เลือก AUTO ก้อได้ครับ
จากนั้น AVR-Studio ถ้า AVR-Studio เข้ามาถึงหน้าต่างนี้ ท่านประสบความสำเร็จแล้ว (ฮ่าๆ)

ตอน นี้ท่านก้อสามารถ flash โปรแกรม หรือ เปลี่ยน fusebit ก้อได้ครับ (เปลี่ยนได้บางตัวนะครับ) ส่วน erase chip ไม่ทำงานนะครับ แต่ทุกครั้งที่ flash ใหม่ ที่ตัว firmware  จะลบเองครับ


***ทุก ครั้งก่อนจะ connect ท่านต้องเข้า bootloader mode ก่อน ไม่งั้น โปรแกรม AVRISP หาไม่เจอ และต้องปิดหน้าต่าง AVRISP ถึงจะสามารถใช้ serial port ได้เหมือนเดิม

เขียนโปรแกรมง่าย ทดสอบกันไฟกระพริบเทพก่อน (ตอนนี้ผมสามารถทำไฟกระพริบได้กับทุก MCU แล้ว)

#include                    
#include               // Delay functions


void delay_ms(unsigned int i)
{
    for(;i>0;i--)
        _delay_ms(1);
}


int main(void)
{
  PORTB=0x00;                          // PB7..0 = 0
  DDRB=0x01;                             // PB0    = Output

  while (1)
  {
    PORTB = 0x00;  
    delay_ms(200);
    PORTB = 0xFF;
    delay_ms(200);
  }

  return 0;
}

จากนั้นกด flash to current settings ที่เมนูของ avr-studio ได้ไฟกระพริบแล้ว (สวยงาม)
ไฟดับ
ไฟติด

เอาล่ะครับ ยาวมากๆ หวังว่าคงจะมีประโยชน์กับเพื่อน สมาชิกบ้างนะครับ เอาไว้เจอกันใหม่ในโปรแกรมหน้า สวัสดีครับ :D
เอกสารแนบ:atmega64_bootlooader_stk-500v2.rar
รายการบล็อกSep 23, '08 11:59 PM
สำหรับ ทุกคน

พัฒนาการ ของไมโครคอนโทรลเลอร์ ในช่วงสิบปีที่ผ่าน นี้พัฒนาไปมาก เริ่มตั้งแต่ยุคแรก พวก single board  มีไมโครโปรเซสเซอร์ กับ อุปกรณ์ต่อพ่วง เป็นสิบ  ต่อมาพัฒนาเป็น ยุคของไมโคร คอนโทรลเลอร์ ไอซีตัวเดียวมีทุกฟังก์ชั่น มีการลดขนาดลงไปเรื่อยๆ อุปกรณ์ ไมโครโปรเซสเซอร์ ยังใช้อยู่นะครับ แต่เอาไปใช้ในระบบที่ซับซ้อน ขนาดใหญ่ขึ้น มาถึงตอนนี้ ไมโครคอนโทรลเลอร์ ออกมาเป็น ร้อยๆรุ่นแล้วแล้วมั่ง

ปัญหาใหญ่ๆ การเริ่มต้น คอนโทรลเลอร์ เหมือนกับ space ขนาดใหญ่ ไม่รู้จะเริ่มอย่างไงดี เต็มไปด้วยอะไรที่ไม่รู้  ทั้งการออกแบบบอร์ด การใช้งาน แต่พอจับทางได้แล้ว ต่อไปอะไรต่อไปก้อเกือบจะง่ายแล้ว

โปรเจค arduino ลดความซับซ้อนของคอนโทรลเลอร์ เพื่อให้ผู้ใช้งาน เข้าถึงง่ายขึ้น เพียงแค่มีไอเดีย ใครๆ ก้อเอาโปรแกรมเองได้ บ่อยครั้งใช่ไหมครับ รู้ล่ะว่าอยากให้มีเซ็นเซอร์ทำงานประมาณนี้ พอมีอะไร ผ่านก้อขอให้ อุปกรณ์นี้ทำงาน แล้ว ตัวนี้ทำงานต่อ แต่ดันทำเองไม่เป็น เลยพับโปรเจคไว้ มาตอนนี้คุณก้อทำเองได้แล้ว (เริ่มปลุกใจ ให้ตื้นเต้น)

ไม่ ต้องถึงขนาดเปิด datasheet เพื่อหาวิธีใช้งาน ไม่ต้องรู้ศัพท์ทางเทคนิค เราก้อควบคุมอุปกรณ์เราได้แล้ว ส่วน software ที่ใช้พัฒนาอยู่ในรูปแบบ ของภาษา C/C++ และเป็นระบบเปิด ที่เราสามารถเข้าถึงได้ทุกส่วน

ถ้ายังสงสัยกว่า arduino เป็นอย่างไง ใช้ทำอะไรได้บ้าง ขอให้ไปศึกษาเพิ่มเติมก่อนนะครับ จากที่นี้ครับ http://www.arduino.cc  หรือ เอาไทยๆ จาก เวป http://logicthai.net/ หรือ http://www.avride.com/pop_thai/
หรือ จะเข้าไปอ่านที่นี้
http://todbot.com/blog/2006/09/25/arduino-the-basic-stamp-killer/

What is Arduino
Arduino is two things:
A software programming environment, with a GUI and style based off
of Processing, and a packaging of AVR GCC, AVR LIBC, and AVRlib. In many ways the Arduino environment is like WinAVR, but cross-platform.

A hardware board, based on an Atmel AVR processor, arranged in a standardized way. Arduino isn’t restricted to just this board however, and many Arduino-compatible boards have been created


เขาเปรียบเทียบ arduino กับให้คำจำกัดความของโปรเจคนี้ได้สั้นๆ เข้าใจง่ายสุดแล้ว (ผมขี้เกียจแปล ก๊อบปี้มาเลย)

ต้อง ยอมรับ เลยนะครับ ในตอนแรกผมไม่ได้สนใจ โปรเจคนี้มากนัก  คิดว่ามันคงเหมือน basic stamp ทำอะไรไม่ได้มาก เขียนโปรแกรมซับซ้อนมากก้อไม่ได้ ด้วยความที่ arduino เป็นระบบเปิดสามารถ เข้าถึง source code ได้ทั้งหมด แกนหลักของมันคือ c ++ เป็น core i/o ของ arduino ออกแบบมาให้ยืดหยุ่น เพิ่มเติมอะไรได้ง่ายครับ ผมว่าเอามาทำงานด้านตั้งแต่ basic จน advance ได้เลยนะครับ สามารถออกแบบ library แล้วใช้ arduino เป็นเหมือน high level  เรียกใช้ library ของเราอีกที่ แล้วแต่มุมมองของคนเอาไปใช้เลยนะครับ

ส่วน ที่ผมยังไม่ชอบมาก ส่วนของ IDE มันทำงานแบบหลายๆ ไฟล์ เอามาเปรียบเทียบไฟล์กันไม่ได้ ส่วน serial monitor ก้อเหมาะกับการรับข้อความมากกว่า แต่คงมีการพัฒนาไปได้อีกยาว

เข้า เรื่องของเราต่อ หลังจากประกอบบอร์ดเสร็จแล้ว ถ้าใครยังไม่มีบอร์ด เข้าไปที่นี้ก่อน ไปทำบอร์ดมาก่อนครับ :D หรือจะซื้อเอาก้อได้ ตอนนี้มีหลายที่ ที่เอามาขายแล้ว

อุปกรณ์ที่เราต้องมีนะครับ
- บอร์ด I/O Arduino หรือไม่ก้อได้ ต่อบน bred board (บอร์ดทดลอง) ตัวหลักของ arduino ไม่ได้อยู่ที่บอร์ดนะครับ ต่างจาก ค่ายอื่นมากๆ อาจจะใช้งานง่าย แต่บอร์ดต้องซื้อเอา
-อุปกรณ์อีกอย่าง flash avr จะเป็น avrisp, ett avr-isp, usbasp  ยังไม่มี เข้าไปเลือกซื้อ ตามนี้เลยครับ http://etteam.com/product/03000AVR.html



สำหรับ มือใหม่มากๆ ส่วนนี้ อาจจะพยายามมากหน่อยนะครับ เราต้อง flash bootloader เข้าไปก่อน
firmware ส่วนนี้ เป็นตัวช่วย download โปรแกรมที่เขียนลง chip โดยผ่านสาย serial ไม่ต้องมีเครื่อง flash ใด ไม่ลำบากมาก ลุยส่วนนี้ให้ได้ก่อน ต่อไปบอร์ดพัง เราแค่เปลี่ยน ชิป มันไม่กี่บาทครับ ไม่ไหวจริงรบกวนเพื่อนๆ ช่วยล่ะครับ

ขั้นแรกเราต้องเลือกบอร์ดก่อนครับ หรือ เลือกรุ่นบอร์ดก่อนครับครับ เข้าที่ tools->board



แต่ในกรณี บอร์ดเราทำเอง แนะแนวให้เลือก Arduino NG ดูชิปที่เราใช้เป็น ATmega8 กับ ATmega168
จากนั้น  Burn Bootloader อันนี้ต้องมาดูก่อนว่าเรามีอุปกรณ์ตัวไหนแล้วเลือก

ส่วนผมมีตัว ett avr-isp (ตัวล่ะ 150 บาท) ก่อนจะใช้ต้องมาทำ connector ใหม่ก่อนนะครับ CISP ใช้ 6 pin ในเมนูจะมี paralell programmer แต่ก้อดันไม่ใช้อีก งั้นทำไงดีล่ะ เอาแบบเดิมก้อไปใช้โปรแกรม ponyprog burn แล้วเปลี่ยน fusebit  ซึ่งตามรูปเป็นของ ATmega168


** บอร์ด Arduino มีปัญหา กับ ตัว ETT ISP จะ burn เข้าไม่ได้นะครับ ที่ขา SPI ต่อกับ LED ไว้ ต้องเอาก่อนจะทำการ burn ได้ครับ **

แต่ผมมีอีกวิธีครับ เข้าไปเพิ่ม programmer  ตัว burn นี้ล่ะ ไหนจะใช้ arduino แล้ว
วิธีเข้าไปที่ directory ของ arduino -> hardware

หาไฟล์ programmers.txt

เข้าไปเพิ่ม

####################################

ettparallel.name=ETT ISP Parallel Programmer
ettparallel.protocol=pony-stk200
ettparallel.force=true
#ettparallel.delay=200

######################################


หลัง จากนั้นปิดโปรแกรม แล้วเปิดใหม่ จะเห็น ett isp ที่เพิ่มเข้าไป ดังตัวอย่างดังรูปข้างล่าง ตอนนี้น่าจะ burn ได้แล้ว ถ้าใช้ตัว programmer  ตัวอื่นเพิ่มได้ด้วยวิธีนี้เช่นกันครับ


ตอน นี้เรามี bootloader จะใช้งานได้แล้ว สำหรับ Arduino NG เราจะโหลดโปรแกรมเข้าไปได้ หลังจาก reset ซึ่งจะเห็นได้จากไฟกระพริบ เข้าโหมด boot loader

มาลองกับโปรแกรมแรก กันก่อน ด้วยไฟกระพริบกันก่อน ก่อนจะพากับไฟกระพริบเทพ

กดที่ file->  sketchbook -> example -> digital -> blink

แล้วจึงกด upload ตอนนี้ท่านจะได้เห็นไฟกระพริบแล้ว

หลังจากโม้ไปสักเยอะ หวังว่า คงจะทำให้เริ่มสนุก และ อยากเล่น arduino มากขึ้นนะครับ

เอกสารแนบ:Arduino S3v3 manual.pdf
เอกสารแนบ:BOM.xls
กลับมาลงบทความอีกครั้ง หลังจากที่มีเรื่องวุ่นวายใจ เริ่มคิดได้หรือเริ่มได้คิดก้อได้ครับ บ่อยครั้งมีสิ่งสูญหายไป หรือโดนลักขโมย เรามักไปคิดมาก น้อยใจชะตากรรม โทษสังคม ทั้งที่ของบางอย่างที่หายไป ก้อเป็นของที่ไม่ค่อยได้ใช้ด้วยช้ำ บางที่ของที่เรามีอยู่ ไม่ได้ใช้นาน ก้อเก่า และตกรุ่น เราก้อพาลไม่อยากได้อีกล่ะ สิ่งของ ทรัพย์สิน มันไม่ได้อยู่ยันยื่น แต่มีบางอย่างที่ มันไม่สูญหายไปไหนได้นะครับ สิ่งความรู้ที่อยู่ในหัวเรานิ ซึ่งยิ่งให้ เรายิ่งได้มากนะครับ ผมเลยกลับมาทำสิ่งนี้ดีกว่า แบ่งปันความรู้

ช่วงนี้ผมเน้นการประหยัด ทั้งเงิน ทั้งเวลาล่ะครับ ตามปกติอยากได้แผ่นวงจร ส่งร้านที่รับทำ ส่วนมากจะใช้เวลา 3-5 วัน  ทำด่วน กับ บวกหลายร้อยครับ แต่บางที่เราอยากทำบอร์ดทดลองขึ้นมาก่อน หรือ เรียกว่า prototype ไม่ใช้ phototype (ตามภาษาช่าง) จะให้รอนานนั้น คงไม่ไหว วิธีที่ทำบอร์ดขั้นทดลอง วิธีแรก หนีไม่ wirelap กับแผ่นวงจรอเนกประสงค์วิธีที่สอง ออกแบบลายวงจร แล้วใช้ กรดกัดลายวงจร เองเลย


โดย วิธีการสร้างแผ่นวงจรกรดกัดโลหะ คือ เราต้องถ่ายลายวงจรลงไปบนทองแดง เพื่อป้องกันไม่ให้กรดเข้าไปสัมผัสกับทองแดง โดยการถ่ายลายวงจรมี สองแบบ คือใช้ฟิลม์พิเศษ ฉายแสง กับ แผ่นใส กับ laser printer เราพิมพ์ลายวงจรลงแผ่นใส แล้วใช้เตารีด ทำให้ร้อนเพื่อให้หมึกละลาย ลงมาติดกับแผ่นทองแดง และใช้กรดกัดตามปกติครับ

ซึ่งศึกษาได้จาก
http://www.thaimicrotron.com/Trick/PCB/DIYPCB.htm

ซึ่งปัญหา ของ แผ่นใส ก้อมีนะครับ คือเวลาลอกลาย หมึกมักจะติดไม่ทั่วถึง และที่สำคัญ มันกัดลายวงจร พวก SMT หรือ ลายเล็ก ยากมาก

ซึ่งผมก้อหามาหลายวิธีล่ะ ตั้งแต่ ใช้ CNC กัดลายวงจร ปัญหา คือเสียเวลามาก ตั้งแต่ setup ชิ้นงานบนเครื่อง
หัว tools กัดเล็กมาก หักง่าย จะเอา PCB แผ่นเดียว ทำขนาดนี้ เดินสายด้วย wirelap ดีกว่า โปรเจค CNC กัด PCB เลยเก็บไว้ดีกว่า

แต่มาวันนี้ ผมขอเสนออีกวิธี เป็นอีกตัวเลือกแล้วกันครับ

ผม ได้หาวิธี จากใน google คือเจออีกวิธี  เรียกว่า toner transfer  แต่แทนที่เข้าจะใช้ แผ่นใส  อันนี้ใช้กระดาษ glossy photo ราคาแผ่นล่ะ 4-6 บาทและแต่เกรด บางเวป เล่นไปถูกกว่านั้น ใช้กระดาษจากหนังสือ มาใช้เลยด้วยซ้ำ

เข้าไปดูในนี้ได้นะครับ
http://www.headwize.com/projects/garbz2_prj.php



วิธี ทำการพิมพ์วงจรลงกระดาษ glossy photo ครับ ให้ลายวงจรกลับด้านด้วยนะครับ (mirror) แล้วตัดขนาดให้พอเหมาะ เอามารีดลงแผ่นวงจร ด้านทองแดง ส่วนกระดาษที่ผมใช้ เป็น glossy photo 120 gram ยี่ห้อ Hi-jet (รับบริจาคจากเพื่อนมา ยังจะประหยัดไปได้อีก) ควรใช้กระดาษมันด้านเดียว ลอกง่ายกว่า ถูกกว่าครับ หาได้ฟรี อะไรก้อใช้ได้ครับ ฮ่าๆ

ตอนรีด ไม่ต้องรีดนานมาก หรือกดหนักมากๆ แต่ต้องร้อนและเอาให้ทั่ว ก้อพอ เคยทดลองรีดนาน หมึกจะละลายเลอะ เหมือนกันครับ อันนี้ต้องไปหาเทคนิคกันเอาเอง

รีดเสร็จ โยนลงน้ำ ควรปล่อยให้กระดาษมันปล่อย แล้วเอานิ้วถูให้มันลอกออกมานะครับ ซึ่งกระดาษ glossy ลอกง่ายกว่า แผ่นมากครับ ไม่รู้ว่ามันออกแบบ มาไว้ทำ toner transfer เลยหรือป่าว

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

ผมได้ทดลองกัดลายวงจรดู ผมกัดขนาดเส้น 10 mil space 10mil ได้  จะเห็นได้จาก แผ่นวงจร Lilypad footprint คมมาก smt กัดลายออกมาได้ละเอียดดี


พวก silk screen ก้อรีดได้เช่นกันครับ ดังที่เห็นตัวอย่างข้างต้นครับ  ขอให้สนุกกับการทำบอร์ดใช้เองนะครับ
หลังจากไม่ได้ update blog มานาน ถึงเวลาแอบมา update บ้างล่ะ

หลัง จากที่ฝันอยากได้ gps มานานแล้ว เนื่องด้วยราคามันแพง เหลือเกิน สมัยก่อนหลายปีที่แล้ว เอาแค่เล็กๆ บอกตำแหน่งได้ราคาเกือบหมื่นแล้ว ยิ่งมีจอสีบอกตำแหน่งได้ ราคาก้อฝันไปได้เลย จิงผมไม่ได้ อยากได้ function อะไรแบบนั้นหรอก อยากเอามาทำเป็นนาฬิกา sync เวลา ผ่านดาวเทียว atomic clock เลยนะครับ ฟังดูอย่างไงก้อหรูสักจริงๆ  ,เอามาทำ datalog บันทึกตำแหน่ง latitude, longitude เอามาใส่ google map ดูเส้นทางที่เดินไป เอาไปประยุกต์ อุปกรณ์ติดตามแฟนสาวได้ (เผื่อไว้ก่อน) เมกะโปรเจค มันช่างเยอะเหลือเกิน แต่ติดอยู่ที่ หา module มาเล่นไม่ได้เลย เสียดายเงิน

ด้วย ความโชคดีครับ ประกอบกับจังหวะที่ดี ผมหามาได้จากบ้านหม้อ รอจนบ้านหม้อมีขาย เลยมีเลยเอามาเล่น หาของเล่นตามฤดูกาลครับ ราคาจะไม่แพงมีเพื่อนเล่นด้วยเยอะ ฮ่าๆ gps module ที่หามาได้ ขายกับ สามตัวพันบาท

เอามาวางเทียบกับ sd-flash ตัวเท่าๆกันเลย เล็กมาก โดย chip ตัวนี้มาจาก samsung thailand โรงงานบ้านเรา ไม่ธรรมดานะครับ บอร์ดแบบนี้ ในไทยก้อทำได้

ส่วนที่ชอบนะครับ บอร์ดนี้มี เสา GPS แบบ Active Antenna เห็นเขาเรียกกันแบบนี้นะครับ มีเสาในตัวล่ะครับ โดย Chipset เป็นตระกลู SiRF StarIII รับดาวเทียมได้ 20 ดวง ก้อมีข้อดีครับ ทำเป็นอุปกรณ์ hand held เล็กๆ ได้สบายมาก แต่มันไม่มีเสา เวลารับสัญญาณ จะลำบากหน่อย อยู่ในตึก บางที่อาจจะหาตัวมันเองไม่เจอเลย

สเ๊ป๊กเต็มๆ หาอ่านที่ได้ที่นี้ครับ คิดว่าเป็นตัวใกล้เคียง
http://www.sparkfun.com/commerce/product_info.php?products_id=465

ก่อน จะไปถึง mega project ต่อๆไป เราต้องเข้าใจพื้นฐานมันก่อนครับ ระบบจีพีเอส คือระบบหาตำแหน่งอ้างอิงเทียบกับโลกโดยใช้ดาวเทียมบนฟ้าเป็นตัวระบุตำแหน่ง พิกัด (เส้นรุ้ง-เส้นแวง)
โดย วิธีคำนวน delay time จากการส่งสัญญาณระหว่างดาวเทียมกับตัวรับ ซึ่งต้องอาศัยดาวเทียมหลายๆดวง 4 ดวงขึ้นไป เพื่อมาคำนวนหาตำแหน่งที่แม่นยำ

เอาแบบละเอียด กว่านี้ เข้ามาดูที่นี้เลยครับ
http://th.wikipedia.org/wiki/GPS

โดย ตัว module ที่ได้มา จะทำหน้าที่ส่งสัญญาณกับดาวเทียมและส่งข้อมูลพิกัดมาให้แล้ว ซื่ึ่งเป็น format NMBA บอกตำแหน่งพิกัด กับข้อมูลเกี่ยวกับดาวเทียมเอาไปวัดความน่าเชื่อถือของข้อมูล (ทำไมมันช่างเต็มไปด้วยข้อมูลเทคนิดแบบนี้นะ) สรุปง่ายๆ มันมาตราฐานแล้ว เอามาต่อคอมได้เลยล่ะครับ จะได้ข้อมูลพิกัดมาเลยครับ ผมได้ลองเอาบอร์ดที่ทำไว้เป็น usb2serial มาต่อกับ module ดังรูปเป็น usb2serial แบบทำมือ handmade แบบจีนแดงไม่กล้าทำตาม


ใน ขั้นแรก ผมก้อหาโปรแกรมมาลองก่อน จากคำแนะนำจากเพื่อนๆใน เวป www.electoday.com ได้มาสองโปรแกรม u-center จาก u-blox กับ Mapking 2007

โปรแกรมแรก u-center


หาโหลตได้ที่นี้ครับ http://www.u-blox.com/products/u_center.html


อีก โปรแกรม MapKing2007 อันนี้สามารถเอาตำแหน่ง ไปแสดงบนแผนที่ พร้อมทั้งบันทึกตำแหน่ง เพื่อเอามา playback ได้อีกด้วย ดังรูปที่เห็น แสดงข้อมูลของตัวผมเองครับ

เริ่มต้นการทดลองโมดูลง่ายๆก่อน ต่อไปคงเอาไว้ศึกษาข้อมูล Format NMBA ก่อน
นี้เป็นตัวอย่างข้อมูลที่ได้มาครับ
อ่านออกแต่บรรทัดสุดท้าย วัน เวลา พิกัด อะไรต่อก้อไม่แน่ใจ

$GPGSA,A,1,22,18,09,,,,,,,,,,,,*1E
$GPGSV,3,1,12,18,45,016,23,09,44,043,30,22,27,330,28,21,77,179,21*7B
$GPGSV,3,2,12,24,38,149,25,14,36,283,17,06,21,215,25,30,20,154,21*74
$GPGSV,$GPGGA,114008.804,1339.7094,N,10028.2090,E,0,03,,27.4,M,-27.4,M,,0000*6F

ข้อมูลเต็มไปด้วยตัวเลข เดี่ยวหาข้อมูล มาแกะก่อน จะมาเล่าให้ฟังกันต่อไปครับ

AVR – Arduino ตอน ชนิดตัวแปร

AVR – Arduino ตอน ชนิดตัวแปร

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


ชนิดตัวแปรใน Arduino


ใน Arduino จะมีชนิดข้อมูลให้เลือกใช้ได้หลายตัว ซึ่งหากต้องการรู้เรื่องตัวข้อมูลแต่ละตัวก็สามารถเข้าไปใน Help แล้วดูที่ Data Types จากนั้นก็เลือกดู ชนิดตัวแปรที่ต้องการได้ครับ

void : ไม่มีค่า แต่จะใช้ในการเขียน ฟังก์ชั่น
boolean : เก็บเพียง 2 ค่า คือ TRUE และ FALSE
char : ข้อมูล 8 bit เก็บค่ารหัสตัวอักษร
unsigned char : ข้อมูล 8 bit เก็บจำนวนเต็มไม่คิดเครื่องหมาย 0 – 255 (แบบเดียวกับ Byte)
byte : ข้อมูล 8 bit เก็บจำนวนเต็มไม่คิดเครื่องหมาย 0 - 255
int : ข้อมูล 16 bit เก็บจำนวนเต็มคิดเครื่องหมาย 65536 ค่า คือ -32768 ถึง 32767
unsigned int : ข้อมูล 16 bit เก็บจำนวนเต็มไม่คิดเครื่องหมาย 65536 คือ 0 ถึง65535
word : ข้อมูล 16 bit เช่นเดียวกันกับ unsigned int
long : ข้อมูล 32 bit เก็บจำนวนเต็มคิดเครื่องหมาย 4294967296 ค่า คือ -2147483683 ถึง 4294967295
unsigned long : ข้อมูล 32 bit เก็บจำนวนเต็มไม่ คิดเครื่องหมาย 4294967296 ค่า คือ 0 ถึง 4294967295
float : ข้อมูลแบบเลขทศนิยม 32 บิต คิดเครื่องหมาย เก็บค่าได้ 3.4 E-38 ถึง 3.4 E +38
double : เก็บค่าแบบเดียวกับ Float แต่มีความละเอียดกว่า 2 เท่า คือ 1.7E+308
string : เป็นตัวแปรชนิดข้อความ หรือตัวอักษร
array : เป็นการเก็บข้อมูลหลายๆค่าไว้ในตัวแปรชื่อเดียวกัน

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

จากชนิดของตัวแปรดังกล่าวอาจจะแบ่งกลุ่มได้ คือ
boolean : เก็บเพียง 2 ค่า คือ TRUE และ FALSE
char และ String จะเก็บค่าอักษรและรหัสอักษร
byte , int , word , long , float , double จะเก็บค่าตัวเลข ซึ่งอาจจะใช้กำหนดค่าหรือในการคำนวณทางคณิตศาสตร์

array จะเก็บข้อมูลหลายๆ ค่า ให้อยู่ในชื่อตัวแปรตัวเดียวและสามารถเรียกค่าตัวแปรมาใช้งานได้ซึ่งจะทำให้ การเขียนโปรแกรมง่ายและสั้น เช่น การเขียนไฟวิ่ง หรือ โครงงานอักษรวิ่ง จะใช้ตัวแปรอะเรย์เป็นหลัก


เขียนเมื่อ 4 มิ.ย. 2554

Arduino จิ๋ว !! ทำเล่นเองได้

DuinoThumb : Arduino จิ๋ว !! ทำเล่นเองได้ ง่าย นิ๊ดส์ เดียว~

(update 30/05/2009)



หลังจากที่ออกแบบ PCB อเนกประสงค์ ที่เมื่อประกอบแล้ว สามารถนำ AVR ไปใช้ในโครงงานได้ ถึง 3 ประเภท เช่น
1. โครงงานที่เกี่ยวกับ AVR โดยตรง คือเอา AVR ไปพัฒนาเหมือนปกติทั่วไป
2. โครงงานที่จำลอง AVR เป็นอุปกรณ์ USB Device (AVR-USB) เช่น USB Keyboard, USB Mouse, USB to Serial Converter, USB Sensor ฯลฯ
3. โครงงานที่ใช้ AVR เป็น Arduino ซึ่งผมตั้งชื่อให้มันว่า "DuinoThumb" มาจาก (Ar)Duino + Thumb (หัวแม่มือ) นั่นเอง
วันนี้ผมจะพูดถึงเรื่องการทำ DuinoThumb เพื่อพัฒนากับโปรแกรม ในแบบฉบับ Arduino ครับ (^_^) 
ซึ่งหลังจากนี้ ผมจะเสนอวิธี และจุดต่อ Idea มากมายที่นำ DuinoThumb ไปใช้ ก็อยากจะให้คอยติดตามรับชมรับฟังนะครับ

DuinoThumb = Arduino Clone 
    DuinoThumb จะแตกต่างจาก Arduino ธรรมดา ตรงที่ "BootLoader" ครับ แรกเริ่มเดิมทีนั้น Arduino จะรับข้อมูลจาก Serial port เพื่อเอาโปรแกรมที่เขียนขึ้น ไปเขียนลงบริเวณ flash ของตัวมันเอง การกระทำเช่นนั้นจะต้องใช้ Serial Port เป็นหลัก แต่กาลเวลาต่อมาก็มีคนรวมเอา IC FTDI ทำการแปลง USB เป็น serial แล้วติดในตัว Arduino เลย ทำให้ไม่ต้องคอยหา port Serial อีกต่อไป (เพราะหลังๆ ยิ่งหาได้ยากมากขึ้น โดยเฉพาะ notebook)

    แต่การทำเช่นนั้นจะต้องมี IC FTDI ซึ่งมีราคาแพง (แพงกว่าตัว AVR เสียอีก) จึงมีคนหัวใส ที่ดัดแปลงโครงงานเครื่องโปรแกรม AVR (ที่ชื่อ USBasp) โดยเอาเฉพาะส่วน protocal USB มาเขียนใหม่ เป็น BootLoader อีกตัวหนึ่ง เพื่อใช้แทน Arduino BootlLader เดิมๆ ผลที่ได้ก็คือ ทำให้ AVR สามารถจำลองตัวเองเป็น USB Device ได้ ยิ่ง ไปกว่านั้น มันยังสามารถรับข้อมูลจาก USB เพื่อนำข้อมูลไปเขียน ณ บริเวณ พื้นที่ flash ซึ่งเหมือนกัน Arduino เดิมๆ ทุกประการ โดยเราจะเรียก BootLoader ตัวนี้ว่า USBaspLoader

สิ่ง ที่เกิดขึ้นก็คือ ตัว AVR เองนั้น เมื่อเสียบเข้ากับ PC ทาง port USB แล้วก็สามารถรับข้อมูลจาก PC ได้ทันที โดยไม่ต้องใช้ Chip FTDI แปลง USB เป็น Serial อีกต่อไป ทำให้ประหยัดทั้งเงินและค่า PCB ไปได้มาก และด้วยเหตุที่มันเป็นการดัดแปลงจากเครื่องโปรแกรมที่ชื่อ USBasp ผลที่ได้คือมันจึงสามารถติดต่อกับ Arduino เพื่อรับข้อมูลมาเขียนได้ ด้วย ข้อดีที่ตามมาคือ อุปกรณ์น้อยลง บอร์ดก็เล็กลง สามารถประดิษฐ์ หรือเพิ่มโอกาสในการไปรวมเพื่อทำผลิตภัณฑ์ได้หลากหลายมากขึ้น 

สำหรับคำว่าบอร์ดขนาดเล็กนั้น ก็จะมีขนาดประมาณ หัวแม่มือ นี่จึงเป็นที่มาของชื่อ "DuinoThumb"

และ เพราะว่าไม่ต้องหาสาย power เพราะใช้ไฟจาก USB , สาย serial RS232 ก็ไม่ต้องใช้ เพราะสามารถรับข้อมูลผ่าน USB ได้ สรุปคือเพียงเสียบ DuinoThumb เข้ากับช่อง USB ก็ช่วยลดความวุ่นวายในการพัฒนาก็ลงไปได้เยอะมากเลยทีเดียว


เริ่มประกอบบอร์ด
หัวใจหลักของงานนี้คือ มีบอร์ด PCB อเนกประสงค์ และ AVR เบอร์ ATmega8/168 แบบ SMD

(หน้าตา บอร์ดอเนกประสงค์ พระเอกของเราในงานนี้)

หลังจากนั้นก็เริ่มลงอุปกรณ์ จากเล็กๆ แบนๆ เตี้ยๆ ไปหาใหญ่ๆ สูงๆ ตามลำดับทั้งหน้าและหลัง รายละเอียดให้ดูจากหน้า PCB อเนกประสงค์ นะครับ ซึ่งเมื่อเสร็จแล้วจะได้บอร์ดที่มีรูปร่างลักษณะดังนี้

(หน้าตา บอร์ด DuinoThumb ที่ประกอบเสร็จแล้ว)
จาก นั้นเราต้องหาเครื่องโปรแกรม AVR และโปรแกรมที่ใช้ Burn (ซึ่งในที่นี้ ใช้โปรแกรม AvrOspII เป็นหลัก) แต่คุณจะใช้เครื่องอื่นๆ และโปรแกรมอื่นๆ ก็ตามสะดวก เพราะไม่ใช่ประเด็น หรือปัญหาครับ

การ ที่ AVR ธรรมดาจากโรงงาน จะกลายมาเป็น DuinoThumb ที่เก่งกาจได้นั้น เราต้อง Burn BootLoader ลงไปที่ตัวมันก่อน ซึ่ง BootLoader นั้นเราสามารถ Download มาศึกษาได้จาก http://www.obdev.at/products/vusb/usbasploader.html project นี้เป็น opensource แต่เพื่อความเป็น มาตราฐานเราใช้วิธี download มาแล้วเลือกเบอร์ที่ตรงกับเรา ในที่นี้ผมใช้ ATmega168 และ X'Tal 12Mhz เหตุที่ใช้ 12Mhz ไม่ใช้ 16Mhz เพราะโครงงานส่วนใหญ่ของ AVR-USB ที่ใช้ library ของ Obdev เดิมๆ นั้น ส่วนมากจะเป็น 12 Mhz ครับ ถ้าเราจะเปลี่ยนก็ไม่มีปัญหา แต่ต้องแก้ code ด้วย (แต่ผมใช้ 12Mhz เลยไม่มีปัญหาใดๆ ทั้งนี้ขึ้นอยู่กับแต่ละ project ด้วยนะครับ)

Burn Burn Burn และ Burn
ใน การ Burn นั้นก็ไม่มีอะไรมาก เริ่มจากเอาสาย ISP เสียบไปที่บอร์ด เปิดโปรแกรมที่ใช้ในการเบิร์น เลือก ไฟล์ .hex ที่ตรงกับเบอร์ AVR ของเรา แล้วกด burn แล้วรอ ก็เป็นอันเสร็จ การกระทำนี้ขึ้นอยู่กับแต่ละโปรแกรม
ด้วยนะครับว่าใช้โปรแกรมอะไร ซึ่งแต่ละโปรแกรมจะไม่เหมือนกัน แต่ในที่นี้ใช้โปรแกรม Avr-Osp II ครับ

ภาพหน้าจอการ burn BootLoader


1. กดปุ่ม Auto Detect เพื่อค้นหาเบอร์ MCU ที่ใช้แบบอัตโนมือ เอ๊ย อัตโนมัติ
2. กดปุ่ม Browse เพื่อค้นหา Firmware ที่ต้องการ (เลือกให้ตรงกับเบอร์ และ Xtal ของตัวเอง)
3. กดปุ่ม Program เพื่อ Burn แล้วรอสักครู่

เมื่อ burn เป็นที่เรียบร้อยแล้วต่อไปคือต้องตั้งค่า FuseBit ซึ่งต้องระวังให้มาก เพราะถ้าผิดพลาดบางที MCU จากเน่าได้
การตั้งค่าจาก Avr-Osp II นั้นง่ายมากเพียงกรอกข้อมูลแล้วกด Program ก็เสร็จทันที

การตั้งค่า FuseBit

1. เลือก Tab FustBit
2. กรอกข้อมูลที่จำเป็นตามเบอร์ MCU ในที่นี้เลือกใช้ ATmega168 จึงกรอกแบบนี้
3. กดปุ่ม Program แล้วรอจนเสร็จ

** สำหรับ AVR ATmega8 ใช้ค่า High Bit = C0, Low Bit = 9F
** สำหรับ AVR ATmega88/168 ใช้ค่า Ext = 00, High Bit = D6, Low Bit = DF


เพียงเท่านี้คุณก็สามารถได้ DuinoThumb มาใช้แล้ว !! จากนั้นก็เริ่มทดสอบกันเลย
แต่ เมื่อคุณ Burn เสร็จ อุปกรณ์ตัวนี้จะยังไม่สามารถใช้งานได้ทันที ถ้าคุณยังดันทุรังเสียบไป ก็มีแต่จะเกิด Error แบบค้นพบ Device แต่ไม่รู้จัก วันยันค่ำ
เนื่อง จาก firmware นั้นเขียนมาว่า การที่จะใช้โปรแกรม BootLoader ต้อง Jump ขา D7 ลง GND ก่อน แล้ว reset  จึงจะทำให้ PC ค้นหาอุปกรณ์ได้ ดังนั้นเราจึงต้อง Jump ขา สาย D7 ไปลง GND ให้ได้ ตามรูปนี้



จากนั้นก็กด reset ที่ตัวบอร์ด จะทำให้เครื่องค้นพบอุปกรณ์ที่ชื่อ USBasp แต่ไม่มี Driver ให้คุณทำการบอกที่อยู่ของ Driver แล้วติดตั้งมันซะก็เสร็จสิ้น
แก้ไข Arduino IDE
ที่ ผ่านมาข้างบนคือการประกอบ และการลง driver ครับ แต่ ........ แต่มันยังไม่จบแค่นั้น เพราะ Arduino เดิมๆ  มันไม่รองรับของอะไรแบบนี้ เราจึงต้องจัดการแก้ไขให้ Arduino รู้จัก DuinoThumb ก่อนครับ ด้วยการ
1. เปิดไฟล์ x:\_Path_\arduino-0015\hardware\boards.txt
2. เพิ่มบรรทัดพวกนี้เข้าไป แล้ว save ครับ
##############################################################

duinoThumb8.name=DuinoThumb8 12Mhz

duinoThumb8.upload.protocol=usbasp
duinoThumb8.upload.maximum_size=7168
duinoThumb8.upload.speed=19200

duinoThumb8.build.mcu=atmega8
duinoThumb8.build.f_cpu=12000000L
duinoThumb8.build.core=arduino

duinoThumb8.upload.disable_flushing=true

##############################################################

duinoThumb168.name=DuinoThumb168 12Mhz

duinoThumb168.upload.protocol=usbasp
duinoThumb168.upload.maximum_size=14336
duinoThumb168.upload.speed=19200

duinoThumb168.build.mcu=atmega168
duinoThumb168.build.f_cpu=12000000L
duinoThumb168.build.core=arduino

duinoThumb168.upload.disable_flushing=true

##############################################################

ทดสอบด้วยการพัฒนากับของจริง !!!
เมื่อ เราแก้ไขไฟล์ Board.txt แล้ว ก็เปิด Arduino IDE ขึ้นมาเลย ระหว่างตรวจดูว่า ขา D7 ของ DuinoThumb ได้ต่อลง GND แล้ว ให้กด Reset ที่บอร์ดเลยครับ เมื่อ Arduino IDE โหลดเสร็จแล้ว ก่อนอื่นเราต้องเลือก Board ที่เราพัฒนาให้ตรงกับบอร์ด DuinoThumb ก่อน (ดูตามรูป)

เลือกบอร์ดให้ตรงกับ DuinoThumb


- จากนั้นโหลดโปรแกรมที่ใช้ทดสอบ DuinoThumb
- compile  แล้วก็ upload มาที่ DuinoThumb
- เมื่อเสร็จแล้วจะเห็นไฟกระพริบที่บอร์ด DuinoThumb ครับ (^_^)

รายละเอียดเรื่องการเขียนโปรแกรม Arduino คงต้องศึกษาเพิ่มจากหนังสือ Arduino หรือไปที่ http://www.Arduino.cc

***สำหรับโปรแกรม, เอกสาร และไฟล์ที่จำเป็นสำหรับโครงงานนี้ สามารถดาวน์โหลดเพื่อไปศึกษาหรือทำเองได้จากหัวข้อด้านล่างนี้ครับ

ขอบคุณครับ
เป็นหนึ่ง (^_^)
หน้าเว็บย่อย (1): duinothumb files download