primi passi con irRemote

salve sto facendo le prime prove di controllo remoto di arduino

non sto avendo grossi problemi però ci sono alcune cose che proprio mi sfuggono e desidere capire

prendendo questo mini codice, la parte sotto ir code si può saltare, è uguale a quella degli sketch di esempio della liberia

#include <IRremote.h>
#include <Servo.h>


//ir
IRrecv irrecv(11);
decode_results  results;


//raw data & codes
//unsigned int irSignal [] = {};
int up = 275196119;
//int down = 275212439;


//servo
Servo myServo;
int degree;


void  setup () {

  Serial.begin(9600);
  irrecv.enableIRIn();

  myServo.attach(6);
  myServo.write(90);

  delay(1000);
  Serial.println("READYYYY");

}



void  loop () {

  if (irrecv.decode(&results)) {
    Info(&results);
    Code(&results);
    irrecv.resume();
    Serial.println("");
  }

  receiver();
  myServo.write(degree);

}


void receiver() {

  Serial.println(results.value);
  if (results.value == up) {
    degree += 10;
    results.value = 0;
  }

  if (results.value == 275212439) {
    degree -= 10;
    results.value = 0;
  }

}



// ------------------- IR code ------------------- \\

void  Info (decode_results * results) {
  Serial.print("Code      : ");
  ircode(results);
  Serial.print(" (");
  Serial.print(results->bits, DEC);
  Serial.print(" bits), conversion DEC  : ");
  Serial.println(results->value);
}


void  ircode (decode_results * results) {
  Serial.print(results->value, BIN);
}


void  Code (decode_results * results) {

  Serial.print("rawData[");
  Serial.print(results->rawlen - 1, DEC);
  Serial.print("] = {");

  for (int i = 1;  i < results->rawlen;  i++) {
    Serial.print(results->rawbuf[i] * USECPERTICK, DEC);
    if ( i < results->rawlen - 1 ) Serial.print(",");
    if (!(i & 1))  Serial.print(" "); // ',' not needed on last one
  }
  Serial.println("};");
}

dove semplicemente muovo un servo in base a due pulsanti, funziona, ho 2 grossi dubbi

1: la libreria crea un “results.value” che è un integrale in base 10, per semplificare avrei voluto assegnare in globale il suo valore a un altro integrale ad esempio “up”, il problema è che poi quando nella funzione reveicer gli chiedo di confrontarlo non funziona! l unico modo in cui funziona è se gli chiedo un confronto con il valore direttamente come scritto sotto nella stessa funzione

2 in una prova avevo posto questa condizione prima di entrare nel servo.write()

if (results.value != 0) {}

perchè non funzionava? in teoria con questa sarebbe dovuto entrare solo se vi era una lettura nuova o sbaglio?

Servo e IRRemote usano lo stesso timer, è modificabile quello della IRRemote agendo dentro a IRRemoteInt.h

nid69ita: Servo e IRRemote usano lo stesso timer, è modificabile quello della IRRemote agendo dentro a IRRemoteInt.h

mi sento un po' idiota ma non ho capito cosa intendi con timer, e come può essere relativo al problema delle variabili

Non capisco cosa intendi per integrale in base 10. I numeri che ti da la results.value sono numeri, se hai usato lo sketch IRrecvDump, quello stampa i valori in esadecimale. MA... sono numeri enormi, 32 bits, quindi unsigned long e non di certo int Basta che apri IRRemote.h e guardi che tipo è il campo value.

Poi, la libreria servo e remote possono andare in conflitto perchè usano i timer, Arduino Uno ha 4 timer. https://arduino-info.wikispaces.com/Timers-Arduino Forse però il timer viene usato dalla IRRemote solo per spedire, per ricevere non lo usa. Ma vado a memoria. Non sono sicuro.

si ho usato quello sketch modificandolo per stamparmeli in decimale (prima ho detto base 10 usando questo termine improprio) e poi con questi numeri creare la condizione (o lo switch)

codice uguale al primo post solo che invece dell if ho usato uno switch. praticamente nella funziona receiver() decido angolo di sterzo, velocità e quanto andare avanti. ho il problema che quando dico allo stepper di fare X passi tutto arduino va in blocco per effettuare il movimento, c è un modo in cui posso dire allo stepper di fare infiniti passi e nel frattempo continuare a modificare gli altri parametri come rpm e sterzo?

#include <IRremote.h>
#include <Servo.h>
#include <Stepper.h>


//ir
IRrecv irrecv(11);
decode_results  results;


//robot
Servo myServo;
int degree = 75;
int power = 0;
int steps = 0;
Stepper myStepper(2048, 2, 3, 4, 5);


void  setup () {

  Serial.begin(9600);
  irrecv.enableIRIn();

  myServo.attach(9);

  Serial.begin(9600);

  delay(1000);
  Serial.println("READYYYY");
  
}



void  loop () {

  if (irrecv.decode(&results)) {
    Info(&results);
    Code(&results);
    receiver();
    irrecv.resume();
    Serial.println("");
  }

  myStepper.step(steps);
  myStepper.setSpeed(power);
  myServo.write(degree);
  
}


void receiver() {

  switch (results.value) {
    case 33720439:
      degree += 30;
      break;
    case 33687799:
      degree -= 30;
      break;
    case 33706159:
      power = 0;
      steps = 0;
      break;
    case 33738799:
      power += 3;
      steps += 100;
      break;
    case 33714319:
      power -= 3;
      steps -= 100;
      break;
  }

  power = constrain (power, 0, 10);
  Serial.print("power:"); Serial.println(power);
  Serial.print("degree:"); Serial.println(degree);
  Serial.print("steps:"); Serial.println(steps);

}



// ------------------- IR code ------------------- \\

void  Info (decode_results * results) {
  Serial.print("Code      : ");
  ircode(results);
  Serial.print(" (");
  Serial.print(results->bits, DEC);
  Serial.print(" bits), conversion DEC  : ");
  Serial.println(results->value);
}


void  ircode (decode_results * results) {
  Serial.print(results->value, DEC);
}


void  Code (decode_results * results) {

  Serial.print("rawData[");
  Serial.print(results->rawlen - 1, DEC);
  Serial.print("] = {");

  for (int i = 1;  i < results->rawlen;  i++) {
    Serial.print(results->rawbuf[i] * USECPERTICK, DEC);
    if ( i < results->rawlen - 1 ) Serial.print(",");
    if (!(i & 1))  Serial.print(" "); // ',' not needed on last one
  }
  Serial.println("};");
}

edit: ho visto il tuo messaggio solo ora nid, dannazione hai ragione per il tipo di variabili, stavo usando un tipo completamente sbagliato, non ci avevo proprio pensato… per il fatto dei timer sto leggendo l articolo grazie
riedit: timer1 è usato da servo
timer 2 da irREmote e anche se non ne ho la certezza anche da stepper

e qui mi sa che troverò risposta al mio dubbio su come fare altre cose mentre lo stepper si muove (forse): http://reprage.com/post/non-blocking-control-of-stepper-motors-on-arduino
certo che se qualcuno conosce una soluzione più semplice è ben accetto ahahah alla fin fine vorrei solo dire allo stepper fai passi infiniti e ogni tanto ti cambio la velocità

La IRRemote mi pare di default usa il timer2 ovvero lo stesso timer della tone() Però è modificabile, agendo dentro a IrRemoteInt.h Per la Mega è più semplice non usare gli stessi timer di altre librerie perchè ci sono 2 timer in più rispetto alla Uno.

Poi, il timer per la IrRemote serve per ricevere. Nel IrRemote.cpp c'e' scritto: // Interrupt Service Routine - Fires every 50uS - TIMER2 interrupt code to collect raw data. ed infatti c'e' da settare il timer con la enableIRIn() per ricevere

Per spedire invece usa un pin PWM, e la enableIRout() dentro disabilita il timer2, c'e' scritto: // Disable the Timer2 Interrupt (which is used for receiving IR)

fatto però mi sa di avere un paio di problemi

Arduino:1.6.10 (Windows 10), Scheda:"Arduino/Genuino Uno"

libraries\Servo\avr\Servo.cpp.o (symbol from plugin): In function `ServoCount':

(.text+0x0): multiple definition of `__vector_11'

libraries\IRremote\IRremote.cpp.o (symbol from plugin):(.text+0x0): first defined here

collect2.exe: error: ld returned 1 exit status


Errore durante la compilazione per la scheda Arduino/Genuino Uno.

eppure io la servo non l ho toccata, forse vanno in conflitto adesso che usano lo stesso timer

facendo un paio di prove se carico la servo da sola nessun problema quindi confermo il problema del conflitto con irremote, non riesco a capire cosa sia questo vector_11 non lo trovo da nessuna parte

in ogni caso prese singolarmente tutte le librerie funzionano

Non saprei. Io per ora sono tornato alla 1.6.9

alla fine ho lasciato perdere visto che era solo un piccolo esperimento per prendere dimestichezza con arduino, in ogni caso grazie mille nid per l aiuto ho imparato un bel paio di cose utili :D Karma+++