Codice per servomotore ethernet ?

ciao a tutti sto realizzando un codice in cui comando il mio servomotore attraverso il mio pc. per fare questo ho usato arduino uno , modem e la shield ethernet.
ora ho provato a creare un codice ma non vuole funzionare… mi potreste dire dov’è che ho sbagliato ed eventualmente correggerlo ? grazie mille :slight_smile:

#include <SPI.h>
#include <Ethernet.h>
#include <Servo.h> 

Servo myservo;

int pos = 0;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,0,239);
EthernetServer server(272);

void setup()
{
  myservo.attach(9);
  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
}

void loop()
{
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    // an http request ends with a blank line
  //  boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (c == '8') {
        for(pos = 0; pos < 180; pos += 1)
        {                                  // in steps of 1 degree 
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
              
    }
       if(c=='2') {
       for(pos = 0; pos < 180; pos += 1)
       {
    myservo.write(pos);
    delay(15);
       }
   } 
       
    }
  }
}
      delay(1);
     // close the connection:
     client.stop();
 }

Ciao, qual è il problema esattamente ? Lo sketch ti dà errore, non riesci a connetterti al 192.168.0.239 o il servo non fa quello che vuoi ?

Se il problema è la Ethernet, inizialmente avevo problemi anch’io e ho risolto cambiando il mac con questo:
byte mac = { 0x04, 0x18, 0xD6, 0xEF, 0xFE, 0xED };

Inoltre, hai controllato che l’indirizzo ip corrisponda alla stessa classe della tua rete ?
Io per esempio uso questo: byte ip = {192, 168, 1, 239};
e apro la porta 80 invece che la 272.

Se invece il problema è il codice o il mal funzionamento del servo, ti consiglio di non sfruttare subito la Ethernet e utilizzare un codice base, tipo questo:

#include <Servo.h> 
 
Servo myservo;  //crea un oggetto servo
              
int pos = 0;    // inizializza la variabile pos a 0
 
void setup() 
{ 
  myservo.attach(9);  // collega il servo sul pin 9 all'oggetto servo 
 
  for(pos = 0; pos < 180; pos += 1)   // va da 0 a 180 gradi muovendosi di un grado alla volta
  {                                  
    myservo.write(pos);              // dice al servo di muoversi nella posizione scritta nella variabile pos
    delay(60);                              // velocità a cui si muove il servo
  }                                
}

void loop(){};

Io sono alle prime armi, quindi più di così non so se ti posso aiutare. Nel caso, prova a scriverci cosa vorresti che facesse il tuo servo (ho visto degli “if” dentro il tuo codice, quindi immagino vorrai farlo muovere a delle condizioni…)

@daniel come detto da @Velenia, dovresti spiegarti meglio. Cosa non va? Ti devi mettere nei panni di chi legge la tua richiesta. Potrebbe anche essere che non riesci a compilare.

Strano aver usato la porta 272 invece di 80 (standard). Se il problema è che non vedi Arduino nella rete, prova a dare anche gli altri parametri, Dns, Gateway, Mask

Ethernet.begin(myMac,myIp,myDns,myGateway,myMask);

Di solito do 8.8.8.8 per il DNS (google dns), il router di solito è 192.168.1.1 e la maschera 255.255.255.0

Questo programma Windows è utile per analizzare la rete domestica: http://www.softperfect.com/products/networkscanner/ Intervallo da 192.168.1.1 a 192.168.1.255

grazie per avermi risposto velenia.. comunque il codice non mi da errori è solamente che quando lo carico in arduino ed eseguo il programma il servomotore non gira. la ethernet funziona benissimo e secondo me è il codice che non è giusto e per questo non riesco a far girare il servomotore :)

grazie anche a te nid69 comunque non penso che sia quello il problema in quanto ho sempre fatto questo procedimento e arduino lo vede perfettamente.. il problema secondo me è qualcosa di sbagliato nel codice perchè il servomotore non gira proprio :)

Okay, ora è più chiaro il tuo problema.
Primo suggerimento (praticamente quello di @Velenia), provato il servo senza la Ethernet?
Secondo: provato al posto del servo di mandare sul Monitor Seriale solo una frase?

if (c == '8') {
    Serial.println("Ricevuto 8");
    for(pos = 0; pos < 180; pos += 1)                  // in steps of 1 degree 
    { myservo.write(pos);              // tell servo to go to position in variable 'pos' 
      delay(15);                       // waits 15ms for the servo to reach the position 
    }

Naturalmente nel setup() abilita la seriale con Serial.begin(9600);

si il servo l'ho provato su arduino e funziona benissimo.. non ho capito il fatto di mandare sul Monitor Seriale solo una frase. cosa intendi ?

Per fare il debug. Per avere delle informazioni da Arduino. Nell'IDE apri il Monitor Seriale e da Arduino usi Serial.println("qualcosa"); per inviare informazioni.

non ho capito cosa intendi comunque per te il codice è giusto o bisognerebbe modificare qualcosa ? :slight_smile:

Mi sembra di no. Ma ripeto per sapere cosa stà facendo Arduino si usa fare debug mandando informazioni al Monitor Seriale dell'IDE. E' una tecnica che DEVI imparare.

Nella setup() metti queste righe:

void setup()
{ delay(1000);
  Serial.begin(9600);
  Serial.println("inizio");
...  resto del tuo codice
}

Dove serve nel programma puoi aggiungere Serial.println("qualcosa"); per sapere cosa sta facendo Arduino.

char c = client.read();
Serial.print("ricevuto: "); Serial.println(c);

Dove hai il pilotaggio del Servo aggiungi una frase:

if (c == '8') {
   Serial.println("Ricevuto 8");
   for(...
}

Dopo aver scaricato il programma su Arduino, sempre nell'IDE premi il pulsante o da Menu lancia Monitor Seriale.

ok ho fatto come hai detto te ma quando mi si apre la schermata monitor seriale cosa devo fare ? più che altro cosa devo inviargli ?

Non invii nulla. Resetta Arduino e vedi se ci sono i messaggi che abbiamo inserito. Ma soprattutto il tuo programma fa girare il servo quando riceve 8 oppure 2. Ma sai come spedirgli questi dati?

ok ho fatto tutto quanto e si ci sono scritte le cose che mi hai detto di inserire.. comando questo servomotore tramite un programma in java :)

Quindi, quando mandi comandi da programma java, con monitor seriale aperto dovresti vedere quelle frasi.

ok grazie ora ho capito :slight_smile:
ho modificato il codice come hai detto tu puoi dirmi se ho fatto bene ? grazie

#include <SPI.h>
#include <Ethernet.h>
#include <Servo.h> 

Servo myservo;

int pos = 0;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,0,239);
EthernetServer server(272);

void setup()
{
  delay(1000);
  Serial.begin(9600);
  Serial.println("inizio");
   
  myservo.attach(9);
  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
}

void loop()
{
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    // an http request ends with a blank line
  //  boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.print("ricevuto: ");
        Serial.println(c);
          
        if (c == '8') {
        Serial.println("Ricevuto 8");
          
          for(pos = 0; pos < 180; pos += 1)
        {                                  // in steps of 1 degree 
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
              
    }
       if(c=='2') {
       for(pos = 0; pos < 180; pos += 1)
       {
    myservo.write(pos);
    delay(15);
       }
   } 
       
    }
  }
}
      delay(1);
     // close the connection:
     client.stop();
 }