Suchcode

Lektion 85: Einführung in Servomotoren | Arduino Schritt-für-Schritt-Kurs

Lektion 85: Einführung in Servomotoren | Arduino Schritt-für-Schritt-Kurs

Dieser Projektleitfaden führt Sie in die Welt der kontinuierlich rotierenden Servomotoren ein, auch bekannt als 360-Grad-Servos. Im Gegensatz zu Standard-Servos, die sich zu einem bestimmten Winkel bewegen (wie 0 bis 180 Grad), drehen sich diese Motoren kontinuierlich in beide Richtungen. Das macht sie ideal für den Bau kleiner Roboter, Kettenfahrwerke oder jedes Projekt, das einfache, erschwingliche Antriebsmotoren benötigt. Dieser Leitfaden zeigt Ihnen, wie Sie einen solchen Motor mit einem Arduino und einigen Drucktasten steuern, und gibt Ihnen praktische Kontrolle über Richtung und Geschwindigkeit.

Hier sind einige praktische Anwendungen für ein 360-Grad-Servo:

  • Bau eines kleinen zweirädrigen Roboterautos.
  • Erstellung einer Schwenk- und Neigekamera-Halterung, die sich endlos dreht.
  • Antrieb eines kleinen Förderbands oder einer Winde.
  • Bau einer einfachen Radar- oder Sensor-Scan-Plattform.

Hardware und Komponenten

Für dieses Projekt benötigen Sie die folgenden Komponenten:

  • Arduino-Board (z. B. Uno)
  • Kontinuierlich rotierender Servomotor (z. B. FS90R oder ähnlich)
  • Drei Drucktasten
  • Jumper-Kabel
  • Breadboard (optional, für einfachere Verkabelung)

Verkabelungsanleitung

Die Verkabelung für dieses Projekt ist unkompliziert. Der Servomotor hat drei Drähte: typischerweise braun (Masse), rot (Strom) und orange oder gelb (Signal). Die Drucktasten sind in einer einfachen Konfiguration verdrahtet.

Hier ist eine Aufschlüsselung der Verbindungen:

  • Servomotor:
    • Brauner Draht (Masse) wird mit dem GND-Pin des Arduinos verbunden.
    • Roter Draht (Strom) wird mit dem 5V-Pin des Arduinos verbunden.
    • Oranger/Gelber Draht (Signal) wird mit Pin 9 des Arduinos verbunden.
  • Drucktasten:
    • Eine Seite jeder Taste wird mit dem GND-Pin des Arduinos verbunden.
    • Die andere Seite der Taste "Gegen den Uhrzeigersinn" wird mit Pin 2 verbunden.
    • Die andere Seite der Taste "Stopp" wird mit Pin 3 verbunden.
    • Die andere Seite der Taste "Im Uhrzeigersinn" wird mit Pin 4 verbunden.

Im Video betont der Ersteller, dass das Signalkabel des Servos mit einem PWM-fähigen Pin des Arduinos verbunden werden muss, der oft mit einer Tilde (~) markiert ist. Pin 9 ist einer dieser Pins. Die Drucktasten verwenden die internen Pull-up-Widerstände des Arduinos, was die Verkabelung vereinfacht, da keine externen Widerstände benötigt werden (im Video bei 07:02).

Code-Erklärung

Der Code ist darauf ausgelegt, den Zustand von drei Drucktasten zu lesen und den entsprechenden Befehl an den Servomotor zu senden. Lassen Sie uns die benutzerkonfigurierbaren Teile aufschlüsseln.

Konfiguration von Pins und Befehlen

Am Anfang des Codes finden Sie die Definitionen für die Pins und die Servosteuerwerte. Hier können Sie das Verhalten Ihres Projekts anpassen.


const int servoPin = 9;    // PWM-Pin für das Servosignal
const int stopPin = 3;     // Pin für die Stopp-Taste
const int cwPin = 4;       // Pin für die Taste "Im Uhrzeigersinn"
const int ccwPin = 2;      // Pin für die Taste "Gegen den Uhrzeigersinn"

Diese Konstanten definieren, welche Arduino-Pins mit den Tasten und dem Servo verbunden sind. Wenn Sie andere Pins für Ihre Tasten verwenden, würden Sie die Zahlen hier ändern. Der servoPin muss ein PWM-fähiger Pin sein.


const int csServoCommand[3] = {106, 52, 0};  // {CCW, STOP, CW}
const String csServoCommandText[3] = {"Gegen den Uhrzeigersinn", "Gestoppt", "Im Uhrzeigersinn"};

Dies ist der wichtigste Teil, den es zu verstehen und einzustellen gilt. Das Array csServoCommand enthält die Werte, die an das Servo gesendet werden. Bei einem kontinuierlichen Servo repräsentieren diese Werte keinen Winkel, sondern eine Geschwindigkeit und Richtung.

  • 106 ist der Wert für die volle Drehung gegen den Uhrzeigersinn.
  • 52 ist der Wert für einen vollständigen Stopp.
  • 0 ist der Wert für die volle Drehung im Uhrzeigersinn.

Diese Werte sind nicht universell. Aufgrund von Fertigungsunterschieden muss der "Stopp"-Wert (52) möglicherweise angepasst werden. Wenn Ihr Servo langsam driftet, wenn Sie die Stopp-Taste drücken, müssen Sie diesen Wert feinjustieren. Das Video demonstriert diesen Prozess und zeigt, wie die Änderung des Werts auf 54 oder 51 das Verhalten des Motors beeinflussen kann (im Video bei 13:45).

Sie können auch die Werte für die Drehung anpassen, um die Geschwindigkeit des Motors zu ändern. Zum Beispiel bewirkt das Setzen des Werts für gegen den Uhrzeigersinn auf 70 eine langsamere Drehung als bei 106 (im Video bei 12:23).

Das Array csServoCommandText enthält die Textzeichenfolgen, die an den seriellen Monitor ausgegeben werden, um den aktuellen Befehlszustand anzuzeigen.

Benutzerdefinierte Funktion: servoCommand()

Der Code verwendet eine benutzerdefinierte Funktion, um die Befehlslogik zu verarbeiten. Diese Funktion nimmt eine Zahl (0, 1 oder 2) als Argument, aktualisiert den Statustext und sendet den entsprechenden Befehl an das Servo.


void servoCommand(int n) {
  statusText = csServoCommandText[n];
  myservo.write(csServoCommand[n]);
  Serial.println(csServoCommandText[n]);
  Serial.println(csServoCommand[n]);
}

Diese Funktion wird aus der Hauptschleife aufgerufen, wenn eine Taste gedrückt wird. Sie zentralisiert die Logik zum Aktualisieren der Anzeige und zum Steuern des Servos, was den Code sauberer und einfacher zu ändern macht.

Live-Projekt und Demonstration

Im Video demonstriert der Ersteller das Projekt in Aktion. Das Drücken der Taste "Im Uhrzeigersinn" sendet den Wert 0 an das Servo, wodurch es sich in eine Richtung dreht. Das Drücken der Taste "Gegen den Uhrzeigersinn" sendet den Wert 106, wodurch es sich in die andere Richtung dreht. Die Taste "Stopp" sendet 52, was den Motor anhalten sollte.

Der Serielle Monitor wird verwendet, um den aktuellen Zustand und den genauen Wert anzuzeigen, der an den Servo gesendet wird. Dies ist unverzichtbar zum Debuggen und zum Finden des perfekten „Stopp“-Werts für Ihren spezifischen Motor. Wie im Video erwähnt, ist der Stopp-Befehl möglicherweise nicht perfekt, da die interne Schaltung des Servos dies verursachen kann, und Sie könnten ein langsames Driften oder Vibrationen beobachten. Dies ist ein häufiges Merkmal günstigerer kontinuierlicher Servos und kann durch das Feinabstimmen des Stopp-Werts im Code minimiert werden (im Video bei 01:15).

Kapitel

  • [00:05] Einführung in den 360-Grad-Servomotor
  • [02:02] Komponenten und Hardware-Überblick
  • [02:40] Detaillierter Schaltplan und Verbindungen
  • [05:07] Code-Erklärung: Konstanten, Arrays und Setup
  • [09:56] Code-Erklärung: die servoCommand-Funktion
  • [10:54] Live-Demonstration und Serieller-Monitor-Ausgabe
  • [12:23] Anpassen von Servogeschwindigkeit und Stopp-Werten

Bilder

SG90 Mini Servo Motor
SG90 Mini Servo Motor
SG90_servo_motor-1
SG90_servo_motor-1
115-Arduino code to control continuous 360° servo from serial monitor command
Sprache: C++
/*
 * Demonstration der Steuerung eines kontinuierlichen Servos (360-Servo) 
 * Dieser Code ermöglicht es Ihnen, einen 360-Grad-Servo über einen Befehl vom Serial Monitor zu steuern. 
 * Dieser 350-Servo-Motor ist nur zum Spaß. Er kann nicht für echte Anwendungen verwendet werden, bei denen eine genaue Positionierung erforderlich ist. Verwenden Sie einen Schrittmotor oder einen teuren Servomotor. 
 * 
 * Modifiziert von Ahmad Shamshiri für Robojax.com 
 * am Sonntag, den 1. Juli 2018, um 11:09 Uhr in Ajax, Ontario, Kanada 
 * Sehen Sie sich eine Videoanleitung zu diesem Projekt an: https://youtu.be/b_xvu6wWafA 
 * Holen Sie sich diesen Code von Robojax.com 
 * 
 * Originalcode von BARRAGAN <http://barraganstudio.com> 
 * Dieser Beispielcode ist gemeinfrei. 
 * Modifiziert am 8. Nov 2013 
 * von Scott Fitzgerald 
 * http://www.arduino.cc/en/Tutorial/Sweep
 */
#include <Servo.h>

Servo myservo; // Servo-Objekt erstellen, um einen Servo zu steuern.
 // Auf den meisten Boards können zwölf Servo-Objekte erstellt werden.

int pos = 0; // Variable zur Speicherung der Servoposition
int incomingByte = 0; // für eingehende serielle Daten

void setup() {
  Serial.begin(9600);
  myservo.attach(9); // befestigt den Servo an Pin 9 am Servo-Objekt
}



void loop() {

 // Daten nur senden, wenn Sie Daten empfangen.
        if (Serial.available() > 0) {
 // lese das eingehende Byte:
                incomingByte = Serial.read();

 // sag, was du hast:
                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);
                }


        }


}
893-Arduino code to control continuous 360° servo from serial monitor command (Code 2)
Sprache: C++
/* 
 *  
 *  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 

Dinge, die Sie vielleicht brauchen

Ressourcen & Referenzen

Dateien📁

Andere Dateien