Lekcja 97-2: Sterowanie serwomechanizmem za pomocą enkodera obrotowego
Ten projekt pokazuje, jak zbudować precyzyjny sterownik serwomechanizmu z użyciem enkodera obrotowego. W przeciwieństwie do potencjometru, enkoder obrotowy obraca się w sposób ciągły, co pozwala na dokładne regulacje lub szybkie zmiany o wiele obrotów bez natrafiania na fizyczny ogranicznik. To czyni go doskonałym wyborem do zastosowań wymagających wysokiej trwałości i precyzyjnej kontroli, takich jak ramiona robotów, gimbale kamer, mechanizmy obrotowo-przechylne czy dowolne projekty DIY, w których trzeba ustawić pozycję za pomocą fizycznego pokrętła.
Oto kilka praktycznych przykładów, co można zbudować z tym zestawem:
- Tworzenie ręcznego panelu sterowania ramieniem robota do ustawiania kątów stawów.
- Budowa precyzyjnej głowicy obrotowo-przechylnej do kamery lub czujnika.
- Opracowanie sterownika zmotoryzowanego zaworu lub przepustnicy do automatyki domowej.
- Tworzenie interaktywnej instalacji artystycznej, w której obracanie pokrętła porusza fizycznym elementem.
Komponenty sprzętowe
Aby podążać za tym przewodnikiem, będziesz potrzebować następujących części. Enkoder obrotowy może być gołym elementem lub modułem z PCB, które zawiera niezbędne rezystory podciągające. Schematy połączeń w filmie obejmują obie wersje.
- Arduino Uno (lub podobna płyta)
- Enkoder obrotowy (z PCB lub bez)
- Serwomechanizm (standardowy lub z przekładnią metalową)
- 3x rezystory (1kΩ do 100kΩ, tylko jeśli używasz gołego enkodera)
- Wyświetlacz LCD I2C (16x2)
- Przewody połączeniowe i płytka stykowa (opcjonalnie)
Przewodnik po podłączeniu
Ten projekt obejmuje podłączenie trzech głównych komponentów do Arduino: enkodera obrotowego, serwomechanizmu i opcjonalnego wyświetlacza LCD. Film zawiera szczegółowe schematy zarówno dla wersji z PCB, jak i gołej enkodera. Podstawowe połączenia są opisane poniżej.
Enkoder obrotowy: Enkoder ma dwa piny sygnałowe (często oznaczone A i B) oraz pin przycisku. Dla wersji z PCB podłącz jego dwa piny sygnałowe do pinów 2 i 3 Arduino, a pin przycisku do pinu 4. Piny zasilania i masy idą odpowiednio do 3.3V i GND. Dla gołego enkodera musisz dodać rezystory podciągające do pinów sygnałowych.
Serwomechanizm: Serwo ma trzy przewody. Podłącz przewód sygnałowy (często żółty lub pomarańczowy) do pinu z obsługą PWM na Arduino, którym jest pin 9 w kodzie. Podłącz przewód zasilania (zwykle czerwony) do pinu 5V, a przewód masy (brązowy lub czarny) do GND. Dla mocnego serwa film zaleca użycie zewnętrznego zasilania 5V, aby uniknąć przeciążenia regulatora napięcia Arduino, zapewniając wspólną masę.
Wyświetlacz LCD I2C: LCD używa protokołu I2C, który wymaga tylko dwóch połączeń danych. Podłącz pin SDA do A4 Arduino, a pin SCL do A5. Zasil wyświetlacz napięciem 5V i GND. Film pokazuje również alternatywną metodę zasilania go z nagłówka ICSP.
Wyjaśnienie kodu
Kod jest zaprojektowany tak, aby był łatwy do konfiguracji. Główne ustawienia są zdefiniowane na górze szkicu, co pozwala dostosować piny i zachowanie bez zagłębiania się w logikę. Oto kluczowe zmienne, które możesz chcieć zmienić (w filmie o 17:52).
const int SW_PIN = 4;
const int PIN_A =2;
const int PIN_B =3;
const int homePosition = 90; //pozycja początkowa
const int stepValue = 5;
const int servoPin = 9;//musi to być pin oznaczony symbolem ~
- PIN_A i PIN_B: Definiują piny Arduino podłączone do wyjść enkodera. Jeśli twój serwomechanizm porusza się w przeciwnym kierunku niż pokrętło, możesz po prostu zamienić te dwie wartości (w filmie o 17:32).
- SW_PIN: To pin dla wbudowanego przycisku enkodera. Naciśnięcie go spowoduje przesunięcie serwa do zdefiniowanej pozycji
homePosition(w filmie o 19:06). - homePosition: To kąt (w stopniach), do którego serwo przesunie się po naciśnięciu przycisku, a także pozycja startowa serwa po włączeniu zasilania.
- stepValue: Kontroluje czułość pokrętła. Wartość 5 oznacza, że kąt serwa zmienia się o 5 stopni na każde wyczuwalne kliknięcie podczas obracania enkodera. Zwiększ tę wartość dla szybszego ruchu lub zmniejsz dla dokładniejszej kontroli (w filmie o 20:39).
- servoPin: To pin sterujący serwem. Ważne jest, aby użyć pinu obsługującego PWM (modulację szerokości impulsu), co jest oznaczone symbolem
~obok numeru pinu na Arduino. Pin 9 to bezpieczny wybór (w filmie o 21:03).
Główna pętla ciągle odczytuje pozycję enkodera. Gdy wykryta zostanie zmiana, porównuje nową pozycję ze starą, aby określić kierunek obrotu. Jeśli obracasz zgodnie z ruchem wskazówek zegara, servoAngle jest zwiększane o stepValue, a jeśli przeciwnie do ruchu wskazówek zegara, zmniejszane. Kod zawiera sprawdzenia, aby upewnić się, że kąt pozostaje w prawidłowym zakresie 0–180 stopni dla standardowego serwa.
Przycisk enkodera jest odczytywany jako wejście cyfrowe. Po naciśnięciu obniża pin do stanu niskiego, co wyzwala kod do zresetowania servoAngle do zdefiniowanej pozycji homePosition (w filmie o 27:13). Jeśli używasz wersji kodu z LCD, niestandardowa funkcja obsługuje czyszczenie i aktualizację wyświetlania kąta na ekranie, aby zapobiec duchom tekstu (w filmie o 27:56).
Demonstracja na żywo projektu
W demonstracji wideo pokazano działanie układu zarówno z serwem standardowym, jak i z serwem z przekładnią metalową. Podczas obracania pokrętła ramię serwa podąża za kierunkiem obrotu, zatrzymując się na granicach 0 i 180 stopni. Reakcja jest natychmiastowa i precyzyjna. Wideo pokazuje również działanie przełącznika, gdzie naciśnięcie pokrętła natychmiast przywraca serwo do pozycji początkowej, co może być bardzo przydatną funkcją do zerowania mechanizmu (w filmie na 30:01).
Sterowanie serwem za pomocą enkodera zostało omówione w Lekcji 97-1: Wykrywanie obrotu enkodera obrotowego i naciskania przełącznika.
Powiązane projekty z tego wideo
- Lekcja 97-1: Wykrywanie obrotu enkodera obrotowego i naciskania przełącznika
- Lekcja 97-3: Sterowanie serwomotorem za pomocą enkodera obrotowego i wyświetlanie kąta na LCD
Rozdziały
- [00:01] Wprowadzenie do sterowania serwem za pomocą enkodera obrotowego
- [00:51] Podłączanie enkodera w wersji PCB
- [06:55] Podłączanie gołego enkodera z rezystorami
- [09:56] Podłączanie serwomotoru i LCD
- [13:28] Instalacja wymaganych bibliotek
- [14:54] Testowanie podstawowego kodu enkodera
- [17:52] Modyfikacja kodu dla serwa i przełącznika
- [20:20] Wyjaśnienie kodu sterowania serwem
- [27:56] Wyjaśnienie funkcji wyświetlania na LCD
- [30:01] Finalna demonstracja i podsumowanie
/*
* Lesson 97-2: Controlling Servo Motor using Rotary Encoder
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 or a 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
const int homePosition = 90; //initial position
const int stepValue = 5;
const int servoPin = 9;//must be a pin that that is labeled with ~
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int servoAngle =homePosition;
void setup() {
Serial.begin(9600);
pinMode(SW_PIN, INPUT);
Serial.println("Basic Encoder Test:");
myservo.attach(servoPin); // attaches the servo on pin
myservo.write(servoAngle);//move servo to initial position
}
long oldPosition = -999;
void loop() {
long newPosition = myEnc.read();
if (newPosition != oldPosition) {
if(newPosition > oldPosition)
{
int newStep = abs(newPosition - oldPosition);
Serial.print("Angle ");
Serial.println(servoAngle);
servoAngle -= stepValue;
if(servoAngle <0)
servoAngle =0;
myservo.write(servoAngle);
}
if(newPosition < oldPosition )
{
int newStep = abs(newPosition - oldPosition);
Serial.print("Angle ");
Serial.println(servoAngle);
servoAngle += stepValue;
if(servoAngle >180)
servoAngle =180;
myservo.write(servoAngle);
}
oldPosition = newPosition;//remember the new position
}
if( digitalRead(SW_PIN) == LOW)
{
Serial.print("Home: ");
Serial.println(homePosition);
servoAngle =homePosition;
myservo.write(servoAngle);
}
//Watch full details video: https://youtu.be/6xVLbNlmK-g
//delay(200);
}
Rzeczy, których możesz potrzebować
-
Amazon
-
Amazon
-
Amazon
-
Allegro
-
Allegro
-
AliExpressPurchase an LCD1602 from AliExpresss.click.aliexpress.com
Zasoby i odniesienia
-
ZewnętrznyPurchase an LCD1602 from AliExpresss.click.aliexpress.com
-
Zewnętrzny
-
Zewnętrzny
-
ZewnętrznyPurchase ZK-5DA from Amazon UKamzn.to
Pliki📁
Brak dostępnych plików.