Lekcia 85: Úvod do servomotorov | Kurz Arduino krok za krokom
Tento projektový sprievodca vás uvedie do sveta plynule rotujúcich servomotorov, známych aj ako 360-stupňové servá. Na rozdiel od štandardných serv, ktoré sa pohybujú do konkrétneho uhla (napríklad 0 až 180 stupňov), tieto motory sa otáčajú plynule v oboch smeroch. Vďaka tomu sú ideálne na stavbu malých robotov, pásových podvozkov alebo akéhokoľvek projektu, ktorý vyžaduje jednoduché a lacné hnacie motory. Táto príručka vám ukáže, ako ovládať jeden z nich pomocou Arduina a niekoľkých tlačidiel, čo vám dá praktickú kontrolu nad jeho smerom a rýchlosťou.
Tu je niekoľko praktických aplikácií pre 360-stupňové servo:
- Stavba malého dvojkolesového robotického auta.
- Vytvorenie naklápacieho a otočného držiaka kamery, ktorý sa otáča donekonečna.
- Pohon malého dopravníkového pásu alebo navijaka.
- Vytvorenie jednoduchej platformy na skenovanie radarom alebo senzormi.

Hardvér a komponenty
Na tento projekt budete potrebovať nasledujúce komponenty:
- Doska Arduino (napr. Uno)
- Plynule rotujúci servomotor (napr. FS90R alebo podobný)
- Tri tlačidlá
- Prepojovacie vodiče
- Nepájivé pole (voliteľné, pre jednoduchšie zapojenie)
Sprievodca zapojením
Zapojenie tohto projektu je jednoduché. Servomotor má tri vodiče: zvyčajne hnedý (uzemnenie), červený (napájanie) a oranžový alebo žltý (signál). Tlačidlá sú zapojené v jednoduchej konfigurácii.
Tu je rozpis pripojení:
- Servomotor:
- Hnedý vodič (uzemnenie) sa pripája na pin GND na Arduine.
- Červený vodič (napájanie) sa pripája na pin 5V na Arduine.
- Oranžový/žltý vodič (signál) sa pripája na pin 9 na Arduine.
- Tlačidlá:
- Jedna strana každého tlačidla je pripojená na pin GND na Arduine.
- Druhá strana tlačidla "Proti smeru hodinových ručičiek" sa pripája na pin 2.
- Druhá strana tlačidla "Stop" sa pripája na pin 3.
- Druhá strana tlačidla "V smere hodinových ručičiek" sa pripája na pin 4.
Vo videu tvorca zdôrazňuje, že signálny vodič serva musí byť pripojený na pin Arduina podporujúci PWM, ktorý je často označený symbolom vlnovky (~). Pin 9 je jedným z týchto pinov. Tlačidlá využívajú interné pull-up rezistory Arduina, čo zjednodušuje zapojenie tým, že odpadá potreba externých rezistorov (vo videu v čase 07:02).
Vysvetlenie kódu
Kód je navrhnutý tak, aby čítal stav troch tlačidiel a odosielal zodpovedajúci príkaz servomotoru. Poďme si rozobrať časti, ktoré môže používateľ konfigurovať.
Konfigurácia pinov a príkazov
Na začiatku kódu nájdete definície pinov a hodnôt na ovládanie serva. Tu môžete prispôsobiť správanie svojho projektu.
const int servoPin = 9; // PWM pin pre signál serva
const int stopPin = 3; // Pin pre tlačidlo stop
const int cwPin = 4; // Pin pre tlačidlo v smere hodinových ručičiek
const int ccwPin = 2; // Pin pre tlačidlo proti smeru hodinových ručičiek
Tieto konštanty definujú, ktoré piny Arduina sú pripojené k tlačidlám a servu. Ak pre svoje tlačidlá použijete iné piny, zmenili by ste čísla tu. servoPin musí byť pin podporujúci PWM.
const int csServoCommand[3] = {106, 52, 0}; // {CCW, STOP, CW}
const String csServoCommandText[3] = {"Proti smeru hodinových ručičiek", "Zastavené", "V smere hodinových ručičiek"};
Toto je najdôležitejšia časť na pochopenie a doladenie. Pole csServoCommand uchováva hodnoty odosielané servu. Pre plynule rotujúce servo tieto hodnoty nepredstavujú uhol, ale rýchlosť a smer.
- 106 je hodnota pre plnú rýchlosť rotácie proti smeru hodinových ručičiek.
- 52 je hodnota pre úplné zastavenie.
- 0 je hodnota pre plnú rýchlosť rotácie v smere hodinových ručičiek.
Tieto hodnoty nie sú univerzálne. Kvôli rozdielom vo výrobe môže byť potrebné upraviť hodnotu "stop" (52). Ak sa vaše servo pomaly pohybuje, keď stlačíte tlačidlo stop, budete musieť túto hodnotu doladiť. Video demonštruje tento proces a ukazuje, ako zmena hodnoty na 54 alebo 51 môže ovplyvniť správanie motora (vo videu v čase 13:45).
Môžete tiež upraviť hodnoty pre rotáciu, aby ste zmenili rýchlosť motora. Napríklad nastavenie hodnoty pre proti smeru hodinových ručičiek na 70 spôsobí pomalšiu rotáciu ako pri hodnote 106 (vo videu v čase 12:23).
Pole csServoCommandText uchováva textové reťazce, ktoré sa tlačia do sériového monitora na zobrazenie aktuálneho stavu príkazu.
Vlastná funkcia: servoCommand()
Kód používa vlastnú funkciu na spracovanie logiky príkazov. Táto funkcia berie číslo (0, 1 alebo 2) ako argument, aktualizuje text stavu a odosiela zodpovedajúci príkaz servu.
void servoCommand(int n) {
statusText = csServoCommandText[n];
myservo.write(csServoCommand[n]);
Serial.println(csServoCommandText[n]);
Serial.println(csServoCommand[n]);
}
Táto funkcia sa volá z hlavnej slučky, keď sa stlačí tlačidlo. Centralizuje logiku aktualizácie displeja a ovládania serva, vďaka čomu je kód čistejší a ľahšie upravovateľný.
Živý projekt a demonštrácia
Vo videu tvorca demonštruje projekt v akcii. Stlačenie tlačidla "V smere hodinových ručičiek" odošle servu hodnotu 0, čo spôsobí jeho otáčanie jedným smerom. Stlačenie tlačidla "Proti smeru hodinových ručičiek" odošle hodnotu 106, čo spôsobí otáčanie opačným smerom. Tlačidlo "Stop" odošle hodnotu 52, čo by malo motor zastaviť.
Sériový monitor sa používa na zobrazenie aktuálneho stavu a presnej hodnoty odosielanej servu. To je neoceniteľné pri ladení a pri hľadaní dokonalej hodnoty „stop" pre váš konkrétny motor. Ako je uvedené vo videu, príkaz stop nemusí byť dokonalý kvôli vnútornému zapojeniu serva a môžete si všimnúť pomalý drift alebo vibrácie. Toto je bežná vlastnosť lacnejších kontinuálnych serv a dá sa minimalizovať nastavením hodnoty stop v kóde (vo videu o 01:15).
Kapitoly
- [00:05] Úvod do 360-stupňového servomotora
- [02:02] Prehľad komponentov a hardvéru
- [02:40] Podrobná schéma zapojenia a pripojení
- [05:07] Vysvetlenie kódu: konštanty, polia a nastavenie
- [09:56] Vysvetlenie kódu: funkcia servoCommand
- [10:54] Živá ukážka a výstup Sériového monitora
- [12:23] Nastavenie rýchlosti serva a hodnôt 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
Veci, ktoré by ste mohli potrebovať
-
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
Zdroje a referencie
Súbory📁
Iné súbory
-
SG90 Servo motor datasheet
robojax-servo-SG90_datasheet.pdf0.12 MB