Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

So steuern Sie Servomotoren mit Arduino – Vollständige Anleitung

In diesem Tutorial lernen wir, wie Servomotoren funktionieren und wie man Servomotoren mit Arduino steuert . Servomotoren sind sehr beliebt und werden in vielen Arduino-Projekten häufig verwendet, da sie einfach zu bedienen sind und eine hervorragende Positionssteuerung bieten.

Servos sind eine gute Wahl für Robotikprojekte, Automatisierung, RC-Modelle und so weiter. Ich habe sie bereits in vielen meiner Arduino-Projekte verwendet und Sie können sich einige davon hier ansehen:

  • DIY-Arduino-Roboterarm mit Smartphone-Steuerung
  • Arduino Ant Hexapod-Roboter
  • DIY Arduino-basiertes RC Hovercraft
  • SCARA-Roboter | So bauen Sie Ihren eigenen Arduino-basierten Roboter
  • DIY Mars Perseverance Rover Replica – Arduino-basiertes Projekt

Sie können sich das folgende Video ansehen oder das schriftliche Tutorial unten lesen. Es enthält mehrere Beispiele zur Verwendung eines Servomotors mit Arduino, Schaltplan und Codes. Darüber hinaus enthält es eine Anleitung zur Steuerung mehrerer Servomotoren mit Arduino mithilfe des PWM-Treibers PCA9685.

Was ist ein Servomotor?

Ein Servomotor ist ein System mit geschlossenem Regelkreis, das eine Positionsrückmeldung verwendet, um seine Bewegung und Endposition zu steuern. Es gibt viele Arten von Servomotoren und ihr Hauptmerkmal ist die Fähigkeit, die Position ihrer Welle präzise zu steuern.

Bei Industrie-Servomotoren ist der Positionsrückmeldungssensor normalerweise ein hochpräziser Encoder, während der Positionssensor bei kleineren RC- oder Hobby-Servos normalerweise ein einfaches Potentiometer ist. Die von diesen Geräten erfasste Ist-Position wird an den Fehlerdetektor zurückgemeldet, wo sie mit der Soll-Position verglichen wird. Dann korrigiert die Steuerung entsprechend dem Fehler die tatsächliche Position des Motors, um sie mit der Zielposition abzugleichen.

In diesem Tutorial werfen wir einen detaillierten Blick auf die Hobby-Servomotoren. Wir erklären, wie diese Servos funktionieren und wie man sie mit Arduino steuert.

Hobby-Servos sind kleine Aktuatoren, die zur Steuerung von RC-Spielzeugautos, Booten, Flugzeugen usw. verwendet werden. Sie werden auch von Ingenieurstudenten für das Prototyping in der Robotik verwendet, um Roboterarme, biologisch inspirierte Roboter, humanoide Roboter usw. zu erstellen.

Wie funktionieren Servomotoren?

Es gibt vier Hauptkomponenten innerhalb eines Hobby-Servos, einen Gleichstrommotor, ein Getriebe, ein Potentiometer und eine Steuerschaltung. Der Gleichstrommotor hat eine hohe Drehzahl und ein niedriges Drehmoment, aber das Getriebe reduziert die Drehzahl auf etwa 60 U/min und erhöht gleichzeitig das Drehmoment.

Das Potentiometer ist am Endzahnrad oder der Abtriebswelle angebracht, sodass sich das Potentiometer bei Drehung des Motors ebenfalls dreht und somit eine Spannung erzeugt, die mit dem absoluten Winkel der Abtriebswelle in Beziehung steht. In der Steuerschaltung wird diese Potentiometerspannung mit der von der Signalleitung kommenden Spannung verglichen. Bei Bedarf aktiviert der Controller eine integrierte H-Brücke, die es dem Motor ermöglicht, in beide Richtungen zu drehen, bis die beiden Signale eine Differenz von Null erreichen.

Ein Servomotor wird gesteuert, indem eine Reihe von Impulsen durch die Signalleitung gesendet werden. Die Frequenz des Steuersignals sollte 50 Hz betragen oder alle 20 ms sollte ein Impuls auftreten. Die Breite des Impulses bestimmt die Winkelposition des Servos und diese Art von Servos kann normalerweise um 180 Grad gedreht werden (sie haben physikalische Bewegungsgrenzen).

Im Allgemeinen entsprechen Impulse mit einer Dauer von 1 ms einer Position von 0 Grad, einer Dauer von 1,5 ms einer 90-Grad-Position und einer Dauer von 2 ms einer 180-Grad-Position. Die minimale und maximale Dauer der Impulse kann jedoch manchmal je nach Marke variieren und 0,5 ms für 0 Grad und 2,5 ms für 180 Grad betragen.

Beliebte RC-/Hobby-Servos für Arduino-Projekte

Es gibt viele verschiedene Modelle und Hersteller von RC oder Hobby. Die wichtigsten Überlegungen bei der Auswahl eines Servomotors sind Drehmoment, Betriebsspannung, Stromaufnahme und Größe.

Hier sind die beiden beliebtesten Servomodelle der Hersteller, das SG90 Micro Servo und das MG996R.

SG90 Mikroservo Technische Daten:

Stillstandsmoment 1,2 kg·cm bei 4,8 V, 1,6 kg·cm bei 6 V,
Betriebsspannung 3,5 – 6 V
Kein Laststrom 100mA
Stallstrom 650mA
Höchstgeschwindigkeit 60 Grad in 0,12 s
Gewicht 9g

MG996R-Servo Technische Daten:

Stillstandsmoment 11kg.cm @4.8v, 13kg.cm @6V
Betriebsspannung 4,8 – 7,2 V
Kein Laststrom 220 mA bei 4,8 V, 250 mA bei 6 V
Stallstrom 650mA
Höchstgeschwindigkeit 60 Grad in 0,20 Sekunden
Gewicht 55g

Arduino-Servomotorsteuerung

Lassen Sie uns das oben Gesagte testen und ein praktisches Beispiel für die Steuerung eines Hobby-Servos mit Arduino erstellen. Ich werde das MG996R verwenden, ein High-Torque-Servo mit Metallgetriebe und einem Stillstandsmoment von 10 kg-cm. Das hohe Drehmoment hat seinen Preis und das ist der Stillstandsstrom des Servos, der 2,5 A beträgt. Der Betriebsstrom beträgt 500 mA bis 900 mA und die Betriebsspannung 4,8 bis 7,2 V.

Die aktuellen Nennwerte zeigen, dass wir dieses Servo nicht direkt an den Arduino anschließen können, sondern eine separate Stromversorgung dafür verwenden müssen.

Schaltplan

Hier ist der Schaltplan für dieses Beispiel.

Wir müssen einfach den Steuerstift des Servos mit einem beliebigen digitalen Stift der Arduino-Platine verbinden, die Erdung und die positiven Drähte mit der externen 5-V-Stromversorgung verbinden und auch die Arduino-Masse mit der Servomasse verbinden.

Falls wir ein kleineres Hobby-Servo verwenden, das S90 Micro Servo, ist es möglich, es direkt über den 5-V-Arduino-Pin mit Strom zu versorgen.

Der S90 Micro Servo hat einen geringeren Stromverbrauch, etwa 100-200 mA Leerlaufstrom, aber etwa 500-700 mA Stillstandsstrom. Andererseits kann der Arduino-5-V-Pin nur etwa 500 mA ausgeben, wenn er über USB mit Strom versorgt wird, oder bis zu 1 A, wenn er über den Barrel-Anschluss mit Strom versorgt wird.

Obwohl es möglich ist, diese 9-g-Servomotoren direkt an Arduino zu betreiben, würde ich für eine stabilere Arbeit vorschlagen, immer eine externe Stromversorgung für sie zu verwenden.

Die für dieses Beispiel benötigten Komponenten erhalten Sie über die folgenden Links:

  • MG996R Servomotor ………………………….
  • oder S90 Micro Servo ………..……………………
  • Arduino-Board …………………………………….
  • 5V 2A DC Netzteil …………………..…..

Arduino-Code zur Servomotorsteuerung

Schauen wir uns nun den Arduino-Code zur Steuerung des Servomotors an. Der Code ist sehr einfach. Wir müssen nur den Pin definieren, an den das Servo angeschlossen ist, diesen Pin als Ausgang definieren und im Schleifenabschnitt Impulse mit der spezifischen Dauer und Frequenz erzeugen, wie wir zuvor erklärt haben.

/* Servo Motor Control - 50Hz Pulse Train Generator by Dejan, https://howtomechatronics.com */ #define servoPin 9 void setup() { pinMode(servoPin, OUTPUT); } void loop() { // A pulse each 20ms digitalWrite(servoPin, HIGH); delayMicroseconds(1450); // Duration of the pusle in microseconds digitalWrite(servoPin, LOW); delayMicroseconds(18550); // 20ms - duration of the pusle // Pulses duration: 600 - 0deg; 1450 - 90deg; 2300 - 180deg } Codesprache:Arduino (arduino)

Nach einigen Tests bin ich auf folgende Werte für die Dauer der Impulse gekommen, die mit meinem Servo funktionieren. Impulse mit einer Dauer von 0,6 ms entsprachen einer 0-Grad-Position, 1,45 ms einer 90-Grad-Position und 2,3 ms einer 180-Grad-Position.

Ich habe ein Multimeter in Reihe mit dem Servo angeschlossen, um die Stromaufnahme zu überprüfen. Die maximale Stromaufnahme, die ich bemerkte, betrug bis zu 0,63 A im Stillstand. Nun, das liegt daran, dass es sich nicht um das originale TowerPro MG996R-Servo handelt, sondern um einen billigeren Nachbau, der offensichtlich eine schlechtere Leistung hat.

Lassen Sie uns dennoch einen Blick auf eine bequemere Art werfen, Servos mit Arduino zu steuern. Dazu wird die Arduino-Servobibliothek verwendet.

/*
     Servo Motor Control using the Arduino Servo Library
           by Dejan, https://howtomechatronics.com
*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo

void setup() {
  myservo.attach(9,600,2300);  // (pin, min, max)
}

void loop() {
  myservo.write(0);  // tell servo to go to a particular angle
  delay(1000);
  
  myservo.write(90);              
  delay(500); 
  
  myservo.write(135);              
  delay(500);
  
  myservo.write(180);              
  delay(1500);                     
} Codesprache:Arduino (arduino) 

Hier müssen wir nur die Bibliothek einbinden, das Servo-Objekt definieren und mit der Attach()-Funktion den Pin definieren, an den das Servo angeschlossen ist, sowie die minimalen und maximalen Werte der Impulsdauer definieren. Dann setzen wir mit der Funktion write() einfach die Position des Servos von 0 auf 180 Grad.

Steuerung mehrerer Servomotoren mit Arduino

Die Arduino-Servobibliothek unterstützt die gleichzeitige Steuerung von bis zu 12 Servos mit den meisten Arduino-Boards und 48 Servos mit dem Arduino Mega-Board. Darüber hinaus ist die Steuerung mehrerer Servomotoren mit Arduino so einfach wie die Steuerung nur eines einzigen.

Hier ist ein Beispielcode zum Steuern mehrerer Servos:

/*
     Controlling multiple servo motors with Arduino
     by Dejan, https://howtomechatronics.com
*/

#include <Servo.h>

Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;

void setup() {
  servo1.attach(8);
  servo2.attach(9);
  servo3.attach(10);
  servo4.attach(11);
  servo5.attach(12);
}

void loop() {
  // move all servos to position 0
  servo1.write(0);
  servo2.write(0);
  servo3.write(0);
  servo4.write(0);
  servo5.write(0);
  delay(2000);

  // move all servos to position 90
  servo1.write(90);
  servo2.write(90);
  servo3.write(90);
  servo4.write(90);
  servo5.write(90);
  delay(2000);

  // move all servos to position 180
  servo1.write(180);
  servo2.write(180);
  servo3.write(180);
  servo4.write(180);
  servo5.write(180);
  delay(2000);
} Codesprache:Arduino (arduino) 

Wir müssen also nur Objekte aus der Servo-Klasse für jeden Servomotor erstellen und definieren, mit welchem ​​Arduino-Pin verbunden ist. Natürlich können wir jedes Servo jederzeit in jede beliebige Position bringen.

Als Beispiel können Sie sich auch mein Arduino Ant Hexapod Robot-Projekt ansehen, bei dem ich ein Arduino MEGA-Board zur Steuerung von 22 Servomotoren verwendet habe.

Arduino und PCA9685 PWM/Servotreiber

Es gibt auch eine andere Möglichkeit, Servos mit Arduino zu steuern, und zwar die Verwendung des PCA9685-Servotreibers. Dies ist ein 16-Kanal-12-Bit-PWM- und Servotreiber, der über den I2C-Bus mit Arduino kommuniziert. Es hat eine eingebaute Uhr, so dass es 16 Servos freilaufend oder unabhängig von Arduino antreiben kann.

Was noch cooler ist, wir können bis zu 62 dieser Treiber auf einem einzigen I2C-Bus verketten. Theoretisch können wir also bis zu 992 Servos steuern, indem wir nur die beiden I2C-Pins des Arduino-Boards verwenden. Die 6 Adressauswahlpins werden zum Einstellen unterschiedlicher I2C-Adressen für jeden zusätzlichen Treiber verwendet. Wir müssen nur die Lötpads gemäß dieser Tabelle verbinden.

Hier ist der Schaltplan und wir können noch einmal feststellen, dass wir eine separate Stromversorgung für die Servos benötigen.

Die für dieses Beispiel benötigten Komponenten erhalten Sie über die folgenden Links:

  • MG996R Servomotor ………………………….
  • PWM-Servotreiber PCA9685  ……………….
  • Arduino-Board …………………………………….
  • 5V 6A DC Netzteil …………………..…..

Schauen wir uns nun den Arduino-Code an. Zur Steuerung dieses Servotreibers verwenden wir die PCA9685-Bibliothek, die von GitHub heruntergeladen werden kann.

Arduino- und PCA9685-Code

/*
     Servo Motor Control using Arduino and PCA9685 Driver
           by Dejan, https://howtomechatronics.com
           
     Library: https://github.com/NachtRaveVL/PCA9685-Arduino
*/

#include <Wire.h>
#include "PCA9685.h"

PCA9685 driver;

// PCA9685 outputs = 12-bit = 4096 steps
// 2.5% of 20ms = 0.5ms ; 12.5% of 20ms = 2.5ms
// 2.5% of 4096 = 102 steps; 12.5% of 4096 = 512 steps
PCA9685_ServoEvaluator pwmServo(102, 470); // (-90deg, +90deg)

// Second Servo
// PCA9685_ServoEvaluator pwmServo2(102, 310, 505); // (0deg, 90deg, 180deg)


void setup() {
  Wire.begin();                 // Wire must be started first
  Wire.setClock(400000);        // Supported baud rates are 100kHz, 400kHz, and 1000kHz
  driver.resetDevices();        // Software resets all PCA9685 devices on Wire line

  driver.init(B000000);         // Address pins A5-A0 set to B000000
  driver.setPWMFrequency(50);   // Set frequency to 50Hz
}
void loop() {
  driver.setChannelPWM(0, pwmServo.pwmForAngle(-90));
  delay(1000);
  driver.setChannelPWM(0, pwmServo.pwmForAngle(0));
  delay(1000);
  driver.setChannelPWM(0, pwmServo.pwmForAngle(90));
  delay(1000);
} Codesprache:Arduino (arduino) 

Also müssen wir zuerst die Bibliotheken einbinden und das Objekt PCA9685 definieren. Definieren Sie dann mit der Servo_Evaluator-Instanz die Impulsdauer oder den PWM-Ausgang des Treibers. Beachten Sie, dass die Ausgänge 12-Bit sind, oder das ist eine Auflösung von 4096 Schritten. Die minimale Impulsdauer von 0,5 ms oder 0 Grad Position würde also 102 Schritten entsprechen und die maximale Impulsdauer von 2,5 ms oder 180 Grad Position 512 Schritten. Aber wie bereits erwähnt, sollten diese Werte entsprechend Ihrem Servomotor angepasst werden. Ich hatte einen Wert von 102 bis 470, was einer Position von 0 bis 180 Grad entsprach.

Im Setup-Bereich müssen wir die I2C-Taktrate definieren, die Treiberadresse einstellen und die Frequenz auf 50 Hz einstellen.

Im Schleifenabschnitt mit setChannelPWM() und pwmForAngle() Funktionen stellen wir das Servo einfach auf den gewünschten Winkel ein.

Ich habe ein zweites Servo an den Treiber angeschlossen, und wie ich erwartet hatte, positionierte es sich nicht wie das erste, und das liegt daran, dass die Servos, die ich verwende, billige Kopien sind und sie nicht so zuverlässig sind. Dies ist jedoch kein großes Problem, da der Servo_Evaluator verwendet wird Beispielsweise können wir für jedes Servo unterschiedliche Ausgangseinstellungen festlegen. Wir können auch die 90-Grad-Position anpassen, falls sie nicht genau in der Mitte ist. Auf diese Weise arbeiten alle Servos gleich und positionieren sich im exakten Winkel.

Steuerung vieler Servos mit Arduino und den PCA9685-Treibern

Wir werden uns noch ein weiteres Beispiel ansehen und das steuert viele Servos mit mehreren verketteten PCA9685-Treibern.

Dazu müssen wir die Treiber miteinander verbinden und die entsprechenden Adressauswahl-Lötpads verbinden. Hier ist der Schaltplan:

Sehen wir uns jetzt den Arduino-Code an.

/*
     Servo Motor Control using Arduino and PCA9685 Driver
           by Dejan, https://howtomechatronics.com
           
     Library: https://github.com/NachtRaveVL/PCA9685-Arduino
*/

#include <Wire.h>
#include "PCA9685.h"

PCA9685 driver;

// PCA9685 outputs = 12-bit = 4096 steps
// 2.5% of 20ms = 0.5ms ; 12.5% of 20ms = 2.5ms
// 2.5% of 4096 = 102 steps; 12.5% of 4096 = 512 steps
PCA9685_ServoEvaluator pwmServo(102, 470); // (-90deg, +90deg)

// Second Servo
PCA9685_ServoEvaluator pwmServo2(102, 310, 505); // (0deg, 90deg, 180deg)


void setup() {
  Wire.begin();                 // Wire must be started first
  Wire.setClock(400000);        // Supported baud rates are 100kHz, 400kHz, and 1000kHz
  driver.resetDevices();        // Software resets all PCA9685 devices on Wire line

  driver.init(B000000);         // Address pins A5-A0 set to B000000
  driver.setPWMFrequency(50);   // Set frequency to 50Hz
}
void loop() {
  driver.setChannelPWM(0, pwmServo.pwmForAngle(-90));
  delay(1000);
  driver.setChannelPWM(0, pwmServo.pwmForAngle(0));
  delay(1000);
  driver.setChannelPWM(0, pwmServo.pwmForAngle(90));
  delay(1000);
} Codesprache:Arduino (arduino) 

Wir sollten also für jeden Treiber ein separates PCA9685-Objekt erstellen, die Adressen für jeden Treiber definieren und die Frequenz auf 50 Hz einstellen. Jetzt können wir einfach mit den Funktionen setChannelPWM() und pwmForAngle() jeden Servo an jedem Treiber so einstellen, dass er jeden gewünschten Winkel positioniert.

Fehlerbehebung

Servomotor zittert und setzt mein Arduino-Board zurück

Dies ist ein häufiges Problem bei diesen Hobby-Servomotoren, dem SG90 Micro Servo und dem MG996R. Der Grund dafür ist, dass sie, wie bereits erwähnt, unter Last eine beträchtliche Strommenge ziehen können. Dies kann dazu führen, dass das Arduino-Board zurückgesetzt wird, insbesondere wenn Sie das Servo direkt über den Arduino-5-V-Pin mit Strom versorgen.

Um dieses Problem zu lösen, können Sie einen Kondensator zwischen GND und dem 5-V-Pin verwenden. Er fungiert als Entkopplungskondensator, der dem System beim Start zusätzlichen Strom liefert, wenn der Gleichstrommotor startet.

Der Servomotor bewegt sich nicht über den gesamten Bereich von 0 bis 180 Grad

Dies ist ein weiteres häufiges Problem bei diesen Hobby-Servos. Wie wir bereits erklärt haben, entspricht eine Impulsbreite von 1 ms (0,5 ms) einer 0-Grad-Position und 2 ms (2,5 ms) einer 180-Grad-Position. Diese Werte können jedoch von Servo zu Servo und zwischen verschiedenen Herstellern variieren.

Um dieses Problem zu lösen, müssen wir die Impulsbreite anpassen, die wir mit dem Arduino an den Servomotor senden. Glücklicherweise können wir mit der Arduino Servo-Bibliothek die Pulsbreitenwerte im attach() leicht anpassen Funktion.

Das attach() Die Funktion kann zwei zusätzliche Parameter annehmen, und das ist die minimale und maximale Impulsbreite in Mikrosekunden. Die Standardwerte sind 544 Mikrosekunden (0,544 Millisekunden) für den minimalen Winkel (0 Grad) und 2400 Mikrosekunden (2,4 ms). Durch Anpassen dieser Werte können wir also den Momentbereich des Servos feinabstimmen.

  myservo.attach(9,600,2300);  // (pin, min, max) Codesprache:Arduino (arduino) 

Abmessungen und 3D-Modell

Ich habe 3D-Modelle der beiden beliebtesten Servomotoren, des SG90 Micro Servo und des MG996R Servomotors, erstellt. Sie können sie über die folgenden Links herunterladen.

SG90 Mikroservo

3D-Modell:Download von Thangs.

Abmessungen:

MG996R Servomotor

MG996R Servomotor 3D-Modell:Download von Thangs.

Abmessungen:

Schlussfolgerung

Damit haben wir fast alles abgedeckt, was wir über die Verwendung von Servomotoren mit Arduino wissen müssen. Natürlich gibt es viele Hersteller und Modelle dieser Art von Hobby- oder RC-Servomotoren, und jeder von ihnen hat seine eigenen einzigartigen Merkmale, die sich von dem, was wir oben erklärt haben, unterscheiden können.

Die Möglichkeiten zum Erstellen fantastischer Robotik-, Automatisierungs- und RC-Projekte mit Motoren sind endlos, aber die Wahl des richtigen Modells für Ihre Anwendung ist sehr wichtig.

Ich hoffe, Ihnen hat dieses Tutorial gefallen und Sie haben etwas Neues gelernt. Fühlen Sie sich frei, Fragen in den Kommentaren unten zu stellen, und vergewissern Sie sich, dass Sie meine Arduino-Projektsammlung verwenden können.

Häufig gestellte Fragen (FAQs)

Wie verwende ich einen Servomotor mit Arduino?

Die Verwendung eines Servomotors mit Arduino ist recht einfach. Der Servomotor hat nur 3 Drähte, von denen zwei GND und 5 V für die Stromversorgung sind, und der dritte Draht ist die Steuerleitung, die zum Arduino-Board geht.

Kann Arduino Servomotoren betreiben?

Wir können Servomotoren direkt von Arduino aus betreiben, aber wir könnten Stromprobleme haben. Wenn der Servomotor mehr als 500 mA Strom zieht, verliert das Arduino-Board möglicherweise seine Stromversorgung und wird zurückgesetzt. Es ist besser, immer eine separate Stromquelle für die Servomotoren zu verwenden.

Wie viele Servomotoren kann ein Arduino steuern?

Mit der Arduino Servo-Bibliothek können wir mit den meisten Arduino-Boards bis zu 12 Servomotoren und mit dem Arduino Mega-Board bis zu 48 Servomotoren steuern. Natürlich müssen wir eine dedizierte Stromquelle für die Servomotoren verwenden.


Herstellungsprozess

  1. Münzprüfer mit Arduino steuern
  2. Hindernisse vermeiden Roboter mit Servomotor
  3. Arduino mit Bluetooth zur Steuerung einer LED!
  4. Arduino Nano:Steuerung von 2 Schrittmotoren mit Joystick
  5. Steuerung des Servomotors mit Arduino und MPU6050
  6. ThimbleKrox - Maussteuerung mit den Fingern
  7. Wie man mit einem Arduino Musik macht
  8. So verwenden Sie NMEA-0183 mit Arduino
  9. So löten Sie Aluminium – Eine vollständige Anleitung
  10. Wie eine Kupplung funktioniert:Eine vollständige Anleitung