Isi kandungan:

Penyelesaian Rotary Arduino Lengkap: 5 Langkah
Penyelesaian Rotary Arduino Lengkap: 5 Langkah

Video: Penyelesaian Rotary Arduino Lengkap: 5 Langkah

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

Pengekod putar adalah tombol kawalan yang boleh dipusingkan untuk projek elektronik, yang sering digunakan dengan mikrokontroler keluarga Arduino. Mereka dapat digunakan untuk menyesuaikan parameter, menavigasi menu, memindahkan objek di layar, menetapkan nilai apa pun. Mereka adalah pengganti biasa untuk potensiometer, kerana mereka dapat diputar dengan lebih tepat dan tak terbatas, mereka menambah atau menurunkan satu nilai diskrit pada satu masa, dan sering disatukan dengan sakelar untuk fungsi jenis pilihan. Mereka datang dalam semua bentuk dan ukuran, tetapi julat harga terendah sukar dihubungkan seperti yang dijelaskan di bawah.

Terdapat banyak artikel mengenai perincian kerja dan cara penggunaan pengekod Rotary, dan banyak contoh kod dan perpustakaan mengenai cara menggunakannya. Satu-satunya masalah adalah bahawa tidak ada yang berfungsi 100% tepat dengan modul putar Cina julat harga terendah.

Langkah 1: Pengekod Rotary Di Dalam

Pengekod Putar Di Dalam
Pengekod Putar Di Dalam
Pengekod Putar Di Dalam
Pengekod Putar Di Dalam
Pengekod Putar Di Dalam
Pengekod Putar Di Dalam

Bahagian putar pengekod mempunyai tiga pin (dan dua lagi untuk bahagian suis pilihan). Salah satunya adalah landasan umum (GND hitam), dua yang lain adalah untuk menentukan arah ketika tombol dipusingkan (mereka sering disebut CLK biru dan DT merah). Kedua-duanya dilampirkan pada pin input PULLUP mikrokontroler, menjadikan tahap TINGGI bacaan lalai mereka. Apabila tombol dipusing ke depan (atau mengikut arah jam), pertama CLK biru jatuh ke tahap RENDAH, kemudian DT merah mengikuti. Berpusing lebih jauh, CLK biru naik kembali ke HIGH, kemudian ketika patch GND biasa meninggalkan kedua pin sambungan, DT merah juga naik kembali ke HIGH. Oleh itu, lengkapkan satu tanda penuh FWD (atau mengikut arah jam). Sama arah BWD yang lain (atau berlawanan arah jam), tetapi sekarang merah jatuh pertama, dan biru naik kembali terakhir seperti yang ditunjukkan pada gambar dua tingkat masing-masing.

Langkah 2: Kesengsaraan yang Menyebabkan Nyeri bagi Ramai

Kesengsaraan yang Menyebabkan Nyeri bagi Ramai
Kesengsaraan yang Menyebabkan Nyeri bagi Ramai
Kesengsaraan yang Menyebabkan Nyeri bagi Ramai
Kesengsaraan yang Menyebabkan Nyeri bagi Ramai
Kesengsaraan yang Menyebabkan Nyeri bagi Ramai
Kesengsaraan yang Menyebabkan Nyeri bagi Ramai

Masalah biasa bagi penggemar Arduino, bahawa modul Encoder Rotary yang murah memantulkan perubahan tambahan pada tahap output, menyebabkan pembacaan jumlah arah yang salah dan salah. Ini menghalang pengiraan yang sempurna dan mustahil untuk mengintegrasikan modul ini ke dalam projek putar yang tepat. Lantunan tambahan ini disebabkan oleh pergerakan mekanikal patch pada pin sambungan, dan bahkan menggunakan kapasitor tambahan tidak dapat menghilangkannya sepenuhnya. Lantunan boleh muncul di mana sahaja dalam kitaran kutu penuh, dan digambarkan oleh senario kehidupan sebenar pada gambar.

Langkah 3: Penyelesaian Mesin Keadaan Terhingga (FSM)

Penyelesaian Mesin Keadaan Terhingga (FSM)
Penyelesaian Mesin Keadaan Terhingga (FSM)

Gambar menunjukkan ruang keadaan penuh kemungkinan perubahan tahap untuk dua pin (CLK biru dan DT merah), baik untuk pantulan betul dan salah. Berdasarkan mesin keadaan ini, penyelesaian lengkap dapat diprogramkan yang selalu berfungsi 100% tepat. Oleh kerana tidak ada kelewatan penapisan yang diperlukan dalam penyelesaian ini, ini juga secepat mungkin. Manfaat lain untuk memisahkan ruang keadaan pin dari mod kerja adalah seseorang dapat menerapkan mod pemilihan atau mengganggu mengikut keinginannya sendiri. Pengundian atau gangguan dapat mengesan perubahan tahap pada pin dan rutin yang terpisah akan mengira keadaan baru berdasarkan keadaan semasa dan peristiwa sebenar perubahan tahap.

Langkah 4: Kod Arduino

Kod Arduino
Kod Arduino

Kod di bawah ini mengira tanda FWD dan BWD pada monitor bersiri dan juga mengintegrasikan fungsi suis pilihan.

// Peter Csurgay 2019-04-10

// Pin putar dipetakan ke port Arduino

#tentukan SW 21 #tentukan CLK 22 #tentukan DT 23

// Nilai kaunter semasa dan sebelumnya yang diselaraskan oleh putar

int curVal = 0; int prevVal = 0;

// Tujuh keadaan FSM (mesin keadaan terhingga)

#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 keadaan = IDLE_11;

batal persediaan () {

Serial.begin (250000); Serial.println ("Mula …"); // Level HIGH akan menjadi default untuk semua pin pinMode (SW, INPUT_PULLUP); pinMode (CLK, INPUT_PULLUP); pinMode (DT, INPUT_PULLUP); // Kedua-dua CLK dan DT akan mencetuskan gangguan untuk semua perubahan tahap attachInterrupt (digitalPinToInterrupt (CLK), rotaryCLK, CHANGE); attachInterrupt (digitalPinToInterrupt (DT), rotaryDT, CHANGE); }

gelung kosong () {

// Pengendalian suis pilihan yang disatukan ke dalam beberapa pengekod berputar jika (digitalRead (SW) == RENDAH) {Serial.println ("Ditekan"); sementara (! digitalRead (SW)); } // Sebarang perubahan dalam nilai kaunter akan ditampilkan di Monitor Serial jika (curVal! = PrevVal) {Serial.println (curVal); prevVal = curVal; }}

// Peralihan Mesin Negeri untuk perubahan tahap CLK

batal putarCLK () {if (digitalRead (CLK) == RENDAH) {if (state == IDLE_11) state = SCLK_01; lain jika (state == SCLK_10) state = SCLK_00; lain jika (state == SDT_10) state = SDT_00; } lain {if (state == SCLK_01) state = IDLE_11; lain jika (state == SCLK_00) state = SCLK_10; lain jika (state == SDT_00) state = SDT_10; lain jika (state == SDT_01) {state = IDLE_11; curVal--; }}}

// Peralihan Mesin Negeri untuk perubahan tahap DT

void rotaryDT () {if (digitalRead (DT) == RENDAH) {if (state == IDLE_11) state = SDT_10; lain jika (state == SDT_01) state = SDT_00; lain jika (state == SCLK_01) state = SCLK_00; } lain {if (state == SDT_10) state = IDLE_11; lain jika (state == SDT_00) state = SDT_01; lain jika (state == SCLK_00) state = SCLK_01; lain jika (state == SCLK_10) {state = IDLE_11; curVal ++; }}}

Langkah 5: Integrasi tanpa cacat

Anda boleh melihat dalam video yang dilampirkan bahawa penyelesaian FSM berfungsi dengan tepat dan pantas walaupun terdapat pengekod putar jarak rendah dengan pelbagai kesan lonjakan sporadis.

Disyorkan: