Suchcode

Lektion 88: Steuerung eines Servomotors mit zwei Drucktasterschaltern

Lektion 88: Steuerung eines Servomotors mit zwei Drucktasterschaltern

Dieses Projekt zeigt, wie man einen Servomotor mit zwei Drucktasten und einem Arduino steuert. Anstatt auf ein Potentiometer oder einen seriellen Befehl zu setzen, können Sie einfache taktile Schalter verwenden, um einen Servo manuell nach links oder rechts zu bewegen. Dies ist unglaublich nützlich für Anwendungen, bei denen Sie eine direkte, physische Steuerung über einen Mechanismus benötigen, z. B. beim Bau eines Roboterarms, beim Einstellen einer Kamera-Gimbal oder beim Erstellen eines ferngesteuerten Schwenk-Neige-Systems. Die Tasten ermöglichen es Ihnen, den Winkel des Servos schrittweise anzupassen, wobei Sie die Taste gedrückt halten können, um ihn über seinen gesamten Bewegungsbereich zu schwenken.

Hier sind einige praktische Projekte, die Sie mit diesem Aufbau realisieren können:

  • Bau eines manuellen Bedienfelds für einen Roboterarm oder -greifer.
  • Erstellung eines ferngesteuerten Kamera-Sliders oder Schwenk-Neige-Kopfs.
  • Entwicklung einer physischen Steuerungsschnittstelle für ein Modellflugzeug- oder Bootsruder.
  • Herstellung eines einfachen "Teach-Pendants" zum Aufzeichnen von Positionen für eine CNC-Maschine oder einen 3D-Drucker.

Hardware und Komponenten

Dieses Projekt erfordert nur wenige grundlegende Komponenten und ist daher ein hervorragender Ausgangspunkt, um sowohl Eingabe- als auch Ausgabegeräte mit dem Arduino kennenzulernen.

  • Arduino-Board (Uno, Nano, Mega usw.)
  • Servomotor (z. B. SG90 oder MG995)
  • Zwei Taster (momentane Drucktasten)
  • Jumper-Kabel
  • Breadboard (optional, aber empfohlen)

Verdrahtungsanleitung

Im Video ist die Verdrahtung unkompliziert. Das Signalpin des Servomotors ist mit einem PWM-fähigen Pin des Arduino verbunden, in diesem Beispiel Pin 9. Die Stromversorgung und Masse des Servos sind mit den 5V- und GND-Pins des Arduino verbunden. Die beiden Drucktasten sind ähnlich wie einander verdrahtet. Ein Bein jeder Taste ist mit Masse verbunden, und das andere Bein ist mit einem digitalen Eingangspin des Arduino verbunden (Pin 2 für die "Links"-Taste und Pin 3 für die "Rechts"-Taste). Der Code verwendet die internen Pull-up-Widerstände, sodass keine externen Widerstände für die Tasten benötigt werden. (im Video bei 00:57)

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

Code-Erklärung

Der Code ist so konzipiert, dass er leicht konfigurierbar ist. Die wichtigsten benutzerkonfigurierbaren Teile befinden sich am Anfang des Sketches. Hier ist eine Aufschlüsselung der wichtigen Variablen und Definitionen, die Sie möglicherweise für Ihr eigenes Projekt anpassen möchten.

#include <Servo.h>

Servo myservo;  // Servoobjekt zur Steuerung eines Servos erstellen
int servoPin = 9;// dieser Pin muss einer mit PWM ~ sein
int angle =90;    // Anfangswinkel für Servo
int angleStep =5;

#define LEFT 2   // Pin 2 ist mit der linken Taste verbunden
#define RIGHT  3  // Pin 3 ist mit der rechten Taste verbunden
  • servoPin: Diese Variable definiert den Arduino-Pin, mit dem das Signalkabel des Servos verbunden ist. Es ist entscheidend, einen Pin zu verwenden, der Pulsweitenmodulation (PWM) unterstützt, normalerweise mit einem ~-Symbol auf dem Board gekennzeichnet.
  • angle: Dies setzt den Anfangswinkel des Servos, wenn der Arduino startet. Der Standardwert ist 90 Grad, was den Servo normalerweise zentriert.
  • angleStep: Dies ist die Schrittweite, um die sich der Servowinkel bei jedem Tastendruck ändert. Ein Wert von 5 bedeutet, dass jede Betätigung den Servo um 5 Grad bewegt. Sie können diesen Wert erhöhen, um eine schnellere Bewegung zu erzielen, oder verringern, um eine feinere Steuerung zu erreichen.
  • LEFT und RIGHT: Diese #define-Direktiven weisen die digitalen Pins zu, mit denen die Drucktasten verbunden sind. Wenn Sie Ihre Tasten an andere Pins anschließen, müssen Sie diese Werte an Ihren Aufbau anpassen.

Die Kernlogik in der loop()-Funktion prüft, ob eine Taste gedrückt ist (durch Lesen eines LOW-Signals aufgrund der Pull-up-Konfiguration). Wenn die "Rechts"-Taste gedrückt wird, verringert sie die angle-Variable um angleStep. Wenn die "Links"-Taste gedrückt wird, erhöht sie den angle. Der Code enthält Grenzprüfungen, um sicherzustellen, dass der Winkel im Bereich von 0 bis 180 Grad bleibt. Die Funktion myservo.write(angle) wird dann verwendet, um den Servo zu befehlen, sich in die neue Position zu bewegen.

Live-Projektdemonstration

In der Videodemonstration wird die Funktionalität deutlich gezeigt. Das Drücken und Halten der "Links"-Taste bewirkt, dass der Servo sanft nach links schwenkt, wobei der Winkel jeweils um 5 Grad erhöht wird, bis er 180 Grad erreicht und stoppt. Ebenso bewirkt das Drücken und Halten der "Rechts"-Taste, dass der Servo nach rechts zurückschwenkt und den Winkel verringert, bis er 0 Grad erreicht. Der aktuelle Winkel wird auf dem seriellen Monitor ausgegeben, sodass Sie die genaue Position des Servos in Echtzeit sehen können. (im Video bei 05:20)

Video-Kapitel

  • [00:00] Einführung in die Steuerung eines Servos mit Tasten
  • [00:57] Verdrahtungsanleitung für Servo und Drucktasten
  • [02:12] Code-Erklärung, Teil 1: Einrichtung und Konfiguration
  • [03:25] Code-Erklärung, Teil 2: Die Hauptschleifenlogik
  • [05:20] Live-Demonstration des Projekts
  • [06:23] Fazit und mögliche Anwendungen

Bilder

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
Sprache: 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
  }// 

  
}

Dateien📁

Andere Dateien