Lekcja 86: Sterowanie pozycją serwomechanizmu za pomocą potencjometru
Wyobraź sobie, że przekręcasz prosty pokrętło i obserwujesz, jak mechaniczne ramię precyzyjnie podąża za każdym Twoim ruchem. To jest magia połączenia potencjometru z serwomechanizmem. Ten projekt, będący częścią kursu Arduino Step by Step autorstwa Robojax, demonstruje podstawową i niezwykle użyteczną koncepcję w elektronice: przekształcanie sygnału analogowego w precyzyjny ruch fizyczny. Nauczysz się, jak odczytywać zmienne napięcie z potencjometru, mapować tę wartość na zakres kątów i sterować serwomechanizmem, aby obracał się do dokładnie tej pozycji. To Twoja brama do budowania intuicyjnych i interaktywnych projektów, w których ręczna kontrola spotyka się z automatyzacją.

Zastosowania tej umiejętności są szerokie i praktyczne. Oto kilka pomysłów, które Cię zainspirują:
- Sterowanie ramieniem robota: Użyj potencjometru, aby ręcznie ustawić każde przegub ramienia robota do precyzyjnych operacji pick-and-place.
- System obrotu i pochylania kamery: Zbuduj zdalnie sterowany uchwyt kamery do poklatków lub monitoringu, płynnie obracając i pochylając kamerę za pomocą obrotu pokrętła.
- Replika wskaźnika analogowego: Stwórz fizyczny wskaźnik deski rozdzielczej (np. prędkościomierz lub pokrętło temperatury), który porusza się na podstawie danych z czujników, a potencjometr służy jako ręczne sterowanie lub narzędzie do kalibracji.
- Interaktywne instalacje artystyczne: Twórz kinetyczne rzeźby reagujące na działania widzów, gdzie obrót pokrętła zmienia pozycję ruchomych części.
- Sterowanie modelem pojazdu: Zdalnie steruj kątem skrętu modelu samochodu lub łodzi, zapewniając bardziej intuicyjne i analogowe sterowanie niż przyciskami cyfrowymi.
Ten przewodnik opiera się na samouczku wideo Lesson 86: Control position of a servo motor using potentiometer autorstwa Robojax (na filmie o 00:00). Przeprowadzi Cię przez cały proces, od zrozumienia okablowania po wyjaśnienie kodu, który sprawia, że wszystko działa. Zaczynajmy.
Sprzęt i komponenty
Aby śledzić ten projekt, będziesz potrzebować następujących komponentów:
- Płytka Arduino (np. Uno, Nano)
- Standardowy serwomechanizm (np. SG90 lub MG996R)
- Potencjometr (rezystor zmienny, zwykle 10kΩ)
- Przewody połączeniowe
- Płytka stykowa (opcjonalnie, dla łatwiejszych połączeń)
Zrozumienie okablowania
Okablowanie tego projektu jest proste. Kluczem jest zapewnienie prawidłowych połączeń zasilania i sygnału zarówno dla serwomechanizmu, jak i potencjometru. Serwomechanizm jest urządzeniem o dużym poborze mocy, więc zasilany jest bezpośrednio z pinu 5V Arduino. Potencjometr działa jako dzielnik napięcia, a my odczytujemy napięcie na jego suwaku (środkowym pinie), aby określić jego pozycję. (na filmie o 01:05)
Jednym ze sprytnych trików w tym projekcie jest utworzenie dodatkowego źródła 5V na pinie cyfrowym do zasilania potencjometru, ponieważ niektóre płytki Arduino mają tylko jeden dedykowany pin 5V. Robi się to w kodzie, ustawiając pin cyfrowy (pin 8) na HIGH, co daje napięcie 5V. (na filmie o 00:39)
Oto schemat połączeń wspomniany w filmie:
Rozbijmy połączenia:
- Serwomechanizm:
- Zasilanie (czerwony przewód) → pin 5V Arduino
- Masa (brązowy/czarny przewód) → pin GND Arduino
- Sygnał (pomarańczowy/żółty przewód) → pin 3 Arduino (pin z obsługą PWM)
- Potencjometr:
- Lewy pin → pin GND Arduino
- Środkowy pin (suwak) → pin analogowy A0 Arduino
- Prawy pin → pin 8 Arduino (zdefiniowany jako VCC2 w kodzie)
Wyjaśnienie kodu
Kod tego projektu jest elegancko prosty. Wykorzystuje kilka kluczowych funkcji Arduino do odczytu potencjometru i sterowania serwomechanizmem. Skupmy się na konfigurowalnych częściach, które możesz dostosować do własnych projektów. (na filmie o 03:00)
Na górze szkicu zdefiniujesz piny i utworzysz obiekt serwomechanizmu. To są główne zmienne, które zmienisz w zależności od okablowania:
#include <Servo.h>
Servo myservo; // utwórz obiekt serwomechanizmu do sterowania serwem
int potpin = A0; // pin analogowy używany do podłączenia potencjometru
int servoPin = 3; // zdefiniuj pin cyfrowy (z PWM) dla serwa. Można użyć tylko pinów 3, 5, 6, 9, 10, 11
int VCC2 = 8;// zdefiniuj dodatkowe VCC dla potencjometru
int val; // zmienna do odczytu wartości z pinu analogowego
Oto, co robi każda część:
- Servo myservo;: Ta linia tworzy obiekt o nazwie
myservo, którego użyjemy do sterowania naszym konkretnym serwomechanizmem. Możesz go przemianować, ale musisz użyć tej samej nazwy później w kodzie. - int potpin = A0;: To definiuje, do którego pinu analogowego podłączony jest suwak potencjometru. Jeśli przeniesiesz przewód do innego pinu analogowego, musisz zaktualizować tę liczbę.
- int servoPin = 3;: To ustawia pin cyfrowy dla przewodu sygnałowego serwomechanizmu. Kluczowe jest użycie pinu z obsługą PWM (zwykle oznaczonego '~' na płytce). Komentarz wymienia prawidłowe piny dla większości Arduino.
- int VCC2 = 8;: To jest pin używany jako dodatkowe źródło 5V dla potencjometru. Jeśli masz płytkę z wieloma pinami 5V, możesz podłączyć go bezpośrednio i usunąć tę część kodu.
W funkcji setup() kod inicjalizuje serwo i konfiguruje dodatkowy pin zasilania. Funkcja myservo.attach(servoPin) jest kluczowa, ponieważ informuje Arduino, który pin jest podłączony do przewodu sygnałowego serwa.
void setup() {
Serial.begin(9600); // konfiguracja serial
myservo.attach(servoPin); // podłącza serwo na pinie 3 do obiektu serwa
pinMode(VCC2, OUTPUT);// ustaw pin 8 jako wyjście
digitalWrite(VCC2, HIGH);// ustaw pin 8 na HIGH, aby działał jako pin 5V
}
Główna logika znajduje się w funkcji loop(). Odczytuje ona wartość potencjometru, skaluje ją do kąta i wydaje polecenie serwu, aby się przesunęło. Dwie kluczowe funkcje to analogRead() i map(). (na filmie o 04:27)
void loop() {
val = analogRead(potpin); // odczytuje wartość potencjometru (wartość między 0 a 1023)
val = map(val, 0, 1023, 0, 180); // skaluje ją do użycia z serwem (wartość między 0 a 180)
myservo.write(val); // ustawia pozycję serwa zgodnie ze skalowaną wartością
Serial.print(val);
Serial.println();
delay(50); // czeka, aż serwo dotrze do pozycji
}
Oto jak to działa:
- analogRead(potpin): Ta funkcja odczytuje napięcie z suwaka potencjometru i zwraca wartość między 0 (0V) a 1023 (5V).
- map(val, 0, 1023, 0, 180): To jest klucz do całego projektu. Pobiera surową wartość z potencjometru (0 do 1023) i proporcjonalnie przekształca ją na kąt serwa (0 do 180 stopni). Na przykład, jeśli potencjometr odczytuje 511 (około połowy), funkcja
map()zwróci 90, przesuwając serwo do pozycji środkowej. - myservo.write(val): Ta funkcja przyjmuje obliczony kąt (teraz zapisany w
val) i nakazuje serwu obrót do tej pozycji. - delay(50): Dodaje krótką pauzę na końcu każdej pętli. Kontroluje szybkość aktualizacji. Większe opóźnienie (np. 200 ms) powoduje, że serwo porusza się skokowo, podczas gdy mniejsze opóźnienie (np. 50 ms) sprawia, że ruch jest bardzo płynny. Możesz to dostosować, aby zmienić responsywność. (na filmie o 07:26)
Demonstracja projektu na żywo
Na filmie można zobaczyć projekt w działaniu. Podczas obracania pokrętła potencjometru ramię silnika serwa proporcjonalnie podąża za jego pozycją. Monitor serialny wyświetla bieżący kąt, potwierdzając, że mapowanie działa poprawnie. Gdy potencjometr jest w pozycji minimalnej, serwo znajduje się pod kątem 0 stopni. Gdy obracasz pokrętło do maksimum, serwo płynnie obraca się do 180 stopni. (na filmie o 06:33)
Ta pętla sprzężenia zwrotnego w czasie rzeczywistym demonstruje bezproblemową integrację czujnika analogowego z cyfrowym aktuatororem, tworząc responsywny i intuicyjny system sterowania.
Rozdziały
- [00:00] Wprowadzenie i przegląd projektu
- [01:05] Schemat i schemat połączeń
- [02:07] Demonstracja fizycznego okablowania
- [03:00] Wyjaśnienie kodu
- [06:33] Demonstracja i testowanie na żywo
- [07:26] Dostosowywanie szybkości reakcji serwa
/*
* Lesson 88: Controlling Servo motor a with Potentiometer
* 📚⬇️ Download and resource page https://robojax.com/RJT763
watch full video tutroial: https://www.youtube.com/watch?v=ntRW77mNFFk
Controlling a servo position using a potentiometer (variable resistor)
by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>
modified on 8 Nov 2013
by Scott Fitzgerald
http://www.arduino.cc/en/Tutorial/Knob
Update by Ahmad Shamshiri on Jan 01, 2019 in Ajax, Ontario, Canada
*/
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int potpin = A0; // analog pin used to connect the potentiometer
int servoPin = 3; // define a digital pin (with PWM) for servo. Can use only pin 3, 5, 6,9, 10, 11
int VCC2 = 8;// define extra VCC for potentiometer
int val; // variable to read the value from the analog pin
void setup() {
//
Serial.begin(9600); // setup serial
myservo.attach(servoPin); // attaches the servo on pin 3 to the servo object
pinMode(VCC2, OUTPUT);// set pin 8 as output
digitalWrite(VCC2, HIGH);// set pin 8 HIGH so it acts as 5V pin
}
void loop() {
val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023)
val = map(val, 0, 1023, 0, 180); // scale it to use it with the servo (value between 0 and 180)
myservo.write(val); // sets the servo position according to the scaled value
Serial.print(val);
Serial.println();
delay(50); // waits for the servo to get there
}
Rzeczy, których możesz potrzebować
-
Amazon
-
Amazon
-
Allegro
-
AliExpressPurchase SG90 servo motor 180 or 360 from AliExpresss.click.aliexpress.com
Zasoby i odniesienia
-
Wewnętrzny
Pliki📁
Inne pliki
-
Dane techniczne silnika SG90 Seroo
robojax-servo-SG90_datasheet.pdf0.12 MB