Arduino

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

By August 15, 2010 June 6th, 2012 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

[cpp] # 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;
}
}
}[/cpp]

One Comment

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

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

Leave a Reply