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...
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
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.
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
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
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
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.