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

10 ความคิดเห็น:

  1. ใช้พร๊อกซิมิตี้เซนเซอร์ รุ่นอะไรหรอครับ

    ตอบลบ
  2. http://www.hobbyembshop.biz/product/47/inductive-proximity-sensor
    ตามลิงค์เลยครับ

    ตอบลบ
  3. พี่ใช้ shield อะไรต่อกับตัว arduino อะครับ

    ตอบลบ
  4. คำตอบ
    1. ใช้ PBC ไข่ปลา แล้วก็ wire สายตามวงจรในรูปเลยครับ

      ลบ
  5. จะเปลี่ยน จอ LED เป็น Buzzer ต้องแก้ไข้ตรงไหนครับ

    ตอบลบ
    คำตอบ
    1. ลบ code ส่วนที่เป็น 7SEGMENTS ไปได้เลยครับ แล้วใส่ output จ่ายไฟให้ Buzzer แทน code ตรง counter++

      ลบ
  6. ถ้าเจอโลหะ จอ led จะแสดงเป็นเลขอะไรคับ

    ตอบลบ