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

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

วัตถุประสงค์
       
         1.  ฝึกการต่อวงจร(เบรดบอร์ด)ปุ่มกดและไดโอดเปล่งเเสงร่วมกับบอร์ด Arduino
         2.  รู้และเข้าใจการทำงานของบอร์ด  Arduino
         3.  ฝึกการใช้งานบอร์ด Arduino และเขียนโค้ดภาษา C/C++ เพื่อกำหนดคำสั่งในการทำงานของบอร์ด Arduino

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

         1.  แผงต่อวงจร (เบรดบอร์ด)                                  1  อัน
         2.  บอร์ด Arduino (ใช้แรงดันลอจิก +5V)               1 บอร์ด
         3.  ปุ่มกดแบบสี่ขา                                                  2 ตัว
         4.  ไดโอดเปล่งแสงขนาด 5 มม.                            4 ตัว
         5.  ตัวต้านทาน 10kΩ                                             2 ตัว
         6.  ตัวต้านทาน 10kΩ                                             2 ตัว
         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 ทันที( หมายถึงการรีเซตค่าเป็นศูนย์)

ผลการทดลอง
      จำลองการต่อวงจรโดยใช้โปรแกรม frizing


         จากโค้ดตัวอย่างที่กำหนดให้มา  เมื่อทําขั้นตอนคอมไพล์และอัพโหลดโปรแกรมไปยังบอร์ด Arduino แล้ววงจรจะเริ่มต้นทํางาน จะมี LED เพียงตัวเดียวที่อยู่ในสถานะ “ติด” (LED1) และที่เหลืออีก 3 ตัว(LED2, LED3, LED4) อยู่ในสถานะ “ดับ”


   


   EXAMPLE  CODE...

  ................................................................................................................................................. 
 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
  }


แสดงผลการทดลองของข้อ  6 >>>เมื่อกดปุ่ม  PB1 แล้วปล่อยในแต่ละครั้ง จะทำให้ LED ที่ “ติด” เลื่อนไปทางขวาทีละหนึ่งตําแหน่งแล้ววนกลับมาเริ่มใหม่  และเมื่อกดปุ่ม PB2 แล้วปล่อยในแต่ละครั้ง จะทําให้ตําแหน่งของ LED ที่ “ติด” เลื่อนไปทางซ้ายทีละหนึ่งตําแหน่งแล้ววนกลับมาเริ่มใหม่


CODE..

  ................................................................................................................................................. 
 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( k != i ) digitalWrite ( LEDS[k], LOW );
    }
  }



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


 CODE.....

  ................................................................................................................................................. 
  const byte PB_1 = 2;
  const byte PB_2 = 3;

  const byte LEDS[4] = {4, 5, 6, 7};
  const byte state[16][4] = {{0, 0, 0, 0},{0, 0, 0, 1},{0, 0, 1, 0},{0, 0, 1, 1}, 
    {0, 1, 0, 0},{0, 1, 0, 1},{0, 1, 1, 0},{0, 1, 1, 1},{1, 0, 0, 0},{1, 0, 0, 1},
    {1, 0, 1, 0},{1, 0, 1, 1}, {1, 1, 0, 0},{1, 1, 0, 1},{1, 1, 1, 0},{1, 1, 1, 1}};   
  
  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 == 16) i = 0;
    }
    if (digitalRead(PB_2) == LOW ){
      while (digitalRead(PB_2) == LOW) {
        delay(20);
      }
      i=0;
    }
    for (int k = 0; k < 4; k++){
      digitalWrite(LEDS[k],  state[i][k]);
    }
  }



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

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