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

การทดลองที่ 4.6 การวัดแรงดันอินพุต-แอนะล็อกและการแสดงค่าโดยใช้ 7-Segment

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


  • ฝึกต่อวงจรและเขียนโปรแกรมสําหรับบอร์ด Arduino เพื่อวัดแรงดันอินพุต-แอนะล็อกและแสดงค่าที่ได้ผ่านทาง 7-Segment Display

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


  1. แผงต่อวงจร (เบรดบอร์ด)    1 อัน
  2. บอร์ด Arduino (ใช้แรงดัน +5V)    1 บอร์ด
  3. ตัวต้านทานปรับค่าได้แบบสามขา 10kΩ หรือ 20kΩ    1 ตัว
  4. 7-Segment Display แบบ 2 ตัวเลข (Common-Cathode)    1 ตัว
  5. ทรานซิสเตอร์ NPN (เช่น PN2222A)    2 ตัว
  6. ตัวต้านทาน 1kΩ    2 ตัว
  7. ตัวต้านทาน 330Ω หรือ 470Ω    8 ตัว
  8. สายไฟสําหรับต่อวงจร    1 ชุด
  9. มัลติมิเตอร์    1 เครื่อง

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


  1. ออกแบบวงจร วาดผังวงจร และต่อวงจรบนเบรดบอร์ด ร่วมกับบอร์ด Arduino เพื่อวัดแรงดันที่ได้จากวงจรแบ่งแรงดันที่ใช้ตัวต้านทานปรับค่าได้ (แรงดันอยู่ในช่วง 0V ถึง 5V) เช่น ป้อนเข้าที่ขา A0 ของบอร์ด Arduino แล้วนําค่าไปแสดงผลโดยใช้ 7-Segment Display จํานวน 2 หลัก และให้มีทศนิยมเพียงหนึ่งตําแหน่ง เช่น ถ้าวัดแรงดันได้ 2.365V จะแสดงผลเป็น “2.4” ถ้าวัดได้ 2.539V ให้แสดงผลเป็น “2.5” เป็นต้น และให้ใช้แรงดันไฟเลี้ยง VCC=+5V และ Gnd จากบอร์ด Arduinoเท่านั้น [ทุกกลุ่มจะต้องวาดวงจรสําหรับการทดลองมาให้แล้วเสร็จ (ให้เตรียมตัวมาก่อนเข้าเรียนวิชาปฏิบัติ) ]
  2. เขียนโค้ดสําหรับ Arduino เพื่ออ่านค่าจากแรงดันอินพุต-แอนะล็อก แลวนำไปแสดงผลโดยใช้ 7-Segment Display ตามที่กล่าวไป (และให้แสดงค่าที่อ่านได้ออกทาง Serial Monitor ด้วย) และในการเขียนโค้ด ห้ามใช้ตัวแปรหรือตัวเลขแบบ float 
  3. เขียนรายงานการทดลอง ซึ่งประกอบด้วยคําอธิบายการทดลองตามขั้นตอน ผังวงจรที่ถูกต้องครบถ้วนตามหลักไฟฟ้า (ให้วาดด้วยโปรแกรม Cadsoft Eagle) รูปถ่ายของการต่อวงจรบน เบรดบอร์ด โค้ด Arduino ที่ได้ทดลองจริงพร้อมคาอธิบายโค้ด/การทํางานของโปรแกรมและตัวอย่างผลที่แสดงบน Serial Monitor (Screen Capture)

รูปจากการต่อวงจร




ผลจากการทดลอง





โค้ดในการทดลอง


const byte SEG[7] = {4, 5, 6, 7, 8 , 9, 10};
int analogpin = 0;
const byte TC[2] = {2, 3};
byte NUM[10] = {B1111110, B0110000, B1101101, B1111001, B0110011,
                              B1011011, B1011111, B1110000, B1111111, B1111011};

void setup() {
  analogReference(DEFAULT);
  Serial.begin(9600);
  for(int i = 0; i < 7; i++){
    pinMode(SEG[i], OUTPUT);
  }
  for(int i = 0; i < 2; i++){
    pinMode(SEG[i], OUTPUT);
  }
}

void loop() {
  int value = analogRead(analogpin);
  value = map(value, 0, 1023, 0, 5000);
  int G = value / 1000; //I
  int W = (value % 10);
  int Y = (value % 1000 / 100); //F
  if (W > 5) {
    Y = Y + 1;
  }
  delay(10);
  digitalWrite(TC[0], 1);
  digitalWrite(TC[1], 0);
  display_seg(G);
  delay(10);
  digitalWrite(TC[0], 0);
  digitalWrite(TC[1], 1);
  display_seg(Y);
}

void display_seg(int num){
  byte N = NUM[num];
  for(int i = 6; i >= 0; i--){
    digitalWrite(SEG[i], N&1);
    N >>= 1;
  }
}

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

การทดลองที่ 4.3 การต่อวงจรตัวต้านทานไวแสงและตรวจวัดการเปลี่ยนแปลงของปริมาณแสง

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


  • ฝึกต่อวงจรโดยตัวต้านทานไวแสง (LDR) ร่วมกับไอซีเปรียบเทียบแรงดัน เบอร์ LM393N

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

  1. แผงต่อวงจร (เบรดบอร์ด) 1 อัน
  2. ไอซีเปรียบเทียบแรงดัน เบอร์ LM393N 1 ตัว
  3. ตัวต้านทานปรับค่าได้แบบสามขา ขนาด 10kΩ หรือ 20kΩ 1 ตัว
  4. ตัวต้านทานไวแสง 1 ตัว
  5. ตัวต้านทาน 330Ω หรือ 470Ω 1 ตัว
  6. ตัวต้านทาน 4.7kΩ 1 ตัว
  7. ตัวต้านทาน 10kΩ 1 ตัว
  8. ทรานซิสเตอร์ NPN เบอร์ PN2222A 1 ตัว
  9. สายไฟสำหรับต่อวงจร 1 ชุด
  10. มัลติมิเตอร์ 1 เครื่อง

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

  1. ใช้มัลติมิเตอร์วัดค่าความต้านทานของตัวต้านทานไวแสง (LDR) ในสภาวะแสงที่แตกต่างกันในสามระดับ (ปริมาณแสงน้อย ปานกลาง และมาก) แล้วจดบันทึกค่าที่วัดได้ สังเกตการเปลี่ยนแปลงของค่าความต้านทานเมื่อปริมาณแสงเปลี่ยน
          -     
    ได้ค่าความต้านทาน 40kΩ, 2kΩ และ 400Ω ตามลำดับ
  2. ต่อวงจรบนเบรดบอร์ด ตามรูปที่ 4.3.1 แล้ววัดแรงดัน Vx ในสภาวะแสงที่แตกต่างกัน (ปริมาณแสงน้อย ปานกลาง มาก) แล้วจดบันทึกค่าที่วัดได้ สังเกตการเปลี่ยนแปลงของระดับแรงดันเมื่อปริมาณแสงเปลี่ยน
    รูปที่ 4.3.1 : ผังวงจรสำหรับต่อตัวต้านทานปรับค่าได้
         -     ได้ค่าแรงดัน Vx 1.3V, 4.2V และ 5V ตามลำดับ
  3. ต่อวงจรบนเบรดบอร์ด ตามรูปที่ 4.3.2 (แบบที่ 1) โดยใช้แรงดันไฟเลี้ยง VCC=+5V และ Gnd
    จากแหล่งจ่ายแรงดันควบคุม ทดลองหมุนปรับค่าที่ตัวต้านทานปรับค่าได้ และวัดแรงดัน Vref ที่ได้สังเกตสถานะติด/ดับของ LED
    รูปที่ 4.3.2 : ผังวงจรสำหรับต่อวงจรไอซีเปรียบเทียบแรงดัน (แบบที่ 1)
  4. ต่อวงจรบนเบรดบอร์ด ตามรูปที่ 4.3.3 (แบบที่ 2) โดยใช้แรงดันไฟเลี้ยง VCC=+5V และ Gnd
    จากแหล่งจ่ายแรงดันควบคุม ทดลองหมุนปรับค่าที่ตัวต้านทานปรับค่าได้ และวัดแรงดัน Vref ที่ได้สังเกตสถานะติด/ดับของ LED
    รูปที่ 4.3.3 : ผังวงจรสำหรับต่อวงจรไอซีเปรียบเทียบแรงดัน (แบบที่ 2)

  5. ต่อวงจรบนเบรดบอร์ด ตามรูปที่ 4.3.4 (แบบที่ 3) โดยใช้แรงดันไฟเลี้ยง +5V +9V และ Gnd
    จากแหล่งจ่ายแรงดันควบคุม ทดลองหมุนปรับค่าที่ตัวต้านทานปรับค่าได้ เพื่อให้ LED “สว่าง”
    เมื่อปริมาณแสงน้อย และให้ LED “ไม่ติด” เมื่อปริมาณแสงมาก
    รูปที่ 4.3.4 : ผังวงจรสำหรับต่อวงจรไอซีเปรียบเทียบแรงดัน (แบบที่ 3)

คำถามท้ายการทดลอง

  1. ค่าความต้านทานของ LDR จะเปลี่ยนแปลงอย่างไร เมื่อปริมาณแสงเปลี่ยน และค่าความต้านทานของ LDR ที่ได้จากการทดลอง จะอยู่ในช่วงใด
    • ค่าความต้านทานของ LDR จะแปรผันแบบผกผันกับปริมาณแสง คือ ปริมาณแสงน้อย ค่าความต้านทานมาก, ปริมาณแสงมาก ค่าความต้านทานน้อย
    • ค่าความต้านทานของ LDR ที่ได้จากการทดลอง จะอยู่ในช่วง 40kΩ-400Ω
  2. สำหรับวงจรแบบที่ 1 และ 2 แรงดัน Vx จะเปลี่ยนแปลงอย่างไร เมื่อปริมาณแสงเปลี่ยน(เปลี่ยนจากปริมาณแสงน้อยเป็นปริมาณแสงมาก)
    • แรงดัน Vx จะแปรผันตรงกับ ปริมาณแสง คือ ปริมาณแสงน้อย Vx น้อย, ปริมาณแสงมาก Vx มาก
  3. สำหรับวงจรแบบที่ 3 การปรับค่าแรงดัน Vref โดยใช้ตัวต้านทานปรับค่าได้ในวงจร มีผลอย่างไรต่อการติดหรือดับของ LED
    • ถ้าค่า Vref < Vx จะทำให้ LED ดับ
    • ถ้าค่า Vref > Vx จะทำให้ LED ติด

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

การทดลองที่ 4.2 การต่อวงจรสําหรับเปรียบเทียบช่วงแรงดัน

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

  1. ฝึกต่อวงจรโดยใช้ตัวต้านทานปรับค่าได้และไอซี LM393N
  2. ต่อวงจรโดยใช้ไอซี LM393N ที่มีตัวเปรียบเทียบแรงดันสองตัวเพื่อเปรียบเทียบแรงดันอินพุตกับแรงดันอ้างอิงโดยแบ่งเป็นสองระดับ

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

  1. แผงต่อวงจร (เบรดบอร์ด)                          1 อัน
  2. ไอซีเปรียบเทียบแรงดัน เบอร์ LM393N      1 ตัว
  3. ตัวต้านทานปรับค่าได้แบบ 3 ขาขนาด 10kΩ หรือ 20kΩ 1 ตัว
  4. ตัวต้านทาน 10kΩ                                        4 ตัว
  5. ตัวต้านทาน 330Ω หรือ 470Ω                    1 ตัว
  6. ไดโอดเปล่งแสง (LED) ขนาด 5 มม.         1 ตัว
  7. สายไฟสําหรับต่อวงจร                                1 ชุด
  8. มัลติมิเตอร์                                                 1 เครื่อง
  9. แหล่งจ่ายแรงดันควบคุม                             1 เครื่อง
  10. เครื่องกําเนิดสัญญาณแบบดิจิทัล               1 เครื่อง
  11. ออสซิลโลสโคปแบบดิจิทัล                       1 เครื่อง

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

  1. ต่อวงจรบนเบรดบอร์ด โดยใช้ไอซี LM393N ตามผังวงจรในรูปที่ 4.2.1 และป้อนแรงดันไฟเลี้ยง VCC= +5V และ Gnd จากแหล่งจ่ายควบคุมแรงดัน

  2. ใช้มัลติมิเตอร์วัดแรงดัน V1 และ V2 เทียบกับ Gnd ของวงจร ตามลําดับ แล้วจดบันทึกค่าที่ได้
    - แรงดัน V1 และ V2 มีค่าประมาณ 3.355 V และ 1.675 V ตามลำดับ
  3. สร้างสัญญาณแบบสามเหลี่ยม (Triangular Wave) ให้อยู่ในช่วงแรงดัน 0V ถึง5V โดยใช้เครื่องกําเนิดสัญญาณ(Function Generator)  โดยกําหนดให้ Vpp = 5V ( Peak-to-Peak Voltage) และแรงดัน    Offset = 2.5V และความถี่ f = 1kHz เพื่อใช้เป็นสัญญาณอินพุต Vin สําหรับวงจร
  4. ใช้ออสซิลโลสโคปวัดสัญญาณ โดยใช้ช่อง A สําหรับวัดสัญญาณที่มาจากเครื่องกําเนิดสัญญาณ (Vin) และช่อง B สําหรับวัดสัญญาณเอาต์พุตที่ขาหมายเลข 1 (V3) ของตัวเปรียบเทียบแรงดัน(บันทึกภาพที่ได้จากออสซิลโลสโคป เพื่อใช้ประกอบการเขียนรายงานการทดลอง)

    (ภาพจากการต่อวงจร)


    (ภาพที่ได้จากออสซิลโลสโคป)
  5. ใช้ออสซิลโลสโคปวัดสัญญาณ โดยใช้ช่อง A สําหรับวัดสัญญาณที่มาจากเครื่องกําเนิดสัญญาณ (Vin) และช่อง B สําหรับวัดสัญญาณเอาต์พุตที่ขาหมายเลข7 (V4) ของตัวเปรียบเทียบแรงดัน                           (บันทึกภาพที่ได้จากออสซิลโลสโคป เพื่อใช้ประกอบการเขียนรายงานการทดลอง)
    (ภาพที่ได้จากออสซิลโลสโคป)
  6. ต่อวงจรบนเบรดบอร์ด ตามผังวงจรในรูปที่ 4.2.2 โดยตัวต้านทานปรับค่าได้ขนาด 10kΩ หรือ 20kΩ

    (ภาพจากการต่อวงจร)
  7. ใช้มัลติมิเตอร์วัดแรงดัน Vin ทดลองหมุนปรับค่าที่ตัวต้านทานปรับค่าได้ แล้วสังเกตสถานะของการติด/ดับของ LED1 ให้จดบันทึกค่าแรงดัน Vin ที่ทําให้ LED1 เกิดการเปลี่ยนสถานะติด/ดับ
  8. เขียนรายงานการทดลองซึ่งประกอบด้วยคําอธิบายการทดลองตามขั้นตอน ผังวงจรที่ถูกต้องครบถ้วนตามหลักไฟฟ้า (ให้วาดด้วยโปรแกรม Cadsoft Eagle) รูปถ่ายของการต่อวงจรบนเบรดบอร์ด  รูปคลื่นสัญญาณที่วัดได้จากออสซิลโลสโคปตามโจทย์การทดลอง และตอบคําถามท้ายการทดลอง

คําถามท้ายการทดลอง

  1. แรงดัน V1และ V2 มีค่าประมาณ …3.355... โวลต์และ …1.675... โวลต์ตามลําดับ
  2. แรงดัน Vin จะต้องมีค่าอยู่ในช่วง …3... ถึง …5… โวลต์และ ...0… ถึง ...3... โวลต์จึงจะทําให้แรงดัน V3 ที่ขาหมายเลข 1 ของ LM393N (วงจรในรูปที่ 4.2.1) ได้ลอจิก LOW และ HIGH ตามลําดับ
  3. แรงดัน Vin จะต้องมีค่าอยู่ในช่วง ...0... ถึง …1.9… โวลต์และ ...2… ถึง ...5... โวลต์จึงจะทําให้แรงดัน V4 ที่ขาหมายเลข 7 ของ LM393N (วงจรในรูปที่ 4.2.1) ได้ลอจิก LOW และ HIGH ตามลําดับ
  4. แรงดัน Vin ที่ได้จากการหมุนปรับค่าของตัวต้านทานปรับค่าได้จะต้องมีค่าอยู่ในช่วงใดจึงจะทําให้ LED1สว่าง
    1. ช่วง 0V - 1.5V จะทำให้ LED1 สว่าง
    2. ช่วง 1.5V - 3.25V จะทำให้ LED1 ดับ
    3. ช่วง 3.25V - 5V จะทำให้ LED1 สว่าง

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

การทดลองที่ 3.2 การใช้อุปกรณ์ 7-Segment Display เพื่อแสดงตัวเลข BCD

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


  • ฝึกต่อวงจรโดยใช้อุปกรณ์ 7-Segment Display บนเบรดบอร์ด และใช้งานร่วมกับบอร์ด Arduino
  • เขียนโปรแกรม Arduino เพื่อแสดงตัวเลข โดยใช้อุปกรณ์ 7-Segment Display

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

  • แผงต่อวงจร (เบรดบอร์ด)                     1 อัน
  • บอร์ด Arduino (ใช้แรงดัน +5V)           1 บอร์ด
  • อุปกรณ์ 7-Segment Display               1 ตัว
  • ปุ่มกดแบบสี่ขา                                      1 ตัว
  • ตัวต้านทาน 330Ω หรือ 470Ω              7 ตัว
  • ตัวต้านทาน 1kΩ                                   1 ตัว
  • ตัวต้านทาน 10kΩ                                 1 ตัว
  • ทรานซิสเตอร์ NPN เบอร์ PN2222A    1 ตัว
  • สายไฟสําหรับต่อวงจร                          1 ชุด

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

  1. ศึกษาการใช้งาน และตำแหน่งของขาต่างๆ ของอุปกรณ์ 7-Segment Display (ใช้แบบ Common-Cathode) จากเอกสาร (ดาต้าชีทของผู้ผลิต) วาดรูปอุปกรณ์ ระบุขาต่างๆ และการกำหนดสถานะ LOW หรือ HIGH ที่ขาเหล่านั้น เพื่อให้สามารถแสดงตัวเลขในแต่ละกรณีได้ระหว่าง 0 ถึง 9
  2. ต่อตัวต้านทาน 330Ω หรือ 470Ω จำนวน 7 ตัว แบบอนุกรมกับขา a, b, c, d, e, f, g แต่ละขาของอุปกรณ์ 7-Segment Display ตามผังวงจรในรูปที่ 3.2.1
  3. ต่อขา CC (Common Cathode) ไปยัง Gnd ของวงจร
  4. เชื่อมต่อขา D3, D4, D5, D6, D7, D8, D9 ของบอร์ด Arduino ไปยังขา a, b, c, d, e, f, g ของอุปกรณ์ 7-Segment Display (ผ่านตัวต้านทาน 330Ω หรือ 470Ω ที่ต่ออนุกรมอยู่สำหรับแต่ละขา)
  5. เขียนโค้ดตามตัวอย่างโดยใช้ Arduino IDE แล้วทำขั้นตอนคอมไพล์และอัพโหลดโปรแกรมไปยังบอร์ด Arduino
  6. ตรวจสอบความถูกต้องของวงจรบนเบรดบอร์ดก่อน เมื่อถูกต้องแล้ว จึงเชื่อมต่อ +5V และ Gndจากบอร์ด Arduino ไปยังเบรดบอร์ด เพื่อใช้เป็นแรงดันไฟเลี้ยง (VCC และ GND) และไม่ต้องใช้แหล่งจ่ายควบคุมแรงดันจากภายนอก ให้ระวังการต่อสลับขั้วสายไฟ และระวังการต่อถึงกันทางไฟฟ้าของสายไฟทั้งสองเส้น
  7. แก้ไขโค้ดสำหรับ Arduino ให้สามารถแสดงตัวเลขตั้งแต่ 0 ถึง 9 แล้ววนซ้ำ โดยเว้นระยะเวลาในการเปลี่ยนเป็นตัวเลขถัดไปประมาณ 1 วินาที
  8. แก้ไขวงจร โดยต่อวงจรตามผังวงจรในรูปที่ 3.2.3 ให้สังเกตว่า มีการต่อวงจรปุ่มกดแบบ Pull-upเพื่อใช้เป็นอินพุต-ดิจิทัลให้บอร์ด Arduino และมีการต่อวงจรทรานซิสเตอร์แบบ NPN เพื่อใช้ควบคุมการไหลของกระแสจากขา CC ของ 7-Segment Display ผ่านตัวทรานซิสเตอร์ NPN จากขา Collector (C) ไปยังขา Emitter (E) และ GND ของวงจรตามลำดับ
  9. แก้ไขโค้ดสำหรับ Arduino เพื่อให้แสดงตัวเลขตั้งแต่ 0 ถึง 9 แล้ววนซ้ำ โดยเว้นระยะเวลาในการเปลี่ยนเป็นตัวเลขถัดไปประมาณ 1 วินาที แต่จะแสดงผลก็ต่อเมื่อกดปุ่ม PB1 ค้างไว้ แต่ถ้าไม่กดจะต้องไม่แสดงผลตัวเลขใดๆ (ไม่ติด)
รูปที่ 3.2.1 : ผังวงจรสำหรับเชื่อมต่อบอร์ด Arduino
(ตัวอย่างนี้ใช้ 7-Segment Display แบบ Common-Cathode)

รูปที่ 3.2.3 : ผังวงจรสำหรับเชื่อมต่อบอร์ด Arduino
(ควบคุมการทำงาน 7-Segment Dispay ได้ด้วยทรานซิสเตอร์ NPN)


โค้ดตัวอย่างสำหรับ Arduino

// Add your code below for global variables, constants.
const byte SEVEN_SEG[7] = {3,4,5,6,7,8,9};
void setup() {
  for (int i=0; i < 7; i++) {
     pinMode( SEVEN_SEG[i], OUTPUT );
     digitalWrite( SEVEN_SEG[i], HIGH );
   }
}
void loop() {
  // Write your code below
}


โค้ดการทดลองที่ 3.2.7

const byte SEVEN_SEG[7] = {3, 4, 5, 6, 7, 8, 9};
byte number[10][7] = {{1, 1, 1, 1, 1, 1, 0}, {0, 1, 1, 0, 0, 0, 0},
  {1, 1, 0, 1, 1, 0, 1}, {1, 1, 1, 1, 0, 0, 1}, {0, 1, 1, 0, 0, 1, 1},
  {1, 0, 1, 1, 0, 1, 1}, {1, 0, 1, 1, 1, 1, 1}, {1, 1, 1, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 0, 1, 1}};

void setup() {
  for (int i = 0; i < 7; i++) {
  pinMode (SEVEN_SEG[i], OUTPUT);

  digitalWrite (SEVEN_SEG[i], number[1][i]);

  }
}

void loop() {
  for (int x = 0; x < 10; x++) {
    for (int y = 0; y < 7; y++) {
      pinMode (SEVEN_SEG[y], OUTPUT);

      digitalWrite (SEVEN_SEG[y], number[x][y]);
      //delay(100);
    }
    delay(1000);
  }
}


โค้ดการทดลองที่ 3.2.9

const byte SEVEN_SEG[7] = {3, 4, 5, 6, 7, 8, 9};
const byte SW = 2;
const byte s = 10;

byte number[10][7] = {{1, 1, 1, 1, 1, 1, 0}, {0, 1, 1, 0, 0, 0, 0},
  {1, 1, 0, 1, 1, 0, 1}, {1, 1, 1, 1, 0, 0, 1}, {0, 1, 1, 0, 0, 1, 1},
  {1, 0, 1, 1, 0, 1, 1}, {1, 0, 1, 1, 1, 1, 1}, {1, 1, 1, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 0, 1, 1}
};

void setup() {
}
void loop() {
  for (int x = 0; x < 10; x++) {
    for (int y = 0; y < 7; y++) {
      if (digitalRead(SW) == LOW) {
        pinMode (s, OUTPUT);
        digitalWrite (s, HIGH);
      } else {
        pinMode (s, OUTPUT);
        digitalWrite (s, LOW);
        x=0;
        y=0;
      }
      pinMode (s, OUTPUT);
      pinMode (SEVEN_SEG[y], OUTPUT);
      digitalWrite (SEVEN_SEG[y], number[x][y]);
    }  delay(1000);
  }
}

การทดลองที่ 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);
    }
  }
}