Netzwerkgesteuerter RC-Servo

Hallo,

ich habe vor einen Modelbauservo an einen Arduino Ethernet anzuschliessen, um per Netzwerk (und am besten per im Arduino hinterlegten Uhrzeiten) diesen Servo zu steuern. Dabei würden mir 2 Stellungen des Servos ausreichen.

Über Servoansteuerung per Servo library finden sich ja so einige Beispiele, mit denen ich auch was anfangen kann, über die Ethernetanbindung leider nur sehr bedingt. Auch wenn ich bereits danach gesucht habe, vielleicht gibt es ja bereits ein ähnliches Projekt und ich habe es schlicht nicht gefunden? Ich wäre für Hinweise in die richtige Richtung dankbar.

über die Ethernetanbindung leider nur sehr bedingt.

??? Eher zu viel, da gibt es -zig Ansätze die von der anderen Seite ( Socket Kommunikation, Web Browser, Web Server , ... ) abhängen. Die allermeisten natürlich nicht mit direkter servo - Ansteuerung.

Was bedeutet USB in deinem Thread - Titel, in diesem Zusammenhang ?

…ach Mist - Ethermet sollte es heissen, nicht USB. Wo war ich nur mit meinen Gedanken? Inzwischen wurde mein erster Arduino auch per UPS geliefert und so konnte ich das ganze in der Praxis sehen. Ich habe zB bei den Beispielen auch einiges gefunden (<SPI.h> <Client.h> <Ethernet.h> <Server.h> <Udp.h>…), irgendwie hab ich wohl vorhin nach Wäldern gesucht, und mir standen dabei diverse theoretische Bäume im Weg…

Momentan schalte ich zwar lediglich die LED ein und aus, da ich erst einen “Testservo” suchen muss, aber das dürfte dann wohl alles machbar sein.

OK, irgendwo hab ich wohl einen Denkfehler. Der Server startet, aber sobald man den Servo betätigt, wird die Seite nicht mehr akutalisiert und es geht nichts mehr…

Ich hab mir nun einfach mal ein Skript zur Steruerung einer LED genommen und die Servopositionierung dazugeschrieben. Vermutlich liegt dort auch der Fehler, da die LED (so wie im Ursprungsskript) natürlich an und ausschaltbar ist, wenn man die Servozeilen auskommentiert… Vielleicht kann mir jemand sagen wo mein Fehler ist?

#include <SPI.h>
#include <Client.h>
#include <Ethernet.h>
#include <Server.h>
#include <Udp.h>
#include <Servo.h>
/*
	Simple Ethernet Test
        Arduino server outputs simple text to browser
	The circuit:
	* Arduino Duemilanove
        * Arduino Ethernet shield
        * Basic FTDI breakout 5V
        *LED connected to GND and digital pin 4 via resistor
        http://www.sciencprog.com/
        Created: 2009.11.18
        By Minde
        Modified: 2011.04.06
          1. Changed obsolete Wstring.h functions to String.h
          2. Changed includes to match Ethernet library.
          3. Fixed LED control
        By Minde
*/

byte mac[] = { 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF }; //physical mac address - hier steht natürlich dann meine richtige MAC 
byte ip[] = { 192, 168, 02, 131 };			// ip in lan - und hier meine richtige IP...
byte gateway[] = { 192, 168, 02, 1 };			// internet access via router
byte subnet[] = { 255, 255, 255, 0 };                   //subnet mask
EthernetServer server(80);                                      //server port
// byte sampledata=50;            //some sample data - outputs 2 (ascii = 50 DEC)             
int ledPin = 9;  // LED pin 9 die interne led
String readString = String(30); //string for fetching data from address
boolean LEDON = false; //LED status flag

//  Erzeugen eines Servo Objekts zur Servo Steuerung
 Servo myservo;

 //  Variable zum Speichern der Position des servos
 int pos = 0;
 
 
void setup(){
//start Ethernet
  Ethernet.begin(mac, ip, gateway, subnet);
//Set pin 9 to output
  pinMode(ledPin, OUTPUT);  
//enable serial datada print  
  Serial.begin(9600);
  
// Initialisierung des Servo Pins pwm 3  
  myservo.attach(3);
}


 
void loop(){
// Create a client connection
EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
   if (client.available()) {
    char c = client.read();
     //read char by char HTTP request
    if (readString.length() < 100) 
      {
        //store characters to string 
        readString += c; //replaces readString.append(c);
      }  
        //output chars to serial port
        Serial.print(c);
        //if HTTP request has ended
        if (c == '\n') {
          //dirty skip of "GET /favicon.ico HTTP/1.1"
          if (readString.indexOf("?") <0)
          {
            //skip everything
          }
          else
          //lets check if LED should be lighted
        if(readString.indexOf("L=1") >0)//replaces if(readString.contains("L=1"))
           {
             //led has to be turned ON
             digitalWrite(ledPin, HIGH);    // set the LED on
             myservo.write(100);  // servo auf postition 100
                 
              LEDON = true;
           }else{
             //led has to be turned OFF
             digitalWrite(ledPin, LOW);    // set the LED OFF
             myservo.write(20);  // servo auf position 20
                
             LEDON = false;             
           }
          // now output HTML data starting with standart header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          //set background to orange
          client.print("<body style=background-color:orange>");
          //send first heading
          client.println("<font color='red'><h1>Tuer</font></h1>");
          client.println("<hr />");
          client.println("<hr />");
          //controlling led via checkbox
          client.println("<h1>Steuerung</h1>");
          //address will look like http://192.168.1.110/?L=1 when submited
          if (LEDON)
          client.println("<form method=get name=LED><input type=checkbox name=L value=1 CHECKED>Servo
<input type=submit value=submit></form>");
          else
          client.println("<form method=get name=LED><input type=checkbox name=L value=1>Servo
<input type=submit value=submit></form>");      
          client.println("
");
          //printing LED status
          client.print("<font size='5'>Tuer ist: ");
          if (LEDON)
              client.println("<font color='green' size='5'>AUF"); 
          else
              client.println("<font color='grey' size='5'>ZU");     
          client.println("<hr />");
          client.println("<hr />");
          client.println("</body></html>");
          //clearing string for next read
          readString="";
          //stopping client
          client.stop();
            }
          }
        }
      }
 }

Der Server startet, aber sobald man den Servo betätigt, wird die Seite nicht mehr akutalisiert

Zieht der zuviel Strom ? Wie ist er denn angeschlossen ? Oder hattest du schon ein Servo-Beispiel ( Ohne den Ethernet - Teil ) am Laufen ?

Danke schonmal für dein Mitdenken

michael_x: Zieht der zuviel Strom ?

Das ist gut möglich. Ich habe nun ein Steckernetzteil angeschlossen, und der Server läuft nun weiter. Allerdings fährt der Servo nur einmal in eine Richtung, danach geht zwar noch die LED an und aus, der Servo bewegt sich aber nichtmehr. Habe ich irgendwie ein Denkfehler im Programm?!? Da sins zwar noch einige unnötige Überbleibsel drin (zB int pos = 0;), aber das dürfte ja nicht stören. Vielleicht fahre ich den Servo mal etwas langsamer mit einer Schleife auf die jeweilige Position, evtl. bricht ja auch mit dem Steckernetzteil die Spannung kurz ein...

michael_x: Wie ist er denn angeschlossen ?

Der Servo hängt an +5V, GND und an Pin 3 des Arduino.

michael_x: Oder hattest du schon ein Servo-Beispiel ( Ohne den Ethernet - Teil ) am Laufen ?

Nein, ich habe den Arduino erst seit heute mittag... merkt man vermutlich an meiner momentan noch recht planlosen Herangehensweise :cold_sweat:

Edit: Ich habe nun auch etwas in den englischsprachigen Forenteilen gestöbert, und bin dabei zB auf das hier gestossen: http://rcarduino.blogspot.de/2012/04/servo-problems-with-arduino-part-1.html

...das werde ich dann wohl die nächsten Tage mal ausprobieren, vielleicht liegt es tatsächlich nur an der Stromversorgung.

Wie steuerst Du denn den Servo an? Dir ist schon klar, dass es mit einem Impuls Protokoll angesteuert wird: http://www.rn-wissen.de/index.php/Servo#Ansteuerung