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

Assignment 3

โจทย์ฝึกปฏิบัติ

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

อุปกรณ์ที่ใช้ในการทดลอง

1. Arduino Uno rev.3                                                            1                 บอร์ด
2. USB connector type B                                                     1                 เส้น

code arduino



ผลการทดลอง
http://www.youtube.com/watch?v=IEt4IPuZ5Hk&feature=youtu.be


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 ได้



อุปกรณ์ที่ใช้ในการทดลอง

1. Arduino Uno rev.3                                                            1                 บอร์ด
2. USB connector type B                                                     1                 เส้น
3. LCD 16 X 2                                                                      1                 อัน
4. LED                                                                                 2                 อัน
5. Push button switch                                                          1                 อัน
6. ตัวต้านทานขนาด 330 ohm                                                2                 ตัว
7. ตัวต้านทานขนาด 300 ohm                                                1                 ตัว
8. สายไฟสำหรับเชื่อมต่อวงจร                                                1                 ชุด                                                                          


Wiring Diagram ด้วย Fritzing




code arduino

ประกาศตัวแปร
- ส่วนของการ import Lib สำหรับ  LCD 16X2, StringQueue
- ประกาศตัวแปรเริ่มต้นต่างๆ(State_Button, Delay, LCD)


void setup()
- set ขนาด กว้าง x ยาวของ LCD
- ตั้งค่า Timer_1 สำหรับ Delay 1 s
- และตั้งค่า push_Button, LED


Get() เมื่อมีการกดแล้วปล่อย..ปุ่ม
- จะทำการ get ค่าจาก Queue แบบ FIFO (First-In-First-Out)
- ทำการแสดงผล ตัวที่ get ผ่านทาง LCD และเมื่อหมดแล้วจะแสดงข้อความ isEmpty

* lcd.setCursor( บรรทัดไหน?(0 = บรรทัดบน 1 = บรรทัดล่าง), เริ่มตัวที่เท่าไร? )



put ไปใน Queue
- รับข้อความผ่านทาง SerialPort ขนาดไม่เกิน 16 ตัวอักษร

- จะแสดงผลผ่านทาง LCD เมื่อใส่ไปเต็ม จะแสดงว่า isFull !


ผลการทดลอง

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




- การแสดงผลข้อมูลบน LCD
http://www.youtube.com/watch?v=k5AZPddwGpI&feature=youtu.be

วันศุกร์ที่ 12 กันยายน พ.ศ. 2557

Assignment 2

โจทย์ฝึกปฏิบัติสำหรับสัปดาห์นี้



1) เขียนโค้ดสำหรับบอร์ด Arduino โดยสร้างเป็น C++ Class ดังต่อไปนี้
=> Class StringStack เป็นโครงสร้างข้อมูลแบบ Stack (กองซ้อน) สำหรับเก็บ String objects (http://arduino.cc/en/Reference/StringObject) และกำหนด API สำหรับคลาสดังกล่าว เป็นดังนี้


/////////////////////////////////////////////////////////////////////////
‪#include <String.h>
class StringStack {
public:
StringStack( int capacity=10 ); // constructor
boolean put( String s ); // put a String object on stack
boolean get( String &s ); // get a String object from stack
inline int size(); // return the number of String objects on the stack
inline boolean isEmpty(); // return true if stack is empty, otherwise false
inline boolean isFull(); // return true if stack is full, otherwise false
private:
int capacity; // the max. capacity of the stack
int count; // used to count the number of string objects stored
String *buf; // used to store String objects on stack
};
/////////////////////////////////////////////////////////////////////////


จงสร้างคลาส StringStack และทดสอบการทำงานโดยใช้โค้ดตัวอย่างต่อไปนี้
และทดสอบโดยใช้ฮาร์ดแวร์จริง (ใช้บอร์ด Arduino และแสดงผลผ่าน Serial Monitor ของ Arduino IDE)
/////////////////////////////////////////////////////////////////////////


int num = 10; // capacity
StringStack st( num );
void setup() {
Serial.begin(115200);
}
char buf[20];
String str;
void loop() {
Serial.print( "\nPut strings: " );
for ( int i=0; i < num; i++ ) {
str = String( (i+1)*10 );
if ( !st.put( str ) ) {
Serial.println( "\nPut string error!" );
break;
} else {
Serial.print( str );
Serial.print( " " );
}
str = NULL;
delay(50);
}
delay(500);
Serial.print( "\nGet strings: " );
for ( int i=0; i < num; i++ ) {
if ( st.get( str ) ) {
str.toCharArray( buf, 20 );
Serial.print( buf );
Serial.print( " " );
} else {
Serial.println( "\nGet string error!" );
break;
}
delay(50);
}
delay(500);
}
/////////////////////////////////////////////////////////////////////////



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" กลับมา เมื่อกดปุ่มแล้วปล่อย


อุปกรณ์ที่ใช้ในการทดลอง
    1. Arduino Uno rev.3                                                        1                    บอร์ด
    2. ตัวต้านทาน 10 k-ohm                                                    1                    ตัว
    3. push button                                                                  1                    ตัว
    4. สายไฟ             

                                                             
การทดลองที่ 1
1.1 เขียน Class StringStack ทีทำงานได้โดย Code ที่กำหนดมาให้ด้านบน

# Constructor 
- รับค่า Capacity มากำหนด ขนาดของ Stack
- กำหนดค่าเริ่มต้นต่างๆ
StringStack::StringStack(int capacity) {              // Constructor
  count = 0;
  this->capacity = capacity;
  buf = new String [capacity];
}
# put(String s)
- จะตรวจสอบถ้า ณ ตอนนี้ Stack เต็มหรือไม่? ถ้าไม่ ก็เพิ่มเข้าไป
boolean StringStack::put(String s){               
 boolean v;
 if( isFull() == false ){     // No Full
  buf[count] = s;
  count += 1;    
  v = true;
 }
 else{        // String is Full!
  v = false;
 }
 return v;
}
# get(String s)
- จะตรวจสอบว่า ณ ตอนนี้ Stack ว่างหรือไม่? ถ้าไม่ก็เปลี่ยนตำแหน่งชี้ไปยังตัวก่อนหน้า
boolean StringStack::get(String &s){
 boolean v;
 if(isEmpty() == false){     
             count -= 1;
     *&s = buf[count];
  v = true;
 }
 else{       
  v = false;
 }
 return v;
}
# size()
- จะคืนค่า count ณ ตอนนั้น
inline int StringStack::size(){ return count; }
# isEmpty()
- จะตรวจสอบว่า Stack ณ ขณะนั้นว่างหรือไม่ ?
inline boolean StringStack::isEmpty(){
 if( size() <= 0){ 
  return true;    // isEmpty
 }  
 else{
  return false;    // Not! Empty
 }
}
# isFull()
- จะตรวจสอบว่า Stack ณ ขณะนั้นเต็มหรือไม่ ?
inline boolean StringStack::isFull(){ if( size() >= capacity){ return true; // isFull } else{ return false; // Not! Full } }
----------------------------
Output 1

(รุปแสดง Output ที่ได้)



2.1 ออกแบบวงจรปุ่มกดโดย Program Fritzing 

รูป-การออกแบบวงจรปุ่มกด

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

Output 2

รูป output ที่ได้


Code ที่แนบ มา => Code :: 2
---------------------------------