Lekcia 88: Ovládanie servomotora pomocou dvoch tlačidlových spínačov
Tento projekt demonštruje, ako ovládať servomotor pomocou dvoch tlačidiel s Arduinom. Namiesto potenciometra alebo sériového príkazu môžete použiť jednoduché dotykové spínače na manuálne pohybovanie serva doľava alebo doprava. Je to neuveriteľne užitočné pre aplikácie, kde potrebujete priame fyzické ovládanie mechanizmu, ako je stavba robotického ramena, nastavovanie gimbalu kamery alebo vytvorenie diaľkovo ovládaného systému nakláňania a otáčania. Tlačidlá vám umožňujú postupne nastavovať uhol serva, pričom môžete tlačidlo podržať a plynulo prejsť celým rozsahom pohybu.
Tu je niekoľko praktických projektov, ktoré môžete postaviť s týmto zapojením:
- Vytvorenie manuálneho ovládacieho panela pre robotické rameno alebo chapadlo.
- Vytvorenie diaľkovo ovládaného posúvača kamery alebo hlavy nakláňania a otáčania.
- Vývoj fyzického ovládacieho rozhrania pre kormidlo modelu lietadla alebo lode.
- Vytvorenie jednoduchého „teach pendantu" na zaznamenávanie polôh pre CNC stroj alebo 3D tlačiareň.

Hardvér a komponenty
Tento projekt vyžaduje iba niekoľko základných komponentov, čo z neho robí vynikajúci štartovací bod pre učenie sa o vstupných aj výstupných zariadeniach s Arduinom.
- Doska Arduino (Uno, Nano, Mega atď.)
- Servomotor (napr. SG90 alebo MG995)
- Dve okamžité tlačidlá
- Prepojovacie vodiče
- Nepájivé pole (voliteľné, ale odporúčané)
Návod na zapojenie
Vo videu je zapojenie jednoduché. Signálny pin servomotora je pripojený k pinu s podporou PWM na Arduine, čo je v tomto príklade pin 9. Napájanie a uzemnenie serva sú pripojené k 5V a GND pinom Arduina. Dve tlačidlá sú zapojené podobným spôsobom. Jedna nožička každého tlačidla je pripojená k uzemneniu a druhá nožička k digitálnemu vstupnému pinu na Arduine (pin 2 pre tlačidlo „vľavo" a pin 3 pre tlačidlo „vpravo"). Kód používa interné pull-up rezistory, takže pre tlačidlá nie sú potrebné žiadne externé rezistory. (vo videu o 00:57)

Vysvetlenie kódu
Kód je navrhnutý tak, aby sa dal ľahko konfigurovať. Kľúčové používateľsky nastaviteľné časti sú na začiatku skeču. Tu je rozpis dôležitých premenných a definícií, ktoré môžete upraviť pre svoj vlastný projekt.
#include <Servo.h>
Servo myservo; // vytvorenie objektu servo na ovládanie serva
int servoPin = 9;// tento pin musí byť jeden z tých s PWM ~
int angle =90; // počiatočný uhol pre servo
int angleStep =5;
#define LEFT 2 // pin 2 je pripojený k tlačidlu vľavo
#define RIGHT 3 // pin 3 je pripojený k tlačidlu vpravo
servoPin: Táto premenná definuje pin Arduina, ku ktorému je pripojený signálny vodič serva. Je dôležité použiť pin, ktorý podporuje Pulznú šírkovú moduláciu (PWM), zvyčajne označený symbolom~na doske.angle: Toto nastavuje počiatočný uhol serva pri spustení Arduina. Predvolená hodnota je 90 stupňov, čo zvyčajne vycentruje servo.angleStep: Toto je prírastok, o ktorý sa uhol serva zmení pri každom stlačení tlačidla. Hodnota 5 znamená, že každé stlačenie posunie servo o 5 stupňov. Môžete to zvýšiť pre rýchlejší pohyb alebo znížiť pre jemnejšie ovládanie.LEFTaRIGHT: Tieto direktívy#definepriraďujú digitálne piny, ku ktorým sú pripojené tlačidlá. Ak zapojíte tlačidlá na iné piny, musíte tieto hodnoty zmeniť podľa svojho zapojenia.
Základná logika vo funkcii loop() kontroluje, či je tlačidlo stlačené (čítaním signálu LOW kvôli pull-up konfigurácii). Ak je stlačené tlačidlo „vpravo", znižuje premennú angle o angleStep. Ak je stlačené tlačidlo „vľavo", zvyšuje angle. Kód obsahuje kontroly hraníc, aby sa zabezpečilo, že uhol zostane v rozsahu 0 až 180 stupňov. Funkcia myservo.write(angle) sa potom použije na príkaz servu, aby sa presunulo do novej polohy.
Živá ukážka projektu
Vo video ukážke je funkčnosť jasne zobrazená. Stlačenie a podržanie tlačidla „vľavo" spôsobí, že servo plynulo prejde doľava, pričom sa uhol zvyšuje o 5 stupňov naraz, až kým nedosiahne 180 stupňov a nezastaví sa. Podobne stlačenie a podržanie tlačidla „vpravo" spôsobí, že servo prejde späť doprava, pričom sa uhol znižuje, až kým nedosiahne 0 stupňov. Aktuálny uhol sa tlačí na Sériový monitor, čo vám umožňuje vidieť presnú polohu serva v reálnom čase. (vo videu o 05:20)
Kapitoly videa
- [00:00] Úvod do ovládania serva tlačidlami
- [00:57] Návod na zapojenie serva a tlačidiel
- [02:12] Vysvetlenie kódu, časť 1: Nastavenie a konfigurácia
- [03:25] Vysvetlenie kódu, časť 2: Logika hlavnej slučky
- [05:20] Živá ukážka projektu
- [06:23] Záver a potenciálne aplikácie
/*
* S05-05 Servo control with 2 push buttons
* Download and resource page https://robojax.com/RJT764
Watch video on YouTube https://www.youtube.com/watch?v=J_kbyAY1rLM
*
* Written by Ahmad Shamshiri for Robojax.com
* on Jan 15, 2019 at 19:15 in Ajax, Ontario, Canada
* This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.*
* This code has been download from Robojax.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
/*
Controlling a servo with two Push buttons with Arduino
when Left push button is pressed, the servo start moving to the left until it reaches 180( or zero) degrees
when Right push button is pressed, the servo start moving to the right until it reaches 180( or zero) degrees
At any instance if the button is released, servo stops
*/
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int servoPin = 9;// this pin must be of those with PWM ~
int angle =90; // initial angle for servo
int angleStep =5;
#define LEFT 2 // pin 2 is connected to left button
#define RIGHT 3 // pin 3 is connected to right button
void setup() {
// Servo button demo by Robojax.com
Serial.begin(9600); // setup serial
myservo.attach(servoPin); // attaches the servo on pin 9 to the servo object
pinMode(LEFT,INPUT_PULLUP); // assign pin 12 ass input for Left button
pinMode(RIGHT,INPUT_PULLUP);// assing pin 2 as input for right button
myservo.write(angle);// send servo to the middle at 90 degrees
Serial.println("Robojax Servo 2 Buttons ");
}
void loop() {
// Servo button demo by Robojax.com
while(digitalRead(RIGHT) == LOW){
if (angle > 0 && angle <= 180) {
angle = angle - angleStep;
if(angle < 0){
angle = 0;
}else{
myservo.write(angle); // move the servo to desired angle
Serial.print("Moved to: ");
Serial.print(angle); // print the angle
Serial.println(" degree");
}
}
delay(100); // waits for the servo to get there
}// while
// Servo button demo by Robojax.com
while(digitalRead(LEFT) == LOW){
// Servo button demo by Robojax.com
if (angle >= 0 && angle <= 180) {
angle = angle + angleStep;
if(angle >180){
angle =180;
}else{
myservo.write(angle); // move the servo to desired angle
Serial.print("Moved to: ");
Serial.print(angle); // print the angle
Serial.println(" degree");
}
}
delay(100); // waits for the servo to get there
}//
}
Veci, ktoré by ste mohli potrebovať
-
Amazon
-
Amazon
-
Amazon
-
AmazonServo motor on Amazonamzn.to
-
eBay
Zdroje a referencie
Súbory📁
Iné súbory
-
SG90 Servo motor datasheet
robojax-servo-SG90_datasheet.pdf0.12 MB