Hľadať kód

Lekcia 88: Ovládanie servomotora pomocou dvoch tlačidlových spínačov

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)

Arduino wriing for Sevo motor with 2 push buttons
Arduino wriing for Sevo motor with 2 push buttons

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.
  • LEFT a RIGHT: Tieto direktívy #define priraď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

Obrázky

2 pin tactile push button switch
2 pin tactile push button switch
SG90 Mini Servo Motor
SG90 Mini Servo Motor
SG90_servo_motor-1
SG90_servo_motor-1
SG90_servo_motor-0
SG90_servo_motor-0
Arduino wriing for Sevo motor with 2 push buttons
Arduino wriing for Sevo motor with 2 push buttons
891-Lesson 88: Servo control with 2 push buttons
Jazyk: C++
/*
 * 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
  }// 

  
}

Súbory📁

Iné súbory