วัตถุประสงค์
- เพื่อฝึกใช้งานบอร์ด 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 เครื่อง
ขั้นตอนการทดลอง
- ออกแบบวงจร วาดผังวงจร และต่อวงจรบนเบรดบอร์ด ร่วมกับบอร์ด Arduino เพื่อวัดแรงดันที่ได้จากวงจรแบ่งแรงดันที่ใช้ตัวต้านทานปรับค่าได้ (แรงดันอยู่ในช่วง 0V ถึง 5V) เช่น ป้อนเข้าที่ขา A0 ของบอร์ด Arduino แล้วนำค่าไปแสดงผลโดยใช้ 7-Segment Display จำนวน 2 หลัก และให้มีทศนิยมเพียงหนึ่งตำแหน่ง เช่น ถ้าวัดแรงดันได้ 2.365V จะแสดงผลเป็น “2.4” ถ้าวัดได้ 2.539V ให้แสดงผลเป็น “2.5” เป็นต้น และให้ใช้แรงดันไฟเลี้ยง VCC=+5V และ Gnd จากบอร์ด Arduino เท่านั้น
- เขียนโค้ดสำหรับ Arduino เพื่ออ่านค่าจากแรงดันอินพุต-แอนะล็อก แล้วนำไปแสดงผลโดยใช้ 7-Segment Display ตามที่กล่าวไป (และให้แสดงค่าที่อ่านได้ออกทาง Serial Monitor ด้วย) และในการเขียนโค้ด ห้ามใช้ตัวแปรหรือตัวเลขแบบ float
- เขียนรายงานการทดลอง ซึ่งประกอบด้วยคำอธิบายการทดลองตามขั้นตอน ผังวงจรที่ถูกต้องครบถ้วนตามหลักไฟฟ้า (ให้วาดด้วยโปรแกรม 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 ซึ่งได้แก่ตัวแปรดังนี้
และประกาศตัวแปรที่ใช้ในโปรแกรมดังนี้
ในฟังก์ชั่น setup()
ทำการกำหนด Input และ Output ของบอร์ดโดยใช้คำสั่ง pinMode() รวมถึงสถานะแรกเริ่มของแต่ละส่วนด้วยคำสั่ง digitalWrite() โดยกำหนดให้ IN เป็น Input ที่รับมาจากตัวต้านทาน ให้ EN[],SEVEN_SEG [] และ DOT เป็น Output โดยกำหนดให้เอาต์พุตทุกตัวมีสถานะแรกเริ่มเป็น HIGH จากนั้นใช้คำสั่ง Serial.Begin(9600) เพื่อเปิดใช้งาน Serial Monitor ที่ Baud rate เท่ากับ 9600
ในฟังก์ชั่น loop()
ทำการแยกหน่วยจาก Input ดังนี้
และแสดงค่าต่างๆออกทาง Serial Monitor คำสั่ง Serial.print
ทำการสั่ง 7Segment ให้ทำงานได้ดังนี้
ตัวแปร | คำอธิบาย |
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 และเก็บผลลัพธ์ลงในตัวแปรตัวเดิมจะได้ว่าตัวแปร value1 จะเก็บค่าของเลขหลักหน่วย ตัวแปร value2 จะเก็บค่าของเลขทศนิยมหลักที่ 1 และตัวแปร value3 จะเก็บค่าของเลขทศนิยมหลักที่ 2
จากนั้นทำการพิจารณาค่าของ value3 ถ้ามากกว่า 5 จะทำการปัดเศษขึ้นโดยการเพิ่มค่า value2 ขึ้น 1 ค่า และทำการพิจารณาค่าของ value2 ถ้ามากกว่า 9 ทำการปัดเศษขึ้นโดยการเพิ่มค่า value1 ขึ้น 1 ค่าและปรับ value2 เท่ากับ 0
และแสดงค่าต่างๆออกทาง 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 |
No comments:
Post a Comment