Aus Raspberry Pi Geek 04/2016

ESP8266 als Steuereinheit für Servomotoren (Seite 2)

Abbildung 4: Der Schaltplan zum Roboterarm.

Abbildung 4: Der Schaltplan zum Roboterarm.

Neu hinzugekommen ist die Ansteuerung der Servos über den Optokoppler. Die Optokoppler sorgen für eine galvanische Trennung der Signalleitungen. Bei R5 bis R9 handelt es sich um Vorwiderstände für die LEDs im Optokoppler. Die Widerstände R10 bis R13 erzeugen einen definierten Signalpegel an den Servos, wenn Ausgangstransistoren der Optokoppler sperren. Der Aufwand mit der galvanischen Trennung lohnt sich, um den ESP8266 vor Störungen durch die Servos zu schützen.

Der Kondensator C1 dient dazu, die Betriebsspannung des ESP8266 konstant zu halten, selbst wenn die Servos arbeiten. Mit dem Transistor T1 schalten Sie den Magneten ein und aus. Die Diode D1 sieht auf den ersten Blick so aus, als hätte sie keine Funktion: Sie sperrt ja in Richtung der Betriebsspannung, leitet also dadurch nie. Diese Annahme stimmt im Prinzip, aber sobald Spulen ins Spiel kommen, sieht die Sache anders aus (siehe Kasten “Spule unter Spannung”).

Die Motoren in den Servos haben ebenfalls Spulen, mögliche Überspannungen eliminiert der Servomotor selbst. Es lässt sich jedoch nicht vermeiden, dass der Servo schlagartig einen recht hohen Strom zieht, sobald er aktiv wird. Das bringt unter Umständen die Betriebsspannung kurzzeitig zum Zusammenbrechen; der Kondensator C1 verhindert das nur bedingt.

Wenn Sie also beim ersten Anlaufen der Servos das Gefühl haben, das Programm hätte einen Bug, ist vermutlich einfach nur die Betriebsspannung eingebrochen. Es gibt dann zwei Möglichkeiten, das Problem anzugehen: Entweder trennen Sie die Spannungsversorgung der Servos komplett von der des ESP8266 – so bringt das Zusammenbrechen der Spannung das Programm nicht mehr zum Absturz. Oder Sie verwenden eine Spannungsquelle, die mit einem stark schwankenden Strombedarf zurechtkommt, wie etwa ein ordentliches Labornetzteil.

Spule unter Spannung

Eine Spule ist ein auf einen Metallkern gewickelter Kupferlackdraht. Je nachdem, ob Sie die Spule mit Gleich- oder Wechselspannung betreiben, legt sie ein unterschiedliches Verhalten an den Tag. In unserem Aufbau spielt das Verhalten bei Gleichspannung eine Rolle.

Liegt keine Spannung an, passiert erst einmal gar nichts. Sobald nun der Transistor durchschaltet, liegt die komplette Betriebspannung an der Spule an, und es beginnt ein Strom zu fließen. Jetzt baut sich ein Magnetfeld auf, wobei der Stromfluss in der Spule ansteigt. Ist das Magnetfeld aufgebaut, bestimmt der Ohmsche Widerstand der Spule den Strom. Es ist also Energie im Magnetfeld der Spule gespeichert.

Wenn der Transistor wieder sperrt, hört der Strom in der Spule nicht einfach auf zu fließen: Die Spule gibt so lange Strom ab, bis sich das Magnetfeld abgebaut hat. Nun befindet sich in diesem Stromkreis aber nur ein gesperrter Transistor mit einem sehr hohen Widerstand, durch den die Spule diesen Strom drückt. Dadurch steigt die Spannung am Transistor sprunghaft auf bis zu mehrere 1000 Volt an. Das hat unweigerlich ein Rauchwölkchen und einen defekten Transistor zur Folge. Der Retter in der Not ist die Diode D1, die hier als sogenannte Freilaufdiode fungiert. Sie leitet genau in der Richtung, in die der von der Spule erzeugte Strom fließt. Dadurch entsteht am Transistor keine Überspannung, und er überlebt den Schaltvorgang.

Falls Sie die Freilaufdiode vergessen, nimmt unter Umständen nicht nur der Transistor Schaden, sondern darüber hinaus auch der ESP8266 selbst. Um es auf den Punkt zu bringen: Schalten Sie Spulen grundsätzlich mittels einer Freilaufdiode parallel – sonst handeln Sie sich Ärger ein.

Programm

Das Programm Robot.ino (Listing 1) stellt auf dem ESP8266 einen einfachen Webserver bereit, mit dem Sie über eine URL die einzelnen Servos und den Magneten ansteuern. Wie im letzten Teil passen Sie die Parameter für das Netzwerk den jeweiligen Gegebenheiten an. Achten Sie darauf, dass der Server eine feste IP-Adresse erhält.

Listing 1

 

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <Servo.h>
const char* ssid = "vogli";
const char* pass = "E1vtbbuY!";
IPAddress ip(192,168,1,21);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);
Servo ser1,ser2,ser3,ser4;
String inString;
ESP8266WebServer server(80);
void handleRoot() {
  server.send(200, "text/plain", "ESP Robot");
  ser1.detach();ser2.detach();ser3.detach();ser4.detach();
}
void handleRobot() {
  int s1=atoi(server.arg("s1").c_str());
  int s2=atoi(server.arg("s2").c_str());
  int s3=atoi(server.arg("s3").c_str());
  int s4=atoi(server.arg("s4").c_str());
  if (server.arg("m")=="1") {
    digitalWrite(4, HIGH);
  } else {
    digitalWrite(4, LOW);
  }
  server.send(200, "text/plain", "ok");
  ser1.write(s1);ser2.write(s2);ser3.write(s3);ser4.write(s4);
  delay(1500);
}
void setup() {
  pinMode(4, OUTPUT);
  ser1.write(90);ser2.write(90);ser3.write(90);ser4.write(90);
  ser1.attach(13);ser2.attach(12);ser3.attach(14);ser4.attach(16);
  Serial.begin(115200);
  Serial.println("\r\n");
  WiFi.begin(ssid, pass);
  WiFi.config(ip, gateway, subnet);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Verbunden mit ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  server.on("/",handleRoot);
  server.on("/robot", handleRobot);
  server.begin();
  Serial.println("HTTP server started");
}
void loop(void) {
  server.handleClient();
}

Die Methode setup() definiert den Betriebsmodus der einzelnen GPIOs und gibt die URLs vor, unter denen der Webserver antwortet. Hier sehen Sie, wie leicht es fällt, mit dem ESP8266 Servomotoren anzusteuern.

Mit der Methode write() des Servo-Objekts geben Sie einfach den Winkel für den Hebel des Servos an. Die Methoden attach() und detach() verbinden und trennen das Servo-Objekt mit bzw. von einem bestimmten GPIO-Port. Die Methode setup() fährt alle Servos initial in die Mittelposition. Das ist schon alles, was Sie benötigen, um einen Servo mit dem ESP8266 zu steuern.

Für den Webserver definieren Sie zunächst mit der Anweisung ESP8266WebServer server(80) das entsprechende Objekt. In diesem Fall würde der Server auf Port 80 lauschen. An dieses Objekt hängen Sie mit der Methode on() URLs und die dazugehörigen Handler an. Letztere bearbeiten den jeweiligen HTTP-Request.

Hinter der Methode handleRoot() verbirgt sich eine Art Panik-Knopf, der alle Servo-Objekte von den GPIO-Ports trennt. Möchten Sie danach den Roboter wieder verwenden, setzt das einen harten Reset voraus.

Das Steuern des Arms geschieht komplett über die Methode handleRobot(). Sie liest die einzelnen Parameter für die Servos aus dem Request heraus und übergibt die Werte an die Servo-Objekte. Die Parameter heißen s1 bis s4 für die Servos und m1 für den Magneten. Die Funktion delay() am Ende der Methode gibt den Servos Zeit, die gewünschte Position zu erreichen.

Um das Ganze zu steuern, öffnen Sie einfach einen Browser Ihrer Wahl und geben die URL aus Listing 2 ein. Die IP-Adresse passen Sie dabei an die des Servers in Ihrem Netzwerk an. Das gezeigte Kommando bringt alle Servos in Mittelposition und deaktiviert den Magneten.

Listing 2

 

http://192.168.1.21/robot?s1=90&s2=90&s3=90&s4=90&m=0

Erste Schritte

Die Inbetriebnahme des Arms gestaltet sich etwas knifflig: Zunächst einmal müssen Sie für alle Servos die Ausgangspositionen der Hebel auf der vorhandenen Hardware ermitteln – eine mühselige und zeitaufwendige Tätigkeit. Am besten beginnen Sie dabei von unten nach oben.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 6 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben