วันพุธที่ 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 ได้ที่นี้