วันพฤหัสบดีที่ 28 สิงหาคม พ.ศ. 2557

การควบคุม หลอด RGB LED โดยใช้ปุ่มกด ด้วยการใช้ Arduino [RGB LED / PWM-based Dimming]

โจทย์ Warm up ทบทวน Arduino
และการเขียนโปรแกรมภาษา C/C++


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 ใหม่

จากโจทย์ดังกล่าวข้างต้น เป็นการทำงานโดยอาศัยการสร้างคลาสด้วยภาษา C++ มาสร้างเป็นไลบารี่ไว้ใช้งานในโปแกรม Arduino ซึ่งเป็นการเขียนโค้ดโดยใช้หลักการเชิงวัตถุหรือ O-op ซึ่งสะดวกต่อการใช้งาน และนำคลาสที่สร้างได้มาเป็นไลบารี่เพื่อใช้งานกับโปรแกรม Arduino 
      จากโจทย์สามารถแบ่งการทำงานของโค้ดได้ทั้งหมด 3 ส่วน คือ 
             - ไฟล์ .h ซึ่งเป็นไฟล์ที่ใช้สำหรับสร้างชื่อคลาส และชื่อเมธอดต่างๆ ภายในคลาสนั้นๆ
             - ไฟล์ .cpp ซึ่งเป็นไฟล์ที่ใช้สำหรับสร้างรายละเอียดการทำงานของคลาสและเมธอดต่างๆ ที่สร้างไว้แล้วในไฟล์ .h
             - ไฟล์ .ino ซึ่งเป็นไฟล์ที่ใช้สำหรับติดต่อและทำงานร่วมกันกับบอร์ด Arduino โดยใช้คำสั่งต่างๆ ทั้งจากไลบารี่ที่ตัวโปรแกรมมีอยู่แล้วและจากไลบารี่ที่สร้างขึ้นเอง


โค้ดการทำงานสำหรับโจทย์ข้อที่ 1


    ในส่วนแรกเป็นส่วนของไฟล์ .h จะเป็นการสร้างชื่อคลาสและชื่อเมธอดภายในคลาสนั้นๆ จากรูปด้านล่างเป็นเป็นโค้ดไฟล์ .h ที่สร้างมาใช้งานกับโจทย์ข้างต้น ซึ่งจะประกอบด้วย การประกาศคลาส RGB_LED() ซึ่งประกอบด้วย Constructor REB_LED ซึ่งมีอากิวเมนต์ 3 ตัว คือ red_pin, green_pin และ blue_pin ซึ่งเป็นค่าของการกำหนดขาให้กับขา R G และ B และการประกาศ method  3 method ที่ไว้ใช้สำหรับเซ็ตค่า DutyCycleให้กับขา red green และ blue ซึ่งก็คือ setRed() ,setGreen() และ setBlue()



     ต่อมาส่วนที่สองจะเป็นส่วนของไฟล์ .cpp จะเป็นการกำหนดรายละเอียดการทำงานของคลาสและmethod ต่างๆ ที่ได้สร้างไว้ในไฟล์ .h จากส่วนที่ 1 โดยมีรายละเอียดคือ ในส่วนของ constructor เป็นการเก็บค่า pin ของขาแต่ละขา โดยนำค่ามาเก็บใน array เพื่อสะดวกต่อการเรียกใช้งาน และมีการกำหนดค่า DutyCycle ให้กับ pin ใน method setRed(), setGreen() และsetBlue() โดยใช้คำสั่ง analogWrite


     และสุดท้ายเป็นส่วนของไฟล์ .ino ที่ใช้ในการติดต่อและทำงานร่วมกันกับบอร์ด Arduino ในส่วนนี้จะแบ่งการทำงานออกเป็น 2 ส่วนหลัก คือ void setup() และ void loop() โดย void setup() จะเป็นการตั้งค่าให้กับขาต่างๆ ดังภาพด้านล่าง ก็จะเป็นการกำหนด ขา 3,5 และ 7 ให้เป็นขา Input 


     ต่อมาเป็นการทำงานในส่วนของ void loop()  จะแบ่งเป็น 3 if ใหญ่ๆ แต่ละ if จะรับผิดชอบ 1 สี โดยแต่ละ if จะเริ่มจากการตรวจสอบว่าปุ่มไหนมีการกดหรือไม่ ถ้ามีการกดแสดงว่าค่าที่อ่านได้จากปุ่มนั้นคือ 0 จากนั้นให้วนลูป while ไปเรื่อยๆ จนกว่าจะมีการปล่อยปุ่ม แสดงว่าค่าลอจิกที่อ่านได้ก็จะมีค่าเป็น 1 จากนั้นก็จะให้เพิ่มค่า dutycycle ของสีที่มีการกดปุ่มขึ้น 8 ตามที่โจทย์ได้กำหนด แล้วนำค่าที่ได้ไปเป็นค่า argument ให้กับคำสั่งที่ใช้สำหรับกำหนดค่า output ให้กับ RGB LED(setRed, setGreen, setBlue) จากนั้นให้ break เพื่อออกจากลูป while เพราะเกิดการกดแล้วปล่อยที่ปุ่มกดเรียบร้อยแล้ว ดังรูปด้านล่าง









โค้ดการทำงานสำหรับโจทย์ข้อที่ 2

          โค้ดการทำงานของข้อนี้จะประกอบด้วยการทำงานของโค้ดทั้งหมด 3 ไฟล์ คือ .h, .cpp และ .ino โดยไฟล์ .cpp และ .ino จะใช้ไฟล์เดียวกับโจทย์การทดลองในข้อที่ 1 แต่ไฟล์ .ino จะมีการเปลี่ยนแปลงดังรูปด้านล่าง











         จากโค้ดข้างต้นจะมีการเปลี่ยนแปลงเฉพาะในส่วนของ void loop() ซึ่งจะแบ่งเป็น 3 if เหมือนเดิมคือ ส่วนของปุ่มกด R, G และ B การทำงานจะเริ่มจากเมื่อมีการกดปุ่มใดปุ่มใดปุ่มหนึ่งทำให้สถานะลอจิกของปุ่มนั้นเป็น 0 จากนั้นให้นับ delay 100 msec แล้วทำการบวกค่า Dutycycle เพิ่มขึ้น 8 วนไปเรื่อยๆ พร้อมกับการสั่งให้ไฟสีนั้นมี Dutycycle ตามที่กำหนด โดยแต่ละรอบจะมีการตรวจสอบว่าปุ่มที่ทำการกดอยู่ขณะนั้น ถูกปล่อยหรือยังถ้าปุ่มกดได้ถูกปล่อยแล้ว ก็จะหยุดการทำงานของการเพิ่มความเข้มสีนั้น โดยการ break ในส่วนของสีนั้นๆ ไป


การต่อวงจรสำหรับการควบคุม LED RGB ในโจทย์การทดลองข้อ 1 และข้อ 2




รูปแสดงแบบจำลองการต่อวงจร







                                         รูปแสดงการจำลองการต่อจร แบบ Schematic

  


รูปแสดงการต่อวงจรจริง


จากวงจรข้างต้นประกอบด้วย 2 ส่วน  คือ

      1. ส่วน Input จะรับมาจากผู้ใช้งาน ผ่านทางปุ่มกด ( Push Switch ) ซึ่งต่อแบบ Pull up (Active-low) ประกอบด้วย 3 ปุ่ม ที่เอาไว้เพิ่มค่า Dutycycle ของทั้ง 3 สีคือ R,G และ B
      2. ส่วน Output จะเป็นส่วนของการสั่งการให้ RGB LED แสดงค่า Dutycycle ตามที่ได้รับมาจากปุ่มกด Switch ซึ่ง RGB LED  ที่ใช้เป็นแบบ Common Cathode

RGB LED คืออะไร????

       RGB LED คือ หลอด LED ที่มี แม่สี ทั้งสามสี อยู่ในหลอดเดียวกัน และมี 4 ขา ได้แก่ 
  ขาของหลอดสีแดง กราวน์ เขียว น้ำเงิน ตามลำดับ ซึ่งทั้งสามสีจะผสมกันออกมากลายเป็นสีต่างๆ
ตามปริมาณแต่ละสีที่ใส่ค่าเข้าไป ซึ่งมีทั้งแบบ Common Anode และ Common Cathode  ซึ่งถ้าเป็น
แบบ Common Anode ขากราวน์ จะต่อกับไฟบวก แต่ถ้าเป็นแบบ Common Cathode ขากราวน์จะต่อกับ กราวน์


                           



ผลการทดสอบการทำงานจริง
ทำการวัดค่า กระแสที่ไหผ่านLED RGB และแรงดันที่ตกคร่อมแต่ละขา มีค่าดังนี้
แรงดันตกคร่อม สีแดง 0.224 V สีเขียว 0.35 V สีฟ้า 0.488 V และมีแรงดันอยู่ระหว่าง 
สีแดง 0.27mA - 8.36mA สีเขียว 0.19mA-5.86mA สีฟ้า 0.2mA  - 6.24mA


วิดิโอแสดงการทำงานจริงของโจทย์การทดลอง ข้อที่ 1


ผลการทดลองทดสอบ วัดกับเครื่อง oscilloscope ข้อที่ 1


วิดิโอแสดงการทำงานจริงของโจทย์การทดลองข้อที่ 2


ผลการทดลองทดสอบ วัดกับเครื่อง oscilloscope ข้อที่ 2


       สามารถดาวน์โหลดไฟล์ RGB_LED.zip เพื่อทดสอบการทำงานของโค้ดและวงจรได้ 


วันพุธที่ 20 สิงหาคม พ.ศ. 2557


ข้อมูลและการเปรียบเทียบเชิงเทคนิคของบอร์ด

Arduino Uno, Arduino Leonardo และ Arduino Mega 2560

   

Arduino

รูปจาก : http://fizz.kiersmcfarlane.com/wp-content/uploads/2014/02/arduino_logo1.png

            "Arduino is an open-source electronics prototyping platform based on flexible, easy-to-use hardware and software. It's intended for artists, designers, hobbyists, and anyone interested in creating interactive objects or environments."

           "อาดูยโน่ เป็นระบบที่ใช้ในการพัฒนาอุปกรณ์อิเล็กทรอนิกส์ต้นแบบ ซึ่งออกแบบให้ใช้งานง่ายทั้งฮาร์ดแวร์ และซอฟแวร์ กลุ่มเป้าหมายผู้ใช้งานอาดูยโน่ ได้แก่ ศิลปิน นักประดิษฐ์ นักออกแบบ ใช้ในงานอดิเรก หรือ ใครๆก็ตามที่สนใจในการประดิษฐ์นวัตกรรม งานสร้างสรรค์"

Arduino Uno

 รูปจาก : http://arduino.cc/en/Main/ArduinoBoardUno

        คำว่า "Uno" หมายถึง "One" ในภาษาอิตาลี ที่เปรียบเหมือนกับการเปิดตัว Arduino 1.0 Arduino Uno หรือ Arduino version 1.0 ยังถูกใช้เป็นรุ่นอ้างอิงสำหรับ Arduino รุ่นต่อๆ มา Arduino Uno เป็นรุ่นล่าสุดของ USB Arduino Board และใช้เป็นโมเดลอ้างอิงสำหรับ Arduino Platform         
        บอร์ดไมโครคอนโทรเลอร์ Arduino Uno เป็น Microcontroller board ที่ใช้ ATmega328 เป็น MCU หลัก ซึ่งตัวนี้จะมีขา Digital 14 ขา อินพุท/เอ้าพุท (สามารถทำเป็น PWM ได้ถึง 6 ขา) และมีขา Analog อินพุทได้อีก 6 ขา, รันที่ความถี่ 16 MHz มี USB Connector และ Power Jack DC ซึ่ง Concept ของ Arduino Board นี้ทำมาเพื่อความสะดวก ง่ายในการเชื่อมต่อเข้ากับคอมพิวเตอร์ สามารถต่อ USB เข้ากับช่องคอมพอร์ต ก็สามารถ Run โปรแกรมที่ Board ได้ เหมาะสำหรับผู้ที่กำลังเริ่มต้นเข้าสู่วงการอิเล็กทรอนิกส์อย่างแท้จริง Arduino Uno มีการป้องกันการเกินของกระแสไฟฟ้าที่จะเข้าไปสู่ USB Port ของคอมพิวเตอร์คุณได้ถึง 500 mA คุณสามารถใช้โปรแกรม Atmel's FLIP software (Windows) หรือ the DFU programmer (Mac OS X and Linux) สำหรับการ Program บน Arduino Uno Board

 รูปจาก : http://www.hackshed.co.uk/wp-content/uploads/2014/04/pinout.jpg

 

Arduino Leonardo

                       
 รูปจาก : http://arduino.cc/en/Main/ArduinoBoardLeonardo

        บอร์ดไมโครคอนโทรเลอร์ Arduino Leonardo มีการทำงานคล้ายกับบอร์ด Arduino Uno แต่มีการเปลี่ยน MCU ตัวใหม่เป็น ATmega32U4 บอร์ดนี้ความเร็วเท่ากับ UNO แต่ให้จำนวน input/ output port มากกว่า ซึ่งจุดเด่นของเบอร์นี้คือมี USB Controller ในตัว ทำให้การพัฒนาโปรแกรมสามารถดาวน์โหลดผ่านทางพอร์ต USB ของไมโครคอนโทรลเลอร์ ATmega32U4 ได้เลย ไม่ต้องมีชิพ USB TO SERIAL เช่น เบอร์ FT232RL เหมือนบอร์ดรุ่นก่อนหน้า 
 รูปจาก : http://o.lnwfile.com/_/o/_raw/q1/lu/nn.png



Arduino Mega 2560

รูปจาก : http://arduino.cc/en/Main/ArduinoBoardMega2560

       บอร์ดไมโครคอนโทรเลอร์ Arduino Mega 2560 เป็น Microcontroller board ที่ใช้ชิป ATmega2560  บอร์ด Mega สามารถใช้ร่วมกับ shield ที่ออกแบบมาสำหรับ Arduino Duemilanove หรือ Diecimila มี 54 pins digital I/O โดยที่มี 14 pins สามารถทำเป็น PWM เอาต์พุต มี 16 สำหรับ analog อินพุต มี 4 UARTs (serial ports) มี 16 MHz crystal oscillator ใช้การเชื่อมต่อด้วย USB มีต่อไฟเลี้ยงแบบแจ็ค มี ICSP hearder มี ปุ่ม reset รองรับงานไมโครคอนโทรเลอร์พื้นฐานเกือบทุกอย่าง เชื่อมต่อกับคอมพิวเดอร์สะดวกด้วยสาย USB สามารถต่อไฟเลี้ยงวได้โดยใช้แบตเตอรี่ หรือ อะแดปเตอร์ AC-to-DC

รูปจาก : http://arduino-info.wikispaces.com/file/view/Mega2-900.jpg/421499040/Mega2-900.jpg

 

ตารางการเปรียบเทียบเชิงเทคนิคของบอร์ด

Arduino Uno, Arduino Leonardo และ Arduino Mega 2560



      จากคุณสมบัติของบอร์ด Arduino ทั้ง 3 รุ่นข้างต้น ทำให้เห็นถึงความแตกต่างของแต่ละรุ่นที่มีลักษณะที่แตกต่างกัน เช่น ในส่วนของ Arduino Uno มี Digital I/O Pins 14 pin(of which 6 provide PWM output) , Analog Input Pins 6 pins และ Arduino Leonardo มี Digital I/O Pins 20 pins(of which 7 provide PWM output) , Analog Input Pins 12 pins ซึ่ง 2 รุ่นดังกล่าวต่างจาก Arduino Mega 2560 ที่เป็นตัวที่มีความโดดเด่นกว่าในเรื่องของการใช้งานในส่วน I/O ที่มากกว่า คือ มี Digital I/O Pins ถึง 54 pins (of which 15 provide PWM output) ,Analog Input Pins 16 pins เช่น งานที่ต้องการรับสัญญาณจาก Sensor หรือควบคุมมอเตอร์ Servo หลายๆ ตัว 
       บอร์ด Arduino Leonardo มีโมดูลพอร์ต USB มาด้วยบนชิป ซึ่งแตกต่างจากบอร์ด Arduino UNO และ Arduino Mega 2560 ที่ต้องใช้ชิป ATmega16U2 ร่วมกับ Atmega328 ในการเชื่อมต่อกับพอร์ต USB
        ในส่วนของหน่วยความจำแบบ Flash บอร์ด Arduino Mega 2560 มีหน่วยความจำแบบ Flash ที่มากกว่า อีก 2 รุ่น ทำให้สามารถเขียนโปรแกรมเข้าไปได้มากกว่า ซึ่งแน่น่อนว่าขนาดของ บอร์ดก็จะขยายใหญ่ขึ้นตามลำดับ นอกจากนี้ ราคาก็แพงตามขึ้นไปด้วย แต่หากจะหาตัวที่คุ้มยิ่งกว่าคุ้มคงต้องเลือกในส่วนของ Arduino Leonardo เนื่องจาก มี Digital I/O Pins 20 pin , PWM Channels 7 pin , Analog Input Channels 12 pin มาพร้อมกับราคาสบายกระเป๋า (อ้างอิงราคาตามเว็ป http://arduino.cc) แถมมาด้วยกับ library ที่ควบคุม mouse และ keybord แต่ในส่วนของ library บางตัว ของ Arduino Uno ก็ไม่สามารถใช้ร่วมกันได้ เนื่องจากใช้ MCU คนละเบอร์กันนันเอง ถือเป็นตัวเลือกหนึ่งที่น่าสนใจ แต่หากถามถึงการใช้งานกันอย่างแพร่หลายคงต้องยกให้กับ Arduino Uno ตัวแรกที่ส่งลงตลาด และที่สำคัญสิ่งที่ตามมาคือ การค้นคว้าหาข้อมูลง่าย เหมาะแก่ผู้เริ่มต้น เพราะ Library ที่มีแจกกันบน Github.com โดยมากก็ใช้กับ UNO ได้เลยโดยไม่ต้องมีการดัดแปลง




แหล่งอ้างอิง 

http://www.arduino.cc/
http://www.arduitronics.com/
http://www.arduinothaishop.com/
http://www.arduinomdt.blogspot.com/