Lekcja 85: Wprowadzenie do serwomechanizmów | Kurs Arduino Krok po Kroku
Ten przewodnik projektowy wprowadza Cię w świat serwomotorów o ciągłym obrocie, znanych również jako serwa 360 stopni. W przeciwieństwie do standardowych serw, które przesuwają się pod określony kąt (np. od 0 do 180 stopni), te silniki obracają się w sposób ciągły w obu kierunkach. Dzięki temu idealnie nadają się do budowy małych robotów, gąsienic czołgów lub dowolnego projektu wymagającego prostych, niedrogich silników napędowych. Ten przewodnik pokaże Ci, jak sterować jednym z nich za pomocą Arduino i kilku przycisków, dając Ci praktyczną kontrolę nad jego kierunkiem i prędkością.
Oto kilka praktycznych zastosowań serwa 360 stopni:
- Budowa małego dwukołowego robota.
- Tworzenie uchwytu kamery z funkcją obrotu i pochylania, który obraca się w nieskończoność.
- Napędzanie małego przenośnika taśmowego lub wciągarki.
- Wykonanie prostej platformy skanującej do radaru lub czujników.

Sprzęt i komponenty
Do tego projektu będziesz potrzebować następujących komponentów:
- Płytka Arduino (np. Uno)
- Serwomotor o ciągłym obrocie (np. FS90R lub podobny)
- Trzy przyciski
- Przewody połączeniowe
- Płytka stykowa (opcjonalnie, dla łatwiejszego okablowania)
Schemat połączeń
Okablowanie tego projektu jest proste. Serwomotor ma trzy przewody: zazwyczaj brązowy (masa), czerwony (zasilanie) oraz pomarańczowy lub żółty (sygnał). Przyciski są podłączone w prostej konfiguracji.
Oto zestawienie połączeń:
- Serwomotor:
- Brązowy przewód (masa) łączy się z pinem GND na Arduino.
- Czerwony przewód (zasilanie) łączy się z pinem 5V na Arduino.
- Pomarańczowy/żółty przewód (sygnał) łączy się z pinem 9 na Arduino.
- Przyciski:
- Jedna strona każdego przycisku jest podłączona do pinu GND na Arduino.
- Druga strona przycisku „Przeciwnie do ruchu wskazówek zegara” łączy się z pinem 2.
- Druga strona przycisku „Stop” łączy się z pinem 3.
- Druga strona przycisku „Zgodnie z ruchem wskazówek zegara” łączy się z pinem 4.
W filmie autor podkreśla, że przewód sygnałowy serwa musi być podłączony do pinu z obsługą PWM na Arduino, który często jest oznaczony symbolem tyldy (~). Pin 9 jest jednym z takich pinów. Przyciski wykorzystują wewnętrzne rezystory podciągające Arduino, co upraszcza okablowanie, eliminując potrzebę stosowania zewnętrznych rezystorów (na filmie o 07:02).
Wyjaśnienie kodu
Kod został zaprojektowany tak, aby odczytywać stan trzech przycisków i wysyłać odpowiednie polecenie do serwomotoru. Rozłóżmy na czynniki pierwsze części konfigurowalne przez użytkownika.
Konfiguracja pinów i poleceń
Na górze kodu znajdziesz definicje pinów i wartości sterowania serwem. To tutaj możesz dostosować zachowanie swojego projektu.
const int servoPin = 9; // Pin PWM dla sygnału serwa
const int stopPin = 3; // Pin dla przycisku stop
const int cwPin = 4; // Pin dla przycisku zgodnie z ruchem wskazówek zegara
const int ccwPin = 2; // Pin dla przycisku przeciwnie do ruchu wskazówek zegara
Te stałe definiują, które piny Arduino są podłączone do przycisków i serwa. Jeśli użyjesz innych pinów dla swoich przycisków, zmienisz tutaj liczby. servoPin musi być pinem z obsługą PWM.
const int csServoCommand[3] = {106, 52, 0}; // {CCW, STOP, CW}
const String csServoCommandText[3] = {"Przeciwnie do ruchu wskazówek zegara", "Zatrzymany", "Zgodnie z ruchem wskazówek zegara"};
To najważniejsza część do zrozumienia i dostrojenia. Tablica csServoCommand przechowuje wartości wysyłane do serwa. W przypadku serwa o ciągłym obrocie wartości te nie oznaczają kąta, ale prędkość i kierunek.
- 106 to wartość dla pełnej prędkości obrotu przeciwnie do ruchu wskazówek zegara.
- 52 to wartość dla całkowitego zatrzymania.
- 0 to wartość dla pełnej prędkości obrotu zgodnie z ruchem wskazówek zegara.
Te wartości nie są uniwersalne. Ze względu na różnice produkcyjne wartość „stop” (52) może wymagać regulacji. Jeśli Twoje serwo powoli dryfuje po naciśnięciu przycisku stop, będziesz musiał precyzyjnie dostroić tę wartość. Film demonstruje ten proces, pokazując, jak zmiana wartości na 54 lub 51 może wpłynąć na zachowanie silnika (na filmie o 13:45).
Możesz również dostosować wartości obrotu, aby zmienić prędkość silnika. Na przykład ustawienie wartości dla obrotu przeciwnie do ruchu wskazówek zegara na 70 spowoduje, że będzie się obracał wolniej niż przy 106 (na filmie o 12:23).
Tablica csServoCommandText przechowuje ciągi tekstowe, które są drukowane w monitorze szeregowym, aby pokazać aktualny stan polecenia.
Funkcja niestandardowa: servoCommand()
Kod używa niestandardowej funkcji do obsługi logiki poleceń. Funkcja ta przyjmuje liczbę (0, 1 lub 2) jako argument, aktualizuje tekst statusu i wysyła odpowiednie polecenie do serwa.
void servoCommand(int n) {
statusText = csServoCommandText[n];
myservo.write(csServoCommand[n]);
Serial.println(csServoCommandText[n]);
Serial.println(csServoCommand[n]);
}
Ta funkcja jest wywoływana z pętli głównej po naciśnięciu przycisku. Centralizuje logikę aktualizacji wyświetlacza i sterowania serwem, dzięki czemu kod jest czystszy i łatwiejszy do modyfikacji.
Projekt na żywo i demonstracja
W filmie autor demonstruje projekt w działaniu. Naciśnięcie przycisku „Zgodnie z ruchem wskazówek zegara” wysyła wartość 0 do serwa, powodując jego obrót w jednym kierunku. Naciśnięcie przycisku „Przeciwnie do ruchu wskazówek zegara” wysyła wartość 106, powodując obrót w drugą stronę. Przycisk „Stop” wysyła wartość 52, co powinno zatrzymać silnik.
Monitor szeregowy służy do wyświetlania bieżącego stanu oraz dokładnej wartości wysyłanej do serwomechanizmu. Jest to nieocenione podczas debugowania oraz znajdowania idealnej wartości „stop" dla Twojego konkretnego silnika. Jak zauważono w filmie, komenda stop może nie być idealna ze względu na wewnętrzne obwody serwomechanizmu i możesz zaobserwować powolny dryf lub wibracje. Jest to częsta cecha tańszych serwomechanizmów ciągłych, którą można zminimalizować, dostrajając wartość stop w kodzie (w filmie o 01:15).
Rozdziały
- [00:05] Wprowadzenie do serwomechanizmu obrotowego 360 stopni
- [02:02] Przegląd komponentów i sprzętu
- [02:40] Szczegółowy schemat połączeń i podłączenia
- [05:07] Wyjaśnienie kodu: stałe, tablice i konfiguracja
- [09:56] Wyjaśnienie kodu: funkcja servoCommand
- [10:54] Prezentacja na żywo i wyjście monitora szeregowego
- [12:23] Regulacja prędkości serwomechanizmu i wartości stop
/*
*
* Demonstration of Controlling Continuous Servo (360 servo)
* This code allows you to control a 360-degree servo by a command from the Serial Monitor.
* this 350 servo motor is a just for fun. it can't be used for real application where you need exact positioning. get stepper motor or expensive servo motor.
📚⬇️ Download and resource page https://robojax.com/RJT762
*
* Modified by Ahmad Shamshiri for Robojax.com
* on Sunday, July 1, 2018, at 11:09 AM in Ajax, Ontario, Canada
* Watch a video instruction of this project: https://youtu.be/b_xvu6wWafA
* Get this code from Robojax.com
*
Original code by BARRAGAN <http://barraganstudio.com>
This example code is in the public domain.
Modified 8 Nov 2013
by Scott Fitzgerald
http://www.arduino.cc/en/Tutorial/Sweep
*/
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 0; // variable to store the servo position
int incomingByte = 0; // for incoming serial data
void setup() {
Serial.begin(9600);
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
void loop() {
// send data only when you receive data:
if (Serial.available() > 0) {
// read the incoming byte:
incomingByte = Serial.read();
// say what you got:
Serial.print("received: ");
Serial.print (incomingByte);
if(incomingByte == 108){
Serial.println(" sent 0 Rotating CW ");
myservo.write(0);
}else if(incomingByte == 114){
Serial.println(" sent 180 Rotating CCW ");
myservo.write(180);
}else if(incomingByte == 60){
Serial.println(" sent Stopped ");
myservo.write(60);
}else{
Serial.println(" moving Randomly");
myservo.write(incomingByte);
}
}
}
/*
*
* Demonstration of Controlling Continuous Servo (360 servo)
360 Servo -2
* This code allows you to control a 360-degree servo by a command from the Serial Monitor.
* this 350 servo motor is a just for fun. it can't be used for real application where you need exact positioning. get stepper motor or expensive servo motor.
📚⬇️ Download and resource page https://robojax.com/RJT762
*
* Modified by Ahmad Shamshiri for Robojax.com
* on Sunday, July 1, 2018, at 11:09 AM in Ajax, Ontario, Canada
* Watch a video instruction of this project: https://youtu.be/b_xvu6wWafA
* Get this code from Robojax.com
*
Original code by BARRAGAN <http://barraganstudio.com>
This example code is in the public domain.
Modified 8 Nov 2013
by Scott Fitzgerald
http://www.arduino.cc/en/Tutorial/Sweep
*/
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
int servoPin = 9;// this pin must be of those with PWM ~
int pos = 0; // variable to store the servo position
int incomingByte = 0; // for incoming serial data
int CWBS, CCWBS, SBS;
void setup() {
Serial.begin(9600);
pinMode(2,INPUT_PULLUP);// set pin for push button STOP
pinMode(3,INPUT_PULLUP);// set pin for push button CCW
pinMode(4,INPUT_PULLUP);// set pin for push button CW
myservo.attach(servoPin); // attaches the servo on pin 9 to the servo object
}
void loop() {
CCWBS = digitalRead(2);// read status of button CCW
SBS = digitalRead(3);// read status of button STOP
CWBS = digitalRead(4);// read status of button CW
if(CCWBS == LOW){
Serial.println(" sent 0 Rotaing CW ");
myservo.write(0);
}else if(CWBS == LOW){
Serial.println(" sent 180 Rotaing CCW ");
myservo.write(180);
}else if(SBS == LOW){
Serial.println(" sent Stopped ");
myservo.write(60);
}else{
Serial.println(" moving Random");
myservo.write(48);
}
}// loop
Rzeczy, których możesz potrzebować
-
Amazon360 Degree Servo motor on Amazonlink.amazon
-
Amazon
-
Allegro360 Degree Servo motor on eBayebay.us
-
AliExpress360 Degree Servo motor on AliExpresss.click.aliexpress.com
-
AliExpress360 Degree Servo motor on AliExpress-2s.click.aliexpress.com
Zasoby i odniesienia
-
Wewnętrzny
Pliki📁
Inne pliki
-
Dane techniczne silnika SG90 Seroo
robojax-servo-SG90_datasheet.pdf0.12 MB