problema con servo e infrarossi

ciao a tutti, volevo sapere se potevate darmi una mano a risolvere un problema con il servo… praticamente io sto cercando di muovere un servo utilizzando il sensore + il telecomando ir presenti nella starter kit.
appena io do il comando di movimento al servo il servo prova a muoversi e lo fa molto lentamente come se nn volesse muoversi…
qui vi scrivo lo sketch

#include <Servo.h> 
#include <IRremote.h>
Servo myservo;
const int RECV_PIN = 2;
int grado = 90;
int minGrad = 0;
int maxGrad = 180;
int pinServo = 8;
int prev = 16601263;
int next = 16584943;
int centro = 16617583; 
IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); 
  myservo.attach( pinServo );
  myservo.write( grado );
 
  pinMode( prev, INPUT );
  pinMode( next, INPUT );
  pinMode( centro, INPUT );
 
}

void loop() {
  if (irrecv.decode(&results))
    {
   Serial.println(results.value);
   if (results.value==16601263){
     ( analogRead( prev ) > 1000 );{ grado--; }
      } if(results.value==16584943){
        ( analogRead( next ) > 1000 );{ grado++; }
         } if(results.value==16617583){
           ( analogRead( centro ) > 1000);{ grado; }}
  if ( grado > maxGrad ) { grado = maxGrad; }
  if ( grado < minGrad ) { grado = minGrad; }
 
  myservo.write( grado );
  delay(15);
   irrecv.resume(); 

 }
}

Il codice va racchiuso nei tag code, altrimenti rischi che una parte del codice non sia visibile. Veri regolamento, sezione 7, spiega bene come fare: http://forum.arduino.cc/index.php?topic=149082.0

Per il servo+IR, probabilmente le librerie sono in conflitto. I servo usano un timer che è lo stesso della libreria IRRemote. Per la libreria IRRemote si può cambiare dentro al file IRremoteInt.h all'inizio del codice della libreria. Che Arduino e quale IDE usi (se ti presentavi come richiesto erano info che avresti già dato) ?

io uso arduino uno e nel mio pc ho 2 ide:1.0.5 e 1.5.6; appena iniziato usavo l'ide 1.5.6 ma appena ho provato a verificare lo sketch mi ha dato un errore che non era causato dal codice ma dal programma. Facendo qualche ricerca sul web ho trovato un posto sul forum dove c'era scritto che era un bug del software e ho scaricato l' ide 1.0.5 e non mi ha dato l'errore

oltre conflitto; Una variabile di tipo int puó contenere numeri tra 32mila e -32 mila ca. Tu vuoi metterci numeri nella grandezza del millione. int prev = 16601263; int next = 16584943; int centro = 16617583;

Arduno li troncherá a 16 Bit e il risultato sono numeri imprevisti. devi usare variabili del tipo long

Ciao Uwe

Già vero, non ci avevo fatto caso, non così:

int prev = 16601263;

ma così:

const long prev = 16601263L;

quindi il problema sta solo nello sketch non è il mio servo che non funziona.Devo aggiungere solo long e una L al numero corrispondente ai pulsanti?

Prova e poi ci dici.

P.S. quando posti il codice, usa nell’IDE il tasto CTRL+T, lo indenta meglio, diventa + leggibile.

ho appena provato e non funziona =( . ma la L che ho aggiunto su

const long prev = 16601263L;

va aggiunta anche in 16601263?

 Serial.println(results.value);
   if (results.value==16601263){
     ( analogRead( prev ) > 1000 );{ grado--; }

Adesso che controllo bene, il tuo codice è praticamente tutto errato.

pinMode() serve per dichiarare dei pin in input o output, ed i pin di arduino vanno dal numero 0 al 13.
Tu fai:

pinMode( prev, INPUT );

E prev vale 16601263
Ma che caspita stai cercando di fare? Hai fatto qualche esempio di base prima di cercare di fare qualcosa di complesso ?
Levali, non servono a NULLA.

Poi se hai dichiarato delle costanti per i tasti, tipo prev, usali ( e mettili maiuscoli, le costanti di solito in maiuscolo):

if (results.value==PREV){             // e non if (results.value==16601263){

Poi questo non ha senso:

     ( analogRead( prev ) > 1000 );{ grado--; }

Leggi un pin analogico ma gli passi prev che vale un numero enorme. E manda anche la parola if()

  if (results.value==PREV)
  { grado--; 
    if ( grado < minGrad ) { grado = minGrad; }
  }
  if(results.value==NEXT)
  { grado++; 
    if ( grado > maxGrad ) { grado = maxGrad; }
  }
  if(results.value==CENTRO)
  { grado=90;              // assegnare un valore per il centro del servo. Verifica quale valore dare !!!!
  }

Forse è meglio che prima ti leggi un pdf free su programmazione ed Arduino.
Cerca con internet “Tiziana Marsella Programmare Arduino”, è un pdf free molto ben fatto.

Anche questi sono valori costanti, mettigli const davanti e mettili maiuscoli:

int minGrad = 0;
int maxGrad = 180;
int pinServo = 8;
const int MINGRAD = 0;
const int MAXGRAD = 180;
const byte PINSERVO = 8;

ciao ho seguito il tuo consiglio ho rivisto l’intero programma che ti posto per informazione e adesso funziona tutto :stuck_out_tongue:
grazie e alla prossima.

//by cagliarigameplayer
#include <Servo.h>
#include <IRremote.h>
Servo myservo;
const int RECV_PIN = 2;
int grado = 90;
const int minGrad = 0;
const int maxGrad = 180;
const int pinServo = 8;
const long prev = 16584943;
const long next = 16601263;
const long centro = 16617583;
IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn();
  myservo.attach( pinServo );

  prev, INPUT;
  next, INPUT;
  centro, INPUT;

}

void loop() {
  if (irrecv.decode(&results))
  {
    Serial.println(results.value);
    if (results.value == prev) {
      (analogRead(RECV_PIN) != 1 ); myservo.write(minGrad);
    } if (results.value == next) {
      ( analogRead( RECV_PIN ) != 2); myservo.write(maxGrad);
    } if (results.value == centro) {
      ( analogRead( RECV_PIN ) != 3); myservo.write(grado);
    }
    if ( grado > maxGrad ) {
      grado = maxGrad;
    }
    if ( grado < minGrad ) {
      grado = minGrad;
    }


    delay(15);
    irrecv.resume();

  }
}
//by cagliarigameplayer
  prev, INPUT;
  next, INPUT;
  centro, INPUT;

Questo pezzo non ha nessun senso e non genera nessun codice.

Come anche questi tre test che NON sono test ma inutili pezzi di codice, non hanno nessun senso anche se il compilatore li accetta:

(analogRead(RECV_PIN) != 1 );

Leggi da pin (chissà perchè visto che già lo fa la libreria con l'istruzione rrecv.decode) e poi ti chiedi se è diverso da 1 ma senza un if davanti il risultato del confronto si perde nel nulla. Avrebbe un senso come sintassi ci fosse if(analogRead(RECV_PIN) != 1 ) senza poi ; Ma nessun senso logico come operazione

nid69ita: Forse è meglio che prima ti leggi un pdf free su programmazione ed Arduino. Cerca con internet "Tiziana Marsella Programmare Arduino", è un pdf free molto ben fatto.

MI autoquoto, ti reinvito a leggere qualcosa sulla programmazione in C. Fai troppi errori di programmazione, metti pezzi di codice che non hanno senso.