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

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

วัตถุประสงค์

  • ฝึกต่อวงจรปุ่มกดและไดโอดเปล่งแสง (LED) และเชื่อมต่อกับบอร์ด Arduino
  • ฝึกการเขียนโปรแกรม C/C++ เพื่อให้บอร์ด Arduino ทำงานตามที่โจทย์กำหนด

รายการอุปกรณ์

  • แผงต่อวงจร (เบรดบอร์ด)                            1 อัน
  • บอร์ด Arduino (ใช้แรงดันลอจิก +5V)         1 บอร์ด
  • ปุ่มกดแบบสี่ขา                                             2 ตัว
  • ไดโอดเปล่งแสงขนาด 5 มม.                       4 ตัว
  • ตัวต้านทาน 10kΩ                                        2 ตัว
  • ตัวต้านทาน 330Ω หรือ 470Ω                     4 ตัว
  • สายไฟสำหรับต่อวงจร                                 1 ชุด

ขั้นตอนการทดลอง

  1. ยังไม่ต้องเชื่อมต่อ +5V และ Gnd จากบอร์ด Arduino ไปยังเบรดบอร์ดเพื่อจ่ายเป็นแรงดันไฟเลี้ยง VCC และ GND
  2. ต่อวงจรปุ่มกดพร้อมตัวต้านทานแบบ Pull-up 10kΩ จำนวนสองชุด (PB1 และ PB2) บนเบรดบอร์ดแล้วนำไปต่อกับขา D2 และ D3 ของบอร์ด Arduino ตามลำดับ โดยใช้ลวดสายไฟสำหรับต่อวงจร
  3. ต่อวงจรโดยใช้ไดโอดเปล่งแสง (LED) พร้อมตัวต้านทานแบบอนุกรม 330Ω หรือ 470Ω จำนวน 4 ชุด (LED1, LED2, LED3, LED4) บนเบรดบอร์ด แล้วนำไปต่อกับขา D4, D5, D6, D7, D8 ของบอร์ด Arduino ตามลำดับ โดยใช้ลวดสายไฟสำหรับต่อวงจร
  4. เขียนโค้ดตามตัวอย่างโดยใช้ Arduino IDE แล้วทำขั้นตอนคอมไพล์และอัพโหลดโปรแกรมไปยังบอร์ด Arduino
  5. ตรวจสอบความถูกต้องของวงจรบนเบรดบอร์ดอีกครั้ง จากนั้นจึงเชื่อมต่อ +5V และ Gnd จากบอร์ด Arduino ไปยังเบรดบอร์ดเพื่อใช้เป็นแรงดันไฟเลี้ยง (VCC และ GND) ให้ระวังการต่อสลับขั้วสายไฟ และ ระวังการต่อถึงกันทางไฟฟ้าของสายไฟทั้งสองเส้น
  6. แก้ไขโค้ดให้แสดงพฤติกรรมการทำงานตามข้อกำหนดต่อไปนี้ ตรวจสอบและสาธิตความถูกต้องในการทำงาน โดยใช้ฮาร์ดแวร์จริง
    1. เมื่อเริ่มต้นทำงาน จะมี LED เพียงตัวเดียวที่อยู่ในสถานะ “ติด” (LED1) และที่เหลืออีก 3 ตัว (LED2, LED3, LED4) อยู่ในสถานะ “ดับ”
    2. ถ้ากดปุ่ม PB1 แล้วปล่อยในแต่ละครั้ง จะทำให้ตำแหน่งของ LED ที่ “ติด” เลื่อนไปทางขวาทีละหนึ่งตำแหน่ง หรือวนกลับมาเริ่มต้นใหม่ทางซ้ายสุด (LED1 -> LED2 -> LED3 -> LED4 -> …)
    3. ถ้ากดปุ่ม PB2 แล้วปล่อยในแต่ละครั้ง จะทำให้ตำแหน่งของ LED ที่ “ติด” เลื่อนไปทางซ้ายทีละหนึ่งตำแหน่ง หรือวนกลับมาเริ่มต้นใหม่ทางขวาสุด (LED1 -> LED4 -> LED3 -> LED2 -> …)
  7. แก้ไขโค้ดให้แสดงพฤติกรรมการทำงานตามข้อกำหนดต่อไปนี้ ตรวจสอบและสาธิตความถูกต้องในการทำงาน
    1. ใช้ LED ทั้ง 4 ตัว แสดงเลขในฐานสอง จำนวน 4 หลัก (4-bit binary number) ซึ่งรับสัญญาณเอาต์พุตมาจากบอร์ด Arduino และกำหนดให้บิตที่มีค่า 0 หมายถึง LED “ดับ” และ บิตที่มีค่าเป็น 1 หมายถึง LED “ติด”และเมื่อเริ่มต้นทำงาน ให้แสดงค่าเป็น 0
    2. เมื่อกดปุ่ม PB1 แล้วปล่อยแต่ละครั้ง จะทำให้ค่าเพิ่มขึ้นทีละหนึ่ง จาก 0000, 0001, 0010, …,1111 ตามลำดับ แล้ววนกลับไปเริ่มต้นที่ 0000 ใหม่ได้
    3. แต่ถ้ากดปุ่ม PB2 จะทำให้ได้ค่าเป็น 0000 ทันที (หมายถึง การรีเซตค่าเป็นศูนย์)
รูปที่ 3.1.1 : ผังวงจรสำหรับเชื่อมต่อบอน์ด Arduino

โค๊ดตัวอย่าง

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

ผลการทดลอง 3.1.6

const byte PB_1 = 2;
const byte PB_2 = 3;
const byte LEDS[4] = {4, 5, 6, 7};

void setup() {
  pinMode(PB_1, INPUT );
  pinMode( PB_2, INPUT);
  for (int i = 0; i < 4; i++) {
    pinMode( LEDS[i], OUTPUT);
    digitalWrite( LEDS[i], (i == 0) ? HIGH : LOW );
  }
}

int i = 0;

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

รูปการต่อวงจรจากการทดลองจริง


ผลการทดลอง 3.1.7

const byte PB_1 = 2;
const byte PB_2 = 3;
const byte LEDS[4] = {4, 5, 6, 7};
byte n[] = {B0000, B0001, B0010, B0011, B0100, B0111, B1000, B1001,
            B1010, B1011, B1100, B1101, B1110, B1111
           };
int j = 0, m = 0;
void setup() {
  pinMode(PB_1, INPUT );
  pinMode( PB_2, INPUT);
  for (int i = 0; i < 4; i++) {
    pinMode( LEDS[i], OUTPUT);
    digitalWrite( LEDS[i], (i == 0) ? HIGH : LOW );
  }
}

void loop() {
  int SW_1 = digitalRead(PB_1);
  int SW_2 = digitalRead(PB_2);
  delay(100);
  if (SW_1 == LOW) {
    byte t = n[j];
    for (int i = 0; i < 4; i++) {
      digitalWrite(LEDS[i], t & 1);
      t >>= 1;
    }
    j++;
    delay(100);
  }
  if (SW_2 == LOW) {
    for (int l = 0; l < 4; l++) {
      digitalWrite(LEDS[l], n[0] & 1);
    }
  }
}

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

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