วันอาทิตย์ที่ 18 สิงหาคม พ.ศ. 2556

วงจรตรวจจับโลหะ Arduino + Inductive Proximity Sensor

Arduino + Inductive Proximity Sensor

         ก่อนที่จะลงมือทำเครื่องนับจำนวนโลหะโดยใช้ Arduino นั้น เรามาทำความรู้จักกับ
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
        จากนั้นทำการประกอบวงจรให้ได้ดังรูปเลยครับ  

        

        จากวงจรด้านบนทำเป็น 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  
        ขอให้สนุกกันการประยุกต์ใช้งานครับ...