Chiarimenti infrarossi!

Salve ragazzi, mi sono ritrovato fra le mani un paio di ricetrasmettitori a infrarossi di un vecchio robottino della deagostini che feci!
Precisamente questo: Schemi elettrici schede robot Cybot

Vorrei dei chiarimenti per quanto riguarda l'infrarosso, cioè come si fa per comunicare con gli infrarossi.
Il metodo di comunicazioni e qualche spiegazione in più sui codici dei televisori.
Per esempio, come faccio a dire al diodo LED emettitore che deve trasmettere una certa frequenza?

devi ysare questa libreria.. A Multi-Protocol Infrared Remote Library for the Arduino

per inviare i codici guarda How to send..

dr4gone:
devi ysare questa libreria.. http://www.arcfn.com/2009/08/multi-protocol-infrared-remote-library.html

per inviare i codici guarda How to send..

Ti ringrazio, avevo già trovato questa pagina! Solo che la mia domanda era un'altra!
Vorrei sapere come funziona esattamente il "mondo infrarossi". Cioè il campionamento della frequenza, come viene inviato un dato tramite una frequenza e cose così! :slight_smile:

Ci sono piú protocolli di trasmissione. I particolare trovi http://www.sbprojects.com/knowledge/ir/ir.htm (link suggerito da Ken sulla pagina che avevi trovato)
Praticamente viene modulato con una frequenza (per esempio 38kHz) per poter distinguere il segnale dal luce del sole o di lampade. Le sequenze di H e L in ricezione tolto l'alta frequenza (demodulato) sono interpretato secondo il protocollo usato.

Ciao Uwe

uwefed:
Ci sono piú protocolli di trasmissione. I particolare trovi http://www.sbprojects.com/knowledge/ir/ir.htm (link suggerito da Ken sulla pagina che avevi trovato)
Praticamente viene modulato con una frequenza (per esempio 38kHz) per poter distinguere il segnale dal luce del sole o di lampade. Le sequenze di H e L in ricezione tolto l'alta frequenza (demodulato) sono interpretato secondo il protocollo usato.

Ciao Uwe

Come faccio a demodulare un segnale in ingresso su arduino?

Scusate il doppio post, ma come faccio, oltre che demodulare un segnale in ingresso, a modulare un segnale in uscita?
Qualche spiegazione in più sulla modulazione? A cosa serve? E come si "immette" il dato da inviare sulla frequenza portante?

Xfox:
Scusate il doppio post, ma come faccio, oltre che demodulare un segnale in ingresso, a modulare un segnale in uscita?
Qualche spiegazione in più sulla modulazione? A cosa serve? E come si "immette" il dato da inviare sulla frequenza portante?

In pratica ti interessa capire come funzionano le comunicazioni digitali in generale... L'argomento non e' semplice. In soldoni, in generale si usa una portante per trasmettere un segnale perche' la bassa frequenza del segnale (in banda base, cioe' cosi' come viene generato; per esempio la voce) non e' adatta a permettergli di propagarsi (vedi legge di Planck), cosi' lo si porta su una frequenza piu' alta (banda traslata), che ha piu' energia. Nel caso delle comunicazioni digitali, o meglio nel caso che stai considerando tu, la frequenza non e' quella della luce del led, dovuta a fenomeni quantistici e quindi fissa, che cambia, ma la frequenza alla quale viene modulato il diodo, cioe' alla quale lo si accende e spegne. Per le telecomunicazioni ottiche, utilizzare una portante serve per diversi motivi, tra cui la necessaria sincronizzazione sorgente-ricevitore e la diminuzione della propagazione e generazione di eventuali errori. I sistemi usati, la teoria ed i calcoli sono complessissimi e non ti interessa conoscere questi dettagli, immagino. Cosi' come non credo ti interessi conoscere approfonditamente i metodi di modulazione/demodulazione digitali. Per il resto, non capisco cosa tu intenda per demodulare in ingresso e modulare in uscita... Qualche esempio? Schemino a blocchi?
Nel caso del tuo progetto la modulazione/demodulazione, viene fatta da appositi integrati in modo anche un po' banale: si invia una frequenza per il segnale 1 e non la si invia per il segnale 0 (serve per evitare che il sensore confonda i raggi del sole con quelli del segnale, ad esempio, cosa che disturbava certi vecchi mouse). Il ricevitore e' sensibile solo alla frequenza alla quale deve essere modulato il led trasmettitore. Non c'e' una vera e propria portante per il segnale.

Per esempio io voglio inviare un dato da un'Arduino (trasmettitore) ad un'altro Arduino (ricevitore).
Come faccio si che questo dato viene trasmesso dall'Arduino trasmettitore tramite un led a infrarosso e ricevuto dall'Arduino ricevitore tramite un apposito ricevitore IR? Che protocollo dovrei utilizzare? Si può realizzare il tutto senza usare librerie?

Al solito, dipende da che ci devi fare ;). Considera che quando devi trasmettere devi accendere e spegnere il led a circa 40 KHz (dipende dal sensore che stai usando, se usi un fototransistor non filtrato non hai questo limite e le cose si complicano). Il protocollo te lo puoi anche inventare tu, con un po' di fantasia. In genere, gli integrati di cui stiamo parlando, danno uscita alta (alimentazione) quando ricevono la summenzionata frequenza e zero quando non ricevono una ceppa.
Quel robottino ce l'ho anche io, ma non ho mai usato gli ir. Ti consiglio di prendere per pochi cent ad un negozio di elettronica un integrato come il vishay TSOP18xx (ne parla nel suo sito anche adrirobot) e usare quello li'. Puoi fare qualcosa anche con un minimo di elettronica esterna, senza fare generare ad arduino i 40 KHz (usa 555, 556 a seconda di come vuoi che si comporti).

Dai un'occhiata qui, è il mio blog: http://www.xfox.it/2011/05/22/prossimo-passo-sensore-di-distanza/
Io dispongo di quei due ricetrasmettitori a infrared!
Il mio problema è come inviare il dato!
Cioè potrei inventare un mio protocollo ma non so cosa mi servirebbe!
Come faccio a sapere che tutti i dati inviati sono stati ricevuti?
Potresti farmi un esempio?

Dunque, compagno di post (105 pari :D), come li collegheresti se fossero cablati? Intendo dire che "protocollo" useresti per una comunicazione cablata? Dovo aver risposto a questo, pensa puoi implementare la stessa cosa con gli infrarossi, con la sola rogna, che si aggiunge, di dover convertire il segnale 1 in un segnale a 40KHz. Come inviare o ricevere dati, quindi come definire un protocollo informatico, non dovrebbe essere complesso, giusto un po' noioso. L'importante e' che quello elettronico sia ben definito. Per sapere se sono stati ricevuti senza problemi potresti aggiungere una specie di checksum e dividere il dati in pacchetti.
Come sarebbe che non ti servirebbe inventare un tuo protocollo? Devono in qualche modo comunicare... Anche i segnali di fumo usavano un protocollo...
Ora non ho tempo (e nemmeno tanta voglia, a dire il vero :)) di mettermi a scrivere uno sketch che faccia questo, ma facendo un po' di prove non dovresti avere problemi a capire come proseguire. Comincia col preparare 2 sketch, uno per ognuno dei due Arduino, fai la prova a far trasmettere un segnale alto continuo ad un arduino e vedi se l'altro lo riceve, poi modifica e complica il codice a piacimento.
Devi avere qualcosa su cui lavorare, non puoi solo immaginare e teorizzare. Costruisci e prova, secondo me ti accorgerai che non e' cosi' complicato.

superkulak:
Dunque, compagno di post (105 pari :D), come li collegheresti se fossero cablati? Intendo dire che "protocollo" useresti per una comunicazione cablata? Dovo aver risposto a questo, pensa puoi implementare la stessa cosa con gli infrarossi, con la sola rogna, che si aggiunge, di dover convertire il segnale 1 in un segnale a 40KHz. Come inviare o ricevere dati, quindi come definire un protocollo informatico, non dovrebbe essere complesso, giusto un po' noioso. L'importante e' che quello elettronico sia ben definito. Per sapere se sono stati ricevuti senza problemi potresti aggiungere una specie di checksum e dividere il dati in pacchetti.
Come sarebbe che non ti servirebbe inventare un tuo protocollo? Devono in qualche modo comunicare... Anche i segnali di fumo usavano un protocollo...
Ora non ho tempo (e nemmeno tanta voglia, a dire il vero :)) di mettermi a scrivere uno sketch che faccia questo, ma facendo un po' di prove non dovresti avere problemi a capire come proseguire. Comincia col preparare 2 sketch, uno per ognuno dei due Arduino, fai la prova a far trasmettere un segnale alto continuo ad un arduino e vedi se l'altro lo riceve, poi modifica e complica il codice a piacimento.
Devi avere qualcosa su cui lavorare, non puoi solo immaginare e teorizzare. Costruisci e prova, secondo me ti accorgerai che non e' cosi' complicato.

Avevo notato anche io il numero dei nostri post :slight_smile:
Comunque ti ringrazio per la schiettezza con la quale hai risposto! Apprezzo la sincerità! U.U

Per rispondere alla domanda, beh utilizzere una libreria per la comunicazione seriale! Ehehehehe! Un dato per essere inviato deve essere trasformato in binario e io non ho le basi per fare questo! :slight_smile: Ma comunque comincerò sicuramente a provare come da te suggerito :slight_smile:

Un ultima domanda, se mando un segnale fisso, non oscilla a 40 KHz giusto?

Se dovessi fare oscillare un led a 40 KHz farei così:

digitalWrite(LED, HIGH);
delayMicrosec(12);
digitalWrite(LED, LOW);
delayMicrosec(12);

Giusto? (Anche se non son proprio 40 KHz)

Cioè ci sono tre stati principalmente!
1)Nessuna comunicazione
2)Livello logico alto
3)Livello logico basso

Come, il ricevitore, distingue fra livello logico basso e nessuna comunicazione?

Innanzitutto ti consiglio di usare tone().
Per quanto riguarda il ricevitore, non devi preoccuparti di come funziona, sappi solo che quando "vede" 40KHz alla frequenza degli infrarossi per cui e' progettato (troppe frequenze, lo so, ma non e' complicato, di questo dato te ne freghi, perche' non li devi produrre tu gli infrarossi, tu devi produrre i 40KHz), restituisce un valore alto. Ti basta collegare i pin di alimentazione a quelli di arduino (controlla le tensioni, vedi se sono compatibili) e il pin del segnale ad un qualunque altro pin (tranne quelli "proibiti", ovviamente) e leggere il valore di quel pin con digitalRead() (magari attiva la resistenza interna di pull-down). Quando leggi 1, vuol dire che al sensore arrivano 40 KHz (che avrai prodotto separatamente). Non ricordo se funziona con logica negata, comunque vedi un po' tu, guarda il datasheet.

EDIT:
non si tratta di discernere tra alto e basso, ma se c'e' o non c'e' frequenza (frequenza si'/frequenza no, come direbbe Elio) e quindi lui (ma a te non interessa), dentro, fa qualcosa tipo "ora vedo, ora non vedo... ora vedo e non vedo a 40 KHz".

Stavo cominciando a fare delle prove! Tanto per tenerti informato, quando c'è la frequenza legge 0, quando non c'è legge 1! Adesso posso cominciare a lavorare per il protocollo! Stavo pensando di far 1 byte alla volta!
Del tipo (sempre da esempio), invio un primo segnale di avvio comunicazione, nel successivo secondo avviene la lettura del primo bit, invio un altro segnale e nel successivo secondo leggo il secondo bit, invio un'altro segnale (questi segnali sono per richiamare l'attenzione) e nel successivo secondo leggo il terzo bit e così via fino all'ottavo!
Se trascorrono oltre 2/3 secondi da un bit e l'altro dichiaro il pacchetto come perso.
Ovviamente un secondo è un tempo lunghissimo! Ma per provare mi sembra più che adeguato! :slight_smile:

Solo che ora mi sorge un dubbio, come faccio a lavorare con i bit? Cioè se ho un byte = 01011100, come faccio a prendere i bit ad uno ad uno?

Aggiungo una piccola cosa:

  tone(out, freq[1], 1000);
  delay(1000);

Dove per freq[1] si intende 38000, questo codice dovrebbe produrmi per un secondo una frequenza di 38 KHz giusto?

Tramite questo:

void loop(){
  temp1 = 0;
  temp2 = millis();
  while (digitalRead(in) == 0){
    temp1 = millis() - temp2;
  }
  Serial.print("Temp1: ");
  Serial.println(temp1);
  delay(100);

}

Cerco di capire il tempo in cui l'uscita sta bassa (ovvero arriva la frequenza di 38KHz), il risultato però non è 1000 ms e neanche un valore prossimo ma 130 ms! Come mai?

Stavo cominciando a fare delle prove! Tanto per tenerti informato, quando c'è la frequenza legge 0, quando non c'è legge 1!

Ok, e' logica negata.

Solo che ora mi sorge un dubbio, come faccio a lavorare con i bit? Cioè se ho un byte = 01011100, come faccio a prendere i bit ad uno ad uno?

Potresti trovare un modo per lavorare con i bit-shift, o in generale con operazioni bit a bit, magari stabilendo dei clock, delle sincronizzazioni, ma la cosa si complica.
Considera che i byte in binario li tratti cosi':

void setup() {
  Serial.begin(9600);
  byte mioByte = B11001100;
  Serial.println(mioByte, BIN);
  mioByte = mioByte >> 1;
  Serial.println(mioByte, BIN);
  mioByte = mioByte << 1;
  Serial.println(mioByte, BIN);
  mioByte = mioByte << 1;
  Serial.println(mioByte, BIN);
}

void loop() {
}

Puoi usare conversioni dec-bin (che pero' devi scriverti tu) e quant'altro, usa la fantasia :wink:

Cerco di capire il tempo in cui l'uscita sta bassa (ovvero arriva la frequenza di 38KHz), il risultato però non è 1000 ms e neanche un valore prossimo ma 130 ms! Come mai?

Controlla con un tester che effettivamente il segnale venga inviato per un secondo, se non l'hai fatto.

questo codice dovrebbe produrmi per un secondo una frequenza di 38 KHz giusto?

Si'.

Il problema del tempo l'ho risolto così:

  tone(out,freq[val1]);
    delay(50);
  noTone(out);

Dove freq[val1] è sempre la frequenza a 38 KHz

E perche'? A me ha sempre funzionato l'altro sistema. Poi cosi' non hai 38KHz per 1 secondo, ma per 50ms...

superkulak:
E perche'? A me ha sempre funzionato l'altro sistema. Poi cosi' non hai 38KHz per 1 secondo, ma per 50ms...

Non lo so, a me funziona meglio così!

Comunque si lo so che così è per 50ms era un pezzo del codice che ho reallizato.

Perdonate i miei frequenti doppi post! xD
Comunque nei post precedenti mi chiedesti come farei se avessi una connessione cablata! Beh, ci sarebbe un segnale di clock!
Qui questo segnale di clock non c'è! Quindi come faccio?

P.S.
Ciò che ho realizzato (invio di due bit) lo si può vedere qui: xfox.it
però riesco solamente a inviare 2 bit, stavo provando con 8 ma i tempi di invio/ricezione sono sfasati! Come si potrebbe risolvere?