Quoi de neuf ?
FlipperFrance

Quoi! Comment! Pas encore membre d'FF ! Franchissez le pas, incrscrivez vous avec le mail de votre F.A.I (VPN Exclus) et participez à la vie flippéristique

Un pinball qui ne connaît pas le tilt...

Nizet Pascal

Membres
Membre FF
Bonjour,, et pour cause, il faut le balloter dans tous les sens. Je me suis inspiré des labyrinthes à bille avec des trous et un ancien article d'électronique-pratique. Il faut toucher les plots verts qui s'allument au hasard à chaque coup réussi en évitant les plots rouges qui remettent le score à 0!... Le jeu est temporisé (via un vieux vu-mètre), mais chaque coup réussi gagne 10 sec. Encore une fois grâce à l'Arduino qui permet d'enregistrer le meilleur score. Une piste conductrice mise à la masse (alu ménager dans mon cas) et plots isolés ("Tubtara"M8 avec 1 led dedans), 4 plots rouges aux angles rendent déjà le jeu assez difficile. J'ai choisi des nixies (qui nécessitent env. 180V), mais il est aussi possible d'utiliser de 7-segents classiques.

Le programme:

// bille !!!conflits entre tone & analogWrite p. 3 & 11!!!

#include <EEPROM.h>

//init variables

unsigned long tm; //gestion temps anim.
unsigned long tm1; //gestion temps jeu
unsigned long inv; //gestion tempo invalid.
byte tps = 0;
byte niy = 0;
byte rnd = 0;
byte uni;
byte diz;
byte nix = 0;
byte rec;
byte bsc = 0; //basc. pts/rec
boolean st = 0; //en attente
byte tmp;

void setup()
{
//init ports

DDRD = 1; //sorties
PORTD = 0; //nixies

pinMode(A0, OUTPUT); // ) A led's pc0
pinMode(A1, OUTPUT); // ) B led's pc1
pinMode(A2, OUTPUT); // ) C led's pc2
pinMode(A3, OUTPUT); // ) D led's pc3
pinMode(A4, INPUT_PULLUP); // entr�e cpt pc4
pinMode(A5, INPUT); // entr�e raz pc5
pinMode(11, OUTPUT); // galva pb2
pinMode(12, OUTPUT); // son pb3
pinMode(13, INPUT_PULLUP); // b.p. start pb4
pinMode(8, OUTPUT); // recopie bit 0 nix
pinMode(9, OUTPUT); // " bit 1 nix
pinMode(10, INPUT_PULLUP); // r.a.z. rec.
analogWrite(11,128); //galva tps � mi-ech.
//tone(12,440,200);
digitalWrite(12,HIGH);//bip test (buzzer actif)
delay(200);
digitalWrite(12,LOW);
//Serial.begin(9600);
if (digitalRead(10) == 0) {EEPROM.put(0,nix);}
EEPROM.get(0,rec); //lect. record
}

void loop()
{
if (st == 0) //en attente?
{
if ((millis() - tm) > 200) //tous les 1/5 sec.
{
if (bsc > 10){bsc = 0;}
bsc ++;
if (bsc == 1) //aff. pts
{
niy = nix;
aff();
analogWrite(11,0);
}
if (bsc == 6) //aff. rec
{
nix = rec;
aff();
nix = niy;
analogWrite(11,255);
}
rnd = random(15);
PORTC = rnd; //led's al�at.
if (digitalRead(13) == 0)
{
st = 1; //d�marrage
tps = 255;
}
tm = millis(); //m.�.j. tempo.
//Serial.println(nix,HEX);
//Serial.println(rec,HEX);
}
}
else
{
if (tps > 254) //rst cpt
{
uni = 0;
diz = 0;
nix = 0;
aff();
}
if ((millis() - tm1) > 250) //tous les 1/4 sec.
{
if (tps > 0)
{
tps --;
analogWrite (11,tps);//d�compte galva.
}
tm1 = millis();
}
if (digitalRead(A5) == 1) //plot faute
{
uni = 0;
diz = 0;
nix = 0;
aff();
for(bsc = 0;bsc < 21;bsc++) //trr...
{
digitalWrite(12,HIGH);
delay(10);
digitalWrite(12,LOW);
delay(10);
}
}
if (digitalRead(A4) == 0)//bon plot
{
uni ++;
if (uni > 9)
{
uni = 0;
diz ++;
}
nix = uni + ( 16 * diz);
aff();
if (tps < 250)
{tps = tps + 4;} // + 1 sec.
digitalWrite(12,HIGH); //bip
delay(200);
digitalWrite(12,LOW);
rnd = random(15);
PORTC = rnd; //led's al�at.
}
if (tps < 1)
{st = 0; //fin partie
if (nix > rec) //rec. battu?
{EEPROM.put(0,nix);
rec = nix;
for(bsc = 0;bsc < 11;bsc++)
{
PORTC = bsc;
digitalWrite(12,HIGH);
delay(50);
digitalWrite(12,LOW);
delay(50);
}
}
else
{
digitalWrite(12,HIGH);
delay(500);
digitalWrite(12,LOW);
}

}
}
}

void aff()
{
PORTD = nix;
digitalWrite(8,LOW);
digitalWrite(9,LOW);
tmp = nix & 1;
if (tmp != false) digitalWrite(8,HIGH);
tmp = nix & 2;
if (tmp != false) digitalWrite(9,HIGH);
}
 

Fichiers joints

  • pinb_ph.jpg
    pinb_ph.jpg
    44.3 KB · Affichages: 5
  • pinball.jpg
    pinball.jpg
    52.4 KB · Affichages: 5
Retour
Haut Bas