Thursday, August 28, 2014

การทดลองใช้งานบอร์ด Arduino เพื่อควบคุมแสงจาก RGB Led

สวัสดีครับ วันนี้จะมานำเสนอผลการทดลองใช้งานบอร์ด Arduino เพื่อควบคุมแสงจาก Led แบบ RGB กันนะครับ ซึ่งโจทย์มีอยู่ว่า

1) จงเขียนโค้ดสำหรับ Arduino และวงจรที่ทำงานได้ตามข้อกำหนดต่อไปนี้ [RGB LED / PWM-based Dimming]

  • วงจรทำงานโดยใช้ระดับแรงดันสำหรับ I/O ที่ 5V เท่านั้น
  • มีปุ่มกด 3 ปุ่ม (ให้ชื่อว่า R, G, B) ทำงานแบบ Pull-up (active-low) ให้ต่อวงจรปุ่มกดเอง เพื่อใช้งานกับบอร์ด Arduino
  • มีเอาต์พุต 3 ขา ต่อกับวงจร RGB LED (จะใช้แบบ Common-Anode หรือ Common-Cathode ก็ได้) พร้อมตัวต้านทานจำกัดกระแส 3 ตัว
  • เขียนโค้ดด้วยภาษา C++ สำหรับ Arduino เพื่อสร้าง Class ที่มีชื่อว่า "RGB_LED"
  • กำหนดให้ constructor สำหรับคลาส RGB_LED เป็นดังนี้ RGB_LED( int red_pin, int_green_pin, int blue_pin ); โดยรับค่ามาเป็นหมายเลขของ I/O pins สำหรับ 3 ขาของ Arduino ที่จะถูกใช้งานเป็นเอาต์พุตแบบ PWM
  • มีเมธอดอย่างเช่นvoid setRed( int duty_cycle ), void setGreen( int duty_cycle ),void setBlue( int duty_cycle ) เพื่อใช้กำหนดค่า duty cycle ของขาเอาต์พุต PWM และใช้ในการกำหนดความสว่างของแต่ละสี ใช้คำสั่ง analogWrite() ในการกำหนดค่า
  • กำหนดสมาชิก instance members ตามความจำเป็น เช่น ค่า duty cycles สำหรับแต่ละสี
  • ใช้คลาสดังกล่าวในการเขียนโค้ด (สร้าง object จากคลาสดังกล่าวและเรียกใช้เมธอด) เพื่อสาธิตการทำงานร่วมกับฮาร์ดแวร์จริง
  • เมื่อกดปุ่ม R, G หรือ B แล้วปล่อยแต่ละครั้ง จะทำให้ค่า duty cycle ของสีดังกล่าวเพิ่มขึ้นทีละ 8 ถ้าค่า duty cycle เกิน 255 ให้วนกลับมาเริ่มที่ 0 ใหม่ (ค่าเริ่มต้นสำหรับ duty cycles เป็น 0)

2) เหมือนข้อ 1 แต่เปลี่ยนพฤติกรรมการกดปุ่ม: ถ้ากดปุ่ม R, G หรือ B ค้างไว้อย่างน้อย 100 msec จะเพิ่มค่าขึ้นทีละ 8 (แล้วเริ่มนับเวลาใหม่) ถ้าค่า duty cycle เกิน 255 ให้วนกลับมาเริ่มที่ 0 ใหม่


สำหรับอุปกรณ์ที่ใช้มีดังนี้

  • บอร์ด Arduino Uno (สามารถใช้รุ่นอื่นแทนได้)
  • RGB Led (Common Anode)
  • ปุ่มกด X3
  • ตัวต้านทาน 330 Ω X3 (ใช้กับ RGB Led)
  • ตัวต้านทาน 10 KΩ X3 (ใช้กับปุ่มกด)
  • Breadboard

ซอฟต์แวร์ที่ใช้

  • Arduino IDE
  • Fritzing
  • text editor หรือ IDE สำหรับเขียนภาษา C/C++


โดยวงจรนี้เป็นวงจรที่สามารถผสมแสงสีของ RGB Led ได้ด้วยการควบคุมความเข้มของแสงจากปุ่มกด ซึ่งจะเริ่มจากค่าความสว่างสูงสุดและค่อยๆ ลดลงเมื่อกดปุ่ม ซึ่งสามารถกดแยกเป็นสีๆ ได้ โดยจะกดแล้วปล่อยหรือกดค้างไว้ก็ได้ (เปลี่ยนระดับทุก 100 msec) พร้อมกันนั้นในส่วนของโค้ดโปรแกรมจะมีส่วนของการเรียกใช้งานคลาสของภาษา C++ อยู่ด้วย ซึ่งมีดังต่อไปนี้


RGB_LED.h

#ifndef RGB_LED_h
#define RGB_LED_h

#include "Arduino.h"


class RGB_LED{

     public:
             RGB_LED (int red_pin, int green_pin, int blue_pin);
             void setRed(int duty_cycle);
             void setGreen(int duty_cycle);
             void setBlue(int duty_cycle);
     private:
             int _red_pin;
             int _green_pin;
             int _blue_pin;
};
#endif


RGB_LED.cpp

#include "Arduino.h"
#include "RGB_LED.h"

RGB_LED::RGB_LED(int red_pin, int green_pin, int blue_pin)
{
     pinMode(red_pin, OUTPUT);
     pinMode(green_pin, OUTPUT);
     pinMode(blue_pin, OUTPUT);

     _red_pin = red_pin;
     _green_pin = green_pin;
     _blue_pin = blue_pin;
}

void RGB_LED::setRed(int duty_cycle)
{
     analogWrite(_red_pin, duty_cycle);
}

void RGB_LED::setGreen(int duty_cycle)
{
     analogWrite(_green_pin, duty_cycle);
}

void RGB_LED::setBlue(int duty_cycle)
{
     analogWrite(_blue_pin, duty_cycle);
}


ส่วนของโค้ด Arduino

rgbButtonWcpp.ino

#include "rgb_led .h"

const int R = 3;
const int G = 5;
const int B = 6;

// instance of class RGB_LED
RGB_LED rgbLed(11, 10, 9);

// 0 = brightiest, 255 = dimmiest
int dutyCycleR = 0;
int dutyCycleG = 0;
int dutyCycleB = 0;

void setup(){
     // Initialize button pin

     pinMode(R, INPUT);
     pinMode(G, INPUT);
     pinMode(B, INPUT);

     // Set Initiate duty cycle to 0
     rgbLed.setRed(dutyCycleR);
     rgbLed.setGreen(dutyCycleG);
     rgbLed.setBlue(dutyCycleB);
}

void loop(){

     // Red section
     if (isButtonPressed(R)){
          dutyCycleR = addDutyCycle(dutyCycleR);
          rgbLed.setRed(dutyCycleR);
          delay(100);
     }

     // Green section
     if (isButtonPressed(G)){
          dutyCycleG = addDutyCycle(dutyCycleG);
          rgbLed.setGreen(dutyCycleG);
          delay(100);
     }

     // Blue section
     if (isButtonPressed(B)){
          dutyCycleB = addDutyCycle(dutyCycleB);
          rgbLed.setBlue(dutyCycleB);
          delay(100);
     }
}

boolean isButtonPressed(int buttonPin){
     int buttonState = digitalRead(buttonPin);

     // check button press (active low)
     if (buttonState == LOW){
          return true;
     }
     else {
          return false;
     }
}

int addDutyCycle(int dutyCycle){
     // increase duty cycle for 8
     int dc = dutyCycle + 8;

     if (dc > 255){
          dc = 0;
     }
     return dc;
}



ภาพวงจรที่ออกแบบไว้โดยใช้โปรแกรม Fritzing


ภาพจากการทดลองจริง


รูปวงจรจริง



ขณะที่บอร์ดเริ่มต้นทำงานไฟจาก Led จะเป็นแสงสีขาวที่เกิดจากการผสมกันของแสงสามสี



เมื่อกดปุ่มลดระดับความเข้มของแสงสีแดงลงจะได้เป็นแสงสีเขียวอ่อน



แสงสีม่วงที่ได้จากแสงสีแดงผสมกับแสงสีน้ำเงิน



ตัวอย่างแสงสีฟ้าอ่อนสวยๆ


สำหรับ source code ทั้งหมดสามารถโหลดได้ ที่นี่ 

Thursday, August 21, 2014

Arduino Yun vs. Raspberry Pi Comparison

สวัสดีครับ วันนี้เราจะมาแนะนำให้สุดยอดบอร์ดไมโครคอนโทรลเลอร์มากความสามารถอย่าง Arduino Yun และ Raspberry Pi พร้อมเปรียบเทียบสเปกกันแบบชิ้นต่อชิ้นกันครับ มาดูกันว่าหน้าใหม่อย่าง Arduino Yun จะสู้กับรุ่นพี่ Raspberry Pi ได้หรือไม่

Arduino Yun
Arduino อ่านว่า (อา-ดู-อิ-โน่ หรือ อาดุยโน่) เป็นบอร์ดไมโครคอนโทรเลอร์ตระกูล AVR ที่มีการพัฒนาแบบ Open Source คือมีการเปิดเผยข้อมูลทั้งด้าน Hardware และ Software ตัว บอร์ด Arduino ถูกออกแบบมาให้ใช้งานได้ง่าย  โดยผู้ใช้สามารถต่ออุปกรณ์อิเล็กทรอนิคส์ต่างๆ จากภายนอกแล้วเชื่อมต่อเข้ามาที่ขา I/O ของบอร์ดได้
Arduino Yun เป็นบอร์ดคอมพิวเตอร์ไร้สายที่ผสาน Arduino เข้ากับ Linux  ผสมผสานระหว่าง Arduino Leonardo ซึ่งมีไมโครคอนโทรลเลอร์ ATmega32u4 8-bit ของ Atmel เข้ากับ Atheros AR9331 Wi-Fi system-on-chip (SoC) ที่มี Linino ซึ่งเป็น MIPS GNU/Linux variant of OpenWRT ฟีเจอร์หลักของบอร์ดใหม่ตัวนี้คือ Bridge library ซึ่งทำให้การประมวลเว็บเซอร์วิสอันซับซ้อนที่ใช้ฟอร์แมตแบบ verbose, RAM-intensive text-based อย่าง XML ทำได้ง่ายขึ้น ด้วยการรวมการเชื่อมโยงเครือข่ายทั้งหมดและการประมวลผล HTTP transactions มายัง SoC ที่ใช้ Linux
Arduino Yun มีคุณสมบัติเหมือนกับ Arduino Leonardo หลายอย่าง เช่น มี 14 digital input/output pins, 7 pulse width modulation (PWM) channels และ 12 analog inputs นอกจากนั้นยังมี 16MHz crystal oscillator และ microUSB connector รวมถึง Standard-A type USB connection และ PoE compatible microSD card socket เพื่อให้เก็บข้อมูลได้มากขึ้น เมื่อ Arduino Yun เริ่มทำงานครั้งแรกจะทำหน้าที่เป็นจุดเชื่อมต่อ Wi-Fi และสร้างเครือข่าย Wi-Fi ชื่อ “Arduino” ขึ้นมา จากนั้นผู้ใช้สามารถตั้งค่าบอร์ดตัวนี้ได้ด้วยการใส่ชื่อและรหัสผ่านของเครือข่าย Wi-Fi

Arduino Yun
แหล่งที่มา: http://arduino.cc/en/Main/ArduinoBoardYun

ภาพแสดง port ต่างๆของ Arduino Yun
แหล่งที่มา: http://arduino.cc/en/Main/ArduinoBoardYun


Raspberry Pi
Raspberry Pi เป็นบอร์ดคอมพิวเตอร์ที่มีขนาดประมาณบัตรเครดิต สามารถต่อเข้ากับจอมอนิเตอร์หรือทีวี พร้อมทั้งใช้กับคีย์บอร์ดและเมาส์มาตรฐานได้  Raspberry Pi เป็นอุปกรณ์ที่ใช้ในการคำนวณและเรียนรู้การเขียนโปรแกรมในภาษา Scratch และ Python นอกจากนี้ยังมีความสามารถที่สามารถทำได้ทุกอย่างตามที่ผู้ใช้ได้คาดหวังไว้ที่คอมพิวเตอร์เดสก์ทอปจะทำได้ ไม่ว่าจะเป็นการค้นหาข้อมูลจากอินเทอร์เน็ต การดูวีดิโอคุณภาพสูง การสร้างสเปรดชีท word-processing หรือแม้กระทั่งการเล่นเกม
นอกจากนี้ Raspberry Pi มีความสามารถในการโต้ตอบกับโลกภายนอกได้และได้ถูกนำมาใช้ในการสร้างโปรเจคเกี่ยวกับดิจิตอลอย่างกว้างขวาง เช่น การสร้างเครื่องฟังเพลงหรือทำเป็นอุปกรณ์ในการเล่นเพลง เช่นกลอง เป็นต้น นอกจากนี้ยังสามารถใช้ในการตรวจจับสภาพอากาศได้ และยังใช้ในการทำ tweeting birdhouse ด้วยกล้องอินฟาเรด
Raspberry Pi ใช้ชิปออนบอร์ด (System on a chip) ของ Broadcom BCM2835 ซึ่งใช้โปรเซสเซอร์ ARM1176JZF-S ขนาด 700 MHz, VideoCore IV GPU, เดิมทีมีแรม 256MB (Model A กับ Model B rev 1) แต่หลังจากที่ได้รับการอัพเกรด (ในโมเดล B และ โมเดล B+) ทำให้มีแรมขนาด 512 MB, ไม่มีฮาร์ดดิสก์หรือ solid-state drive ในตัวแต่ว่าได้ใช้ SD Card ในการบูต และใช้เป็นที่เก็บข้อมูลแบบถาวร สำหรับใน Model B+ จะใช้ Micro SD Card, สำหรับกำลังไฟฟ้าที่ใช้คือ 2.5W (Model A), 3.5 W (model B), 3.0 W (model B+) 

Raspberry Pi model A

Raspberry Pi model B
แหล่งที่มา: http://cdn3.pcadvisor.co.uk/cmsdata/features/3405229/Raspberry_Pi.jpg

Raspberry Pi model B+