PROBLEMA pulseIn() TX--RX

Ciao a tutti, sto cercando di far comunicare 2 arduini tra loro. Per cominciare, ho provato semplicemente di mandare un impulso ad un arduino che una volta ricevuto deve mandare un impulso al primo. Il tutto è implementato tramite la PULSEIN().
Il codice è molto semplice...ma non funziona!
Un Arduino manda un impulso di 50ms...l'altro arduino quando riceve l'impulso di 50ms manda una conferma con un impulso di 5ms!!!
NON FUNZIONA!

Qualcuno può darmi qualche delucidazione??

CODICE PRIMO ARDUINO

#define LED 13
#define SENSING 7
long sense;

void setup(){
pinMode(SENSING, INPUT);
pinMode(LED,OUTPUT);
Serial.begin(115200);

}

void loop(){
   
   sense=pulseIn(SENSING,LOW);
  
    if((sense/1000)<=55 && (sense/1000)>=45){
      
      Serial.println(sense/1000);

      tone(LED,38000);
      delay(5);
      noTone(LED);
      delay(5);     
    }
    else{
      Serial.print("NON RICEVO NULLA----->");
      Serial.print((sense/1000));
      Serial.print("\n");
    } 
  
}

CODICE SECONDO ARDUINO

#define LED 13
#define SENSING 7
long sense;

void setup(){
pinMode(SENSING, INPUT);
pinMode(LED,OUTPUT);
Serial.begin(115200);

}

void loop(){
  
  tone(LED,38000);
  delay(50);
  noTone(LED);
   
  sense=pulseIn(SENSING,LOW);
  
    if((sense/1000)<=3 && (sense/1000)>=7){
      
      Serial.println(sense/1000);
      Serial.println("IMPULSO TRASMESSO E RICEVUTO");

    }
  
}

RINGRAZIO CHIUNQUE RIESCA A FORNIRMI UNA RISPOSTA PLAUSIBILE!

"Non funziona" che vuol dire?
Cos'è che fa esattamente?

Inoltre non ho capito, usi la Tone per generare l'impulso? Ma sai che la Tone crea un'onda quadra con una specifica frequenza? In questo modo però la pulseIn misura solo la durata del segnale alto o basso. E a 38 kHz la durata del fronte alto o di quello basso è molto corto: 0,000026316 secondi. Molto minore dei 5 ms che hai usato tu.
Prova mettendo un semplice digitalWrite(HIGH).

leo72:
Prova mettendo un semplice digitalWrite(HIGH).

Concordo.
Inoltre ricordati di collegare i GND dei due Arduino tra di loro.

Esattamente, il primo arduino tramite un LED INFRAROSSO, spara un impulso PDM di durata 50ms a 38000Hz, che viene discriminato dalla PulseIn() collegata ad un demodulatore ad infrarosso TSOP1738.

Il secondo arduino, quando si rende conto di aver ricevuto un impulso di 50ms circa( ho previsto una tolleranza), spara al primo un impulso di 5ms, che nel primo arduino viene sempre discriminato tramite una PulseIn() con le stesse metodologie scritte sopra.

Adesso, il punto è che si riesce a "catturare" l'impulso di 50ms, ma non quello di 5ms...e non ne capisco la ragione.

Premetto che poichè uso la PulseIn() non è necessaria alcuna sincronizzazione, poichè c'è un continuo "sensing" del canale tramite TSOP.

@Leo72 : come hai calcolato quel tempo di 0,000026316???

Grazie per il tempo dedicato

@ PaoloP : Purtroppo la digitalWrite() non mi fornisce la durata del'impulso, ma solo una variazione di stato ALTO/BASSO, BASSO/ALTO. Io ho bisogno di discriminare la durata.

A che serve collegare i due ground insieme?? traggo qualche misterioso beneficio?? ( spero di si :~ )

Grazie Ancora

Salvofx:
Esattamente, il primo arduino tramite un LED INFRAROSSO, spara un impulso PDM di durata 50ms a 38000Hz, che viene discriminato dalla PulseIn() collegata ad un demodulatore ad infrarosso TSOP1738. ...
...

E' qui che sbagli ...
... tu usi la tone() quindi NON generi UN impulso di 50 mSec, ma generi PER 50 mSec una SERIE di impulsi della durata di 0.026 mSec (26 uSec), ovvero generi per 50 mSec un ONDA QUADRA a 38 KHz.

Guglielmo

Edit : Per inciso, nei tuoi 50 mSec vengono in realtà generati circa 1900 impulsi della durata di 26 uSec

@Salvofx:
frequenza = 1/T
da cui T = 1/frequenza

... tra l'altro, la soluzione per generare un SINGOLO impulso da 50 mSec te l'ha già indicata Leo ...

digitalWrite(pin, HIGH);
delay(50);
digitalWrite(pin,LOW);

Guglielmo

Salvofx:
A che serve collegare i due ground insieme?? traggo qualche misterioso beneficio?? ( spero di si :~ )

Semmai qualche maleficio se non lo fai. ]:smiley: :grin: :grin:
Se fin'ora a funzionato è perche, forse, usi la stessa alimentazione per i due Arduino.

Il GND è il riferimento di tensione. Quando misuri una tensione in effetti stai misurando una differenza di potenziale; avendo pero un riferimento che convenzionalmente è zero noi di norma ci riferiamo come se fossero valori assoluti: 230V, 5V, 3V3, ecc ecc.
Tant'è che utilizziamo lo stesso riferimento anche per valori negativi.

Quando colleghi un sensore o invii un comando, almeno che non sia galvanicamente isolato, DEVI utilizzare lo stesso rifermento allo zero ovvero il medesimo GND. Ecco il motivo per cui devi collegare tra loro almeno un pin GND dei due Arduino. Altrimenti i 5V che invii con uno potrebbero non essere i 5V che vede l'altro.

Se ad esempio volessi collegare i due Arduino tramite il bus I2C dovresti collegare tra loro i pin: SDA, SCL e GND. Quindi tre fili per un bus che ne prevede 2.
Inoltre se il sensore non è autoalimentato devi prevedere anche i 5V, o quello che necessita.
Il DS18B20, classico sensore digitale per la temperatura con bus 1-wire, ha bisogno di 1 filo per i dati, 1 per l'alimentazione e 1 per il GND.
Però, in una apposita modalità il fili per l'alimentazione e i dati possono coincidere, il filo del GND rimane tale, quindi lo collegherai comunque con minimo 2 fili: uno per alimentazione/dati e uno per il riferimento.

beh nel suo caso visto che usa led infrarosso e ricevitore infrarosso il collegamento gnd non serve

detto questo prendo spunto dall'ottimo consiglio di paolo per il gnd con circuiti con fili per suggerirti di

non partire direttamente con led e ricevitore a infrarossi
inizia collegando due pin dei due arduino insieme in modo da creare un bus e metti GND in comune
in questo modo durante i tuoi esperimenti con il codice quando avrai dei problemi non avrai il dubbio che sia un problema di comunicazione ma solo di codice
una volta ottenuto il codice funzionante adattalo agli infrarossi (anche percè un conto è inviare un codice via infrarosso un conto è inviare un impulso di 50ms, per quello che ne so io potrebbe pure attivarsi col sole o altro ogni tanto e casualmente :wink: )

No, fortunatamente il sole non incide tantissimo...sicuramente al buio totale o quasi ( 0 lux ), il comportamento è notevolmente migliore!

@gpb01 : non riesco a ricevere l'impulso lanciato con le digitalRead()....inizio a pensare che ci sia qualcosa che non va nel mio arduino!
il codice è veramente banale...bah... :~

Per inviare l'impulso devi.fare digitalwrite non read
Cmq lo so che il sole non da tanto.fastidio ma in ogni caso un semplice telecomando.invia.un codice non un impulso
Prova a vedere irremote funziona molto bene

Si scusami era un semplice errore di scrittura...ovviamente ho usato la digitalWrite().
Il TSOP funziona...con un normalissimo telecomando da tv rileva tutto. Il problema è che non ricevo un impulso
di 50ms...ma tanti impulsi di durata differente e non correlati tra loro.
Bah, non ci capisco più nulla... =(

Salvofx:
...
Il TSOP funziona...con un normalissimo telecomando da tv rileva tutto. Il problema è che non ricevo un impulso
di 50ms...ma tanti impulsi di durata differente e non correlati tra loro.
...

Ovvio, NON puoi usare il TSOP che è un ricevitore PCM che funziona con una portante a 38KHz e che cerca di decodificare il segnale !!! :astonished:
Ti serve un normale fototransistor per leggere gli impullsi da 50 mSec.

Se vuoi usare il TSOP allora devi cambiare tutto ... ti occorre la libreria IRremote e devi gestire il tutto in modo differente !!!

Guglielmo

P.S. : Allegato il datasheet del TSOP17xx

TSOP17xx.pdf (187 KB)