Lecția 85: Introducere în servomotoare | Cursul Arduino Pas cu Pas
Acest ghid de proiect te introduce în lumea servomotorilor cu rotație continuă, cunoscuți și ca servoare de 360 de grade. Spre deosebire de servoarele standard care se mișcă la un unghi specific (cum ar fi 0 până la 180 de grade), aceste motoare se rotesc continuu în ambele direcții. Acest lucru le face ideale pentru construirea de roboți mici, șenile de tanc sau orice proiect care necesită motoare de acționare simple și accesibile. Acest ghid îți va arăta cum să controlezi unul folosind un Arduino și câteva butoane, oferindu-ți control practic asupra direcției și vitezei sale.
Iată câteva aplicații practice pentru un servomotor de 360 de grade:
- Construirea unei mașini robot mici cu două roți.
- Crearea unui suport de cameră cu mișcare panoramică și înclinare care se rotește la nesfârșit.
- Acționarea unei benzi transportoare mici sau a unui troliu.
- Realizarea unei platforme simple de scanare radar sau cu senzori.

Hardware și componente
Pentru acest proiect, vei avea nevoie de următoarele componente:
- Placă Arduino (de exemplu, Uno)
- Servomotor cu rotație continuă (de exemplu, FS90R sau similar)
- Trei butoane
- Fire de legătură
- Breadboard (opțional, pentru o cablare mai ușoară)
Ghid de cablare
Cablarea pentru acest proiect este simplă. Servomotorul are trei fire: de obicei maro (masă), roșu (alimentare) și portocaliu sau galben (semnal). Butoanele sunt cablate într-o configurație simplă.
Iată o defalcare a conexiunilor:
- Servomotor:
- Firul maro (masă) se conectează la pinul GND al Arduino.
- Firul roșu (alimentare) se conectează la pinul de 5V al Arduino.
- Firul portocaliu/galben (semnal) se conectează la pinul 9 al Arduino.
- Butoane:
- O parte a fiecărui buton este conectată la pinul GND al Arduino.
- Cealaltă parte a butonului „În sens invers acelor de ceasornic" se conectează la pinul 2.
- Cealaltă parte a butonului „Stop" se conectează la pinul 3.
- Cealaltă parte a butonului „În sensul acelor de ceasornic" se conectează la pinul 4.
În videoclip, creatorul subliniază că firul de semnal al servomotorului trebuie conectat la un pin cu capacitate PWM pe Arduino, care este adesea marcat cu simbolul tildă (~). Pinul 9 este unul dintre acești pini. Butoanele folosesc rezistențele interne de pull-up ale Arduino, ceea ce simplifică cablarea prin eliminarea necesității rezistențelor externe (în videoclip la 07:02).
Explicația codului
Codul este conceput pentru a citi starea a trei butoane și a trimite comanda corespunzătoare servomotorului. Să defalcăm părțile configurabile de utilizator.
Configurarea pinilor și comenzilor
În partea de sus a codului, vei găsi definițiile pentru pini și valorile de control ale servomotorului. Aici poți personaliza comportamentul proiectului tău.
const int servoPin = 9; // Pin PWM pentru semnalul servomotorului
const int stopPin = 3; // Pin pentru butonul de stop
const int cwPin = 4; // Pin pentru butonul în sensul acelor de ceasornic
const int ccwPin = 2; // Pin pentru butonul în sens invers acelor de ceasornic
Aceste constante definesc ce pini Arduino sunt conectați la butoane și la servomotor. Dacă folosești alți pini pentru butoanele tale, ai schimba numerele aici. servoPin trebuie să fie un pin cu capacitate PWM.
const int csServoCommand[3] = {106, 52, 0}; // {CCW, STOP, CW}
const String csServoCommandText[3] = {"În sens invers acelor de ceasornic", "Oprit", "În sensul acelor de ceasornic"};
Aceasta este cea mai importantă parte de înțeles și de reglat. Matricea csServoCommand conține valorile trimise servomotorului. Pentru un servomotor cu rotație continuă, aceste valori nu reprezintă un unghi, ci o viteză și o direcție.
- 106 este valoarea pentru rotația la viteză maximă în sens invers acelor de ceasornic.
- 52 este valoarea pentru oprirea completă.
- 0 este valoarea pentru rotația la viteză maximă în sensul acelor de ceasornic.
Aceste valori nu sunt universale. Din cauza diferențelor de fabricație, valoarea de „oprire" (52) poate necesita ajustare. Dacă servomotorul tău se mișcă lent când apeși butonul de stop, va trebui să reglezi fin această valoare. Videoclipul demonstrează acest proces, arătând cum schimbarea valorii la 54 sau 51 poate afecta comportamentul motorului (în videoclip la 13:45).
Poți ajusta și valorile pentru rotație pentru a schimba viteza motorului. De exemplu, setarea valorii pentru sensul invers acelor de ceasornic la 70 îl va face să se rotească mai lent decât la 106 (în videoclip la 12:23).
Matricea csServoCommandText conține șirurile de text care sunt afișate în Monitorul Serial pentru a arăta starea curentă a comenzii.
Funcție personalizată: servoCommand()
Codul folosește o funcție personalizată pentru a gestiona logica comenzilor. Această funcție primește un număr (0, 1 sau 2) ca argument, actualizează textul de stare și trimite comanda corespunzătoare servomotorului.
void servoCommand(int n) {
statusText = csServoCommandText[n];
myservo.write(csServoCommand[n]);
Serial.println(csServoCommandText[n]);
Serial.println(csServoCommand[n]);
}
Această funcție este apelată din bucla principală când este apăsat un buton. Centralizează logica pentru actualizarea afișajului și controlul servomotorului, făcând codul mai curat și mai ușor de modificat.
Proiect live și demonstrație
În videoclip, creatorul demonstrează proiectul în acțiune. Apăsarea butonului „În sensul acelor de ceasornic" trimite valoarea 0 servomotorului, determinându-l să se rotească într-o direcție. Apăsarea butonului „În sens invers acelor de ceasornic" trimite valoarea 106, făcându-l să se rotească în cealaltă direcție. Butonul „Stop" trimite 52, ceea ce ar trebui să oprească motorul.
Monitorul Serial este utilizat pentru a afișa starea curentă și valoarea exactă trimisă către servomotor. Acest lucru este extrem de valoros pentru depanare și pentru găsirea valorii perfecte de „oprire" pentru motorul tău specific. După cum se menționează în videoclip, comanda de oprire poate să nu fie perfectă din cauza circuitelor interne ale servomotorului, iar s-ar putea observa o derivă lentă sau o vibrație. Aceasta este o caracteristică comună a servomotoarelor continue mai ieftine și poate fi minimizată prin reglarea valorii de oprire în cod (în videoclip la 01:15).
Capitole
- [00:05] Introducere în servomotorul cu rotație de 360 de grade
- [02:02] Prezentarea componentelor și a hardware-ului
- [02:40] Schema de conexiuni detaliată și conexiunile
- [05:07] Explicația codului: constante, tablouri și configurare
- [09:56] Explicația codului: funcția servoCommand
- [10:54] Demonstrație live și ieșirea Monitorului Serial
- [12:23] Reglarea vitezei servomotorului și a valorilor de oprire
/*
*
* 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
Lucruri de care ai putea avea nevoie
-
Amazon360 Degree Servo motor on Amazonlink.amazon
-
Amazon
-
eBay360 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
Resurse și referințe
Fișiere📁
Alte fișiere
-
Fișa tehnică a motorului SG90 Seroo
robojax-servo-SG90_datasheet.pdf0.12 MB