Mündəricat:

Tam Arduino Rotary Həll: 5 addım
Tam Arduino Rotary Həll: 5 addım

Video: Tam Arduino Rotary Həll: 5 addım

Video: Tam Arduino Rotary Həll: 5 addım
Video: Как построить ПЛК Arduino с модулем часов реального времени и поворотным энкодером 2024, Noyabr
Anonim
Tam Arduino Rotary Həll
Tam Arduino Rotary Həll

Döner kodlayıcılar, tez -tez Arduino ailəsinin mikro nəzarətçiləri ilə birlikdə istifadə olunan elektron layihələr üçün dönər idarəetmə düymələridir. Parametrləri dəqiq tənzimləmək, menyularda gəzmək, obyektləri ekranda daşımaq, hər cür dəyər təyin etmək üçün istifadə edilə bilər. Potansiyometrlərin ümumi əvəzediciləridir, çünki daha dəqiq və sonsuz döndərilə bilər, bir anda ayrı bir dəyəri artırır və ya azaldır və çox vaxt seçim funksiyaları üçün itələyici açarla birləşdirilir. Hər formada və ölçüdə olurlar, lakin ən aşağı qiymət aralığını aşağıda izah edildiyi kimi istifadə etmək çətindir.

Rotary kodlayıcıların iş detalları və istifadə rejimləri, onlardan necə istifadə olunacağına dair çoxsaylı nümunə kodları və kitabxanalar haqqında saysız -hesabsız məqalələr var. Yeganə problem, heç birinin ən aşağı qiymət aralığında olan Çin fırlanan modulları ilə 100% dəqiq işləməməsidir.

Addım 1: İçərisində Rotary Enkoderlər

İçərisində Rotary Enkoderlər
İçərisində Rotary Enkoderlər
İçərisində Rotary Enkoderlər
İçərisində Rotary Enkoderlər
İçərisində Rotary Enkoderlər
İçərisində Rotary Enkoderlər

Enkoderin fırlanan hissəsində üç sancaq var (və əlavə iki keçid hissəsi üçün). Biri ümumi yerdir (qara GND), digər ikisi də düymə döndükdə istiqaməti təyin etmək üçündür (onlara tez -tez mavi CLK və qırmızı DT deyilir). Hər ikisi də mikrokontrolörün PULLUP giriş pininə bərkidilir, bu da YÜKSƏK səviyyəni standart oxunuşuna çevirir. Düymə irəli (və ya saat istiqamətində) döndərildikdə əvvəlcə mavi CLK LOW səviyyəsinə düşür, sonra qırmızı DT gəlir. Daha da irəli döndükdə mavi CLK yenidən HIGH -a yüksəlir, sonra ümumi GND yaması hər iki əlaqə sancağından ayrıldıqca qırmızı DT də HIGH -a yüksəlir. Beləliklə, bir tam işarə FWD (və ya saat yönünde) tamamlanır. Eyni şəkildə BWD (və ya saat əqrəbinin əksinə) digər istiqamətə gedir, amma indi qırmızı əvvəl düşür, mavi isə iki səviyyəli görüntülərdə göstərildiyi kimi sonuncu dəfə geri qalxır.

Addım 2: Çoxları üçün Həqiqi Ağrıya səbəb olan bədbəxtlik

Çoxları üçün əsl ağrıya səbəb olan bədbəxtlik
Çoxları üçün əsl ağrıya səbəb olan bədbəxtlik
Çoxları üçün əsl ağrıya səbəb olan bədbəxtlik
Çoxları üçün əsl ağrıya səbəb olan bədbəxtlik
Çoxları üçün əsl ağrıya səbəb olan bədbəxtlik
Çoxları üçün əsl ağrıya səbəb olan bədbəxtlik

Arduino həvəskarları üçün ümumi problem, ucuz Rotary kodlayıcı modullarının çıxış səviyyələrində əlavə dəyişikliklər etməsi və əlavə və yanlış istiqamət sayım oxunuşlarına səbəb olmasıdır. Bu, qüsursuz saymağı maneə törədir və bu modulların dəqiq fırlanan layihələrə inteqrasiyasını qeyri -mümkün edir. Bu əlavə sıçrayışlar, yamaqların bağlantı pinləri üzərindəki mexaniki hərəkətlərindən qaynaqlanır və hətta əlavə kondansatörlərin tətbiqi onları tamamilə aradan qaldıra bilməz. Sıçrayışlar tam qeyd dövrlərində hər yerdə görünə bilər və şəkillərdəki real həyat ssenariləri ilə təsvir olunur.

Addım 3: Sonlu Dövlət Maşını (FSM) Həll

Sonlu Dövlət Maşını (FSM) Həll
Sonlu Dövlət Maşını (FSM) Həll

Şəkil, hər iki pin üçün (mavi CLK və qırmızı DT), həm düzgün, həm də səhv sıçrayışlar üçün mümkün olan səviyyəli dəyişikliklərin tam vəziyyətini göstərir. Bu dövlət maşını əsasında hər zaman 100% dəqiq işləyən tam bir həll proqramlaşdırıla bilər. Bu həlldə heç bir süzgəc gecikməsinə ehtiyac olmadığı üçün, eyni zamanda mümkün olan ən sürətlidir. Sancaqların vəziyyət sahəsini iş rejimindən ayırmağın başqa bir faydası, həm zövqünə görə həm seçki, həm də kəsmə rejimini tətbiq edə bilməsidir. Səsvermə və ya fasilələr sancaqlardakı səviyyə dəyişikliklərini aşkar edə bilər və ayrı bir gündəlik, yeni vəziyyəti cari vəziyyətə və səviyyəli dəyişikliklərin faktiki hadisələrinə əsaslanaraq hesablayacaq.

Addım 4: Arduino Kodu

Arduino kodu
Arduino kodu

Aşağıdakı kod seriyalı monitorda FWD və BWD gənələrini sayır və əlavə olaraq keçid funksiyasını da birləşdirir.

// Peter Csurgay 2019-04-10

// Arduino limanlarına döndərilən pinlər

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

// Dönər tərəfindən tənzimlənmiş sayğacın cari və əvvəlki dəyəri

int curVal = 0; int prevVal = 0;

// FSM -nin yeddi vəziyyəti (sonlu dövlət maşını)

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

boş quraşdırma () {

Serial.begin (250000); Serial.println ("Başla…"); // Yüksək səviyyə bütün pin pinMode (SW, INPUT_PULLUP) üçün standart olacaq; pinMode (CLK, INPUT_PULLUP); pinMode (DT, INPUT_PULLUP); // Həm CLK, həm də DT bütün səviyyəli dəyişikliklər üçün fasilələri işə salacaq attachInterrupt (digitalPinToInterrupt (CLK), rotaryCLK, CHANGE); attachInterrupt (digitalPinToInterrupt (DT), rotaryDT, CHANGE); }

boşluq döngəsi () {

// İstifadəçi keçidinin bəzi dönər kodlayıcılara inteqrasiyası, əgər (digitalRead (SW) == LOW) {Serial.println ("Pressed"); while (! digitalRead (SW)); } // Sayğac dəyərindəki hər hansı bir dəyişiklik Serial Monitorda göstərilir, əgər (curVal! = PrevVal) {Serial.println (curVal); prevVal = curVal; }}

// CLK səviyyəsi dəyişiklikləri üçün Dövlət Maşını keçidləri

boş rotaryCLK () {if (digitalRead (CLK) == LOW) {if (state == IDLE_11) state = SCLK_01; başqa halda (vəziyyət == SCLK_10) vəziyyət = SCLK_00; başqa halda (vəziyyət == SDT_10) vəziyyət = SDT_00; } başqa {əgər (vəziyyət == SCLK_01) vəziyyət = IDLE_11; başqa halda (vəziyyət == SCLK_00) vəziyyət = SCLK_10; başqa halda (vəziyyət == SDT_00) vəziyyət = SDT_10; başqa halda (vəziyyət == SDT_01) {vəziyyət = IDLE_11; curVal--; }}}

// DT səviyyəsi dəyişiklikləri üçün Dövlət Maşını keçidləri

boş rotaryDT () {if (digitalRead (DT) == LOW) {if (state == IDLE_11) state = SDT_10; başqa halda (vəziyyət == SDT_01) vəziyyət = SDT_00; başqa halda (vəziyyət == SCLK_01) vəziyyət = SCLK_00; } başqa {əgər (vəziyyət == SDT_10) vəziyyət = IDLE_11; başqa halda (vəziyyət == SDT_00) vəziyyət = SDT_01; başqa halda (vəziyyət == SCLK_00) vəziyyət = SCLK_01; başqa halda (vəziyyət == SCLK_10) {vəziyyət = IDLE_11; curVal ++; }}}

Addım 5: Qüsursuz İnteqrasiya

Əlavə edilmiş videoda, FSM həllinin müxtəlif sporadik sıçrayış effektləri olan aşağı diapazonlu dönmə kodlayıcıları olsa belə dəqiq və sürətli işlədiyini yoxlaya bilərsiniz.

Tövsiyə: