Arduino + Inductive Proximity Sensor
ก่อนที่จะลงมือทำเครื่องนับจำนวนโลหะโดยใช้ Arduino นั้น เรามาทำความรู้จักกับ
Proximity Sensor หรือเรียกอีกชื่อว่า Proximity Switch กันก่อนนะครับในที่นี้จะกล่าวถึง
Inductive Proximity Sensor ซึ่งใช้หลักการเหนี่ยวนำวัตถุที่จะทำการตรวจสอบ(โลหะที่สามารถเหนี่ยวนำได้) ในสภาวะที่ยังไม่มีการเหนี่ยวนำ ภาค Output จะอยู่ในสภาวะ Off และถ้าหากเกิดการเหนี่ยวนำขึ้นก็จะทำให้ภาค Output อยู่ในสภาวะ On ซึ่งสภาวะ On/Off จะขึ้นอยู่กับ Sensor แต่ละตัวซึ่งอาจจะมีค่าเริ่มต้นที่แตกต่างกันออกไป
Proximity Sensor หรือเรียกอีกชื่อว่า Proximity Switch กันก่อนนะครับในที่นี้จะกล่าวถึง
Inductive Proximity Sensor ซึ่งใช้หลักการเหนี่ยวนำวัตถุที่จะทำการตรวจสอบ(โลหะที่สามารถเหนี่ยวนำได้) ในสภาวะที่ยังไม่มีการเหนี่ยวนำ ภาค Output จะอยู่ในสภาวะ Off และถ้าหากเกิดการเหนี่ยวนำขึ้นก็จะทำให้ภาค Output อยู่ในสภาวะ On ซึ่งสภาวะ On/Off จะขึ้นอยู่กับ Sensor แต่ละตัวซึ่งอาจจะมีค่าเริ่มต้นที่แตกต่างกันออกไป
จากหลักการข้างต้น เราจะมาทำอุปกรณ์ในการนับจำนวน โลหะซึ่งจะต้องมีรายการอุปกรณ์ดังนี้
1. Arduino UNO ใช้เป็นตัวประมวลผล
2. Inductive Proximity Sensor
3. 7 Segment 4 Digit (TOF-3461BMB-B)
4. Resistor 4.7K ohms
4. Resistor 4.7K ohms
จากนั้นทำการประกอบวงจรให้ได้ดังรูปเลยครับ
จากวงจรด้านบนทำเป็น Shield ให้กับ Arduino พร้อมติดหลอดแสดงผล
7 Segment 4 Digit จะได้ดังรูปด้านล่างนี้ครับ
เมื่อได้วงจรดังกล่าวแล้ว เราก็มาเขียนโค๊ดใน Arduino กัน ตามข้างล่างนี้เลยครับ
// Assign Pin of 7 Segment 4 Digit
int segA = A1; //Display pin 11
int segB = 3; //Display pin 7
int segC = 4; //Display pin 4
int segD = 5; //Display pin 2
int segE = A0; //Display pin 1
int segF = 7; //Display pin 10
int segG = 8; //Display pin 5
int digit1 = 11; //Display pin 12
int digit2 = 10; //Display pin 9
int digit3 = 9; //Display pin 8
int digit4 = 6; //Display pin 6
// Assign Pin of Proximity
int prox = A5; //Proximity Sensor
// Initial counter & value;
long int counter = 0;
int beforeState = 0;
int value = 0;
void setup() {
pinMode(segA, OUTPUT);
pinMode(segB, OUTPUT);
pinMode(segC, OUTPUT);
pinMode(segD, OUTPUT);
pinMode(segE, OUTPUT);
pinMode(segF, OUTPUT);
pinMode(segG, OUTPUT);
pinMode(digit1, OUTPUT);
pinMode(digit2, OUTPUT);
pinMode(digit3, OUTPUT);
pinMode(digit4, OUTPUT);
pinMode(prox, INPUT);
}
void loop() {
value = digitalRead(prox);
// Prevent Proximity hold on object
if (beforeState != value && value == 0) {
counter++;
}
if (value == 0) {
beforeState = 0;
} else {
beforeState = 1;
}
// Display Counter
printNum(counter);
}
// Display Number
void printNum(int num) {
for (int digit = 4 ; digit > 0 ; digit--) {
switch (digit) {
case 1:
digitalWrite(digit1, HIGH);
break;
case 2:
digitalWrite(digit2, HIGH);
break;
case 3:
digitalWrite(digit3, HIGH);
break;
case 4:
digitalWrite(digit4, HIGH);
break;
}
dispNum(num % 10);
num /= 10;
delayMicroseconds(500);
// Turn off digit between loop
digitalWrite(digit1, LOW);
digitalWrite(digit2, LOW);
digitalWrite(digit3, LOW);
digitalWrite(digit4, LOW);
digitalWrite(segA, HIGH);
digitalWrite(segB, HIGH);
digitalWrite(segC, HIGH);
digitalWrite(segD, HIGH);
digitalWrite(segE, HIGH);
digitalWrite(segF, HIGH);
digitalWrite(segG, HIGH);
}
}
// Display digit
void dispNum(int digit) {
switch (digit) {
case 0:
digitalWrite(segA, LOW);
digitalWrite(segB, LOW);
digitalWrite(segC, LOW);
digitalWrite(segD, LOW);
digitalWrite(segE, LOW);
digitalWrite(segF, LOW);
digitalWrite(segG, HIGH);
break;
case 1:
digitalWrite(segA, HIGH);
digitalWrite(segB, LOW);
digitalWrite(segC, LOW);
digitalWrite(segD, HIGH);
digitalWrite(segE, HIGH);
digitalWrite(segF, HIGH);
digitalWrite(segG, HIGH);
break;
case 2:
digitalWrite(segA, LOW);
digitalWrite(segB, LOW);
digitalWrite(segC, HIGH);
digitalWrite(segD, LOW);
digitalWrite(segE, LOW);
digitalWrite(segF, HIGH);
digitalWrite(segG, LOW);
break;
case 3:
digitalWrite(segA, LOW);
digitalWrite(segB, LOW);
digitalWrite(segC, LOW);
digitalWrite(segD, LOW);
digitalWrite(segE, HIGH);
digitalWrite(segF, HIGH);
digitalWrite(segG, LOW);
break;
case 4:
digitalWrite(segA, HIGH);
digitalWrite(segB, LOW);
digitalWrite(segC, LOW);
digitalWrite(segD, HIGH);
digitalWrite(segE, HIGH);
digitalWrite(segF, LOW);
digitalWrite(segG, LOW);
break;
case 5:
digitalWrite(segA, LOW);
digitalWrite(segB, HIGH);
digitalWrite(segC, LOW);
digitalWrite(segD, LOW);
digitalWrite(segE, HIGH);
digitalWrite(segF, LOW);
digitalWrite(segG, LOW);
break;
case 6:
digitalWrite(segA, LOW);
digitalWrite(segB, HIGH);
digitalWrite(segC, LOW);
digitalWrite(segD, LOW);
digitalWrite(segE, LOW);
digitalWrite(segF, LOW);
digitalWrite(segG, LOW);
break;
case 7:
digitalWrite(segA, LOW);
digitalWrite(segB, LOW);
digitalWrite(segC, LOW);
digitalWrite(segD, HIGH);
digitalWrite(segE, HIGH);
digitalWrite(segF, HIGH);
digitalWrite(segG, HIGH);
break;
case 8:
digitalWrite(segA, LOW);
digitalWrite(segB, LOW);
digitalWrite(segC, LOW);
digitalWrite(segD, LOW);
digitalWrite(segE, LOW);
digitalWrite(segF, LOW);
digitalWrite(segG, LOW);
break;
case 9:
digitalWrite(segA, LOW);
digitalWrite(segB, LOW);
digitalWrite(segC, LOW);
digitalWrite(segD, LOW);
digitalWrite(segE, HIGH);
digitalWrite(segF, LOW);
digitalWrite(segG, LOW);
break;
}
}
เมื่อเขียนโค๊ดเสร็จก็ทำการ Upload เข้าไปยัง Arduino UNO กันได้เลย เพียงเท่านี้เราก็ได้เครื่องนับโลหะ ซึ่งสามารถนำไปประยุกต์ได้หลากหลายมาก อาจจะใช้ในการนับจำนวนเหรียญหรือโลหะอื่นๆ ที่ผ่าน Proximity หรือนับจำนวนรอบของการหมุน หรือแม้กระทั่งคำนวณความเร็วในการหมุน (เพิ่มโค๊ดในส่วนของการคำนวณหาระยะทางและความเร็ว) ลองประยุกต์กันดูนะครับ
ใครมีโปรเจคที่น่าสนใจก็สามารถแชร์ความรู้กันทาง gtalk หรือทางเมลล์ได้นะครับ
olekhanchai@gmail.com หรือสนใจอุปกรณ์สามารถเข้าสั่งซื้อได้ในเว็บ http://www.hobbyembshop.biz หรือสินค้าโปรโมชั่นที่ https://www.facebook.com/hobbyembedded
ขอให้สนุกกันการประยุกต์ใช้งานครับ...olekhanchai@gmail.com หรือสนใจอุปกรณ์สามารถเข้าสั่งซื้อได้ในเว็บ http://www.hobbyembshop.biz หรือสินค้าโปรโมชั่นที่ https://www.facebook.com/hobbyembedded