วันอาทิตย์ที่ 26 พฤษภาคม พ.ศ. 2556

การควบคุม Relay ด้วย Arduino


ในบางเมื่อเราต้องการควบคุมการเปิด/ปิดอุปกรณ์ต่างๆ เราสามารถนำ relay มาใช้งานร่วมกับ arduino เพื่อควบคุมอุปกรณ์ต่างๆได้ โดยใช้ arduino สั่งงานผ่าน relay ให้เปิด/ปิด contact โดยเราสามารถนำตัวอย่างต่อไปนี้ ไปประยุกต์ใช้งานได้ตามต้องการ
วงจร Relay
ในที่นี้เราจะใช้วงจร relay ที่ต้องการไฟเลี้ยง 5 V. เพื่อความง่ายเนื่องจาก บอร์ด arduino ก็ใช้ไฟเลี้ยงขนาดเดียวกัน โดยขอให้ประกอบวงจรตามรูปข้างล่าง เนื่องจาก relay มีความต้องการใช้ไฟเลี้ยงขนาดสูงกว่า 30 mA. ซึ่งตัวไมโครคอนโทรลเลอร์เองไม่สามารถจ่ายไฟเลี้ยงขนาดมากนี้ได้หรืออาจเพียงพอแต่อาจทำให้เสียเร็ว ดังนั้นเราจึงควรสร้างวงจรดังรูป เพื่อให้ relay ดึงไฟเลี้ยงจากภาคจ่ายไฟโดยตรงแทน

โปรแกรม
เราสามารถใช้โปรแกรม Blink ที่มาพร้อมกับ IDE ได้เลย โดยเลือกขา output ให้ตรงกับวงจรตามรูปเท่านั้น
void setup() {
// initialize the digital pin as an output.
// Pin 13 has an LED connected on most Arduino boards:
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH); // set the LED on
delay(1000); // wait for a second
digitalWrite(13, LOW); // set the LED off
delay(1000); // wait for a second
}

วิดีโอ แสดง การทำงาน

การสร้างบอร์ด Arduino ด้วยตนเอง


Bare Bone Arduino
Bare Bone Arduino คือ บอร์ด Arduino ที่มีอุปกรณ์ที่จำเป็นน้อยที่สุด ส่วนมากใช้เป็นพื้นฐานเพื่อพัฒนาอุปกรณ์ที่สร้างเอง โดยอาจมีการต่อเชื่อมกับ Module อื่นๆได้ ซึ่งผมได้ทำขึ้นมาตามรูปดังนี้

Bare Bone Arduino 1

Bare Bone Arduino 2

Bare Bone Arduino 3

เนื่องจากผมสร้างจาก PCB แบบหน้าเดียวเพื่อลดความยุ่งยาก จึงต้องมีการเชื่อมต่อระหว่างจุดด้วยสายไฟบ้างเล็กน้อยตามรูป หากท่านใดต้องการแบบไฟล์เพื่อไปทำแผ่น PCB เอง สามารถดาวโหลดได้จาก ที่นี่ โดยแบบ PCB นี้เป็นแบบด้านทองแดงแล้วนะครับ สามารถนำไปทำแผ่น PCB ได้เลยโดยไม่ต้องกลับด้านของรูปอีก ส่วนไฟเลี่้ยงที่สามารถใช้กับบอร์ดนี้จะต้องมีขนาด 7 - 12 V นะครับ จากรูปเราจะเห็นว่าผมได้เตรียม connector สำหรับ ICSP ไว้ใช้ในการ Upload program เข้าบอร์ดไว้ด้วยแล้ว
หากท่านใดสนใจซื้ออุปกรณ์ที่ใช้ในตัวอย่างนี้ สามารถดูได้ที่ 

การใช้งาน Bare Bone Arduino
เนื่องจาก Bare Bone Arduino ไม่มีส่วนเชื่อมต่อกับ Computer ดังนั้นเราจะต้องใช้อุปกรณ์พิเศษ เพื่อทำการ Upload Program เข้าสู่บอร์ด ซึ่งอาจทำได้หลายวิธี ได้แก่ 
1. USBASP ซึ่งเป็นอุปกรณ์ที่สามารถทำงานผ่าน ICSP ได้โดยตรง

USBASP
แต่เนื่องจากอุปกรณ์นี้มีขั้ว 10 ขั้ว ดังนั้นจึงต้องใช้ตัวแปลงดังรูป

Adpator
2. USB to Serial ซึ่งทำงานผ่านทาง Serial port ของตัว Atmega chip

usb2serial
3. อุปกรณ์อื่นอีก เช่น USBTiny เป็นต้น
 
ข้อดี - ข้อเสีย การเลือกใช้อุปกรณ์ในการ Upload Program
1. USBASP
ข้อดี
- ใช้งานง่าย
- ไม่ต้องการ Bootloader ทำให้ขนาดข้อมูลที่ใช้มีขนาดลดลง สามารถใช้พื้นที่ใน Chip ได้มากขึ้น
- ใช้เป็นไฟเลี้ยงให้บอร์ดได้
ข้อเสีย
- มีราคาแพงกว่า USB to Serial (ไม่มากนัก)
- ไม่สามารถใช้อ่านข้อมูล Serial Port ได้
2. USB to Serial
ข้อดี
- ราคาถูกกว่าเล็กน้อย
- ใช้อ่านข้อมูล Serial Port ได้
- ใช้เป็นไฟเลี้ยงให้บอร์ดได้
ข้อเสีย
- ใช้งานยุ่งยากกว่าเล็กน้อย
- Atmega Chip จำเป็นต้องมี Bootloader ทำให้มีพื้นที่ใช้งานลดลง 1.5 KB

ตัวอย่างการ Upload Program โดยใช้ USB to Serial 
ให้ต่อสายจาก USB to Serial ไปที่บอร์ดดังนี้

USB to Serial                  Bare Bone Arduino
+5 V                               +5 V หรือ pin 2 ของ ICSP
GND                                GND หรือ pin 6 ของ ICSP
Tx                                   Rx
Rx                                   Tx

เริ่มต้น ขอให้กดปุ่ม Reset บนบอร์ดค้างไว้ จากนั้นให้เรา click  Upload ใน Arduino IDE เมื่อโปรแกรม compile เสร็จจะเปลี่ยนข้อความเป็น Uploading ให้เรารอประมาณ 1 - 3 วินาที แล้วจึงปล่อยปุ่ม Reset 

Arduino: การสั่งงานผ่าน Android โดยใช้ ADK


ADK (Android Open Accessory Development Kit) คือ เครื่องมือที่ใช้ในการเชื่อมต่อระหว่าง Arduino และ Android (รุ่น 2.3.4+) ทาง Google ได้เลือก Arduino ให้เป็นอุปกรณ์ที่ใช้เชื่อมต่อกับอุปกรณ์ Android ผ่านทาง USB Host เพื่อใช้ในการสั่งงานหรืออ่านค่าจาก Android ได้ ซึ่งเป็นเพิ่มขยายขีดความสามารถให้กับอุปกรณ์ทั้ง 2 ชนิดคือไมโครคอนโทรลเลอร์และมือถือหรือ Tablet ที่มี Android เป็น OS นั่นเอง
ติดตั้ง ADK Demo Kit บน Android
ใช้อุปกรณ์มือถือหรือ Tablet เพื่อเข้าไปยัง Android Market แล้วค้นหาด้วยคำว่า "ADK" จากนั้นให้ติดตั้งโปรแกรมที่ชื่อ Standard Android ADK Demo Kit หาถ้าไม่เจอแสดงว่าอุปกรณ์ของเราไม่สนับสนุนโปรแกรมที่มีอยู่ใน Market เช่นใช้ Android รุ่นที่ต่ำกว่า 2.3.4 หรืออาจเป็นรุ่น 4.0 ซึ่งปัจจุบันยังไม่มีคนทำออกมาให้ดาวโหลดใน Market
โปรแกรมบน Arduino ADK
ขอให้เปิดโปรแกรม Arduino (ขอให้ใช้ รุ่น 0023 นะครับ อย่าใช้รุ่น 1.0 เพราะอาจใช้งานไม่ได้) ขึ้นมาแล้วเขียนโค๊ดดังนี้
#include <Max3421e.h>
#include <Usb.h>
#include <AndroidAccessory.h>
#define LED1_RED 13 // use pin 13 to display analog value
AndroidAccessory acc("Google, Inc.",
    "DemoKit",
    "DemoKit Arduino Board",
    "1.0",
    "http://www.android.com",
    "0000000012345678");
boolean flagval = true;

void setup()
{
    Serial.begin(115200);
    pinMode(LED1_RED, OUTPUT);
    Serial.print("\r\nStart");
    acc.powerOn();
}
void loop()
{
    byte msg[3];
    if (acc.isConnected()) {
        if (flagval) {
            Serial.println("Accessory connected. ");
            int len = acc.read(msg, sizeof(msg), 1);
            Serial.print("Message length: ");
            Serial.println(len, DEC);
            flagval = false;
        }
        int len = acc.read(msg, sizeof(msg), 1);
        if (msg[0] == 0x2) {
            if (msg[1] == 0x0)
            analogWrite(LED1_RED, msg[2]);
        }
    }
    delay(400);
/*
Delay time shall be long enough to make sure Android can detect USB Host.
For my HTC Desire, this value shall not less than 400 ms.
*/
}

จากนั้น Upload ไปที่บอร์ด(บอร์ดจะต้องรองรับ ADK) แล้วจะได้ผลดังวิดิโอ

Arduino: การรับค่าอนาล็อก

จากตัวอย่างก่อนหน้านี้ที่แสดงการเปิด-ปิดไฟ ซึ่งเป็นลักษณะของสัญญาณดิจิตอล คือเป็นการแสดงค่า 0-1 หรือ เปิด-ปิด หรือ 5-0 โวล์ ในตัวอย่างนี้จะแสดงการส่งค่าที่มีค่าต่างๆนอกเหนือจาก 0-1 กล่าวคือเราจะส่งเป็นแบบอนาล็อกนั่นเอง โดยปกติแล้วไมโครคอนโทรเลอร์หรือคอมพิวเตอร์ จะไม่สามารถส่งค่าแบบอนาล็อกได้ เพราะว่ามันรู้จักค่าดิจิตอลเท่านั้น ดังนั้นถ้าเราต้องการส่งค่าเป็นแบบอนาล็อก เราจะต้องใช้เทคนิคที่เรียกว่า PWM(Pulse Width Modulation)
PWM คืออะไร
PWM จะใช้หลักการที่ส่งค่าแบบดิจิตอลคือ 0-1 ด้วยความถี่ค่าหนึ่ง แต่จะส่งค่าให้มีสัญญาณสูง(1)สลับกับสัญญาณต่ำ(0) โดยให้ระยะเวลาของแต่ละชนิดสัญญาณต่างกัน เพื่อให้ค่าเฉลี่ยของสัญญาณทั้งหมดออกมาเป็นค่าที่ต้องการนั่นเอง เช่นถ้าเราส่งค่าที่มีระยะสัญญาณสูงและต่ำเท่ากัน ก็จะได้ค่าเป็น 2.5 โวล์ ถ้าเราให้ค่าสัญญาณสูงยาวกว่า เราก็จะได้ค่ามากกว่า 2.5 และในทำนองเดียวกันถ้าเราให้ค่าสัญญาณต่ำยาวกว่า เราก็จะได้ค่าเฉลี่ยน้อยกว่า 2.5 นั่นเอง Arduino สามารถรับค่าอนาล็อคได้ 255 ระดับ ดังนั้นหมายความว่าค่าสัญญาณ 0 โวล์ถึง 5 โวล์ ก็จะแสดงได้เป็น 0 ถึง 255 ในสัญญาณดิจิตอลนั่นเอง โดยเราสามารถใช้หลักบัญญัติไตรยางค์ สามารถเปรียบเทียบค่าได้เลย ในการใช้งาน PWM เราจะต้องเลือกขาที่เขียนว่าเป็น PWM เท่านั้น จะใช้ขาอื่นไม่ได้ เพราะบอร์ดไม่ได้รองรับ และจำนวนขาที่เป็น PWM ก็จะมีไม่เท่ากัน ขึ้นกับรุ่นของบอร์ดที่เราใช้งาน

ตัวอย่างไฟสว่าง
ขอให้เปิดโปรแกรม Arduino ขึ้นมาแล้วเขียนโค๊ดดังนี้
int i;
void setup() {
// initialize the digital pin as an output.
// Pin 13 has an LED connected on most Arduino boards
pinMode(13, OUTPUT);
}
void loop() {
for (i=1; i<256; i++){
analogWrite(13, i);
delay(20);
}
for (i=255; i>=0; i--){
analogWrite(13, i);
delay(20);
}
}

จากนั้น Upload ไปที่บอร์ด แล้วจะได้ผลดังวิดิโอ

Arduino: การแสดงข้อความ โดยใช้ LCD1602


LCD1602 คือ อุปกรณ์แสดงผลโดยใช้จอชนิด LCD ซึ่งสามารถแสดงผลข้อความได้แถวละ 16 ตัวอักษรและแสดงได้ 2 แถว เป็นอุปกรณ์มาตรฐานที่สามารถหาซื้อได้ทั่วไป โดยอุปกรณ์นี้มีจำนวนขาทั้งหมด 16 ขาและมีรายละเอียดการใช้งานดังรูป
LCD1602
การประกอบอุปกรณ์
-ภาคจ่ายไฟ
    ให้ต่อไฟเลี้ยงและกราวด์ จากบอร์ดไปเข้า LCD ที่ขา 2 และ 1 ตามลำดับ และให้นำสายทั้ง 2 ไปต่อกับความต้านทานปรับค่าได้ที่ขาด้านนอกทั้ง 2 ด้าน จากนั้นให้นำขากลางของความต้านทานปรับค่าได้ ไปต่อกับขา 3 ของ LCD ซึ่งส่วนนี้จะเป็นการปรับค่า Contrast ของจอ LCD โดยใช้ความต้านทานปรับค่าได้ขนาด 10K หรือ 20K ก็ได้
-ภาคสัญญาณ
    ให้ต่อสายไฟ 4 เส้น จาก LCD ขา 11, 12, 13 และ 14 ไปที่บอร์ดขาดิจิตอล 5, 4, 3 และ 2 ตามลำดับ
-ไฟ Backlight
    ให้ต่อสายไฟ จาก LCD ขา 15, 16 ไปที่บอร์ดขา 13 และ Gnd ตามลำดับ ถ้าเราไม่ต้องการไฟ Backlight ก็ให้ข้ามขั้นตอนนี้ไป

diagram

โปรแกรมบน Arduino ADK
ขอให้เปิดโปรแกรม Arduino  ขึ้นมาแล้วเขียนโค๊ดดังนี้
#include <LiquidCrystal.h>

// LiquidCrystal display with:
// rs on pin 12
// rw on pin 11
// enable on pin 10
// d4, d5, d6, d7 on pins 5, 4, 3, 2
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
int backLight = 13;    // pin 13 will control the backlight
int num = 0;
void setup()
{
  pinMode(backLight, OUTPUT);
  digitalWrite(backLight, 0); // turn backlight on. Replace 'HIGH' with 'LOW' to turn it off.
  lcd.begin(16,2);              // columns, rows.  use 16,2 for a 16x2 LCD, etc.
  lcd.clear();                  // start with a blank screen
  lcd.setCursor(0,0);           // set cursor to column 0, row 0 (the first row)
  lcd.print("Hello, Arduino");    // change this text to whatever you like. keep it clean.
  lcd.setCursor(0,1);           // set cursor to column 0, row 1
  lcd.print("ThaiNetBeans.com");
}

void loop()
{
  if(num == 0) {
    num = 1;
    digitalWrite(13, 0);  //backlight off
    delay(7000);
  } else {
    num = 0;
    digitalWrite(13, 1);  //backlight on
     
    for (int positionCounter = 0; positionCounter < 16; positionCounter++) {
    // scroll one position left:
      lcd.scrollDisplayLeft();
    // wait a bit:
      delay(200);
    }
 
    for (int positionCounter = 0; positionCounter < 32; positionCounter++) {
    // scroll one position right:
      lcd.scrollDisplayRight();
    // wait a bit:
      delay(200);
    }
     
    for (int positionCounter = 0; positionCounter < 16; positionCounter++) {
    // scroll one position left:
      lcd.scrollDisplayLeft();
    // wait a bit:
      delay(200);
    }
    delay(3000);
  }
}


จากนั้น Upload ไปที่บอร์ด แล้วจะได้ผลดังวิดิโอ

พื้นฐานไมโครคอนโทรลเลอร์ด้วย Arduino


ไมโครคอนโทรลเลอร์คืออะไร
ไมโครคอนโทรลเลอร์ คือ อุปกรณ์ที่มีหน่วยประมวลผลและความจำขนาดเล็กภายในตัวเอง สามารถรับ-ส่ง ข้อมูลได้ทั้งแบบดิจิตอลและอนาล็อก ใช้พลังงานน้อย ทำให้เป็นที่นิยมในการใช้งานในรูปแบบที่เรียกว่า Embedded เช่น เครื่องใช้ไฟ้าอัจฉริยะทั้งหลาย
Arduino คืออะไร
Arduino (อ่านว่า อา-ดู-อิ-โน่ หรือจะเรียกว่า อาดุยโน่ ก็ได้) คือ ไมโครคอนโทรลเลอร์ ชนิดหนึ่ง ซึ่งเป็นแบบที่เรียกว่า Open Hardware กล่าวคือ Arduino อุปกรณ์ที่มีแบบส่วนประกอบเป็นมาตรฐานที่เปิดเผย หมายความว่า เราสามารถทำเองโดยใช้แบบที่มีการเปิดเผยทั่วไปก็ได้ หรือสามารถซื้อหาได้ง่าย มีราคาถูก มีซ๊อพต์แวร์ให้ใช้งานฟรี สามารถนำไปใช้งานทั่วไปหรือแบบธุรกิจได้โดยไม่ต้องเสียค่าลิขสิทธิ์ เป็นรูปแบบที่มีข้อมูลมากที่สุดบนอินเตอร์เน็ต การพัฒนาก็ง่าย เพราะมีตัวอย่างมากมาย และไม่ต้องเขียนโปรแกรมในรูปแบบ Low Level หมายความว่า เราสามารถใช้คำสั่งเขียนโปรแกรมได้เสมือนโปรแกรมภาษาชั้นสูงทั่วไป
 
ดาวโหลดซ๊อพต์แวร์
สามารถดาวโหลดซ๊อพต์แวร์ได้ที่ http://arduino.cc/en/Main/Software โดยเราสามารถดาวโหลดได้ตาม OS ที่เราใช้ เช่น Windows, Linux หรือ Mac เมื่อดาวโหลดมาแล้ว ขอให้แตกไฟล์ไว้ในเครื่องของเรา จากนั้นให้ดับเบิ้ลคลิกไฟล์ arduino.exe (ถ้าเราใช้ Windows) ก็จะเปิดโปรแกรมดังรูป

ตัวอย่างไฟกระพริบ
โดยปกติแล้วบอร์ด Arduino ที่ซื้อมา มักจะมาพร้อมกับไฟ LED ที่ต่ออยู่กับขาหมายเลข 13 ของไมโครคอนโทรลเลอร์อยู่แล้ว ดังนั้นในตัวอย่างแรก เราจะใช้อุปกรณ์ที่มีอยู่แล้วมาใช้งาน โดยที่ไม่ต้องต่ออุปกรณ์ใดๆเลย เริ่มต้นขอให้ต่อสาย USB เข้ากับบอร์ดและต่อเข้ากับช่อง USB ในเครื่องคอมพิวเตอร์ จากนั้นให้รอจนเครื่องคอมพิวเตอร์พบอุปกรณ์ เราจะพบว่า บนเครื่องของเราจะมี Port เพิ่มขึ้นมา 1 พอร์ต ซึ่งก็คือพอร์ตที่เราจะใช้งานให้คอมพิวเตอร์คุยกับบอร์ดของคอนโทรลเลอร์นั่นเอง ในกรณีที่เครื่องคอมพิวเตอร์ไม่สามารถหาไดรเวอร์ได้ ขอให้ไปดาวโหลดไดรเวอร์ที่ http://www.ftdichip.com/FTDrivers.htm
โดยปกติแล้วบอร์ด Arduino จะต้องมีไฟเลี้ยง 5 โวลล์ แต่ถ้าเราต่อกับคอมพิวเตอร์ มันก็จะใช้ไฟเลี้ยงที่ออกจาก USB ได้เองทำให้สะดวกมาก จากนั้นขอให้เปิดโปรแกรม Arduino ขึ้นมา ไปที่เมนู Tools->Board จากนั้นให้เลือกรุ่นบอร์ดที่ตรงกับที่เราใช้งาน ในที่นี้ผมใช้ Arduino Mega ADK (หากท่านยังไม่มีสามารถซื้อได้ที่ http://www.thainetbeans.com/forum/viewtopic.php?t=1164) จากนั้นให้ไปที่เมนู Tools->Serial Port แล้วเลือกพอร์ตที่เพิ่มมาใหม่ ในกรณีที่ไม่แน่ใจ ให้ลองดึงสาย USB ที่ต่อออก แล้วลองต่อใหม่ ก็จะเห็นว่าเราใช้พอร์ตอะไรอยู่ จากนั้นให้ไปที่เมนู File->Examples->Basics->Blink หรือเขียนโปรแกรมตามนี้
void setup() {
// initialize the digital pin as an output.
// Pin 13 has an LED connected on most Arduino boards:
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH); // set the LED on
delay(1000); // wait for a second
digitalWrite(13, LOW); // set the LED off
delay(1000); // wait for a second
}

จากนั้นให้คลิกปุ่ม Upload บน Toolbar ดังรูป

รอสักครู่ เราจะเห็นไฟกระพิบถี่ๆ เป็นการแสดงว่าคอมพิวเตอร์กำลังส่งข้อมูลระหว่างบอร์ดอยู่ เมื่อเสร็จแล้วเราจะเห็นว่ามีไฟกระพริบเปิดและปิดทุกช่วงวินาที เราจะพบว่าตัวโปรแกรม(เราเรียกว่า sketch) นั้นมีขนาดเล็กมากและมีเพียง 2 ฟังชั่นเท่านั้น โดยฟังชั่นทั้ง2นั้น เป็นฟังชั่นพื้นฐานที่จะต้องมีเสมอ ฟังชั่น setup จะทำงานครั้งแรกเพียงครั้งเดียวหรือทุกครั้งที่เราเปิดเครื่องใหม่ ในที่นี้เราสั่งบอร์ดว่าเราจะใช้ขาที่ 13 สำหรับส่งข้อมูลออกไป ส่วนฟังชั่น loop จะทำงานวนไปตลอดไม่หยุด ในที่นี้ก็คือส่งค่าแบบดิจิตอลไปที่ขา 13 โดยมีค่าสูง(5 โวลล์) แล้วหยุดรอ 1 วินาที ทำให้ไฟ LED ติด จากนั้นจึงแบบดิจิตอลไปที่ขา 13 โดยมีค่าต่ำ(0 โวลล์) แล้วหยุดรอ 1 วินาที ทำให้ไฟ LED ดับ โดยฟังชั่น delay จะเป็นการสั่งให้บอร์ดหยุดรอโดยมีหน่วยเป็น millisecond