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

การทดลองที่ 3.1

การทดลองที่ 3.1 (การต่อวงจรปุ่มกดและไดโอดเปล่งแสงสำหรับ Arduino)

วัตถุประสงค
     1. ฝึกการต่อวงจรปุ่มกดและวงจรไดโอดเปล่งแสงที่ใช้ไฟเลี้ยงจากคอมพิวเตอร์ และเชื่อมต่อเข้ากับขา input output ของบอร์ด Arduino
     2. ฝึกการเขียนโปรแกรมภาษา C และ C++ เพื่อสั่งการทำงานของวงจรบอร์ด Arduino
     3. เรียนรู้การทำงานของบอร์ด Arduino และโปรแกรมที่ใช้ในการสั่งการทำงานของบอร์ดดังกล่าว
อุปกรณ์ที่ใช้ในการทดลอง
     1. แผงต่อวงจร (เบรดบอร์ด) 1 อัน
     2. บอร์ด Arduino (ใช้แรงดันลอจิก +5V) 1 บอร์ด
     3. ปุ่มกดแบบสี่ขา 2 ตัว
     4. ไดโอดเปล่งแสงขนาด 5 มม. 4 ตัว
     5. ตัวต้านทาน 10kΩ 2 ตัว
     6. ตัวต้านทาน 330Ω หรือ 470Ω 4 ตัว
     7. สายไฟสำหรับต่อวงจร 1 ชุด
ขั้นตอนการทดลอง
      1. ยังไม่ต้องเชื่อมต่อ +5V และ Gnd จากบอร์ด Arduino ไปยังเบรดบอร์ดเพื่อจ่ายเป็นแรงดันไฟเลี้ยง VCC และ GND
      2. ต่อวงจรปุ่มกดพร้อมตัวต้านทานแบบ Pull-up 10kΩ จำนวนสองชุด (PB1 และ PB2) บนเบรดบอร์ด
แล้วนำไปต่อกับขา D2 และ D3 ของบอร์ด Arduino ตามลำดับ โดยใช้ลวดสายไฟสำหรับต่อวงจร (ดูตามผังวงจรในรูปที่ 3.1.1)
      3. ต่อวงจรโดยใช้ไดโอดเปล่งแสง (LED) พร้อมตัวต้านทานแบบอนุกรม 330Ω หรือ 470Ω จำนวน 4 ชุด (LED1, LED2, LED3, LED4) บนเบรดบอร์ด แล้วนำไปต่อกับขา D4, D5, D6, D7, D8 ของบอร์ด Arduino ตามลำดับ โดยใช้ลวดสายไฟสำหรับต่อวงจร (ดูตามผังวงจรในรูปที่ 3.1.1)



      4. เขียนโค้ดตามตัวอย่างโดยใช้ Arduino IDE แล้วทำขั้นตอนคอมไพล์และอัพโหลดโปรแกรมไปยังบอร์ด Arduino



      5. ตรวจสอบความถูกต้องของวงจรบนเบรดบอร์ดอีกครั้ง จากนั้นจึงเชื่อมต่อ +5V และ Gnd จากบอร์ดArduino ไปยังเบรดบอร์ดเพื่อใช้เป็นแรงดันไฟเลี้ยง (VCC และ GND) ให้ระวังการต่อสลับขั้วสายไฟและ ระวังการต่อถึงกันทางไฟฟ้าของสายไฟทั้งสองเส้น
      6. แก้ไขโค้ดให้แสดงพฤติกรรมการทำงานตามข้อกำหนดต่อไปนี้ ตรวจสอบและสาธิตความถูกต้องในการทำงาน โดยใช้ฮาร์ดแวร์จริง
           6.1 เมื่อเริ่มต้นทำงาน จะมี LED เพียงตัวเดียวที่อยู่ในสถานะ “ติด” (LED1) และที่เหลืออีก 3 ตัว (LED2, LED3, LED4) อยู่ในสถานะ “ดับ”


           6.2 ถ้ากดปุ่ม PB1 แล้วปล่อยในแต่ละครั้ง จะทำให้ตำแหน่งของ LED ที่ “ติด” เลื่อนไปทางขวาทีละ หนึ่งตำแหน่ง หรือวนกลับมาเริ่มต้นใหม่ทางซ้ายสุด (LED1 -> LED2 -> LED3 -> LED4 -> …)


           6.3 ถ้ากดปุ่ม PB2 แล้วปล่อยในแต่ละครั้ง จะทำให้ตำแหน่งของ LED ที่ “ติด” เลื่อนไปทางซ้ายทีละหนึ่งตำแหน่ง หรือวนกลับมาเริ่มต้นใหม่ทางขวาสุด (LED1 -> LED4 -> LED3 -> LED2 -> …)


      7. แก้ไขโค้ดให้แสดงพฤติกรรมการทำงานตามข้อกำหนดต่อไปนี้ ตรวจสอบและสาธิตความถูกต้องในการทำงาน
           7.1 ใช้ LED ทั้ง 4 ตัว แสดงเลขในฐานสอง จำนวน 4 หลัก (4-bit binary number) ซึ่งรับสัญญาณเอาต์พุตมาจากบอร์ด Arduino และกำหนดให้บิตที่มีค่า 0 หมายถึง LED “ดับ” และ บิตที่มีค่า
เป็น 1 หมายถึง LED “ติด”และเมื่อเริ่มต้นทำงาน ให้แสดงค่าเป็น 0
           7.2 เมื่อกดปุ่ม PB1 แล้วปล่อยแต่ละครั้ง จะทำให้ค่าเพิ่มขึ้นทีละหนึ่ง จาก 0000, 0001, 0010, …,1111 ตามลำดับ แล้ววนกลับไปเริ่มต้นที่ 0000 ใหม่ได้
           7.3 แต่ถ้ากดปุ่ม PB2 จะทำให้ได้ค่าเป็น 0000 ทันที (หมายถึง การรีเซตค่าเป็นศูนย์) 




**โค้ดสำหรับขั้นตอนการทดลองที่ 6.2-6.3

const byte PB_1 = 2;
const byte PB_2 = 3;
const byte LEDS [4] = {4, 5, 6, 7};
int y = 0;
void setup() {
  pinMode (PB_1, INPUT);
  pinMode (PB_2, INPUT);
  delay (20);
  for (int i = 0; i < 4; i++) {
    pinMode (LEDS [i], OUTPUT);
    digitalWrite (LEDS [i], (i == 0) ? HIGH : LOW);
  }
}

void loop() {
  if (digitalRead(PB_1) == LOW) {
    while (digitalRead (PB_1) == LOW);
    delay (20);
    y++;
    if (y == 4) y = 0;
    for (int i = 0 ; i < 4 ; i++) {
      digitalWrite (LEDS [i], (i == y) ? HIGH : LOW);
    }
  }
  if (digitalRead(PB_2) == LOW) {
    while (digitalRead (PB_2) == LOW);
    delay (20);
    y--;
    if (y < 0) y = 3;
    for (int i = 0 ; i < 4 ; i++) {
      digitalWrite (LEDS [i], (i == y) ? HIGH : LOW);
    }
  }
}


**โค้ดสำหรับขั้นตอนการทดลองที่ 7.2-7.3
const byte PB_1 = 2;
const byte PB_2 = 3;
const byte LEDS [4] = {4, 5, 6, 7};
byte JIB[] = {B0000, B0001, B0010, B0011, B0100, B0101, B0110, B0111, B1000, B1001, B1010, B1011, B1100, B1101, B1110, B1111, B0000};
int a = 0;

void setup() {
  pinMode (PB_1, INPUT);
  pinMode (PB_2, INPUT);
 
  delay (20);
  for (int i = 0; i < 4; i++) {
    pinMode (LEDS [i], OUTPUT);
    digitalWrite (LEDS [i], (i == 0) ? HIGH : LOW);
  }
}
void loop() {
  a += (digitalRead(PB_1) == LOW)?((a==15)?-a:1):0;
  a += (digitalRead(PB_2) == LOW)?((a==15)?-a:1):0;
  byte b = JIB[a];
  for(int i = 0; i < 4; i++){
    digitalWrite(LEDS[i], b&1);
    b >>= 1;
  }
  delay(100);
}

ไม่มีความคิดเห็น:

แสดงความคิดเห็น