Riconoscere un segnale analogico

Salve a tutti,

sto costruendo per i miei nipoti un semplice sistema LaserTag non avendo però alcuna intenzione di raggiungere gli stessi livelli di altri utenti qui sul Forum.
Ecco, il sistema si basa su 2 DIY Arduino per ogni giocatore (uno sulla pistola e l'altro sul caschetto). Quello sulla pistola emana un fascio intermittente di luce che si interrompe per 5 secondi ogni 30 "colpi". L'altro ha un sensore formato da 8 fotoresistenze (4+4) 4 in A0 per una media della luce ambiente e 4 in A1 per la ricezione del fascio di luce.
Il sistema si basa sulla funzione "se la differenza data da A0 - A1 è superiore al valore di soglia" allora emetti un suono dal buzzer ed accendi un Led.
Ho riscontrato però il dei falsi positivi poiché il sistema non è in gradi di discriminare le differenze di valorie fortuite procurate dalle ombre da quelle volontarie create dal laser.
A questo punto, posso inviare un segnale preciso che verrà poi riconosciuto da Arduino? Come lo memorizzo? Io pensavo a qualcosa tipo una lettera del codice Morse...

Grazie in anticipo.

potresti provare una codifica come nei telecomandi ad infrarossi per tv & c. così puoi avere anche più di un giocatore e ognuno con il suo numero identificativo

Ci ho già pensato... ma mi sembra troppo macchinoso.

Tutto dipende dal tempo di risposta delle fotocellule

Se abbastanza rapide....

Ogni pistola emette un fascio pulsante ad una differente frequenza

Ogni ricevitore filtra solo i segnali in ac e riconosce lo sparatore dalla differente frequenza

Che fotocellule e che tempo di risposta?

Fede_ITA:
Ci ho già pensato... ma mi sembra troppo macchinoso.

Usare una codifica SI, ma usare LED IR e ricevitori IR, esempio a 33KHz, non è così complicato e ti permette di riconoscere un vero segnale dalla luce ambiente.

Guglielmo

Però un led ir non è abbastanza direzionale per fare del tirassegno

docsavage:
Però un led ir non è abbastanza direzionale per fare del tirassegno

Tutto dipende da dentro cosa lo racchiudi ... se il TX lo metti in un tubetto nero lungo qualche cm, va piû che bene :wink:

Mi dirai che occorre almeno un transistor per pilotarlo perché, per raggiungere una distanza decente, tocca salire con la corrente ...
... oppure usare dei CAT4101 che sono fatti apposta per pilotarli :wink:

Guglielmo

Il problema è proprio questo... sono delle semplici fotoresistenze da 12mm senza alcun data sheet... la risposta mi sembra abbastanza buona, ma non tanto quanto quella di un fotodiodo.
Il Codice del Ricevitore...

/*
   Ricevitore per LIGHT TAG
   In A0 i sensori leggono la luce ambiente
   In A1 i sensori leggono il fascio di luce in ingresso
*/
int buzz = 8;
int led = 13;
int sensorValue = 0;
int sensorValue1 = 0;

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

void loop() {
 
  int sensorValue = (analogRead(A0));  // Lettura media ambiente
  int sensorValue1 = (analogRead(A1)); // Lettura media segnale
  sensorValue = map (sensorValue, 0, 1023, 0, 16000);    // Aumento il range del segnale, ma si può omettere
  sensorValue1 = map (sensorValue1, 0, 1023, 0, 16000);  // Come sopra
 
    Serial.println(sensorValue - sensorValue1);  // Stampo a video il valore A0 - A1
    delay(35);        
  
  
  if ((sensorValue - sensorValue1) > 2000){   // Se A0 - A1 > 2000... (2000 è la soglia modificabile e dipende dal map)

      for (int i = 0; i < 20; i++) {                     // Lampeggia e Buzz 20 volte
       digitalWrite(led, !digitalRead(led));
       digitalWrite(buzz, !digitalRead(buzz));
       delay(125);
       }
   }
  else{
    delay(35);
    }
}

Fa il suo dovere ma, ovviamente, lavorando sui 680nm e luce visibile, la resa che ho durante il giorno non la stessa che ho alla sera.
Il Trasmettitore...

/*
   Emettitore per LIGHT TAG 
*/

const int buttonPin = 2;        // Pin Pulsante
const int ledPin =  13;          // Pin del Laser 
const int ledNoBullets = 53;  // Pin Led di segnalazione ricarica in corso

int buttonState = 0;         // Variabile lettura del pulsante

int bullet = 29;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);

  Serial.begin(9600);
  Serial.println(bullet + 1);
}

void loop() {
  
  buttonState = digitalRead(buttonPin); // Legge lo stato del pulsante

 
  if (buttonState == HIGH) {                             // Questa è l'intermittenza...
    digitalWrite(ledPin, HIGH);
    delay(40);
    digitalWrite(ledPin, LOW);
    delay(90);
 
   int newbullet = (bullet --);
   Serial.println(newbullet);

  if (newbullet == 0){                                        // Tutta sta roba andrà visualizzata su Display I2C
    Serial.println("No Bullets...");
    digitalWrite(ledNoBullets, HIGH);
    Serial.println("5 sec for Recharging...");
    delay(5000);
    digitalWrite(ledNoBullets, LOW);
    Serial.println("Ready to shoot!");
    bullet = (bullet + 30);
  }
  
  } else {
    digitalWrite(ledPin, LOW);
  }
}

Potrei aggiungere un potenziometro per la modifica della sensibilità...

Forse ho scoperto l'acqua calda,
ma dopo alcuni test ho visto che i diodi led rossi, posizionati al contrario, funzionano perfettamente come detector per frequenze di circa 650nm, esattamente come i sensori per l'IR.
Quindi, quando il fascio laser incontra il nucleo del led, viene creata una tensione di qualche mV che può essere rilevata dalle porte analogiche.
Quindi, i led verdi e blu possono funzionare da detector per i rispettivi colori. Correggetemi se sbaglio...

Non hai scoperto l'acqua calda.
Ogni semiconduttore é sensibile alla luce solo la maggior parte ha un involucro che non fa entrare luce.
I LED, visto che devono emanare luce hanno un involucro piú o meno trasparente (plastica colorata trasparente).
Meglio funzionano i fotodiodi e fototransistori che sono fatti per rilevare la luce.
Ciao Uwe

Nuovamente un saluto a tutti,

Mio cognato ha avuto la brillante idea di installare i circuiti al'interno di repliche in plastica e mi ha chiesto se riesco a simulare il riarmo dopo il cambio del caricatore... Io, da buon deficente, ho detto di si ed ora mi trovo in un casino dal quale non riesco a tirarmi fuori...

Bene, il SW è quello sopra, solo che ora devo aggiungere un pulsante che, premuto una volta, attiva il loop fino ad arrivare a 30.

Ho provato con il leggere lo stato del primo pulsante, che da 0 passa a 1 e poi racchiudere lo sketch scritto sopra dentro un blocco IF... ma non funziona.

Qualche idea?