วันศุกร์ที่ 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;
  }
}

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

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