Search Code

Lekcja 88: Sterowanie serwomotorem za pomocą dwóch przycisków przełączników

Lekcja 88: Sterowanie serwomotorem za pomocą dwóch przycisków przełączników

Ten projekt pokazuje, jak sterować serwomechanizmem za pomocą dwóch przycisków z Arduino. Zamiast polegać na potencjometrze lub poleceniu szeregowym, możesz użyć prostych przełączników dotykowych, aby ręcznie przesuwać serwo w lewo lub w prawo. Jest to niezwykle przydatne w zastosowaniach, gdzie potrzebujesz bezpośredniej, fizycznej kontroli nad mechanizmem, takich jak budowa ramienia robota, regulacja gimbala kamery czy tworzenie zdalnie sterowanego systemu obrotu i pochylania. Przyciski pozwalają na stopniową regulację kąta serwa, z możliwością przytrzymania przycisku, aby przemieścić je w pełnym zakresie ruchu.

Oto kilka praktycznych projektów, które możesz zbudować przy użyciu tego zestawu:

  • Budowa ręcznego panelu sterowania ramieniem robota lub chwytakiem.
  • Tworzenie zdalnie sterowanego suwaka kamery lub głowicy obrotowo-pochylnej.
  • Opracowanie fizycznego interfejsu sterowania sterem modelu samolotu lub łodzi.
  • Wykonanie prostego „panelu nauczania” do zapisywania pozycji dla maszyny CNC lub drukarki 3D.

Sprzęt i komponenty

Ten projekt wymaga tylko kilku podstawowych komponentów, co czyni go doskonałym punktem startowym do nauki zarówno o urządzeniach wejściowych, jak i wyjściowych z Arduino.

  • Płytka Arduino (Uno, Nano, Mega itp.)
  • Serwomechanizm (np. SG90 lub MG995)
  • Dwa przyciski chwilowe
  • Przewody połączeniowe
  • Płytka stykowa (opcjonalna, ale zalecana)

Schemat połączeń

Na filmie połączenia są proste. Pin sygnałowy serwomechanizmu jest podłączony do pinu z obsługą PWM na Arduino, którym w tym przykładzie jest pin 9. Zasilanie i masa serwa są podłączone do pinów 5V i GND Arduino. Dwa przyciski są podłączone w podobny sposób do siebie. Jedna nóżka każdego przycisku jest podłączona do masy, a druga do pinu wejścia cyfrowego na Arduino (pin 2 dla przycisku „w lewo” i pin 3 dla przycisku „w prawo”). Kod wykorzystuje wewnętrzne rezystory podciągające, więc nie są potrzebne żadne zewnętrzne rezystory dla przycisków. (na filmie o 00:57)

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

Wyjaśnienie kodu

Kod został zaprojektowany tak, aby był łatwy do konfiguracji. Kluczowe części konfigurowalne przez użytkownika znajdują się na górze szkicu. Oto zestawienie ważnych zmiennych i definicji, które możesz chcieć dostosować do własnego projektu.

#include <Servo.h>

Servo myservo;  // utwórz obiekt serwa do sterowania serwomechanizmem
int servoPin = 9;// ten pin musi mieć PWM ~
int angle =90;    // początkowy kąt serwa
int angleStep =5;

#define LEFT 2   // pin 2 jest podłączony do przycisku w lewo
#define RIGHT  3  // pin 3 jest podłączony do przycisku w prawo
  • servoPin: Ta zmienna określa pin Arduino, do którego podłączony jest przewód sygnałowy serwa. Ważne jest, aby użyć pinu obsługującego modulację szerokości impulsu (PWM), zwykle oznaczonego symbolem ~ na płytce.
  • angle: Ustawia początkowy kąt serwa po uruchomieniu Arduino. Domyślna wartość to 90 stopni, co zwykle centruje serwo.
  • angleStep: Jest to przyrost, o jaki zmienia się kąt serwa przy każdym naciśnięciu przycisku. Wartość 5 oznacza, że każde naciśnięcie przesunie serwo o 5 stopni. Możesz zwiększyć tę wartość dla szybszego ruchu lub zmniejszyć dla precyzyjniejszej kontroli.
  • LEFT i RIGHT: Te dyrektywy #define przypisują piny cyfrowe, do których podłączone są przyciski. Jeśli podłączysz przyciski do innych pinów, musisz zmienić te wartości, aby pasowały do Twojej konfiguracji.

Główna logika w funkcji loop() sprawdza, czy przycisk jest naciśnięty (poprzez odczyt sygnału LOW z powodu konfiguracji podciągającej). Jeśli przycisk „w prawo” jest naciśnięty, zmniejsza zmienną angle o angleStep. Jeśli przycisk „w lewo” jest naciśnięty, zwiększa angle. Kod zawiera sprawdzenia graniczne, aby upewnić się, że kąt pozostaje w zakresie od 0 do 180 stopni. Funkcja myservo.write(angle) jest następnie używana do wydania polecenia serwu, aby przesunęło się do nowej pozycji.

Demonstracja działania projektu

Na filmie demonstracyjnym funkcjonalność jest wyraźnie pokazana. Naciśnięcie i przytrzymanie przycisku „w lewo” powoduje płynne przesuwanie serwa w lewo, z kątem zwiększającym się o 5 stopni za każdym razem, aż osiągnie 180 stopni i zatrzyma się. Podobnie naciśnięcie i przytrzymanie przycisku „w prawo” powoduje przesuwanie serwa z powrotem w prawo, zmniejszając kąt, aż osiągnie 0 stopni. Aktualny kąt jest drukowany na monitorze szeregowym, co pozwala zobaczyć dokładną pozycję serwa w czasie rzeczywistym. (na filmie o 05:20)

Rozdziały filmu

  • [00:00] Wprowadzenie do sterowania serwem za pomocą przycisków
  • [00:57] Schemat połączeń serwa i przycisków
  • [02:12] Wyjaśnienie kodu, część 1: Konfiguracja i ustawienia
  • [03:25] Wyjaśnienie kodu, część 2: Główna logika pętli
  • [05:20] Demonstracja działania projektu
  • [06:23] Podsumowanie i potencjalne zastosowania

Obrazy

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
Język: 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
  }// 

  
}

Pliki📁

Inne pliki