Friday, September 26, 2014

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

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

วัตถุประสงค์
  • เพื่อฝึกใช้งานบอร์ด Arduino ร่วมกับอุปกรณ์วัดทางไฟฟ้าต่างๆ 
รายการอุปกรณ์
  • แผงต่อวงจร (เบรดบอร์ด) 1 อัน
  • บอร์ด Arduino (ใช้แรงดัน +5V) 1 บอร์ด
  • ตัวต้านทานปรับค่าได้แบบสามขา 10kΩ หรือ 20kΩ 1 ตัว
  • 7-Segment Display แบบ 2 ตัวเลข (Common-Cathode) 1 ตัว
  • ทรานซิสเตอร์ NPN (เช่น PN2222A) 2 ตัว
  • ตัวต้านทาน 1kΩ 2 ตัว
  • ตัวต้านทาน 330Ω หรือ 470Ω 8 ตัว
  • สายไฟสำหรับต่อวงจร 1 ชุด
  • มัลติมิเตอร์ 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)
ผลการทดลอง

ได้ทำการออกแบบวงจรดังนี้

ผังวงจร (โดยโปรแกรม Fritzing)

จำลองการต่อวงจรบนเบรดบอร์ด (โดยโปรแกรม Fritzing)

รูปการต่อจริงบนเบรดบอร์ด

โดยเขียนโค้ดได้ดังนี้

const byte EN[2]={12,11};
const byte SEVEN_SEG[7] = {3,4,5,6,7,8,9};
const byte IN = A0;
const byte DOT = 10;

const byte DIGIT_SEG[]={
 B00111111, //0
 B00000110, //1
 B01011011, //2
 B01001111, //3
 B01100110, //4
 B01101101, //5
 B01111100, //6
 B00000111, //7
 B01111111, //8
 B01101111, //9
};

void setup(){
  pinMode( EN[0],OUTPUT);
  pinMode( EN[1],OUTPUT);
  pinMode( IN,INPUT);
  for (int i=0; i<7; i++){
    pinMode (SEVEN_SEG[i], OUTPUT);
    digitalWrite (SEVEN_SEG[i],HIGH);                                              
  }
  digitalWrite(EN[0],HIGH);
  digitalWrite(EN[1],HIGH);
  digitalWrite(DOT,HIGH);
  Serial.begin(9600);
}

void loop(){
  int value1 = analogRead(IN)*(0.489);
  int value2;
  int value3;
  Serial.print("Raw input: ");
  Serial.print(value1);
  value2 = value1%100;
  Serial.print("    ");
  Serial.print("Input mod100: ");
  Serial.print(value2);
  value3 = value2%10;
  value1 = value1 / 100;
  value2 = value2 / 10;
  if(value3>=5)value2=value2+1;
  if(value2>9){
    value1=value1+1;
    value2 = 0;
  }
  Serial.print("    ");
  Serial.print("(Input mod100)mod 10: ");
  Serial.print(value3);
  Serial.print("    ");
  Serial.print("digit2: ");
  Serial.print(value1);
  Serial.print("    ");
  Serial.print("digit1: ");
  Serial.println(value2);

  digitalWrite(EN[0],HIGH);
  digitalWrite(EN[1],LOW);
 
   byte value_2 = DIGIT_SEG[value2];
   for (int i=0; i<7; i++){
   digitalWrite (SEVEN_SEG[i],(value_2 & 1));
   value_1 >>=1;
   }
 
   delay(10);

   digitalWrite(EN[0],LOW);
   digitalWrite(EN[1],HIGH);

   byte value_1 = DIGIT_SEG[value1];
   for (int i=0; i<7; i++){
    digitalWrite (SEVEN_SEG[i],(value_1 & 1));
    value_2 >>=1;
   }
     delay(10);
 } 


การทำงานของโค๊ด

เริ่มจากกำหนดตัวแปรระบุขา PIN ที่ใช้ต่อเป็น Input หรือ Output เข้ากับบอร์ด Arduino ซึ่งได้แก่ตัวแปรดังนี้

ตัวแปร คำอธิบาย
EN[2] ใช้ควบคุมการทำงานของตัว 7 Segment ทั้ง2
SEVEN_SEG [7] ใช้เพื่อควบคุมไฟในแต่ละ Segment ของตัว 7 Segment
IN ใช้เพื่อรับสัญญาณ Analog จากตัวต้านทานปรับค่าได้
DOT ใช้ควบคุม Segment ที่เป็น . (จุด) ของตัว 7 Segment








และประกาศตัวแปรที่ใช้ในโปรแกรมดังนี้

ตัวแปร                 คำอธิบาย
DIGIT_SEG[]ใช้เก็บตัวเทียบ Binary ของตัวเลขที่จะนำไปแสดงบน 7 Segment




ในฟังก์ชั่น setup()
  ทำการกำหนด Input และ Output ของบอร์ดโดยใช้คำสั่ง pinMode() รวมถึงสถานะแรกเริ่มของแต่ละส่วนด้วยคำสั่ง digitalWrite() โดยกำหนดให้ IN เป็น Input ที่รับมาจากตัวต้านทาน ให้ EN[],SEVEN_SEG [] และ DOT เป็น Output โดยกำหนดให้เอาต์พุตทุกตัวมีสถานะแรกเริ่มเป็น HIGH จากนั้นใช้คำสั่ง Serial.Begin(9600) เพื่อเปิดใช้งาน Serial Monitor ที่ Baud rate เท่ากับ 9600

ในฟังก์ชั่น loop()
  ทำการแยกหน่วยจาก Input ดังนี้
    ทำการประกาศตัวแปรชนิด integer ชื่อว่า value1 รับค่าจากตัวต้านทานปรับค่าได้นำมาปรับสเกลให้     เต็มที่ 500 จากนั้นทำการ mod ตัวแปร value1 ด้วย 100 และเก็บเศษที่ได้ลงในตัวแปรชนิด integer ชื่อว่า value2 จากนั้นทำการ mod ตัวแปร value2 ด้วย 10 และเก็บเศษที่ได้ลงในตัวแปรชนิด integer ชื่อว่า value3 จากนั้นทำการหารตัวแปร  value1 ด้วย 100 และเก็บผลลัพธ์ลงในตัวแปรตัวเดิม
  จากนั้นทำการพิจารณาค่าของ value3 ถ้ามากกว่า 5 จะทำการปัดเศษขึ้นโดยการเพิ่มค่า value2 ขึ้น 1 ค่า และทำการพิจารณาค่าของ value2 ถ้ามากกว่า 9 ทำการปัดเศษขึ้นโดยการเพิ่มค่า value1 ขึ้น 1 ค่าและปรับ value2 เท่ากับ 0
  จะได้ว่าตัวแปร value1 จะเก็บค่าของเลขหลักหน่วย  ตัวแปร value2 จะเก็บค่าของเลขทศนิยมหลักที่ 1 และตัวแปร value3 จะเก็บค่าของเลขทศนิยมหลักที่ 2
และแสดงค่าต่างๆออกทาง Serial Monitor คำสั่ง Serial.print  

ทำการสั่ง 7Segment ให้ทำงานได้ดังนี้
   ทำการสั่ง 7 Segment แต่ละตัวให้ทำงานตามลำดับโดยการควบคุมตัวแปร EN[] จากนั้นจึงประกาศตัวแปรแบบ byte ชื่อ value_1และ value_2 มาเก็บค่าของตัวแปร DIGI_SEG[] โดยมี index เท่ากับ value1 สำหรับตัวแปร value1 และเท่ากับ value2 สำหรับตัวแปร value2 จากนั้นสั่งให้แต่ละ Segment ทำงานโดยใช้ for loop เทียบตัวแปร value_1 และvalue_2 นำมาผ่านลอจิค & กับ 1 และเลื่อนบิตไปจนครบทุก Segment 
โดยสรุปแล้วหลักการทำงานในฟังก์ชั่นนี้ คือการรับค่าจาก IN มาทำการแยกหน่วยแล้วนำค่าที่ได้ไปสั่งให้ 7 Segment ทำงานทีละตัว ตัวมี delay ให้แต่ละตัวทำงานประมาณ 10 ms โดยการวนลูปซ้ำไปซ้ำมาจะพบว่าสามารถมองเป็นภาพนิ่งได้ โดยได้ผลลัพธ์ออกมาดังนี้

รูปถ่ายวงจรในการทดลอง

เมื่อปรับแรงดันจนเหลือ 0 

ผลการแยกหน่วยที่แสดงบน Serial monitor



Thursday, September 18, 2014

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

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

วัตถุประสงค์
  • เพื่อให้สามารถนำ LDR ไปใช้งานเป็นและสามารถประยุกต์ใช้เป็นอุปกรณ์ตรวจจับแสงได้ 
รายการอุปกรณ์
  • แผงต่อวงจร (เบรดบอร์ด)     1 อัน 
  • ไอซีเปรียบเทียบแรงดัน เบอร์ LM393N   1 ตัว 
  • ตัวต้านทานปรับค่าได้แบบสามขา ขนาด 10kΩ หรือ 20kΩ 1 ตัว 
  • ตัวต้านทานไวแสง      1 ตัว 
  • ตัวต้านทาน 330Ω หรือ 470Ω    1 ตัว 
  • ตัวต้านทาน 4.7kΩ      1 ตัว 
  • ตัวต้านทาน 10kΩ      1 ตัว 
  • ทรานซิสเตอร์ NPN เบอร์ PN2222A   1 ตัว 
  • สายไฟสําหรับต่อวงจร     1 ชุด 
  • มัลติมิเตอร์      1
ขั้นตอนการทดลอง

1. ใช้มัลติมิเตอร์วัดค่าความต้านทานของตัวต้านทานไวแสง (LDR) ในสภาวะแสงที่แตกต่างกันในสาม ระดับ (ปริมาณแสงน้อย ปานกลาง และมาก) แล้วจดบันทึกค่าที่วัดได้ สังเกตการเปลี่ยนแปลงของค่า ความต้านทานเมื่อปริมาณแสงเปล่ียน
2. ต่อวงจรบนเบรดบอร์ด ตามรูปที่ 4.3.1 แล้ววัดแรงดัน Vx ในสภาวะแสงที่แตกต่างกัน (ปริมาณแสง น้อย ปานกลาง มาก) แล้วจดบันทึกค่าที่วัดได้ สังเกตการเปลี่ยนแปลงของระดับแรงดันเมื่อปริมาณ แสงเปลี่ยน
3. ต่อวงจรบนเบรดบอร์ด ตามรูปที่ 4.3.2 (แบบที่ 1) โดยใช้แรงดันไฟเลี้ยง VCC=+5V และ Gnd จากแหล่งจ่ายแรงดันควบคุม ทดลองหมุนปรับค่าที่ตัวต้านทานปรับค่าได้ และวัดแรงดัน Vref ที่ได้ สังเกตสถานะติด/ดับของ LED
4. ต่อวงจรบนเบรดบอร์ด ตามรูปที่ 4.3.3 (แบบที่ 2) โดยใช้แรงดันไฟเลี้ยง VCC=+5V และ Gnd จากแหล่งจ่ายแรงดันควบคุม ทดลองหมุนปรับค่าที่ตัวต้านทานปรับค่าได้ และวัดแรงดัน Vref ที่ได้ สังเกตสถานะติด/ดับของ LED
5. ต่อวงจรบนเบรดบอร์ด ตามรูปที่ 4.3.4 (แบบที่ 3) โดยใช้แรงดันไฟเลี้ยง +5V +9V และ Gnd  จากแหล่งจ่ายแรงดันควบคุม ทดลองหมุนปรับค่าที่ตัวต้านทานปรับค่าได้ เพื่อให้ LED “สว่าง”  เมื่อปริมาณแสงน้อย และให้ LED “ไม่ติด” เมื่อปริมาณแสงมาก
6. เขียนรายงานการทดลอง ซึ่งประกอบด้วยคําอธิบายการทดลองตามขั้นตอน ผังวงจรที่ถูกต้อง ครบถ้วนตามหลักไฟฟ้า (ให้วาดด้วยโปรแกรม Cadsoft Eagle) รูปถ่ายของการตอ่วงจรบน เบรดบอร์ด และตอบคําถามท้ายการทดลอง



รูปที่ 4.3.1: ผังวงจรสำหรับต่อวงจรตัวต้านทานปรับค่าได้


รูปที่ 4.3.2: ผังวงจรสำหรับต่อวงจรไอซีเปรียบเทียบแรงดัน (แบบที่ 1)


รูปที่ 4.3.3: ผังวงจรสำหรับต่อวงจรไอซีเปรียบเทียบแรงดัน (แบบที่ 2)


รูปที่ 4.3.4: ผังวงจรสำหรับต่อวงจรไอซีเปรียบเทียบแรงดัน (แบบที่ 3)


ผลการทดลอง 

รูปวงจรที่ต่อตามรูปที่ 4.3.1


ตารางผลการทดลองเมื่อต่อวงจรตามรูปที่ 4.3.1

แสงน้อยแสงปานกลางแสงมาก
40KΩ 3.5KΩ 
310
Vref0.852 V3.8  V
4.6  V


พบว่าเมื่อแสงน้อยลง ความต้านทานของตัวต้านทานไวแสงจะมากขึ้น

รูปวงจรที่ต่อตามรูปที่ 4.3.2
   เมื่อต่อวงจรบนเบรดบอร์ด ตามรูปที่ 4.3.2 (แบบที่ 1)  พบว่าเมื่อแสงน้อยลงแรงดัน  Vx จะเพิ่มขึ้น
เมื่อ Vx เพิ่มขึ้นจนกระทั่งมีระดับแรงดันสูงกว่า Vref  หลอด LED จึงสว่าง

รูปวงจรที่ต่อตามรูปที่ 4.3.3
   เมื่อต่อวงจรบนเบรดบอร์ด ตามรูปที่ 4.3.3 (แบบที่ 2)  พบว่าเมื่อแสงน้อยลงแรงดัน  Vx จะลดลง
เมื่อ Vx เพิ่มลดลงกระทั่งมีระดับแรงดันต่ำกว่า Vref  หลอด LED จึงสว่าง
รูปวงจรที่ต่อตามรูปที่ 4.3.4
   เมื่อต่อวงจรบนเบรดบอร์ด ตามรูปที่ 4.3.4 (แบบที่ 3)  พบว่าเมื่อแสงน้อยลงแรงดัน Vx จะเพิ่มขึ้น
เมื่อแรงดัน Vx เพิ่มขึ้นจนกระทั่งมีระดับแรงดันสูงกว่า Vref หลอด LED จึงสว่าง

รูปประกอบการทดลอง
วงจรที่ต่อตามแบบที่ 1 บนเบรดบอร์ด
วงจรที่ต่อตามแบบที่ 3 บนเบรดบอร์ด
รูปขณะวัดแรงดันเมื่อแสงน้อย (เอามือบังแสงไว้ไกลๆ)(แบบที่ 1)
รูปขณะวัดแรงดันเมื่อแสงปกติ (แบบที่ 1)

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

1. ค่าความต้านทานของ LDR จะเปลี่ยนแปลงอย่างไร เมื่อปริมาณแสงเปลี่ยน และค่าความ
ต้านทานของ LDR ที่ได้จากการทดลอง จะอยู่ในช่วงใด
  • ความต้านทานของ LDR จะเพิ่มขึ้นเมื่อมีปริมาณแสงน้อย
    จากการทดลองวัดได้ 310Ω - 40k

2. สำหรับวงจรแบบที่ 1 และ 2 แรงดัน Vx จะเปลี่ยนแปลงอย่างไร เมื่อปริมาณแสงเปลี่ยน
(เปลี่ยนจากปริมาณแสงน้อยเป็นปริมาณแสงมาก)
  • วงจรแบบที่ 1 แรงดัน Vx จะเพิ่มขึ่้นเมื่อมีปริมาณแสงน้อย
    วงจรแบบที่ 2 แรงดัน Vx จะลดลงเมื่อมีปริมาณแสงน้อย

3. สำหรับวงจรแบบที่ 3 การปรับค่าแรงดัน Vref โดยใช้ตัวต้านทานปรับค่าได้ในวงจร มีผลอย่างไร
ต่อการติดหรือดับของ LED

  • มีผลทำให้ LED ติดเมื่อปรับแรงดัน Vref น้อยกว่า Vx 



Thursday, September 11, 2014

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

การต่อวงจรไอซีเปรียบเทียบแรงดัน

วัตถุประสงค์
  • เพื่อให้เข้าใจหลักการทำงานของไอซี LM393N 
รายการอุปกรณ์
  • แผงต่อวงจร (เบรดบอร์ด) 1 อัน
  • ไอซีเปรียบเทียบแรงดัน เบอร์ LM393N 1 ตัว
  • ตัวต้านทานปรับค่าได้แบบสามขา ขนาด 10kΩ หรือ 20kΩ 1 ตัว
  • ตัวต้านทาน 4.7kΩ หรือ 10kΩ (สำหรับ Pull-Up) 1 ตัว
  • ตัวต้านทาน 330Ω หรือ 470Ω 1 ตัว
  • ไดโอดเปล่งแสง (LED) ขนาด 5 มม. 1 ตัว
  • สายไฟสำหรับต่อวงจร 1 ชุด
  • มัลติมิเตอร์ 1 เครื่อง
  • แหล่งจ่ายแรงดันควบคุม 1 เครื่อง
  • เครื่องกำเนิดสัญญาณแบบดิจิทัล 1 เครื่อง
  • ออสซิลโลสโคปแบบดิจิทัล 1 เครื่อง
ขั้นตอนการทดลอง

1. ต่อวงจรโดยใช้ตัวต้านทานปรับค่าได้ ตามผังวงจรในรูปที่ 4.1.1 แล้วป้อนแรงดันไฟเลี้ยง VCC=+5V และ Gnd จากแหล่งจ่ายแรงดันควบคุม ไปยังวงจรบนเบรดบอร์ด
2. ใช้มัลติมิเตอร์วัดแรงดันระหว่างจุด Vx กับ Gnd และทดลองหมุนปรับค่าที่ตัวต้านทาน สังเกตและจดบันทึกค่าแรงดันต่ำสุดและแรงดันสูงสุดที่วัดได้
3. ต่อวงจรบนเบรดบอร์ด โดยใช้ไอซี LM393N ตามผังวงจรในรูปที่ 4.1.2
(เลือกใช้ตัวเปรียบเทียบแรงดันที่อยู่ภายในตัวใดตัวหนึ่งจากที่มีอยู่สองตัว)
4. สร้างสัญญาณแบบสามเหลี่ยม (Triangular Wave) ให้อยู่ในช่วงแรงดัน 0V ถึง 5V โดยใช้เครื่องกำเนิดสัญญาณ (Function Generator) โดยกำหนดให้ Vpp = 5V (Peak-to-Peak Voltage) และแรงดัน Offset = 2.5V และความถี่ f = 1kHz เพื่อใช้เป็นสัญญาณอินพุต Vin แล้วนำไปป้อนให้ขาV- ของตัวเปรียบเทียบแรงดันที่ได้เลือกใช้
5. ใช้ออสซิลโลสโคปวัดสัญญาณ โดยใช้ช่อง A สำหรับวัดสัญญาณที่มาจากเครื่องกำเนิดสัญญาณ (Vin) และช่อง B สำหรับวัดสัญญาณเอาต์พุต (Vout) ที่ขาของตัวเปรียบเทียบแรงดันที่ได้เลือกใช้    
(บันทึกภาพที่ได้จากออสซิลโลสโคป เพื่อใช้ประกอบการเขียนรายงานการทดลอง)
6. ทดลองหมุนปรับค่าที่ตัวต้านทานปรับค่าได้ วัดแรงดัน Vref และสังเกตการเปลี่ยนแปลงค่า Duty Cycle ของรูปคลื่นสัญญาณเอาต์พุต
7. สลับขาสัญญาณอินพุตที่ขา V+ และ V- (ตามผังวงจรในรูปที่ 4.1.3) แล้วทำขั้นตอนที่ 6 ถึง 7 ซ้ำ
8. เขียนรายงานการทดลอง ซึ่งประกอบด้วย คำอธิบายการทดลองตามขั้นตอน ผังวงจรที่ถูกต้องครบถ้วนตามหลักไฟฟ้า (ให้วาดด้วยโปรแกรม Cadsoft Eagle) รูปถ่ายของการต่อวงจรบนเบรดบอร์ด รูปคลื่นสัญญาณที่วัดได้จากออสซิลโลสโคปตามโจทย์การทดลอง และตอบคำถามท้ายการทดลอง



รูปที่ 4.1.1: ผังวงจรสำหรับต่อวงจรที่ใช้ตัวต้านทานปรับค่าได้



รูปที่ 4.1.2: ผังวงจรสำหรับต่อวงจรเปรียบเทียบแรงดัน (Vin ต่อที่ขา V-)



รูปที่ 4.1.3: ผังวงจรสำหรับต่อวงจรเปรียบเทียบแรงดัน (Vin ต่อที่ขา V+)


ผลการทดลอง 
   จากการทดลองต่อวงจรในรูป 4.1.1 พบว่าเมื่อปรับค่าความต้านทานจะวัดแรงดัน Vx ต่ำสุดได้ 0 V และสูงสุดได้ 5 V และเมื่อนำไอซี LM393N มาต่อตามวงจรที่ 4.1.2 และนำออสซิลโลสโคปมาวัดสัญญาณจากเครื่องกำเนิดสัญญาณ (Vin) และสัญญาณเอาต์พุต (Vout) ได้ดังนี้


   เมื่อทดลองปรับค่าความต้านทานจะพบว่าเมื่อปรับแรงดัน Vref มากขึ้นค่า Duty cycle ของสัญญาณเอาต์พุตจะเพิ่มขึ้น

รูปเมื่อปรับแรงดัน Vref เพิ่มขึ้น

ต่อมาเมื่อสลับเป็นจ่ายแรงดัน Vin เข้าขา + ของไอซีตามรูปที่ 4.1.3 จะใช้ออสซิลโลสโคปวัดได้ดังนี้


   เมื่อทดลองปรับค่าความต้านทานจะพบว่าเมื่อปรับแรงดัน Vref มากขึ้นค่า Duty cycle ของสัญญาณเอาต์พุตจะลดลง


 รูปเมื่อเพิ่มแรงดัน Vref เพิ่มขึ้นจนสุด


  การที่เอาต์พุตออกมาเป็นเช่นนี้ เพราะไอซีทำงานโดยการเปรียบเทียบแรงดันที่ขาอินพุต + และ - ของตัวไอซี โดยถ้าแรงดันที่ขา + มากกว่าขา - ตัวไอซีจะจ่ายเอาต์พุตเป็น Vcc (HIGH) และเป็น 0 (LOW) เมื่อเป็นแรงดันขา - มากกว่าขา + 

รูปประกอบการทดลอง 


รูปวงจรที่ต่อตามรูปที่ 4.1.1

รูปวงจรที่ต่อตามรูปที่ 4.1.2

รูปวงจรที่ต่อตามรูปที่ 4.1.3

รูปการต่อวงจรที่ 4.1.2 บนเบรดบอร์ด

รูปการต่อวงจรที่ 4.1.3 บนเบรดบอร์ด


รูปวงจรบนเบรดบอร์ด

รูประหว่างทำการวัดสัญญาณ

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

1. ระดับของแรงดันอ้างอิง (Vref) ที่ได้จากตัวต้านทานปรับค่าได้ เพื่อใช้ในการเปรียบเทียบแรงดันมีความสัมพันธ์อย่างไรกับระดับของแรงดันเอาต์พุต (Vout) ที่ได้จากตัวเปรียบเทียบแรงดัน และ ค่า Duty Cycle ของสัญญาณเอาต์พุตที่วัดได้ จงอธิบาย
  •   เนื่องจากไอซีทำงานด้วยการเปรียบเทียบแรงดันระหว่างขา + และขา - ของวงจรโดยเอาต์พุตที่ได้ จะมีค่าเท่ากับ Vcc เมื่อขา + มากกว่าขา - (หรือเท่ากับ 5 V  ในการทดลองครั้งนี้) และเป็น -Vcc (หรือเท่ากับ 0 ในการทดลองครั้งนี้)
       สมมุติว่าเมื่อเราจ่าย Vref เข้ากับขา + ของวงจร ในช่วงที่แรงดันขา - ลดลงมากกว่าขา + เอาต์พุตจะเป็น 5 V
       ดังนั้นเมื่อจ่ายสัญญาณสามเหลี่ยมซึ่เข้าไปที่ขา - และต่อ Vref เข้าที่ขา + ของไอซีเอาต์พุตจะมี Duty Cycle เพิ่มขึ้นเมื่อแรงดัน Vref เพิ่มขึ้น
       กลับกัน ถ้าเราจ่ายสัญญาณแบบสามเหลี่ยมเข้าที่ขา + และต่อ Vref เข้าที่ขา - ของไอซี จะทำให้ Duty Cycle  ลดลงเมื่อแรงดัน Vref เพิ่มขึ้น

2. ถ้าจะให้สัญญาณเอาต์พุต Vout มีค่า Duty Cycle ประมาณ 50% จะต้องหมุนปรับค่าที่ตัวต้านทานปรับค่าได้ ให้มีแรงดัน Vref ประมาณเท่าใด
  • ประมาณ 2.5 V

3. เมื่อหมุนปรับค่าที่ตัวต้านทานปรับค่าได้ จากซ้ายสุดไปขวาสุด จะได้ค่า Vref อยู่ในช่วง ~0 ถึง ~5  โวลต์ และได้ค่า Duty Cycle ของสัญญาณเอาต์พุตอยู่ในช่วง 0 ถึง 100 เปอร์เซ็นต์


Thursday, September 4, 2014

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

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

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

  • เพื่อให้เข้าใจวิธีการใช้งาน 7-Segment Display 
  • เพื่อให้สามารถทำการโปรแกรมบอร์ด 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 ตรวจสอบความถูกต้องของวงจรบนเบรดบอร์ดก่อน เมื่อถูกต้องแล้ว จึงเชื่อมต่อ +5V และ Gnd จากบอร์ด Arduino ไปยังเบรดบอร์ด เพื่อใช้เป็นแรงดันไฟเลี้ยง (VCC และ GND) และไม่ต้องใช้แหล่งจ่ายควบคุมแรงดันจากภายนอก ให้ระวังการต่อสลับขั้วสายไฟ และระวังการต่อถึงกันทางไฟฟ้าของสายไฟทั้งสองเส้น
6. แก้ไขโค้ดสำหรับ Arduino ให้สามารถแสดงตัวเลขตั้งแต่ 0 ถึง 9 แล้ววนซ้ำ โดยเว้นระยะเวลาในการ
เปลี่ยนเป็นตัวเลขถัดไปประมาณ 1 วินาที
7. แก้ไขวงจร โดยต่อวงจรตามผังวงจรในรูปที่ 3.2.3 ให้สังเกตว่า มีการต่อวงจรปุ่มกดแบบ Pull-up
เพื่อใช้เป็นอินพุต-ดิจิทัลให้บอร์ด Arduino และมีการต่อวงจรทรานซิสเตอร์แบบ NPN เพื่อใช้ควบคุม
การไหลของกระแสจากขา CC ของ 7-Segment Display ผ่านตัวทรานซิสเตอร์ NPN จากขา
Collector (C) ไปยังขา Emitter (E) และ GND ของวงจรตามลำดับ
8. แก้ไขโค้ดสำหรับ Arduino เพื่อให้แสดงตัวเลขตั้งแต่ 0 ถึง 9 แล้ววนซ้ำ โดยเว้นระยะเวลาในการเปลี่ยนเป็นตัวเลขถัดไปประมาณ 1 วินาที แต่จะแสดงผลก็ต่อเมื่อกดปุ่ม PB1 ค้างไว้ แต่ถ้าไม่กดจะต้องไม่แสดงผลตัวเลขใดๆ (ไม่ติด)


รูปที่ 3.2.1: ผังวงจรสำหรับเชื่อมต่อบอร์ด Arduino
(ตัวอย่างนี้ใช้ 7-Segment Display แบบ Common-Cathode)


รูปที่ 3.2.2: อุปกรณ์ 7-Segment Display แบบหนึ่งหลัก (ซ้าย) และแบบสองหลัก (ขวา)


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

// 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.1: โค้ดตัวอย่างสำหรับ Arduino

ผลการทดลอง

 ในการทดลองครั้งนี้ใช้อุปกรณ์ 7-Segment Display ชนิด Common-Cathode แบบสองหลัก ซึ่งมีวงจรภายในของอุปกรณ์เป็นดังนี้



ภาพวงจรภายในของ 7-Segment Display แบบสองหลัก  (รายระเอียด DATASHEET)


ผังวงจร

การต่อวงจรบนเบรดบอร์ด

ในข้อที่ 6 เขียนโค๊ดได้ดังนี้

const byte SEVEN_SEG[7] = {3,4,5,6,7,8,9};                        
int count=0;
const byte DIGIT_SEG[]={
 B00111111, //0
 B00000110, //1
 B01011011, //2
 B01001111, //3
 B01100110, //4
 B01101101, //5
 B01111100, //6
 B00000111, //7
 B01111111, //8
 B01101111, //9
};

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

void loop(){
  if(count>9)count =0;
  if (0 <= count && count <10){
  byte value = DIGIT_SEG[count];
  for (int i=0; i<8; i++){
    digitalWrite (SEVEN_SEG[i],(value & 1));
    value >>=1;
  }
 }
 count++;
 delay(1000);
}

ในข้อ 7 เมื่อแก้ไขวงจรจะได้ดังนี้

ผังวงจร

การต่อวงจรบนเบรดบอร์ด

ในข้อ 8 เขียนโค๊ดได้ดังนี้

const byte PB_1=2;
const byte SEVEN_SEG[7] = {3,4,5,6,7,8,9};                        
int count=0;
const byte PWR = 10;
const byte DIGIT_SEG[]={
 B00111111, //0
 B00000110, //1
 B01011011, //2
 B01001111, //3
 B01100110, //4
 B01101101, //5
 B01111100, //6
 B00000111, //7
 B01111111, //8
 B01101111, //9
};

void setup(){
  pinMode( PB_1, INPUT);
  for (int i=0; i<7; i++){
  pinMode (SEVEN_SEG[i], OUTPUT);
  digitalWrite (SEVEN_SEG[i],HIGH);
  }
  digitalWrite(PWR,HIGH);
}

void loop(){
  while(digitalRead(PB_1)==0){
  delay(1000);
  if(count>9)count =0;
  if (0 <= count && count <10){
  byte value = DIGIT_SEG[count];
  for (int i=0; i<7; i++){
   digitalWrite (SEVEN_SEG[i],(value & 1));
   value >>=1;
  }
  count++;
 }
}
 count = 0;
 for (int i=0; i<7; i++){
    digitalWrite (SEVEN_SEG[i],LOW);
 }
}

รูปประกอบการทดลอง
รูประหว่างเริ่มต่อวงจรทดลอง

รูปการต่อวงจรเสร็จสมบูรณ์

รูปวงจรที่เพิ่มทรานซิสเตอร์และสวิตช์เข้าไป

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

1. วงจรทรานซิสเตอร์แบบ NPN ในวงจรนี้ใช้เพื่อวัตถุประสงค์ใด จงอธิบายหลักการทำงาน
  • เพื่อใช้เป็นสวิตช์ในการควบคุมการทำงานของ 7-Segment Display  หลักการทำงานของสวิตช์ตัวนี้คือ เมื่อเราจ่ายลอจิคของขา D10 เป็น HIGH จะเกิดแรงดันลอจิคตกคร่อมตัวต้านทาน R6 (1kΩ ) ก่อให้เกิดกระแสไฟฟ้าไหลเข้าขา Base ของทรานซิสเตอร์ ส่งผลให้กระแสไหลผ่านขา Collector และขา Emitter ได้ เมื่อทรานซิสเตอร์ทำงานจะทำให้วงจรของ 7-Segment Display ครบวงจร ตัวอุปกรณ์ดังกล่าวจึงสามารถทำงานได้

2. ถ้าจะใช้ 7-Segment Display สองหลักพร้อมกัน เช่น เพื่อแสดงผลเป็นตัวเลข “00” ถึง “99” โดยเพิ่มขึ้นทีละหนึ่ง ทุกๆ 1 วินาที (1000 มิลลิวินาที) แล้ววนกลับไปที่ “00” ใหม่ได้ จะต้องออกแบบวงจร และเขียนโค้ด Arduino ควบคุมอย่างไร

  • เขียนโค๊ดได้ดังนี้
const byte PB_1=2;
const byte SEVEN_SEG1[7] = {3,4,5,6,7,8,9};
const byte SEVEN_SEG2[7] = {10,11,12,13,A0,A1,A2};          
int count1=0;
int count2=0;

const byte DIGIT_SEG[]={
 B00111111, //0
 B00000110, //1
 B01011011, //2
 B01001111, //3
 B01100110, //4
 B01101101, //5
 B01111100, //6
 B00000111, //7
 B01111111, //8
 B01101111, //9
};

void setup(){
  pinMode( PB_1, INPUT);
  for (int i=0; i<7; i++){
    pinMode (SEVEN_SEG1[i], OUTPUT);
    pinMode (SEVEN_SEG2[i], OUTPUT);
    digitalWrite (SEVEN_SEG1[i],HIGH);
    digitalWrite (SEVEN_SEG2[i],HIGH);
  }
}

void loop(){

  delay(1000);
  if(count1>9){
    count2++;
    count1 = 0;
  }
  if(count2>9)count2=0;
  if (0 <= count1 && count1 <10){
    byte value_1 = DIGIT_SEG[count1];
    for (int i=0; i<7; i++){
    digitalWrite (SEVEN_SEG1[i],(value_1 & 1));
    value_1 >>=1;
    }
    count1++;
   }
  if (0 <= count2 && count2 <10){
    byte value_2 = DIGIT_SEG[count2];
    for (int i=0; i<7; i++){
    digitalWrite (SEVEN_SEG2[i],(value_2 & 1));
    value_2 >>=1;
    }
   }
 } 
  • มีวงจรการต่อดังนี้




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

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

วัตถุประสงค์
  • เพื่อให้สามารถทำการโปรแกรมพื้นฐานบนบอร์ด 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.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 ทันที (หมายถึง การรีเซตค่าเป็นศูนย์)



รูปที่ 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.1: โค้ดตัวอย่างสำหรับ Arduino

ผลการทดลอง 
   
  - ในข้อ 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 );
  }
}

void loop(){
   if (digitalRead(PB_1)==LOW){  
      while(digitalRead(PB_1)==LOW);
      delay(2);                                                                            
      j++;
      if(j==4)j=0;
      for (int i=0; i<4; i++){
      digitalWrite (LEDS[i], (i==j)? HIGH:LOW);
      }
    }
   if (digitalRead(PB_2)==LOW){//
      while(digitalRead(PB_2)==LOW);
      delay(2);
      j--;
      if(j<0)j=3;
      for (int i=0; i<4; i++){
      digitalWrite (LEDS[i], (i==j)? HIGH:LOW);
      }
    }
}
   
  - ในข้อ 7 ได้โค๊ดดังนี้

const byte PB_1=2;                                                                  
const byte PB_2=3;
const byte LEDS[4] = {4,5,6,7};
int count=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(){
  byte t=count;
  if (digitalRead(PB_1)==LOW){
      while(digitalRead(PB_1)==LOW);
      delay(2);/
      count++;
      if(count==16)count=0;
   }
   if (digitalRead(PB_2)==LOW){
      while(digitalRead(PB_2)==LOW);
      delay(2);// debounce
      count=0;
   }
   for (int i=0; i<4; i++){
      digitalWrite (LEDS[i], t & 1);
      t >>= 1;
   }
}

   
รูปประกอบการทดลอง 



วงจรบนเบรดบอร์ด


ผังวงจร


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