arduino อ่าน encoder
ใช้เป็น sensor ตรวจนับรอบวัดความเร็ว encoder หรือใช้ตรวจนับชิ้นงานวัตถุ หรือหยดน้ำก็ได้ครับ
ความกว้างของปาก sensor ประมาณ 10 mm ใช้ไฟเลี้ยง 5V ภายในเบอร์ดมี Opamp LM393 ขยายสัญญานไว้แล้วครับ
ต่อใช้งานง่าย เหมาะสำหรับ AVR ARM STM32 PIC MCS-51
output valid signal is low.
ตัวอย่างนี้นะครับจสามารถอ่าน encorder ได้สองตัวพร้อมๆกันโดยต่อขา 2 และ ขา4 ใครต้องการอ่านแค่ตัวเดียวก็ลบ code
( "void doEncoder_Expanded(){ " ) ไปจนถึงปีกกาล่างนะครับ ออกนะครับ encorder อย่าลืมจ่ายไฟเลี้ยงด้วยนะครับ
code การอ่านค่าจาก encorder
#define encoder0PinA 2 #define encoder0PinB 4 volatile unsigned int encoder0Pos = 0; void setup() { pinMode(encoder0PinA, INPUT); digitalWrite(encoder0PinA, HIGH); // turn on pullup resistor pinMode(encoder0PinB, INPUT); digitalWrite(encoder0PinB, HIGH); // turn on pullup resistor attachInterrupt(0, doEncoder, CHANGE); // encoder pin on interrupt 0 - pin 2 Serial.begin (9600); Serial.println("start"); // a personal quirk } void loop(){
//
} void doEncoder() { if (digitalRead(encoder0PinA) == digitalRead(encoder0PinB)) { encoder0Pos++; } else { encoder0Pos--; } Serial.println (encoder0Pos, DEC); } void doEncoder_Expanded(){
if (digitalRead(encoder0PinA) == HIGH) { // found a low-to-high on channel A if (digitalRead(encoder0PinB) == LOW) { // check channel B to see which way // encoder is turning encoder0Pos = encoder0Pos - 1; // CCW } else { encoder0Pos = encoder0Pos + 1; // CW } } else // found a high-to-low on channel A { if (digitalRead(encoder0PinB) == LOW) { // check channel B to see which way // encoder is turning encoder0Pos = encoder0Pos + 1; // CW } else { encoder0Pos = encoder0Pos - 1; // CCW } } Serial.println (encoder0Pos, DEC); // debug - remember to comment out
}
ดู output ทาง serial monitor จะเห็นการเปลี่ยนแปลงของตัวเลขที่มีการนับขึ้นลง