Gamoover

[move]Le staff Gamoover vous souhaite la bienvenue ;)

[idée] pour fabriquer un penny puncher

Démarré par deltaone, Dimanche 26 Février 2006, 10:24:26 AM

tilowil

#464
Salut,

Il faut plus de précision. Le premier micro switch (celui qui fait avancer 1 par 1 les leds) ne sert plus ?
Ton micro switch 1, 2 et 3 ont il un changement d'état impulsif ou fixe car le code ne va pas être le même. J'explique la question. Si le changement d'état est fixe, genre mesure de niveau, ou si le changement d'etat est impulsif, genre passage d'une pièce. Car si c'est le dernier cas je rejoins Noelfhim, tu dois utiliser les interruptions (les ports 2, 3, 21 puisque tu as un Mega2560). En effet en utilisant des pièces comme déclencheur (ce qui semble logique vu le type de machine que tu veux faire) de passage, l'impulsion sera trop brève pour être prise en compte. Maintenant si c'est une mesure de hauteur cela implique une séquence. Supposons que les contacts soient :
- 1 position basse
- 2 position intermédiaire
- 3 position haute

Le chargement se faisant par le haut le switch 3 va faire générer une impulsion, puis le switch 2 idem et enfin le switch 1 la se fermer. et ainsi de suite jusqu'à atteindre le niveau du switch 2 et ainsi de suite.

Il vaut mieux comprendre exactement ce qui est a faire et le but final,car pisser du code par plaisir n'est pas une solution en soit, il faut que le code soit aussi pertinent. car lors de la mise en pratique tu vas aller au devant de problème de fonctionnement car toutes les informations n'auront pas été données et une fois en place changer tes broches, le programme va être plus compliqué que si tout est clair au départ.

Maintenant pour revenir à ta dernière demande que tu allumes 5 leds ou 1 seule c'est le même chose. C'est  1 led avec 4 autres en //.
Précise comment sont placés tes switchs, comment ils sont actionnés et s'il y a des risques de séquence.
qu'il y ai 1 ou 3 BP le code est plus ou moins le même.

Et le code est celui de l'exemple Arduino "Button" que tu peux trouver dans 02. Digital.

/*
 Bouton

Allume une LED branchée sur la broche 13 lorsque le bouton
branché sur la broche 2 est appuyé.
*/

// Initialisation des constantes :
const int buttonPin = 2;     // Numéro de la broche à laquelle est connecté le bouton poussoir
const int ledPin =  13;      // Numéro de la broche à laquelle est connectée la LED

// Déclaration des variables :
int buttonState = 0;         // variable qui sera utilisée pour stocker l'état du bouton

// le code dans cette fonction est exécuté une fois au début
void setup() {
 // indique que la broche ledPin est une sortie :
 pinMode(ledPin, OUTPUT);      
 // indique que la broche ledPin est une entrée :
 pinMode(buttonPin, INPUT);    
}

// le code dans cette fonction est exécuté en boucle
void loop(){
 // lit l'état du bouton et stocke le résultat
 // dans buttonState :
 buttonState = digitalRead(buttonPin);

 // Si buttonState est à 5V (HIGH→bouton appuyé)
 if (buttonState == HIGH) {    
   // on allume la LED
   digitalWrite(ledPin, HIGH);  
 }
 else {
   // sinon on éteint
   digitalWrite(ledPin, LOW);
 }
}


La difference avec ta demande il n'y a que 1 bouton, mais le principe est le même 1 bouton allume 1 led.
il te suffit d'integrer le bouton 2 avec la led 2 et le bouton 3 avec la led 3 (chaque led representant réellement un groupe de 5 leds en // avec leurs résistances individuelles).

Si maintenant tu veux te frotter aux interruptions.


/*
  Exemple pour démontrer l'utilisation des interruptions.
 
  Bouton poussoir, connecté entre GND et la broche 2 (INT0).
 
  Résistance PULLUP activé pour cette broche.  Condensateur de 100nF
  en parallèle avec le bouton recommandé.
 
*/

#define boutonPin  2  // C'est l'entrée INT0

//  Pour qu'on puisse changer la valeur d'une variable depuis une fonction de
// gestion d'interruption, il faut que la variable soit déclaré "volatile"
volatile boolean changed = false;

// Notre fonction de traitement d'interruption.  Le strict minimum, souvenez vous.
void doContact() {
  changed = true;
  // Difficile de faire + court
}

void setup() {
  // Broche en entrée avec résistance de pull-up
  pinMode(boutonPin, INPUT_PULLUP);
 
  // Attacher notre fonction ISR, détéction de flanc déscendant (5v vers 0v)
  attachInterrupt(0, doContact, FALLING);
 
  // Montrer que nous sommes la
  Serial.begin (115200);
  Serial.println("Hello");
}

void loop(){
  if ( changed ) {
    changed = false;
    Serial.println("Ha ! Vous avez touché le bouton");
    // Vous pouvez aussi faire des actions comme allumer une autre led
    // ou commander un servo moteur, ...
  }
  delay(1000);
  // Vous pouvez ajouter du code ici pour faire clignoter un led, etc.
}


jeremiggy

En effet quand je vois toutes les questions que cela soulève il est évident que je manque de précision dans mes explications.
Je vais être plus précis sur où sont ses switch, comment sont-ils actionné et le but final de mon montage.

Les switch sont juste derrière les entrées de pièces. Il y a 3 entrés donc 3 switch. Ils sont actionnés lorsqu'une pièces est poussée dans la machine.
En plus de ces 3 switch, la machine a également deux boutons (type borne d'arcade) donc 2 switch supplémentaires.

D'abord un état des lieux des différents éléments composant mon montage.
- une carte arduino mega
- 17 leds (5 bleues, 5 jaunes, 5 rouges et 2 blanches)
- 3 stroboscopes 12V à leds
- 3 micro-switch à lamelle
- 2 boutons lumineux à micro-switch

- A VENIR: 2 petits moteurs 12V

Le principe du jeu bonus: remplir une batterie symbolisée par les LEDS pour déclencher un jeu bonus permettant de gagner des pièces supplémentaires.
Pour remplir la batterie, il faut allumer toutes les LEDS. Pour les allumer il faut mettre des pièces dans la machine sachant que la batterie est séparée en 3 zones: bleue, rouge et jaune. Pour allumer les leds de la zone bleues il faut mettre des pièces dans la fente de gauche, pour allumer les leds jaunes il faut mettre des pièces dans la fente centrale et pour allumer les leds rouges il faut mettre des pièces dans la fente de droite. Les deux leds blanches symbolisent le pourcentage de batterie remplie: première led = 50% deuxième led = 100%.

Le déroulement du jeu: on met les pièces, les leds s'allument au fur et à mesure suivant où le joueur met les pièces. Lorsque les 3 zones sont totalement allumées, la led blanche 50% s'allume et les 3 zones s'éteignent. Le joueur continu de mettre des pièces. Lorsque les 3 zones sont à nouveau totalement allumées, la deuxième led blanche 100% s'allume et le jeu bonus commence. Le but à ce moment la est d'avoir un défilement très rapide des leds. Pour stopper ce défilement, le joueur doit appuyer sur un des boutons (peu importe lequel). Si le joueur arrive à stopper le défilement à un endroit précis (la led centrale) alors le joueur gagne (un moteur se déclenche laissant tomber des pièces contenu dans un tubes). Si le joueur perd le jeu recommence à zéro.

Cela fait un sacré pavé mais je ne vois pas comment expliquer cela plus clairement.

Vous allez me dire, il n'a pas parlé de ses 3 stroboscopes. En fait je souhaiterais qu'ils clignotent 2 ou 3 secondes lorsque l'on met une pièce dans la machine (il y a 3 strob, un au dessus de chaque fente de pièce donc l'idée est que se mette à clignoter celui au dessus de la fente d'où l'on vien de mettre une pièce).

jeremiggy

Et pour être parfaitement clair voici quelques images (ne pas faire attention au bazard!):



Les trois stroboscopes en forme de girofare ainsi que les fentes pour insérer les pièces (juste derrière il y a les switch) et les boutons.



L'endroit ou vont les LEDS. Les deux trous à part ce sont les leds blanches.



Les leds déjà soudées sur leur plaques.



Et enfin une vue d'ensemble de la machine.

Ultime précision, il y aura également une partie sonore, j'ai adjoint à mon arduino mega un shield mp3 sparkfun. L'idée est qu'un son soit déclenché également en plus du stroboscope quant on met un pièce dans la fente. Je pense que la partie sonore doit pouvoir être gérée dans un second temps?

tilowil

Je comprends mieux :D. Il te faut passer par les interruptions. Le passage de la pièce va être si rapide que la switch ne va donner qu'une impulsion très brève. D'ailleurs pourquoi utilises tu des micro-switchs et pas une led IR et un récepteur IR (le rayon se faisant couper par la pièce, un opto-coupleur).

donc si j'ai tout bien compris. La fente d'insertion gauche allume par le switch gauche les leds bleues. Quand le joueurs insère 1 pièce à Gauche dans le bloc de 5 leds bleues on allume la première led. Le joueur insère une seconde pièce à gauche on allume la seconde led bleue, et ainsi de suite jusqu'a la 5eme led allumée par la 5eme pièce à gauche. Le fonctionnement est identique pour les led jaunes pour la fente d'insertion centrale et le switch central et pour les leds rouges pour la fente d'insertion droite et le switch droit. Tant que les 3 blocs ne sont pas remplis on ne peux pas éteindre les leds. quand les 3 blocs de 5 leds sont allumés, on éteint les 3 blocs de leds et on allume la première led blanche '50%'. A partir de ce moment, on recommence à remplir les bloc de leds de couleurs jusqu'à ce que tous les blocs soit remplis, ce qui éteint les 3 blocs et on allume la 2eme led blanche '100%', pas de led '0%'. Dès que la led blanche '100%' s'allume on déclenche le jeu.
Et la il manque quelques infos :
- Le jeu se fait sur quelle série de led (bleues, jaunes, rouge, autres) ?
- Les boutons doivent ils s'allumer le temps du jeu ?
- de quelle façon doit se faire le défilement ? Façon cylon ou K2000 1 led faisant des aller retour, de façon linéaire 1 led partant de droite vers la gauche par exemple mais toujours dans le même sens, de façon vu mètre avec un remplissage complet du bloc jeu, ou une autre facon de faire ?

D'ores et déjà tu reserves les broches suivantes de l'arduino pour les microswitch, je les impose pour une viabilité de la demande. Donc les broches 2, 3, 21, 20, 19. Tu as encore la possibilité à 1 interruption en 18, mais pas plus.

Le moteur pour le besoin je prendrais un servomoteur de modelisme avec un mouvement de 90°.

Est ce bien ce que tu veux ? Ai je bien compris ?

Merci :)  <:)

Ps: Je viens de voir tes photos et je comprends mieux  <:)

jeremiggy

#468
Alors pour répondre aux quelques interrogations restantes:
- le jeu se fait sur les 15 leds colorées. Cela fonctionne de cette façon:
1) si on appui sur le bouton lorsque l'une des leds suivantes est allumée: leds 1,2,5,6,7,9,10,11,14 ou 15, le joueur à perdu et le jeu recommence au début.
2) si on appui sur le bouton lorsque l'une des leds suivantes est allumée: leds 3,4,12 ou 13, le joueur gagne le lot simple (un seul moteur se déclenche).
3) Si on appui sur le bouton lorsque la led 8 est allumée le joueur gagne le gros lot (les 2 moteurs se déclenchent distribuant le double de pièce).
- j'aimerais que les boutons soit toujours allumés mais qu'ils clignotent pendant le jeu bonus.
- j'aimerais un défilement des leds façon K2000!

Sinon tu as parfaitement tout compris  :)

P.S: Niveau comportement des leds, pour encore plus de bling bling! le top serait que pendant la partie chaque prochaine leds à s'allumer clignotent, pour faire clair lorsque la partie commence la première led bleu, jaune et rouge clignotent (ainsi que la led 50%). Lorsque l'on met une pièce dans la fente de gauche la led devient fixe et la suivante clignote etc... si cela est possible évidemment!

tilowil

#469
tu viens de soulever une autre question. Comment sait on que la partie commence ou qu'elle finit ? Car pour moi sur ce genre de machine hormis à l'allumage, la partie est toujours en cours. Lorsqu'un joueur n'a plus de pièces, la machine continue le jeu (essayer de pousser des pieces) en attendant le joueur suivant et ses nouvelles pièces. Elle ne s'arrête jamais sauf quand on l'éteint.

jeremiggy

#470
Oui en effet le jeu devra se réinitialiser à l'extinction de la machine, autrement la partie est toujours en cours.

Pour répondre à ta question concernant l'éventualité d'utiliser plutôt LED+récepteur IR, j'avais peur de compliquer les choses ne maitrisant vraiment pas l'électronique...

Noelfhim

Bonjour,

J'ai lu un peu en diagonale parce que j'ai assez peu de temps.

La question qui me vient c'est en fait : tu veux apprendre ou tu veux que ça marche ?

Si tu veux apprendre, je veux bien t'expliquer tout ce que tu veux (attention, en électronique, je suis un peu limité).
Si tu veux juste que ça marche, mieux vaut faire un vrai cahier des charges (avec des schémas pour qu'on comprenne bien et une liste de comportements attendus et les événements qui les déclenchent). Dans la limite de mon temps, je veux bien coder des trucs (et je ne suis pas seul je pense).

Dans les deux cas, ça peut être intéressant de passer par ce simulateur :
https://123d.circuits.io

Régis.

jeremiggy

Salut!

Je dirais les deux mon capitaine!
J'ai découvert l'arduino en planchant sur ma machine, je ne connaissais absolument rien sur cette plate forme et encore moins sur le code. Je trouve ça génial. Mais voila, avant de solliciter votre aide sur ce forum j'ai essayé par mes propres moyens, je suivi des tutos, mais rien à faire, ça ne rentre pas, il y a quelque chose qui m'échappe et qui me braque. Donc je dirais au final, mon vrai besoin est que ça marche car ça fait plus d'un an que je suis sur cette machine et bien que j'adore la bricoler ça commence à me sortir par les yeux, d'autant lorsqu'il s'agit de chose que je ne maîtrise pas. J'aimerais la terminer et passer à autre chose.

Je vais essayer de faire un cahier des charges clair et précis.

tilowil

Salut,

A 2 personnes on devrait pouvoir t'aider à finaliser ta machine ;).
Fait ton cahier des charges, fait des prototypages électroniques avec 123d.circuits.io, mais aussi avec Fritzing (qui contient l'arduino Mega - http://fritzing.org/download/?donation=0) et qui te permettra de générer une image pour ton circuit, mais pas de simulation. Essaie de faire des images claires sans trop de fil qui se croisent dans tous les sens et si ton cahier n'est pas suffisamment clair il y aura un aller retour de questions réponses :D. Réfléchit bien à tout, n'hésites pas à rentrer dans les détails. Un schéma est parfois plus parlant qu'un long texte. A toi de jouer :D.

jeremiggy

Salut à tous,

Cela fait longtemps que je ne suis pas repassé par ici, mon projet n'est pas mort, mais faute de temps (boulot et quelques soucis de santé) je n'ai pas beaucoup avancé. Je suis toujours sur mon arduino et mon jeu bonus.
Je reviens sur ce que tu disais Tilowil concernant les broches à réservées pour les switch, j'ai sur mon arduino mega un shield mp3 sparkfun: MP3 SHIELD Si je comprends bien il utilise certaines des broches mentionnées? La 2 et les 3?

jeremiggy

Salut les coin pusheurs!

Bon j'avance vraiment pas mal. Grosso modo, j'ai terminé les câblages, ne manque plus que la programmation!
Déjà deux petits montages pour vous montrer les éléments (ne pas faire attention au bordel sur et dans la machine!):





J'essai dans l'après midi de vous poster les schémas des câblages des différents éléments.

jeremiggy

Bon pas eu le temps de faire les schémas malheureusement, cependant quelqu'un sait le code à utiliser avec l'arduino pour qu'une piste mp3 démarre lors de l'appui sur un bouton,je ne trouve pas sachant que j'utilise le shield mp3 sparkfun avec lecteur de carte micro sd et la bibliothèque de Bill Porter.

usagi

#477
Je ne sais pas trop, je dirais :


#include <SPI.h>
#include <SdFat.h>
#include <SdFatUtil.h>
#include <SFEMP3Shield.h>

SdFat sd;
SFEMP3Shield MP3player;

const int btnPin=12;

int buttonState = 0;

void setup() {
  Serial.begin(9600);
  //start the shield
  sd.begin(SD_SEL, SPI_HALF_SPEED);
  MP3player.begin();
  //set up button
  pinMode(btnPin, INPUT);
}

//do something else now
void loop() {
  //lit la valeur du bouton
  buttonState = digitalRead(btnPin);

  if(buttonState == HIGH){ //le boutton est appuyé ?
    if (! MP3player.isPlaying()) //Est ce que l'on joue déjà le morceau ?
      MP3player. playTrack(1); // si non, on lance la musique
  }
}


En espérant que ça t'aide.
Arcade: Astro City
Flipper : Space Jam

jeremiggy

Merci pour ta réponse. Cependant le code ne marche pas, il ne se passe rien quand le switch est actionné.
J'ai recopié scrupuleusement ton code j'ai juste changé la broche de bouton qui est en 18 sur ma machine.

Peut être faut-il nommer de façon spécifique le fichier? (il a le nom track001).

usagi

Désolé il y a une coquille dans mon code : il manque une négation sur le second if.
if(buttonState == HIGH){ //le boutton est appuyé ?
    if (! MP3player.isPlaying()) //Est ce que l'on joue déjà le morceau ?
      MP3player. playTrack(1); // si non, on lance la musique
  }
Arcade: Astro City
Flipper : Space Jam