Go Down

Topic: IRremote segnale continuo (Read 1 time) previous topic - next topic

AndreaGeekTrufini

Salve a tutti,
sono nuovo del forum. Mi chiamo Andrea, ho 16 anni e da poco mi sono avvicinato al Mondo di Arduino.
Sto realizzando un braccio robotico e vorrei controllarlo con un telecomando infrarossi con IRremote. Ho già fatto delle prove, però sono riuscito, per esempio, a fare accendete un led con un tasto e a spegnerlo con un altro.
Ci sarebbe un modo per far restare acceso il led per il tempo che mantengo premuto un determinato pulsante???
Se qualcuno di buona volontà potrebbe farmi un esempio di sketch gli sono molto grato :)
Per esempio il codice in HEX trasmesso dal mio telecomando(telesystem) con il tasto OK é 25AE7EE0

Grazie mille

leo72

Ciao e benvenuto.
Ti suggerisco la lettura del regolamento per imparare l'uso del forum e dei suoi strumenti  ;)

Sul tuo problema, resta da capire se il tuo telecomando con il pulsante premuto fa un invio continuo oppure no, per capire poi come poter gestire il comando ricevuto. Se lo fa continuativo, basta leggere e tenere acceso finché c'è quel dato, altrimenti o prevedi un sistema di accensione/spengimento oppure con timeout.

nid69ita

Molti dei miei telecomandi quando tieni premuto un tasto non sparano più quel valore ma un fisso 0xFFFFFFFF
perciò devi prima memorizzarti il valore del tasto.
my name is IGOR, not AIGOR

AndreaGeekTrufini

Si, leggeró accuratamente il regolamento :) grazie...
Comunque ho due telecomandi:
- con uno, mantenendo premuto un pulsante il primo valore é quello che corrisponde al tasto stesso, mentre i successivi sono FFFFFFFF...
- con l'altro telecomando, invece, mantenendo premuto un pulsante viene ripetuto costantemente il valore del pulsante stesso... ho fatto alcune prove peró, essendo ancora alle basi, non sono riuscito a trovare una soluzione e vi chiedo gentilmente uno sketch con un minimo di spiegazione :)
Ancora grazie :)

leo72

Al max possiamo correggere un tuo sketch.
Posta quello che non ti funziona, spiega cosa fa e cosa invece dovrebbe fare e vediamo di trovare una soluzione. Sketch ex-novo non si scrivono perché non si può indovinare la logica che vuoi dare tu al programma e poi perché senza il tuo hardware in mano sarebbe come sparare nel vuoto. Senza considerare che se ti scriviamo noi il programma poi tu non impari nulla.  ;) Se questo programma non è di facile realizzazione per te, ti consiglierei di iniziare con progetti più semplici e di seguire la strada che andrebbe fatta normalmente, ossia quella dei piccoli passi, partendo dalle basi e poi salendo pian piano.

nid69ita

#5
Jul 06, 2013, 10:05 am Last Edit: Jul 06, 2013, 02:33 pm by nid69ita Reason: 1

Ci sarebbe un modo per far restare acceso il led per il tempo che mantengo premuto un determinato pulsante???

Al massimo pseudocodice, che ti indica la logica. Comunque per semplificare, usa il telecomando che ripete sempre lo stesso codice, lascia stare l'altro, per ora.

if (tasto == XXX)
 accendi led
else  // ovvero qualsiasi altro tasto)
 spegni led

EDIT: si, vero ho scritto una cavolata. Così non può funzionare.
my name is IGOR, not AIGOR

AndreaGeekTrufini



Ci sarebbe un modo per far restare acceso il led per il tempo che mantengo premuto un determinato pulsante???

Al massimo pseudocodice, che ti indica la logica. Comunque per semplificare, usa il telecomando che ripete sempre lo stesso codice, lascia stare l'altro, per ora.

if (tasto == XXX)
  accendi led
else  // ovvero qualsiasi altro tasto)
  spegni led


Giá ho utilizzato questo sketch, in questo modo il led si accende quando premo il tasto indicato e resta acceso fino a quando non premo un altro tasto... io invece vorrei fare in modo che il led deve restare acceso per il tempo che mantengo premuto il pulsante e poi al rilascio del pulsante si dovrebbe spegnere

AndreaGeekTrufini


Al max possiamo correggere un tuo sketch.
Posta quello che non ti funziona, spiega cosa fa e cosa invece dovrebbe fare e vediamo di trovare una soluzione. Sketch ex-novo non si scrivono perché non si può indovinare la logica che vuoi dare tu al programma e poi perché senza il tuo hardware in mano sarebbe come sparare nel vuoto. Senza considerare che se ti scriviamo noi il programma poi tu non impari nulla.  ;) Se questo programma non è di facile realizzazione per te, ti consiglierei di iniziare con progetti più semplici e di seguire la strada che andrebbe fatta normalmente, ossia quella dei piccoli passi, partendo dalle basi e poi salendo pian piano.


Si, hai pienamente ragione... sto studiando il C dalle basi, peró da sempre ho voluto realizzare una cosa del genere e lo faccio anche per mettere in pratica quello che imparo... conosco giá cicli e cose varie  perché a scuola abbiamo effettuato lo studio del linguaggio di programmazione Pascal... Comunque ora sono dal mio smartphone e non ho lo sketch a portata di mano, lo posto oggi pomeriggio e vediamo di correggerlo insieme :)
Grazie per la disponibilitá

uwefed

Controlla se viene ricevuto il codice per accendere il led.
Accendi il led e memorizzi la variabile che Ti da millis().
Se entro x ms (per esempio 100ms) non ti arriva un altro codice accensione led lo spegni
Se arriva un altro codice accensione led aggiorni la variabile che memorizza i millis() cosí parte il tempo di nuovo.

http://opensourcehardwarejunkies.com/tutorial-12-blink-an-led-without-using-the-delay-function/

Ciao Uwe

AndreaGeekTrufini

#9
Jul 06, 2013, 06:05 pm Last Edit: Jul 06, 2013, 07:31 pm by leo72 Reason: 1
Ragazzi ecco una delle prove che ho fatto:

Code: [Select]
#include <IRremote.h>

#define OK    0x25AE7EE0         // pulsante OK

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup() {
pinMode(13,OUTPUT);

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

void loop(){
 if (irrecv.decode(&results)) {
   Serial.println(results.value, HEX);       //Risultato in esadecimale
   irrecv.resume();
   }
        if(results.value==OK) {
        digitalWrite(13,HIGH);
        }
           else{
               digitalWrite(13,LOW);
               }
}


però come già vi ho detto con questo sketch il led mi resta acceso fino a quando premo un tasto(diverso da OK) che provoca lo spegnimento del led stesso. Io vorrei farlo rimanere acceso solo per la durata che mantengo premuto il tasto :) Come faccio???

edit by mod: per favore includi il codice usando gli appositi tag

anerDev

Code: [Select]
#include <IRremote.h>

int led1 = 5;
int RECV_PIN = 4;
IRrecv irrecv(RECV_PIN);
decode_results results;
byte flag=0;

void setup() { 
Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  pinMode(led1, OUTPUT);
}

void loop() {
   if (irrecv.decode(&results)) {
     Serial.println(results.value, DEC);
      irrecv.resume();
       if (results.value == 33480735) {
         digitalWrite(led1, flag);
         flag^=1;
       }
    }
}


by Leo72, tempo fa !
Andrea
<a href="http://anerdev.net">anerDev.net</a>

AndreaGeekTrufini

#11
Jul 07, 2013, 06:45 pm Last Edit: Jul 07, 2013, 07:37 pm by AndreaGeekTrufini Reason: 1
Grazie mille a AnerDev!!!
Però non é ancora quello che vorrei realizzare. Con lo sketch postato riesco a fare lampeggiare il led mantenendo premuto il pulsante. Però io avrei bisogno di mantenere il LED acceso per il tempo che mantengo premuto il pulsante e spegnere il LED lasciando semplicemente il pulsante stesso, tipo come i circuiti realizzanti con i pulsantini SMD. :)

leo72

La logica l'hai detta esattamente tu, devi solo tramutarla in codice  ;)

io avrei bisogno di mantenere il LED acceso per il tempo che mantengo premuto il pulsante spesso e spegnere il LED lasciando semplicemente il pulsante, tipo come i circuiti realizzanti con i pulsantini SMD. :)


Quindi:
Code: [Select]
if (digitalRead(pulsante) == statoLogicoCheTiPare) {
  digitalWrite(led, HIGH);
  while (digitalRead(pulsante) == statoLogicoCheTiPare); //questo blocca finché premi il pulsante
  digitalWrite(led, LOW);
}


Così ovviamente sei bloccato finché non rilasci il pulsante. Se invece nel contempo vuoi fare altro, dovresti fare una cosa più complessa, usando una variabile di stato:
Code: [Select]
boolean pulsantePremuto = false;
void loop() {
  if (digitalRead(pulsante) == statoLogicoCheTiPare) {
    if (pulsantePremuto == false) {
      digitalWrite(led, HIGH);
      pulsantePremuto = true;
    }
  } else {
    if (pulsantePremuto == true) {
      pulsantePremuto = false;
      digitalWrite(led, LOW);
    }
  }
  ....il resto del tuo codice
}


1) Non l'ho provato.
2) Occhio ai rimbalzi, il codice non li controlla.

AndreaGeekTrufini

Grazie leo72 :)
Io avrei intenzione di comandare diversi led con diversi tasti del telecomando e da come l'ho "compilato" non so se é possibile... sono all'inizio ed ho alcuni problemi

Code: [Select]
#include <IRremote.h>

#define OK 0x632192736

#define led 13

int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results(results);
boolean pulsantePremuto = false;

void setup() {
  pinMode(led, OUTPUT);
 
  irrecv.enableIRIn();
     Serial.begin(9600);
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, DEC);
       irrecv.resume();
       
if (digitalRead(RECV_PIN) == HIGH) {
    if (pulsantePremuto == false) {
      digitalWrite(led, HIGH);
      pulsantePremuto = true;
    }
  } else {
    if (pulsantePremuto == true) {
      pulsantePremuto = false;
      digitalWrite(led, LOW);
    }
  }
}
}


però comunque in questo modo non mi funziona... probabile mio errore :P :D

nid69ita

Veramente non funziona nulla.
Che è questo tra le variabili globali?
decode_results(results);

Deve essere:
decode_results results;
my name is IGOR, not AIGOR

Go Up