zurück zur Übersicht...
07.02.2018

Servo-Motoren mit Arduino

Einfacher Servomotor
Abb.: Einfacher Servomotor

Verwendete Bauteile

Anschluss des Servos

Eigentlich muss nur 5V mit dem roten Kabel, GND mit dem schwarzen Kabel und ein digitaler Pin mit PWM mit dem verbleibenden (meist gelben oder orangen Kabel) verbunden werden. Wichtig ist zu wissen, dass Servomotoren nur schlecht mit 3,3V laufen und daher oft beim Betrieb mit einer zu niedrigen Spannung brummen können, weil sie die Position nicht richtig einstellen können.

Servomotor an Arduino anschließen
Abb.: Servomotor an Arduino anschließen

Servor mit Library ansteuern

Mit der Library Servo, die schon in der Arduino-IDE vorhanden ist, aber auch über Github bei Arduino/libraries/Servo geladen werden kann, ist eine Ansteuerung des Servos sehr einfach.
Hinweis: Die Zahl in servoMotor.write() ist immer der Winkel, der gestellt werden soll.

#include <Servo.h>

#define SERVO_SIGNAL_PIN 9

Servo servoMotor;

void setup()
{
    servoMotor.attach(SERVO_SIGNAL_PIN);
}

void loop()
{
    servoMotor.write(45);
    delay(500);

    servoMotor.write(135);
    delay(500);


    for(int i = 0; i<180; i+=5){
        servoMotor.write(i);
        delay(150);
    }

    delay(1000);

    for(int i = 180; i>0; i-=5){
        servoMotor.write(i);
        delay(150);
    }
}

Servormotor direkt ansteuern

Es ist auch möglich ohne Verwendung einer Library einen Servomotor mit einem Arduino anzusteuern.
Dazu muss zunächst ein HIGH über die Signalleitung geschickt werden. Anschließend ist eine Pause zwischen 1000µs bis 2000µs einzuhalten, je nachdem welcher Winkel gestellt werden soll. Dann folgt ein LOW, wobei darauf noch eine kurze Pause von ca 20ms folgende sollte, damit der Motor genug Zeit hat, sich vollständig einzustellen.
In meinen Versuch ist aber herausgekommen, das es nicht der absolute Winkel ist, der gestellt wird, sondern der relative, d.h. man verstellt durch setServoAngle() immer nur UM einen bestimmten Winkel und nicht AUF einen Winkel. Außerdem ist der Servormotor nach dem stellen manuell frei beweglich und nicht elektrisch gesperrt.

#define SERVO_SIGNAL_PIN 8

void setup()
{
    pinMode(SERVO_SIGNAL_PIN, OUTPUT);

    for(int i=0; i<180; i+=5){
        setServoAngle(i);
        delay(100);
    }
}

void loop()
{
}

void setServoAngle(byte angle)
{
    // calculate angle to delayTime
    int delayTime = map(angle, 0, 180, 1000, 2000);

    digitalWrite(SERVO_SIGNAL_PIN, HIGH);
    delayMicroseconds(delayTime);
    digitalWrite(SERVO_SIGNAL_PIN, LOW);
    delay(20); // short pause at the end of the regulating
}

360°-Servomotor "DS04-NFC"

Einen speziellen Servo ist das folgende Modell, welches sich um 360° kontinuierlich drehen kann. Laut Hersteller bestitzt es folgende Eigenschaften:

Gewicht: 38g
Abmessungen: 40,8 × 20,0 × 39,5 mm
Geschwindigkeit: 0,22s / 60° (bei 4,8V)
Betriebsspannung: 4,8V - 6V
Betriebsstrom: <1000mA
Drehmoment: 5,5kg/cm (bei 4,8V)
Servomotor DS04-NFC mit 360°-Drehfähigkeit
Abb.: Servomotor DS04-NFC mit 360°-Drehfähigkeit

Funktionsweise laut Hersteller

"The signal terminal needs to be input one 50 HZ square wave, then the duration of high level pulse, which is used to control signal cycle, can control speed and forward/backward rotation as well as stalling. The duration of A high level corresponds to a speed. When high level is 1ms~1.5ms, servo rotates forward(the rotate speed is the fastest when it is 1ms, the later the lower, servo will stop rotating when reaching 1.5ms). When high level is 1.5 ~2ms, the servo rotates backward (The servo stops rotating when reaching 1.5ms, when the duration is closer to 2ms, the closer, the faster. The backward rotation speed is the fastest when reaching 2ms)

This servo carries meso-position adjustment potentiometer(it can only be seen by peeling off the outer cover and circuit board). We can set high level pulse at 1.5ms to observe that whether servo stops rotating. If it doesn’t stop rotating, we keep adjusting the potentiometer until it does.

Just enter the square wave signal terminal a 50Hz signal, and then controls the duration of the high-level pulse signal cycle can control the speed and reversing and stalling. A high level pulse corresponds to the duration of a speed. HIGH 1 ms - 1.5 ms, Steering gear forward (1 msec fastest forward, closer to 1.5 milliseconds slower, 1.5 ms Steering gear stalled), the high level of 1.5 ms to 2 ms when the Steering gear reverse (1.5 ms Steering gear stalling, the closer the faster reverse speed 2 ms, 2 ms fastest reversal)

Note: This servo can draw relatively high currents, especially with load. (up to approximately 1000mA at 4.8V at standstill) So choose a suitable power supply for the servo. It is not recommended to take the Arduino power."

Servomotor DS04-NFC mit 360°-Drehfähigkeit
Abb.: PWM Signal timings

Sketch

#include <Servo.h>

#define SERVO_SIGNAL_PIN  9

// define the duration of the signal in milliseconds
#define STOP 1500
#define ROTATE_CLOCKWISE   1000
#define ROTATE_COUNTERCLOCKWISE  2000

Servo servoMotor;

void setup()
{
    servoMotor.attach(SERVO_SIGNAL_PIN);

    servoMotor.writeMicroseconds(STOP);
    delay(2000);

    servoMotor.writeMicroseconds(ROTATE_CLOCKWISE);
    delay(2000);

    servoMotor.writeMicroseconds(ROTATE_COUNTERCLOCKWISE);
    delay(2000);

    servoMotor.writeMicroseconds(STOP);
}

void loop()
{
}