[arduino] ทำตัววัดรอบพัดลม ด้วย arduino

Posted by | August 15, 2010 | Arduino | One Comment

สวัสดีครับ วันนี้เอาโปรเจคประยุกต์ arduino จากเวปญี่ปุ่น คุณ arms22 จะทดลองทำโปรเจคไว้หลายอันเหมือนกันครับ อย่างเช่น POV ,twipic กับ arduino ให้มันถ่ายรูปแล้ว up ขึ้น twitter อีกหลายๆอันครับปัญหาคืออ่านไม่ออก เป็นภาษาญี่ปุ่น โชดดีเรามีภาษากลางคล้ายๆกัน คือ source-code เลยดูโปรเจคไปเรื่อยก้อพอจะเดาได้ สำหรับโปรเจคนี้ผมเอา ตัววัดรอบพัดลมด้วย arduino แล้วแสดงผลผ่าน 7-segment แบบหลายตัว? ที่อยากจะเอาให้ดูในโปรเจคนี้ ก้อมีที่น่าสนใจอยู่ สองอย่างครับ

  1. วัดความเร็วรอบมอเตอร์ ด้วย Interrupt อันนี้อาจจะเอาไปประยุกต์ วิธีการควบคุมความเร็วมอเตอร์ ต่อได้ครับ
  2. แสดงผล 7-Segment แบบหลายตัว การใช้งาน 7-segment มันยุ่งยากมากครับ มันไม่มี buffer ที่ใช้ในการ hold สัญญาณ เพื่อให้หลอดติดตลอดเวลาได้ เราต้องใช้เทคนิคทางไมโคร เพื่อสวิตส์สัญญาณ ความเร็วสูงในแต่ล่ะหลัก เพื่อให้มันแสดงผลได้ ซึ่งการทำแบบนี้ ถ้าจัดการไม่ดี จะทำให้ process การประมวลผลตกลงไปได้ครับ ที่จะให้ดูคือทางคนเขียน เขาสร้าง Library กับรูปแบบง่ายในการสั่งงานไว้ครับ ใครอยากใช้ลองไปโหลตต่อ ลิงค์นี้นะครับ 7-segment Library

สำหรับโปรแกรมง่ายนี้ ต้นฉบับเป็นของญีปุ่นครับ ผมอ่านได้ผ่าน google translated. สำหรับใครสนใจ code ลงเข้าไปอ่านดูครับ

วงจรกับตัวอย่างโปรแกรมครับ สำหรับการต่อสร้างไฟ อย่างก้อเข้าไปอ่านจากเวปต้นฉบับได้เลยครับ ที่เอามาดูนิ ก้อคงจะเริ่มศึกษาว่าจะมาใช้กับเจ้านาฬิกาหลงยุค Nixie เดิมเป็นแบบ code รูปแบบนี้บ้าง

ตัวอย่างโปรแกรมบน Arduino

# Include "SevenSegment.h"
SevenSegment seg7 (19,16,15,13, //1 digit, 2 digit, 3 digit, 4 digit
                   18,14,11,9,8,17,12,10); //A, B, C, D, E, F, G, DP

unsigned long lastPulseTime;
unsigned long pulseInterval;

// Falling edge detection pulse rotation

void senseRotation(void) {
    unsigned long cur = micros();
    unsigned long dif = cur - lastPulseTime;  // difference between the previous edge
    pulseInterval = (pulseInterval-(pulseInterval >> 2) ) + (dif >> 2); //smooth
    lastPulseTime = cur;
}

void setup() {
    lastPulseTime = 0;
    pulseInterval = 0;
    attachInterrupt (0, senseRotation, FALLING ); //0 = D2, FALLING = falling
    seg7.begin();  // 7 LED segment begins operation
}

unsigned long lastUpdateTime;

void loop() {
   if ( seg7.update() ) {  // called at short intervals as possible, so to control the dynamic lighting;
   unsigned long cur = millis ();
     if (cur - lastUpdateTime > 60) {  // 60ms update interval LED
          uint16_t rpm = 60000000 / (pulseInterval * 2); // RPM find
          seg7.print (rpm); // 7 LED segment display update
          lastUpdateTime = cur;
     }
   }
}

About chang

ชื่อ “ช้าง” ส่วนมากเขาจะเรียกว่า “พี่ช้าง” แล้ว มีความสนใจทางเทคโนโลยีทางคอมพิวเตอร์ อิเล็กทรอนิกส์ และ หุ่นยนต์ เป็นทั้งนักคิด นักประดิษฐ์ ชอบทดลองเล่น จนเดี่ยวนี้รู้สึกว่าจะเล่นมากกว่ามืออาชีพไปสักแล้ว

  • กิตติ ชัยวัฒน์

    มีภาพประกอบไหมคับ ขอบคุณมากคับ