Hľadať kód

Lekcia 97-1: Detekcia rotácie rotačného enkódera a stlačenie prepínača

Lekcia 97-1: Detekcia rotácie rotačného enkódera a stlačenie prepínača

Táto príručka ukazuje, ako vytvoriť presné a odolné ovládacie rozhranie pre vaše projekty s Arduino pomocou rotačného enkódera. Na rozdiel od potenciometra, ktorý má pevný rozsah pohybu, rotačný enkóder sa môže otáčať nepretržite v oboch smeroch, čo z neho robí vynikajúcu voľbu pre aplikácie vyžadujúce prírastkové nastavenia alebo nekonečnú rotáciu. Tento projekt sa zameriava na základnú úlohu detekcie smeru otáčania a polohy enkódera, ako aj na registráciu stlačenia jeho integrovaného tlačidlového spínača. Toto tvorí základnú logiku pre mnohé pokročilé projekty, ako je vytvorenie systému navigácie v menu, nastavenie digitálneho ovládania hlasitosti alebo presné ladenie frekvencie. Mechanické kontakty rotačného enkódera sú tiež výrazne odolnejšie ako uhlíková dráha potenciometra, čo zaisťuje dlhšiu životnosť vašich projektov.

Tu je niekoľko praktických nápadov, čo môžete postaviť s týmto základným nastavením:

  • Systém navigácie v menu: Otáčajte enkóderom na prechádzanie možnosťami na LCD a stlačte spínač na výber položky.
  • Nástroj na presné nastavenie: Použite ho na jemné doladenie parametra, ako je nastavenie časovača alebo úprava rýchlosti motora v malých, definovaných krokoch.
  • Ovládač robotického ramena: Nahraďte joystick enkóderom pre presné, krokové ovládanie polohy servomotora.

Potrebný hardvér

Na sledovanie tejto lekcie budete potrebovať nasledujúce komponenty:

  • Arduino Uno (alebo podobnú kompatibilnú dosku)
  • Modul rotačného enkódera (s PCB) alebo holý rotačný enkóder s tromi rezistormi 10kΩ
  • Nepájivé pole a prepojovacie vodiče
  • USB kábel na programovanie Arduina

Sprievodca zapojením

rotary_encoder_schematic_bb
rotary_encoder_breadboard_bb

Rotačný enkóder zjednodušuje proces sledovania otáčania. Má dva výstupné piny (často označené A a B), ktoré generujú špecifickú sekvenciu signálov pri otáčaní gombíka. Čítaním týchto signálov môže Arduino určiť smer a množstvo otáčania. Enkóder tiež obsahuje vstavaný tlačidlový spínač, ktorý sa aktivuje stlačením gombíka, čo poskytuje dodatočný vstup pre interakciu s používateľom.

Zapojenie pre tento projekt je jednoduché. Uvedený diagram ukazuje, ako pripojiť modul enkódera k Arduinu. Pin CLK (alebo A) je pripojený na digitálny pin 2, pin DT (alebo B) je pripojený na digitálny pin 3 a pin SW (Spínač) je pripojený na digitálny pin 4. Pin + (VCC) enkódera je pripojený na napájanie 3,3V a jeho pin GND je pripojený na spoločnú zem.

Ak používate holý rotačný enkóder bez PCB, budete musieť pridať tri pull-up rezistory (medzi 1kΩ a 100kΩ) na jeho výstupné piny, aby ste zabezpečili čistý signál pre Arduino.

Vysvetlenie kódu

Kód tohto projektu je navrhnutý tak, aby bol jednoduchý a vzdelávací. Zameriava sa na používateľsky konfigurovateľné časti na začiatku skeču, čo vám umožňuje ľahko ho prispôsobiť pre rôzne piny alebo projekty.

Prvá časť definuje piny, ku ktorým je enkóder pripojený. Toto sú primárne hodnoty, ktoré budete musieť zmeniť, ak je váš hardvér zapojený inak.

const int SW_PIN = 4;
const int PIN_A =2;
const int PIN_B =3;
  • SW_PIN: Táto konštanta definuje pin Arduina pripojený k tlačidlovému spínaču enkódera.
  • PIN_A a PIN_B: Tieto konštanty definujú piny Arduina pripojené k dvom výstupným kanálom enkódera, A a B. Tieto piny používa knižnica Encoder na sledovanie otáčania gombíka.

Ďalej kód zahŕňa potrebnú knižnicu a vytvára inštanciu objektu enkódera, pričom ho spája s pinmi, ktoré sme práve definovali.

#include <Encoder.h>
Encoder myEnc(PIN_A, PIN_B);

Vo funkcii setup() sa inicializuje sériový monitor pre komunikáciu a pin spínača sa nakonfiguruje ako vstup.

void setup() {
  Serial.begin(9600);
  pinMode(SW_PIN, INPUT);
  Serial.println("Basic Encoder Test:");
}

Hlavná logika vo funkcii loop() vykonáva dve kľúčové úlohy. Po prvé, nepretržite číta aktuálnu polohu enkódera. Ak sa táto poloha zmenila oproti poslednej zaznamenanej hodnote, znamená to, že gombík bol otočený, a nová poloha sa vytlačí na sériový monitor. Po druhé, kontroluje stav spínača. Keď je spínač stlačený, jeho pin je pritiahnutý na nízku úroveň a kód vytlačí správu oznamujúcu stlačenie.

long oldPosition  = -999;

void loop() {
  long newPosition = myEnc.read();
  if (newPosition != oldPosition) {
    oldPosition = newPosition;
    Serial.println(newPosition);
  }

  if( digitalRead(SW_PIN) == LOW)
  {
   Serial.println("Switch Pressed");
  }

  delay(200);
}

Funkcia myEnc.read() je vlastná funkcia z knižnice Encoder. Vracia aktuálny počet polohy enkódera. Porovnaním aktuálnych a predchádzajúcich hodnôt môžete zistiť pohyb. Funkcia digitalRead(SW_PIN) je štandardná funkcia Arduina, ktorá číta stav pinu spínača.

Živá ukážka projektu

Po nahratí kódu do vášho Arduina môžete otvoriť Sériový monitor (nastavený na 9600 baudov), aby ste videli výsledky. Keď otočíte gombíkom enkódera v smere hodinových ručičiek, uvidíte, ako sa čísla zvyšujú. Otáčanie proti smeru hodinových ručičiek spôsobí znižovanie čísel. Ak stlačíte gombík nadol, zobrazí sa správa „Prepínač stlačený". Toto potvrdzuje, že systém správne deteguje otáčanie aj stlačenie tlačidla.

Súvisiace projekty z tohto videa

Kapitoly

  • [00:01] Úvod do ovládania serva pomocou rotačného enkódera
  • [01:41] Prečo použiť rotačný enkóder namiesto potenciometra
  • [04:18] Prehľad modulu rotačného enkódera a zapojenia
  • [13:28] Inštalácia potrebných knižníc
  • [14:54] Vysvetlenie základného príkladu kódu enkódera
  • [16:43] Demonštrácia základného kódu enkódera
  • [17:52] Upravený kód s tlačidlovým prepínačom
  • [20:20] Úplné vysvetlenie kódu pre ovládanie serva a LCD
  • [23:47] Nájdenie I2C adresy LCD
  • [30:01] Demonštrácia kompletného projektu

Obrázky

Rotary encoder breadboard
Rotary encoder breadboard
Rotary encoder schematic breadboard
Rotary encoder schematic breadboard
431-Lesson 97-1: Code: Rotary Encoder with switch
Jazyk: C++
/* 
 *  Lesson 97-1: Rotary Encoder with switch 
 *  This code detects rotation of the encoder knob
 *  and also detects when it is pushed
 *  Download and resource page https://robojax.com/RJT453

 *  Watch full details video: https://youtu.be/6xVLbNlmK-g
  This video is part of the Arduino Step by Step Course, which starts here: https://youtu.be/-6qSrDUA5a8
 

If you found this tutorial helpful, please support me so I can continue creating 
content like this. Make a donation using PayPal by credit card: https://bit.ly/donate-robojax
  
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact. * 
 * This code has been downloaded from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 *  Updated by Ahmad Shamshiri on Jan 23, 2022
 *  Encoder Library - Basic Example
 * http://www.pjrc.com/teensy/td_libs_Encoder.html
 *
 * This example code is in the public domain.
 */
const int SW_PIN = 4;
const int PIN_A =2;
const int PIN_B =3;

#include <Encoder.h>

// Change these two numbers to the pins connected to your encoder.
//   Best Performance: both pins have interrupt capability
//   Good Performance: only the first pin has interrupt capability
//   Low Performance:  neither pin has interrupt capability
Encoder myEnc(PIN_A, PIN_B);
//   avoid using pins with LEDs attached

void setup() {
  Serial.begin(9600);
  pinMode(SW_PIN, INPUT);
  Serial.println("Basic Encoder Test:");
}

long oldPosition  = -999;

void loop() {
  long newPosition = myEnc.read();
  if (newPosition != oldPosition) {
    oldPosition = newPosition;
    Serial.println(newPosition);
  }

  if( digitalRead(SW_PIN) == LOW)
  {
   Serial.println("Switch Pressed");
  }

  delay(200);
  //Watch video details: https://youtu.be/6xVLbNlmK-g
}

Zdroje a referencie

Súbory📁

Žiadne súbory nie sú k dispozícii.