Szukaj kodu

Lekcja 86: Sterowanie pozycją serwomechanizmu za pomocą potencjometru

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:

Arduino wiring or servo motor with pot
Okablowanie Arduino dla serwomechanizmu z potencjometrem

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

Obrazy

Arduino wiring or servo motor with pot
Arduino wiring or servo motor with pot
SG90_servo_motor-1
SG90_servo_motor-1
SG90_servo_motor-0
SG90_servo_motor-0
892-Lesson 86: Controlling a servo position using a potentiometer (variable resistor)
Język: C++
/*
 * 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ć

Zasoby i odniesienia

Pliki📁

Inne pliki