วันพฤหัสบดีที่ 2 เมษายน พ.ศ. 2558

การทดลองใช้งานบอร์ด stm32f3 discovery กับ Blink LED

การเริ่มต้นการใช้งานบอร์ด stm32f3 discovery

       ก่อนอื่นเรามารู้จักกับบอร์ด stm32f3 discovery กันก่อน บอร์ด stm32f3 discovery เป็นชุดพัฒนา Microcontroller ขนาด 32-bit ของบริษัท ST ในตระกูล STM32 ARM CORTEX-M4 ในบอร์ดจะมีส่วนของ DOWNLOAD พร้อม DEBUG และส่วนของ MCU พร้อมอุปกรณ์ INPUT, OUTPUT ต่างๆ


บอร์ด stm32f3 discovery มีคุณสมบัติดังนี้

• ส่วนST-LINK/V2 ใช้สำหรับ DOWNLOAD ข้อมูลจาก PORT USB ของคอมพิวเตอร์, ขั้วต่อ SWD       สำหรับต่อภายในบอร์ดและต่อใช้งานออกนอกบอร์ด
• ส่วนใช้งานเป็น MCU เบอร์ STM32F303VCT6 ขนาด 256KB FLASH, 48KB RAM, LQFP 100 PIN
• ใช้ Power จากขั้วต่อ USB หรือจากไฟ DC ภายนอก 3V หรือ 5V
• มี Gyroscope แบบ 3-axis Digital เบอร์ L3GD20 ขง ST บนบอร์ด
• มี Accelertion SENSOR และ Magnetic Sensor เบอร์ LSM303DLHC ของ ST บนบอร์ด
• 8 LED แสดงสถานะการทำงานของ Gyroscope และ Accelertion ในแบบเข็มทิศอิเล็กทรอนิกส์
• ขั้วต่อใช้งานแบบ USB Mini ต่อกับคอมพิวเตอร์ 1 PORT และขั้วต่อใช้งานจาก MCU เป็นแบบ
   USB Mini 1 PORT
• ตัวบอร์ดทำเป็นขั้วต่อแบบ PIN HEADER ต่อใช้งานใต้ PCB ขนาด 25x2 PIN จำนวน 2 ชุด

การเริ่มต้นทดลองการใช้งานบอร์ด stm32f3 discovery ด้วยการทำ Blink LED

          การเริ่มต้นการทดลองทำไฟกระพริบหรือ Blink LED นี้จะใช้ LED ที่มีอยู่บนบอร์ดทดลอง
อุปกรณ์ : บอร์ด stm32f3 discovery, สาย USB TO 5P MINI
ซอฟต์แวร์ที่ใช้งาน : STM32CubeMX, CubeMx2EmBlocks, EmBlocks 2.30, st-link_v2_usbdriver

          เริ่มต้นที่การใช้งานโปรแกรม STM32CubeMX เป็นโปรแกรมที่ช่วยในการ Generate C Code ให้อัตโนมัติจากการตั้งค่าการใช้งานต่างๆ บนบอร์ดนั่นเอง โดยมีขั้นตอนการใช้งานดังนี้

          1. เปิดโปรแกรม STM32CubeMX จากนั้นเลือก New Project

          2. เลือกแถบเมนู Board Selector แล้วเลือกค่าต่างๆ ให้ตรงตามบอร์ดที่ใช้งาน และทำการกำหนดจำนวน pin LED(การทดลองนี้จะกำหนดจำนวน LED เท่ากับ 8 pin) ที่จะใช้งาน หลังจากนั้นกด Ok

          3. จะได้หน้าต่างดังภาพด้านล่าง ที่แสดงการใช้งานขาต่างๆ บนบอร์ด 

          4. จากนั้นเลือกไปที่แถบ Clock Configuration สำหรับหน้านี้สามารถเปลี่ยนค่า clock ที่ต้องการใช้ได้ตามต้องการ(การทดลองนี้จะกำหนด SYSCLK และ HCLK เป็น 48 MHz)


          5. เข้าที่เมนู Project แล้วเลือก Setting จะมีหน้าต่างปรากฎดังภาพ ทำการกำหนด Project Name, Project Location และเลือก Toolchain/IDE เป็น True Studio


          6. หลังจากทำการกำหนดค่าต่างๆ เรียบร้อยแล้ว ให้กดที่เมนูรูปเฟือง หรือ เข้าที่เมนู Project แล้วเลือก Generate Code โปรแกรมจะทำการ  Generate Code ภาษา C ออกมาให้อัติโนมัติ เมื่อสำเร็จจะขึ้นหน้าต่างดังภาพ ถือว่าสำเร็จในส่วนของการสร้างโปรเจคจากโปรแกรม STM32CubeMX

         ต่อไปเป็นการใช้งานโปรแกรม CubeMx2EmBlocks ซึ่งเป็นโปรแกรมสำหรับช่วยในการแปลง Project จาก STM32CubeMX ให้ได้เป็น Project ที่สามารถเปิดใช้งานในโปรแกรม EmBlocks ต่อไปได้

          1. เริ่มจากการเปิดโปรแกรม CubeMx2EmBlocks ขึ้นมา
          2. กดที่ปุ่ม Select Project Folder

          3. เลือกโฟลเดอร์โปรเจคที่ได้สร้างไว้จาก โปรแกรม STM32CubeMX ในตอนแรก จากนั้นกด Ok

          4. เมื่อสำเร็จจะขึ้นหน้าต่าง Success ปรากฎดังภาพ ถือว่าสำเร็จในส่วนของการแปลงโปรเจค จากนั้นก็จะได้ไฟล์ที่โปรแกรม EmBlocks สามารถเปิดใช้งานได้มา

         จากนั้นจะเป็นการใช้งานโปรแกรม EmBlocks ซึ่งเป็นโปรแกรมที่เอาไว้สำหรับเปิดใช้งานโปรเจคที่สร้างขึ้นมาจากขั้นตอนที่กล่าวมาทั้งหมด และยังเป็น Free C/C++ IDE อีกด้วย

          1. เริ่มจากการเปิดโปรแกรม EmBlocks แล้วกดที่ Open an existing project

          2. ทำการเลือกไฟล์โปรเจค EmBlocks ที่เป็น .ebp จากไฟล์โปรเจที่เราสร้างขึ้น

          3. ทำการเข้าไปที่ path ของ src และเปิด main.c จะเห็นว่าจะมีโค้ดภาษา C ที่โปรแกรม 
STM32CubeMX ได้ Generate ไว้ให้แล้ว ซึ่งจะมีโค้ดในการเปิดใช้งานพอร์ตต่างๆ การตั้งค่าสัญญาณ CLK และการกำหนดค่าเริ่มต้นต่างๆ 

          4. ทำการเขียนโค้ดการทำงานตามต้องการที่ While Loop โดยการทดลองนี้เป็นการทำไฟกระพริบ ซึ่งสามารถเขียนโค้ดได้ดังภาพ

          5. ตอนนี้โค้ดการทำงานก็พร้อมที่จะ Burn ลง บอร์ด จากนั้นทำการต่อบอร์ด STM32F3 Discovery เข้ากับคอมพิวเตอร์ และทำการลง Dirver ก่อน ซึ่งจะใช้ st-link_v2_usbdriver จากนั้นก็ทำให้คอมพิวเตอร์สามารถเชื่อมต่อกับบอร์ดได้ และเมื่อสำเร็จให้ทำการเข้าเมนู Build แล้วเลือก Build target

          6. เมื่อ Build Success ให้เข้าเมนู Debug แล้วเลือก Start/stop Debug Session จะทำการอัพโหลดโปรแกรมการทำงานลงบนบอร์ด เมื่อสำเร็จจะขึ้นหน้าต่าง Terminal มา ให้ทำการกดปุ่ม Reset บนบอร์ด จะทำให้เห็นผลการทดลองเป็นไฟ LED ทั้ง 8 ดวง บนบอร์กระพริบ ถือว่าประสบความสำเร็จในการทำ Blink LED บนบอร์ด STM32F3 Discovery

ผลการทดลอง Blink LED บนบอร์ด STM32F3 Discovery 



แหล่งอ้างอิง
          http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/PF254044
          http://www.ett.co.th/prod2012/STM32F3/STM32F3-DISCOVERY.html
          http://www.freertos.org/FreeRTOS-Plus/BSP_Solutions/st/STM32CubeMX.html
          http://www.emblocks.org/web/





วันพุธที่ 24 กันยายน พ.ศ. 2557

String Queue

Assignment IV

1) เขียนโค้ดสำหรับบอร์ด Arduino โดยสร้างเป็น C++ Class ดังต่อไปนี้
=> Class StringQueue เป็นโครงสร้างข้อมูลแบบ Queue สำหรับเก็บ String objects สร้างคลาส StringQueue และทดสอบการทำงานโดยใช้โค้ดตัวอย่างต่อไปนี้ และทดสอบโดยใช้ฮาร์ดแวร์จริง (ใช้บอร์ด Arduino และแสดงผลผ่าน Serial Monitor ของ Arduino IDE)

2) ใช้คลาส StringQueue ในข้อแรก นำมาเขียนโค้ด Arduino เพื่อให้มีพฤติกรรมการทำงานดังนี้ กำหนดให้มีความจุเช่น 10 ข้อความ
2.1) บอร์ด Arduino มีวงจรปุ่มกด Get ทำงานแบบ Active-Low (ใช้ตัวต้านทานแบบ Pull-up, 10k)
2.2) ผู้ใช้สามารถส่งข้อความ (ภาษาอังกฤษ) ทีละบรรทัด (ไม่เกิน 16 ตัวอักขระต่อบรรทัด) จากคอมพิวเตอร์ โดยส่งผ่าน Serial Monitor ของ Arduino IDE ไปยังบอร์ด Arduino ใช้ baudrate 115200
2.3) ข้อความแต่ละบรรทัดที่ถูกส่งไปยัง Arduino จะถูกจัดเก็บใน StringQueue ถ้าไม่เต็มความจุ แต่ถ้าเต็มความจุ ไม่สามารถเก็บข้อความใหม่ได้ Arduino จะต้องส่งข้อความ "Full" กลับมา และมี LED "Full" ติด
2.4) เมื่อมีการกดปุ่ม Get แล้วปล่อยหนึ่งครั้ง ข้อความแรก (ถ้ามี) ของ StringQueue จะถูกดึงออกมาแล้วส่งผ่าน Serial Monitor ไปยังคอมพิวเตอร์ และนำไปแสดงผลบนจอ 16x2 LCD ที่ต่อกับบอร์ด Arduino ด้วย แต่ถ้าไม่ข้อความใดๆ Arduino จะต้องส่งข้อความ "Empty" กลับมา เมื่อกดปุ่มแล้วปล่อย และให้มี LED "Empty" ติด
2.5) บรรทัดแรกของ LCD แสดงข้อความที่ถูกอ่านออกมาล่าสุดจาก StringQueue บรรทัดที่สอง ให้แสดงจำนวนข้อความที่มีอยู่ใน StackQueue ในขณะนั้น
2.6 16x2 LCD module สามารถยืมได้จากห้อง ESL และการเขียนโค้ดเพื่อใช้งาน LCD สามารถใช้ไลบรารี่ของ Arduino ได้

โค้ดการทำงาน
            จากโจทย์สามารถทำการทดลองได้ โค้ดการทำงาน 3 ไฟล์ คือ ไฟล์ StringQueue.h, StringQueue.cpp และ StringQueue.ino ดังนี้

   ส่วนที่ 1 StringQueue.h
        ในส่วนแรกนี้เป็นส่วนของ Header File ของการเก็บข้อมูล String ในรูปแบบของ Queue ในส่วนของไฟล์นี้ จะมีการสร้าง Class StringQueue ที่ประกอบด้วย Method ดังนี้



- StringQueue เป็น Constructor ของคลาสนี้ ซึ่งจะรับค่า Argument เป็น int ซึ่งเป็นค่าความจุของ StringQueue นี้
           
           - enqueue เป็น Method ที่รีเทิร์นค่าเป็น Boolean ที่ใช้สำหรับใส่ค่า String เข้าไปใน Queue จะรับ Argument เป็น String ที่ต้องการจะใส่
           
         - dequeue เป็น Method ที่รีเทิร์นค่าเป็น Boolean ที่ใช้สำหรับดึงค่า String ออกจาก Queue จะรับ Argument เป็น Address ของ String สำหรับเอาไว้เก็บค่า String ที่ต้องการจากก Queue ไปไว้ใน Address นั้น
      
      - size เป็น Method ที่รีเทิร์นค่าเป็น int ที่ใช้สำหรับตรวจสอบค่าปริมาณของข้อมูลที่มีอยู่ปัจจุบันภายใน Queue

        - isEmpty เป็น Method ที่รีเทิร์นค่าเป็น Boolean ที่ใช้สำหรับตรวจสอบว่า Queue นั้น ว่างเปล่าหรือไม่
          
            - isFull เป็น Method ที่รีเทิร์นค่าเป็น Boolean ที่ใช้สำหรับตรวจสอบว่า Queue นั้น เต็มหรือไม่


ส่วนที่ 2 StringQueue.cpp
            ส่วนที่ 2 นี้ เป็นไฟล์ .cpp ที่ใช้สำหรับใส่รายละเอียดการทำงานของ Method ต่างๆ ตามที่ไฟล์ .h ได้สร้างเอาไว้ โดยแต่ละ Method มีรายละเอียด ดังนี้

     
- StringQueue จะทำการกำหนดให้ String Pointer ชี้ไปที่ object ใหม่ ที่เป็น String Array ที่มีค่า capacity ของ Array เท่ากับค่า capacity ที่รับเข้ามา

         - enqueue        จะทำการตรวจสอบก่อนว่า String Queue ปัจจุบันนั้นเต็มหรือไม่ ถ้าไม่เต็ม จะไปกำหนดให้ค่าของ String Queue ในตำแหน่ง Address ของหางที่ว่างอยู่ มีค่าเท่ากับ String ที่รับเข้ามา และรีเทิร์นค่าเป็น True แต่ถ้า String Queue ปัจจุบันนั้นเต็ม แสดงว่าไม่สามารถ enqueue ได้ จะทำการรีเทิร์น False

          - dequeue จะทำการตรวจสอบก่อนว่า String Queue ปัจจุบันนั้นว่างหรือไม่ ถ้าไม่ว่างหรือมีข้อมูลอยู่ จะไปทำการกำหนดให้ค่าของ Address String ที่รับค่าเข้ามาชี้ไปที่ค่าของ String ในตำแหน่ง Address ที่เป็นหัวของ String Queue และรีเทิร์นค่าเป็น True แต่ถ้า String Queue ปัจจุบันนั้นว่าง แสดงว่าไม่มีข้อมูลอยู่ไม่สามารถ dequeue ได้ จะทำการรีเทิร์น False
            
         - size จะทำการรีเทิร์นค่า count ซึ่งเป็นตัวแปรที่เอาไว้นับจำนวนข้อมูลที่อยู่ใน Queue
         
        - isEmpty จะทำการตรวจสอบค่าตัวแปร count ซึ่งเป็นตัวนับจำนวนข้อมูลใน Queue ถ้ามีค่าเท่ากับ 0 แสดงว่าไม่มีข้อมูลอยู่ใน Queue หรือ Queue นั้นว่างนั่นเอง ก็จะให้รีเทิร์น True แต่ถ้าไม่เท่ากับ 0 แสดงว่ามีข้อมูลอยู่ใน Queue จะทำการรีเทิร์น False
      
         - isFull จะทำการตรวจสอบค่าตัวแปร count ซึ่งเป็นตัวนับจำนวนข้อมูลใน Queue ถ้ามีค่าเท่ากับ capacity แสดงว่า Queue นั้นเต็ม ก็จะให้รีเทิร์น True แต่ถ้าไม่เท่ากับ capacity แสดงว่า Queue ไม่เต็ม จะทำการรีเทิร์น False

    ในส่วนที่ 3  นี้เป็นส่วนของไฟล์ .ino ที่ใช้สำหรับกำหนดฟังก์ชันการทำงานต่างๆ ให้กับบอร์ด Arduino ดังนี้





      โค้ดส่วน เป็นส่วนของการ include library, การประกาศตัวแปร และการกำหนดค่าต่างๆ โดย library ที่ใช้มี 2 library คือ StringQueue ที่เราสร้างมาเอง และ LiquidCrystal ที่เป็น library ของการใช้งานจอ LCD 16x2 ต่อมาเป็นการประกาศตัวแปรต่างๆ จากนั้นเป็นส่วนของ void setup() มีการเปิด Serial port(115200) มีการกำหนดค่า Input และ Output ให้กับขา และมีการกำหนดค่าเริ่มต้นให้กับจอ lcd 16x2


   โค้ดส่วน เป็นส่วนของการอ่านค่าจาก Serial Port โดยจะให้เข้า while Loop เมื่อ Serial.available() มีค่ามากกว่า 0 คือ เมื่อผู้ใช้งานมีการป้อน Input ผ่านทาง Serial Port จะทำให้เข้า while loop นี้ จากนั้นจะทำการอ่านค่า input ที่รับมา ไม่เกิน 20 ตัวอักษา และใช้ฟังก์ชัน enqueue เป็นตัวเก็บข้อมูลที่รับเข้ามาไว้ใน String Queue และแสดงค่าที่รับเข้ามาได้ผ่านจอ LCD แต่ถ้า Queue เต็มแล้ว ก็จะให้แสดงคำ
แสดงคำว่า  "Full" และให้ไฟ LED สีแดงมีสถานะติด


โค้ดส่วน   C  เป็นส่วนของการตรวจสอบการกดปุ่มจากผู้ใช้งาน โดยถ้ามีการกดปุ่มแล้วปล่อยปุ่มกด จะมีการเรียกใช้ฟังก์ชัน dequeue สำหรับการดึงข้อมูลออกมาจาก String Queue โดยถ้า String Queue มีข้อมูลอยู่ภายในก็จะทำการดึงข้อมูลออกมา และแสดงผลผ่านทางจอ LCD ว่าได้ข้อมูลอะไรออกมา และแสดงจำนวนข้อมูลที่เหลืออยู่ภายใน String Queue ด้วย แต่ถ้า String Queue นั้นว่าง หรือ isEmpty ก็จะ
ให้หน้าจอ LCD แสดงคำว่า "Empty" และให้ไฟ LED สีเขียวมีสถานะติด

ภาพจำลองการต่อวงจรจริง





ภาพการต่อวงจรจริงและผลการทำงาน




ภาพแสดงการทำงานเมื่อเริ่มทำการอัพโหลดโค้ด Queue จะว่าง ทำให้ไฟสีเขียวติด


ภาพแสดงการทำงานเมื่อทำการป้อนคำว่า “embedded system” เข้าไปใน Queue



ภาพแสดงการทำงานเมื่อทำการป้อนค่าจน Queue เต็ม ทำให้ไฟสีแดงติด


ภาพแสดงการทำงานเมื่อทำการดึงค่าจาก Queue จนหมด ทำให้มีค่า Size เท่ากับ 0



ภาพแสดงการทำงานเมื่อทำการกดปุ่มเพื่อดึงค่าในขณะที่ Queue ทำให้แสดงคำว่า “Empty”


สามารถดูผลการทดสอบการทำงานได้จากลิงก์ http://youtu.be/8_68JHYp6yg
สามารถดาวน์โหลดโค้ดตัวอย่างได้จากลิงก์ : http://www.drop4shared.com/48909a23

วันพฤหัสบดีที่ 11 กันยายน พ.ศ. 2557

Assignment III

AssignmentIII


1. เขียนโค้ดสำหรับบอร์ด Arduino โดยสร้างเป็น C# class ดังต่อไปนี้    Class StringStack เป็นโครงสร้างข้อมูลแบบ Stack (กองซ้อน) สำหรับเก็บ String Object


การทำงานของโปรแกรมประกอบไปด้วย 3 ส่วน คือ StringStack.h StringStack.cpp และ StringStack.ino

ส่วนที่ 1 : StringStack.cpp เป็นส่วนที่เขียนลายละเอียดเกี่ยวกับคลาส และแต่ละ method ว่ามีการทำงานอย่างไร รวมถึงจะต้อง include ไฟล์.h ที่เป็น header 
     
       constructor เป็นส่วนที่ใช้กำหนดคุณสมบัติและกำหนดค่าเริ่มต้นของคลาส

method put : ถ้า Stack ยังไม่เต็ม จะนำค่าพารามิเตอร์ที่รับเข้ามา มาเก็บใน stack โดยมีตัวแปร pointer ชี้ที่อยู่ของแต่ละข้อมูล และเพิ่มค่า count ขึ้นอีก 1


method get : ถ้า Stack ยังมีข้อมูลอยู่ จะนำข้อมูลออกจาก stack ได้ โดยรับค่าที่อยู่ของพารามิเตอร์และเมื่อเรียก method get จะนำค่าบนสุดของ stack ไปเก็บไว้ใน ที่อยู่ที่ของพารามิเตอร์


method size : เป็นการ check ขนาดของ Stack ซึ่งเมื่อเรียก method นี้ จะรีเทิร์นจำนวนข้อมูลที่มีอยู่ใน Stack


method isEmpty : เป็นการ check ว่า Stack ว่างหรือไม่ โดย check จาก จำนวนของข้อมูลที่มีอยู่ใน Stack


method isFull : เป็นการ check ว่า Stack เต็มหรือไม่ โดย check จาก จำนวนของข้อมูลที่มีอยู่ใน Stack 




ส่วนที่ 2 :  StingStack.h เป็นส่วนของ Header ใช้กำหนดชื่อ class , method และ variable โดยยังไม่ได้ระบุถึงรายละเอียดต่างๆ ของ method


ส่วนที่ 3 : StringStack.ino เป็นส่วนโค้ดทดสอบการทำงานของ Class StringStack ที่ได้สร้างไว้

เริ่มต้นด้วยการ สร้าง object st จาก class StringStack 




สามารถ Download ตัวอย่าง Code ข้อ 1 ได้ที่นี้

2) ใช้คลาส StringStack ในข้อแรก นำมาเขียนโค้ด Arduino เพื่อให้มีพฤติกรรมการทำงานดังนี้
2.1) บอร์ด Arduino มีวงจรปุ่มกด Get ทำงานแบบ Active-Low (ใช้ตัวต้านทานแบบ Pull-up, 10k)
2.2) ผู้ใช้สามารถส่งข้อความ (ภาษาอังกฤษ) ทีละบรรทัด (ไม่เกิน 20 ตัวอักขระต่อบรรทัด) จากคอมพิวเตอร์ โดยส่งผ่าน Serial Monitor ของ Arduino IDE ไปยังบอร์ด Arduino
2.3) ข้อความแต่ละบรรทัดที่ถูกส่งไปยัง Arduino จะถูกจัดเก็บใน StringStack (เก็บบนกองซ้อน) ถ้าไม่เต็มความจุ แต่ถ้าเต็มความจุ ไม่สามารถเก็บข้อความใหม่ได้ Arduino จะต้องส่งข้อความ "Full" กลับมา
2.4) เมื่อมีการกดปุ่ม Get แล้วปล่อยหนึ่งครั้ง ข้อความบนสุด (ถ้ามี) ของ StringStack จะถูกดึงออกมาแล้วส่งผ่าน Serial Monitor ไปยังคอมพิวเตอร์
แต่ถ้าไม่ข้อความใดๆ Arduino จะต้องส่งข้อความ "Empty" กลับมา เมื่อกดปุ่มแล้วปล่อย


รูปโค้ดการทำงานของไฟล์ .ino ส่วนที่ 1 

       โค้ดในส่วนแรกนี้เป็นส่วนของการกำหนดตัวแปร และ setup ค่าต่างๆ คือ มีการกำหนดตัวแปร num ซึ่งใช้ในการกำหนดความจุของ stack ตัวแปร str และ buf ใช้ในการเก็บข้อมูลที่รับจากผู้ใช้ และมีการสร้าง object ชนิด StringStack ชื่อ st โดยมีการป้อนค่า num ไปเป็น argument ให้กับ st จากนั้นเป็นการ setup ค่าของ serial port คือ 115200 และ ขา pin ที่ใช้สหรับรับอินพุตปุ่มกดจากผู้ใช้งาน

รูปโค้ดการทำงานของไฟล์ .ino ส่วนที่ 2

     โค้ดในส่วนที่สองนี้เป็นส่วนของการอ่านค่าภายใน serial port เมื่อผู้ใช้งานมีการส่งข้อมูลผ่าน serial port มา โดยจะใช้ำสั่ง Serial.readString ในการอ่านค่าข้อมูลที่ถูกส่งมา จากนั้นให้นำไปเก็บใส่ Stack ที่สร้างไว้ในตอนแรก ถ้า stack ยังไม่เต็ม แต่ถ้าเต็มก็จะให้แสดงคำว่า full โดยข้อมูลที่จะนำมาใส่ใน Stack นั้น มีความยาวได้ไม่เกิน 20 ตัวอักษร

รูปโค้ดการทำงานของไฟล์ .ino ส่วนที่ 3


     โค้ดในส่วนสุดท้ายนี้เป็นส่วนของการอ่านค่าจาก pin บนบอร์ด Arduino ว่ามีการรับค่าการกดปุ่มจากผู้ใช้งานหรือไม่ ถ้าผู้ใช้งานกดปุ่มแล้วปล่อย ก็จะทำการ get ค่า ที่อยู่บนสุดของ stack ออกมา แต่ถ้า stack ว่างเปล่า ก็จะให้แสดงคำว่า Empty 

ภาพแสดงการต่อวงจร



ภาพแสดงการต่อวงจรจริง


ภาพจำลองการต่อวงจรจริง

ผลการทดสอบการทำงาน

รูปภาพแสดงผลการทำงานเมื่อป้อน input ผ่านทาง Serial Monitor




รูปภาพแสดงผลการทำงานเมื่อป้อน input ผ่านทาง Serial Monitor เกิน 20 ตัวอักษร




รูปภาพแสดงผลการทำงานเมื่อป้อน input ผ่านทาง Serial Monitor จนครบความจุของ Stack




รูปภาพแสดงผลการทำงานเมื่อผู้ใช้งานกดปุ่มเพื่อ get ค่าจาก Stack




รูปภาพแสดงผลการทำงานเมื่อผู้ใช้งานกดปุ่มเพื่อ get ค่าจาก Stack แต่ Stack ว่าง

สามารถ Download ตัวอย่าง Code ข้อ 2 ได้ที่นี้

วันพฤหัสบดีที่ 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 เพื่อทดสอบการทำงานของโค้ดและวงจรได้