Pilotare servomotore con telecomando ir

Salve a tutti. Ho intenzione di realizzare un codice che possa pilotare un servomotore a 180° tramite un telecomando Ir. Ho un problema: il motore dovrebbe fermarsi quando il tasto del telecomando viene rilasciato, invece continua fino a fine corsa. Come potrei risolvere? grazie a tutti.

#include "Servo.h"
Servo myservo;
int pinreceiver = 8;
IRrecv irrecv(pinreceiver);
decode_results results;
int grado = 90;

void setup() {
myservo.attach(3);  
irrecv.enableIRIn();
}

void loop()
{
  if (irrecv.decode(&results)) //c'è un segnale
  {
    irrecv.resume();// pronto a ricevere il prossimo segnale
  }
  if ( results.value == 0xFF629D ){ //se è premuto tasto Vol+
    (grado ++);
    delay(35);
  } 
 if ( results.value == 0xFFA857 ){ //se è premuto tasto Vol-
    (grado --);
    delay(35);
  }  
  myservo.write ( grado );
  if ( grado > 180) (grado = 180); // riporta a 180 quando grado diventa superiore
  if (grado < 0 ) (grado = 0); // riporta a 0 quando grado diventa inferiore
  }

Buonasera, essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD ([u]spiegando bene quali conoscenze hai di elettronica e di programmazione[/u] ... possibilmente [u]evitando[/u] di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie. :)

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. ;)

Secondo me dovresti mettere il codice che aziona il servo all’interno dell’if() che legge il segnale.

Se ricevo un codice tasto, muovo il servo se il tasto è quello voluto, Altrimenti se non leggo nessun codice tasto non faccio niente.

if (irrecv.decode(&results)) //c'è un segnale
  {
    irrecv.resume();// pronto a ricevere il prossimo segnale

    // Qui tutto il codice per muovere il servo, che viene mosso solo se si preme un tasto
  }

torn24: Secondo me dovresti mettere il codice che aziona il servo all'interno dell'if() che legge il segnale.

Se ricevo un codice tasto, muovo il servo se il tasto è quello voluto, Altrimenti se non leggo nessun codice tasto non faccio niente.

Grazie mille Torn. Farò delle prove e ti farò sapere. Marco.

Salve a Tutti. Grazie a Torn sono riuscito a risolvere il problema. Ho eseguito tutte le istruzioni all’interno di un “if” ivi comprese quelle di posizionamento del servomotore. Nelle verifiche che ho eseguito mi sono accorto di un’altro problema. Quando un tasto del telecomando viene premuto a lungo, invia un segnale di ripetizione (come “FFFFFFFFFF”) che risulta uguale per tutti i tasti. Ho pensato di risolvere creando una variabile di controllo. Sul punto accetto vostri suggerimenti. Potrei dire che il progetto funziona; l’unica notazione negativa è la lentezza del movimento del servomotore. Ci sono possibilità per aumentarla/modificarla? Condivido con voi il nuovo codice. Grazie di tutto. A presto.

#include "IRremote.h"
#include "Servo.h"
Servo myservo;
int pinreceiver = 8;
IRrecv irrecv(pinreceiver);
decode_results results;
int grado = 90;

void setup() {
myservo.attach(3);  
irrecv.enableIRIn();
}

void loop() {
 int verso;
 if (irrecv.decode(&results)) //c'è un segnale
 {
   irrecv.resume();// pronto a ricevere il prossimo segnale
   if ( results.value == 16736925 )//se è premuto tasto Vol+
    { 
       (verso = "avanti");
       } 
    if ( results.value == 16754775 )//se è premuto tasto Vol-
     { 
        (verso = "indietro");
       }  
     if (( results.value == 4294967295 ) && ( verso == "avanti"))
      {
        ( grado = grado+1);
        delay(2);
      }
     if (( results.value == 4294967295 ) && ( verso == "indietro"))
       {
        ( grado = grado-1);
        delay(2);
      }
 myservo.write ( grado );
 if ( grado > 180) (grado = 180); // riporta a 180 quando grado diventa superiore
 if (grado < 0 ) (grado = 0); // riporta a 0 quando grado diventa inferiore
 }
}

Anziché grado+1 puoi provare grado+5 (e anziché grado -1, grado-5). Diminuisci di precisione, ma velocizzi x5.

Caio,
P.

Grazie Pgiagno.