Daftar Isi:

Solusi Rotary Arduino Lengkap: 5 Langkah
Solusi Rotary Arduino Lengkap: 5 Langkah

Video: Solusi Rotary Arduino Lengkap: 5 Langkah

Video: Solusi Rotary Arduino Lengkap: 5 Langkah
Video: BELAJAR ARDUINO #78 - Rotary Encoder Sangat Berguna 2024, Juli
Anonim
Solusi Rotary Arduino Lengkap
Solusi Rotary Arduino Lengkap

Rotary encoder adalah tombol kontrol yang dapat diputar untuk proyek elektronik, sering digunakan dengan mikrokontroler keluarga Arduino. Mereka dapat digunakan untuk menyempurnakan parameter, menavigasi menu, memindahkan objek di layar, mengatur nilai apa pun. Mereka adalah pengganti umum untuk potensiometer, karena mereka dapat diputar lebih akurat dan tak terbatas, mereka menambah atau mengurangi satu nilai diskrit pada satu waktu, dan sering terintegrasi dengan sakelar yang dapat didorong untuk fungsi jenis pemilihan. Mereka datang dalam berbagai bentuk dan ukuran, tetapi kisaran harga terendah sulit untuk digunakan seperti yang dijelaskan di bawah ini.

Ada banyak artikel tentang detail kerja dan mode penggunaan encoder Rotary, dan banyak contoh kode dan pustaka tentang cara menggunakannya. Satu-satunya masalah adalah tidak satupun dari mereka bekerja 100% akurat dengan kisaran harga terendah modul putar Cina.

Langkah 1: Rotary Encoder Di Dalam

Rotary Encoder Di Dalam
Rotary Encoder Di Dalam
Rotary Encoder Di Dalam
Rotary Encoder Di Dalam
Rotary Encoder Di Dalam
Rotary Encoder Di Dalam

Bagian putar encoder memiliki tiga pin (dan dua lagi untuk bagian sakelar opsional). Salah satunya adalah kesamaan (GND hitam), dua lainnya untuk menentukan arah saat kenop diputar (sering disebut CLK biru dan DT merah). Keduanya dilampirkan ke pin input PULLUP dari mikrokontroler, menjadikan level HIGH sebagai pembacaan default mereka. Saat kenop diputar ke depan (atau searah jarum jam), pertama CLK biru turun ke level LOW, kemudian DT merah mengikuti. Beralih lebih jauh, CLK biru naik kembali ke HIGH, kemudian saat patch GND umum meninggalkan kedua pin koneksi, DT merah juga naik kembali ke HIGH. Dengan demikian menyelesaikan satu FWD centang penuh (atau searah jarum jam). Sama halnya dengan arah lain BWD (atau berlawanan arah jarum jam), tetapi sekarang merah turun lebih dulu, dan biru naik kembali terakhir seperti yang ditunjukkan masing-masing pada dua gambar tingkat.

Langkah 2: Kesengsaraan yang Menyebabkan Kesakitan Nyata bagi Banyak Orang

Kesengsaraan yang Menyebabkan Rasa Sakit Nyata bagi Banyak Orang
Kesengsaraan yang Menyebabkan Rasa Sakit Nyata bagi Banyak Orang
Kesengsaraan yang Menyebabkan Rasa Sakit Nyata bagi Banyak Orang
Kesengsaraan yang Menyebabkan Rasa Sakit Nyata bagi Banyak Orang
Kesengsaraan yang Menyebabkan Rasa Sakit Nyata bagi Banyak Orang
Kesengsaraan yang Menyebabkan Rasa Sakit Nyata bagi Banyak Orang

Masalah umum untuk penggemar Arduino, modul encoder Rotary yang murah memantulkan perubahan ekstra pada tingkat output, menyebabkan pembacaan hitungan arah yang salah dan ekstra. Ini mencegah penghitungan sempurna dan membuat modul ini tidak mungkin diintegrasikan ke dalam proyek putar yang akurat. Pantulan ekstra ini disebabkan oleh gerakan mekanis tambalan di atas pin sambungan, dan bahkan menerapkan kapasitor tambahan tidak dapat menghilangkannya sepenuhnya. Pantulan dapat muncul di mana saja dalam siklus centang penuh, dan diilustrasikan oleh skenario kehidupan nyata pada gambar.

Langkah 3: Solusi Finite State Machine (FSM)

Solusi Finite State Machine (FSM)
Solusi Finite State Machine (FSM)

Gambar menunjukkan ruang status penuh dari kemungkinan perubahan level untuk dua pin (CLK biru dan DT merah), baik untuk pantulan yang benar dan salah. Berdasarkan mesin negara ini solusi lengkap dapat diprogram yang selalu bekerja 100% akurat. Karena tidak ada penundaan penyaringan yang diperlukan dalam solusi ini, ini juga merupakan yang tercepat. Manfaat lain dari memisahkan ruang status pin dari mode kerja adalah bahwa seseorang dapat menerapkan mode polling atau interupsi sesuai keinginannya. Polling atau interupsi dapat mendeteksi perubahan level pada pin dan rutin terpisah akan menghitung status baru berdasarkan status saat ini dan peristiwa aktual dari perubahan level.

Langkah 4: Kode Arduino

Kode Arduino
Kode Arduino

Kode di bawah ini menghitung kutu FWD dan BWD pada monitor serial dan juga mengintegrasikan fungsi sakelar opsional.

// Peter Csurgay 2019-04-10

// Pin dari mesin putar dipetakan ke port Arduino

#define SW 21 #define CLK 22 #define DT 23

// Nilai saat ini dan sebelumnya dari penghitung yang disetel oleh putaran

int curVal = 0; int prevVal = 0;

// Tujuh keadaan FSM (mesin keadaan terbatas)

#define IDLE_11 0 #define SCLK_01 1 #define SCLK_00 2 #define SCLK_10 3 #define SDT_10 4 #define SDT_00 5 #define SDT_01 6 int state = IDLE_11;

batalkan pengaturan() {

Serial.begin(250000); Serial.println("Mulai…"); // Level HIGH akan menjadi default untuk semua pin PinMode(SW, INPUT_PULLUP); pinMode(CLK, INPUT_PULLUP); pinMode(DT, INPUT_PULLUP); // CLK dan DT akan memicu interupsi untuk semua perubahan level attachInterrupt(digitalPinToInterrupt(CLK), rotaryCLK, CHANGE); attachInterrupt(digitalPinToInterrupt(DT), rotaryDT, CHANGE); }

lingkaran kosong() {

// Penanganan sakelar opsional yang terintegrasi ke dalam beberapa enkoder putar if (digitalRead(SW)==LOW) { Serial.println("Pressed"); while(!digitalRead(SW)); } // Setiap perubahan nilai penghitung ditampilkan di Serial Monitor if (curVal != prevVal) { Serial.println(curVal); prevVal = curVal; } }

// Transisi State Machine untuk perubahan level CLK

void rotaryCLK() { if (digitalRead(CLK)==LOW) { if (state==IDLE_11) state = SCLK_01; else if (state==SCLK_10) state = SCLK_00; else if (status==SDT_10) status = SDT_00; } else { if (status==SCLK_01) status = IDLE_11; else if (state==SCLK_00) state = SCLK_10; else if (status==SDT_00) status = SDT_10; else if (status==SDT_01) { status = IDLE_11; curVal--; } } }

// Transisi State Machine untuk perubahan level DT

void rotaryDT() { if (digitalRead(DT)==LOW) { if (state==IDLE_11) state = SDT_10; else if (status==SDT_01) status = SDT_00; else if (state==SCLK_01) state = SCLK_00; } else { if (status==SDT_10) status = IDLE_11; else if (status==SDT_00) status = SDT_01; else if (status==SCLK_00) status = SCLK_01; else if (status==SCLK_10) { status = IDLE_11; curVal++; } } }

Langkah 5: Integrasi Sempurna

Anda dapat memeriksa dalam video terlampir bahwa solusi FSM bekerja secara akurat dan cepat bahkan dalam kasus enkoder putar rentang rendah dengan berbagai efek pantulan sporadis.

Direkomendasikan: