Go Down

Topic: [WIP] Projet : Laser Game (Read 2 times) previous topic - next topic

Hidjy

Dec 30, 2013, 05:10 pm Last Edit: Aug 07, 2014, 11:33 am by Hidjy Reason: 1
Bonjour les gens, j'ai pas mal de choses a raconter alors je vais tâcher d'être succinct.

Mon objectif final : Un systeme complet de Laser Game


(03/08/2014)

Objectifs :

  • [OK] Emission/reception IR avec reconnaissance du tireur.

  • [WIP] Serveur RF.



Probleme actuel : Utilisant un module 2.4GHz (Frequence assez utilisé), existe-t-il des risques d'interferences avec d'autres appareil ?
Comment les minimiser ?

Hidjy

Tout betement, quelquechose comme ca pourrais marcher :
Code: [Select]
void loop(){
  if (analogRead(A0) >= 170) { 
    Serial.println(time);
    time = 0;
  }
  time++;
  delay(1);
}


Mais ca pose des soucis de precision, le reglage est plutot coton :
Je peux avoir des valeurs plutot constantes mais pour certains reglages ca deviens assez aléatoire :/

ypelletier

#2
Dec 30, 2013, 07:01 pm Last Edit: Dec 30, 2013, 07:04 pm by ypelletier Reason: 1
Bonjour,

As-tu pensé à utiliser millis() ou micros()?

http://arduino.cc/en/Reference/Millis
http://arduino.cc/en/Reference/Micros

http://electroniqueamateur.blogspot.ca/

Hidjy

Merci pour ta reponse, c'est plus propre, en effet  :)

J'en suis donc a ce code :
Code: [Select]

int sensorPin = A0;
int threshold = 200;
int sensorValue = 0;
int time = 0;
int last = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
 
  time = micros();
  sensorValue = analogRead(sensorPin);
 
  if (sensorValue >= threshold) {
    Serial.println(time - last);
    last = time;
  }
             
}


Si je fais clignoter une LED toutes les secondes, j'obtiens des valeurs autours de 18000.
Je devrais pas avoir 1 000 000 ?

Lorsque je laisse le capteur a la lumiere ambiente, j'ai exactement 6240. (Meme chose a la lumiere de mon laser par exemple)
Cela correspond a quoi ? au rafraichissement de mon capteur ?

PS : Il n'y a pas de balise "spoiler" sur ce forum ?

ypelletier

Si la LED clignote une fois par seconde, ça signifie qu'elle est allumée pendant une fraction de cette seconde, puis éteinte pendant le reste de la seconde. 
Si sensorValue est plus grand que threshold pendant tout le temps que la LED est allumée, ton script devrait à mon avis afficher une suite de temps très courts pendant que la LED est allumée, puis un temps beaucoup plus long pendant que la LED est éteinte.
C'est quoi comme capteur?  Une photorésistance?
http://electroniqueamateur.blogspot.ca/

ypelletier

Dans ton code, time et last devraient être des unsigned long  plutôt que des int.
http://electroniqueamateur.blogspot.ca/

Hidjy

#6
Jan 01, 2014, 06:23 pm Last Edit: Jan 16, 2014, 05:27 pm by Hidjy Reason: 1
Ah bah oui, s'il compte les microsecondes, il a vite fait le tour d'un int...    :smiley-roll-sweat:
Merci.

J'utilise une photoresistance.

Du coups, pour ma LED, j'ai à peu près ces valeurs :
Quand elle clignote toutes les 0.1s , autours de 100 200.
Quand elle clignote toutes les 1s, autours de 1 002 200 .
Quand elle clignote toutes les 10s, autours de 10 022 000.

L'imprécision (si je puis dire) a donc l'air proportionnelle. Elle est du a quoi ?
De toute maniere, il me suffira de couper les 3 derniers chiffre pour tomber sur la bonne valeur envoyé. (Et donc le bon joueur)

Et le 6240 en lumiere continue c'est la vitesse d'execution d'une seule loop enfaite, non ?
Pourtant desfois j'ai des valeurs biens plus petites.

Au passage, quelqu'un sait comment les systeme "pro" fonctionnent ?
EDIT : Apperemment, certains fonctionne comme ce que je compte faire, mais la plupart utilise -en plus des lasers- des LEDs et capteurs IR.

Hidjy

#7
Jan 02, 2014, 03:33 pm Last Edit: Jan 02, 2014, 03:56 pm by Hidjy Reason: 1
Apparemment, la fonction pulseIn pourrait etre une bonne sloution pour mesurer la frequence... si mon etrée n'était pas une photoresistance mais un bouton  :(

(Même chose pour la librairie FreqCounter)

ypelletier

La photorésistance est un capteur analogique, mais rien ne nous empêche de la brancher à une entrée numérique pour qu'elle présente deux états logiques:  HIGH quand elle est éclairée, LOW quand elle ne l'est pas (ou l'inverse, ça dépend comment on la branche).   
http://electroniqueamateur.blogspot.ca/

Hidjy

#9
Jan 02, 2014, 03:50 pm Last Edit: Jan 02, 2014, 04:22 pm by Hidjy Reason: 1
Mais dans ce cas, impossible de regler le seuil pour lequel le capteur donne HIGH, si ?

(je viens de comprendre que tu es l'auteur de ce blog, qui est depuis peu une de mes references ;) )

ypelletier

Tu devrais pouvoir ajuster la frontière entre LOW et HIGH en ajustant la valeur de la résistance de gauche dans le circuit illustré ci-dessous (tu augmente cette résistance pour diminuer le voltage seuil).



(On dirait que mon blog commence à être connu!)     :)
http://electroniqueamateur.blogspot.ca/

Hidjy

J'ai fais pas mal de test avec cette technique du digitalRead, je galère vraiment avec le seuil je trouve ca pas pratique du tout, je pense repasser à l'analogRead. Je vous tiens au courant :)

En attendant, quelqu'un a des suggestion sur ça ou autre chose que j'aurais évoqué ?

B@tto

Utiliser un analogRead() n'a pas de sens ici : d'une part ça va compliquer la prog, et une mesure analogique n'a aucun intérêt.

PulsIn() est également à proscrire, car blocante. Donc si ton joueur capter un signal parasite (néon ou autre) alors il ne pourra plus tirer ...
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

Hidjy

#13
Jan 14, 2014, 12:18 pm Last Edit: Jan 16, 2014, 05:28 pm by Hidjy Reason: 1
En gros je reprend mon ancien code (corrigé) mais avec une lecture en digital, ça serai la meilleure methode ?
Ok, je test ça ce soir, merci :)

Au fait, en digitalRead, on obtient HIGH quand le signal est à l'equivalant de la moitié de la valeur max de la valeur analog, non ? (je testerais ça ce soir aussi, tiens)
EDIT : C'est bizarre, le seuil à l'air d'être 460 en analogique... Enfin, à la limite on s'en fou enfaite.

Hidjy

Bonjour bonjour, ça fait longtemps, mon projet était en stand by.

De retour, j'ai laissé tombé l'idée du pulse laser, j'utilise maintenant une led IR, le capteur qui va bien et la lib IRremote.
=> Tout marche.

Maintenant, je voudrais que les clients (les guns/les joueurs) puissent communiquer avec le serveur :
Rien de bien compliqué, un module nRF24L01 et la lib Mirf (Ca, ça marche).
Mais chaque client doit avoir une adresse qui lui ai propre et je refuse de toutes les rentrer à la main dans chacun des guns. Alors comment faire ?

Go Up