2025 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2025-01-13 06:58
Enkoder obrotowy to urządzenie elektromechaniczne, które przekształca ruch obrotowy na informacje cyfrowe lub analogowe. Może obracać się zgodnie z ruchem wskazówek zegara lub przeciwnie do ruchu wskazówek zegara. Istnieją dwa rodzaje enkoderów obrotowych: enkodery absolutne i względne (przyrostowe).
Podczas gdy enkoder absolutny wyprowadza wartość proporcjonalną do aktualnego kąta wału, enkoder inkrementalny wyprowadza krok wału i jego kierunek (w tym przypadku mamy enkoder inkrementalny)
Enkodery obrotowe stają się coraz bardziej popularne, ponieważ w jednym module elektrycznym można korzystać z dwóch funkcji: prostego przełącznika do potwierdzania operacji oraz enkodera obrotowego do nawigacji m.in. poprzez menu.
Przyrostowy enkoder obrotowy generuje dwa sygnały wyjściowe, gdy jego wał się obraca. W zależności od kierunku jeden z sygnałów prowadzi drugi. (patrz poniżej)
Krok 1: Zrozumienie danych wyjściowych
Jak widać, kiedy wałek enkodera zaczyna się obracać zgodnie z ruchem wskazówek zegara, wyjście A najpierw spada na LOW, a wyjście B podąża za nim. W kierunku przeciwnym do ruchu wskazówek zegara operacja obraca się w przeciwnym kierunku.
Teraz musimy tylko zaimplementować to na naszym µControllerze (użyłem Arduino Nano).
Krok 2: Zbuduj obwód
Jak opisałem wcześniej, wyjścia tworzą bok WYSOKI i NISKI. Aby uzyskać czyste WYSOKIE na pinach danych A i B µControllera, musimy dodać rezystory Pull-Up. Wspólny Pin C idzie prosto do ziemi na NISKIM boku.
Do uzyskania informacji o wewnętrznym przełączniku (przycisku) wykorzystamy pozostałe dwa piny. Jeden z nich trafia do VCC, a drugi do pinu danych mikrokontrolera. Musimy również dodać rezystor Pull-Down do pinu danych, aby uzyskać czysty LOW.
Możliwe jest również użycie wewnętrznych rezystorów Pull-Up i Pull-Down swojego mikrokontrolera!
W moim przypadku pinout wygląda tak:
- +3, 3V => +3, 3V (Arduino)(możliwe również +5V)
- GND => GND (Arduino)
- A => Pin10
-
B =>
Szpilka
11
- C => GND
-
SW =>
Szpilka
12
Krok 3: Pisanie kodu
int pinA = 10; //przełącznik wewnętrzny A int pinB = 11; //włącznik wewnętrzny B int pinSW = 12; //przełącznik (wciśnięty koder) int encoderPosCount = 0; // zaczyna się od zera, zmień jeśli chcesz
int pozycyjny;
bool switchval; int mrotateOstatni; wewn. rotacja;
pusta konfiguracja () {
int mrotateLast = digitalRead(pinA); Serial.początek (9600); opóźnienie(50); }
void loop() { readencoder(); if(readswitch() == 1){ Serial.println("Przełącznik = 1"); } }
int readenkoder (){
mrotate = digitalRead(pinA); if (mrotate != mrotateLast){ //pokrętło obraca się if (digitalRead(pinB) != mrotate) { //przełącznik A zmieniono jako pierwszy -> obracanie zgodnie z ruchem wskazówek zegara encoderPosCount ++; Serial.println ("obrócony zgodnie z ruchem wskazówek zegara"); } else {// przełącznik B zmienił się jako pierwszy -> obracanie w kierunku przeciwnym do ruchu wskazówek zegara PosCount--; Serial.println ("obrócony przeciwnie do ruchu wskazówek zegara"); }
Serial.print("Pozycja kodera: "); Serial.println(liczbaPoz kodera); Serial.println(""); } mrotateLast = mrotate; koder powrotuPosCount; } bool przełącznik odczytu(){
if(digitalRead(pinSW)!=0){ //przełącznik jest wciśnięty
while(digitalRead(pinSW)!=0){} //przełącznik jest aktualnie wciśnięty switchval = 1; } else{switchval = 0;} //switch jest nienaciśnięty return switchval; }
Teraz możesz obrócić enkoder, a zmienna encoderPosCount będzie odliczać w górę, jeśli obrócisz się zgodnie z ruchem wskazówek zegara, i odlicz w dół, jeśli obrócisz się w kierunku przeciwnym do ruchu wskazówek zegara.
Otóż to! Prosto i pożytecznie.
Zapraszam do zmiany i wykonania kodu. Możesz to zaimplementować w swoim projekcie.
Prześlę również projekt LED, w którym użyłem enkodera do ustawienia jasności moich diod LED.