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