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

Tutoriel Jeu de lumière Gottlieb Diamond Lady

jeannotwo

Membres
Membre FF
Bonjour David,
Bonjour à tous,

Je trouvais l'éclairage de mon flipper assez terne, surtout que le plateau est bien sombre, aussi voici le résultat après environ 2 années de recherche pour améliorer l'éclairage.
J'aurai eu besoin d'un Arduino UNO, d'un ruban Led, d'une plaque fabriquée maison avec optocoupleurs et leds, de connecteurs et pince à cosse de chez Restorpinball, de supports leds imprimés en 3D et de galère !!!
Voici le rendu en vidéo du montage . la vidéo est courte (partie très rapide).

Jean

Pour afficher ce contenu, nous aurons besoin de votre consentement pour définir des cookies tiers.
Pour plus d'informations, consultez notre page sur les coOkies.
 
Ah tu as fait un changement de lumières
Sympa l'idée
Tu as du t'amuser câbler toute la GI

Tu sais nous montrer comment tu as fait
 
Oui, bien sûr,

Pour commencer, j'ai étudié les différentes façons de commander les rubans leds, la seule possible s'est révélée être par les entrées de la carte son.
Avec les plans et le câblage, je devais utiliser les entrées S1, S2, S4, S8, S16., la visualisation par des leds entre le +5V et les entrées était incompréhensible.
j'ai donc inverser le problème et commandé la carte sons par des interrupteurs

SAM_3205.JPG

il m'a suffit de basculer les inters et de valider par le bouton poussoir pour jouer les musiques et sons.
j'ai pu définir le rôle de S16
état 0 : il active la musique
état 1 : il active les bruitages

les séquences étant trouvées, je me suis penché sur la technique
j'ai commencé avec des portes logiques : trop de données à gérer
Je me suis tourné vers un module raspberry Pi B : trop lent au démarrage
j'ai enfin fini par un arduino UNO ; très bien pour le nombre d'entrées et de sorties, démarrage instantané.

pour la mise en forme du signal, j'ai utilisé des optocoupleurs 4N25
J'ai créé mon circuit imprimé à l'ancienne (typon + révélateur + gravure)
Attention, il y a des erreurs comme David sauf que moi je ne le fais pas exprès !!! (il manque la masse sur le dernier optocoupleur)

Plaque leds.jpg
l'entrée S20 correspond au relais Q "Game Over" qui me désactive l'attract mode
J'attaque directement les bases des transistors du module de commande du ruban led avec les sorties de l'arduino

la plaque gravée
1770320064418.jpg

la plaque montée

1770320008204.jpg

le ruban led se découpe par groupe de 3 leds

la création d'un support en 3D s'est donc imposée, le but étant de prendre la place de la lampe d'origine

J'ai laissé les douilles en attente sous le plateau pour remettre en configuration d'origine si besoin

1770320090446.jpg

1770320103944.jpg


la programmation de l'arduino s'est faite avec "arduino pour les nuls" et quelques tutos, la vérification avec Tinkercad

Schéma arduino.jpg

le programme ;

Jeu de lumière

Jeu de lumière flipper
circuit:
- LED RGB + résistance rouge pin 9 bleu pin 10 vert pin 11 to ground
- pushbutton en série avec 4 interrupteurs en parallèle S1 pin 2 S2 pin 3 S4 pin 4 S8 pin 5 S16 pin 6 depuis GND utilisation R interne PULLUP

created 2021
by JS

This example code is in the public domain.

*/


// constants won't change. They're used here to set pin numbers:
const int S1 = 2; // the number of the switch pin
const int S2 = 3; // the number of the switch pin
const int S4 = 4; // the number of the switch pin
const int S8 = 5; // the number of the switch pin
const int S16 = 6; // the number of the switch pin
const int S20 = 7; // the number of the switch pin
const int ledPinR = 13; // the number of the LED pin
const int ledPinB = 11; // the number of the LED pin
const int ledPinG = 12; // the number of the LED pin

// variables will change:
int buttonState = 0; // variable for reading the pushbutton status

void setup() {
// initialize the LED pin R as an output:
pinMode(ledPinR, OUTPUT);
// initialize the LED pin B as an output:
pinMode(ledPinB, OUTPUT);
// initialize the LED G pin as an output:
pinMode(ledPinG, OUTPUT);
// initialize the switch pin as an input:
pinMode(S1, INPUT_PULLUP);
// initialize the switch pin as an input:
pinMode(S2, INPUT_PULLUP);
// initialize the switch pin as an input:
pinMode(S4, INPUT_PULLUP);
// initialize the switch pin as an input:
pinMode(S8, INPUT_PULLUP);
// initialize the switch pin as an input:
pinMode(S16, INPUT_PULLUP);
// initialize the switch pin as an input:
pinMode(S20, INPUT_PULLUP);
}

void loop() {


// read the state of the pushbutton value:
int A = digitalRead(S1);
int B = digitalRead(S2);
int C = digitalRead(S4);
int D = digitalRead(S8);
int E = digitalRead(S16);
int F = digitalRead(S20);


// attente début jeu
if (F == HIGH ){
digitalWrite(ledPinR, LOW);
digitalWrite(ledPinB, LOW);
digitalWrite(ledPinG, LOW);
for (int r = 0; r < 256; r++){
analogWrite(ledPinR, r);
delay(1);}
for (int r = 0; r < 256; r++){
digitalWrite(ledPinR, LOW);
analogWrite(ledPinB, r);
delay(1);}
for (int r = 0; r < 256; r++){
digitalWrite(ledPinB, LOW);
analogWrite(ledPinG, r);
delay(1);}
}


// check if the pushbutton is pressed. If it is, the buttonState is HIGH:
if (A == LOW && B == LOW && C == HIGH && D == LOW && E == HIGH) {
// turn LED off:
digitalWrite(ledPinR, LOW);
digitalWrite(ledPinB, LOW);
digitalWrite(ledPinG, LOW);
digitalWrite(ledPinR, HIGH);}

if (A == HIGH && B == LOW && C == HIGH && D == LOW && E == HIGH) {
// turn LED off:
digitalWrite(ledPinR, LOW);
digitalWrite(ledPinB, LOW);
digitalWrite(ledPinG, LOW);
digitalWrite(ledPinB, HIGH);
digitalWrite(ledPinG, HIGH);}

if (A == HIGH && B == HIGH && C == LOW && D == LOW && E == HIGH) {
// turn LED off:
digitalWrite(ledPinR, LOW);
digitalWrite(ledPinB, LOW);
digitalWrite(ledPinG, LOW);
digitalWrite(ledPinG, HIGH);}

if (A == LOW && B == HIGH && C == LOW && D == LOW && E == HIGH) {
// turn LED off:
digitalWrite(ledPinR, LOW);
digitalWrite(ledPinB, LOW);
digitalWrite(ledPinG, LOW);
digitalWrite(ledPinB, HIGH);
digitalWrite(ledPinR, HIGH);
digitalWrite(ledPinG, HIGH);
}

if (A == LOW && B == LOW && C == LOW && D == LOW && E == HIGH) {
// turn LED off:
digitalWrite(ledPinR, LOW);
digitalWrite(ledPinB, LOW);
digitalWrite(ledPinG, LOW);
digitalWrite(ledPinB, HIGH);
digitalWrite(ledPinR, HIGH);
digitalWrite(ledPinG, HIGH);
}
}


Les 1ers essais ont été infructueux, notamment le S 20, le 24V prélevé n'étant pas filtré, arduino l'interprétait comme un signal 100Hz, aussi le ruban leds restait en attract mode, j'ai du
ajouter un condo en parallèle sur la led du photocoupleur.

La carte avec des leds de contrôle et l'arduino monté en lieu et place de la carte reset

Pour afficher ce contenu, nous aurons besoin de votre consentement pour définir des cookies tiers.
Pour plus d'informations, consultez notre page sur les coOkies.

L'arduino est enfichable, donc facilement démontable pour reprogrammer.

je posterai d'autres photos si besoin.

Jean
 

Fichiers joints

  • 1770416602834.png
    1770416602834.png
    139.6 KB · Affichages: 0
Dernière édition par un modérateur:
hello

sup. NOTE: je suis en train de faire un peu dans le même esprit pour mon BLACH HOLE, on en a causé avec David pas plus tard qu'avant hier je crois lje sujet était sur lune empreinte KICAD à la base)


en regardant ton code je vois, ex: (ledPinR, LOW) et ensuite la même (ledPinR, HIGH);

digitalWrite(ledPinR, LOW);
digitalWrite(ledPinB, LOW);
digitalWrite(ledPinG, LOW);
digitalWrite(ledPinB, HIGH);
digitalWrite(ledPinR, HIGH);
digitalWrite(ledPinG, HIGH);

il va y avoir un changement d'état instantané de cette même ledPinR, idem pour la B et la G, je ne pige pas trop la manip


En passant par un SWITCH CASE au lieu d'un IF tu y verras plus clair et cela sera modifiable plus facilement

essai çà ce code à l ocaze sur ton DIAMOND, je ne l ai pas testé.


// index : 0 1 2 3 4 5
// pins : S1 S2 S4 S8 S16 S20
const byte switches[] = {2, 3, 4, 5, 6, 7};

// PIN LEDs RGB
const byte ledR = 13;
const byte ledG = 12;
const byte ledB = 11;

// ================== VARIABLES ANIMATION ==================
unsigned long previousMillis = 0;
const unsigned long interval = 5;

byte animationStep = 0; // 0=R, 1=B, 2=G
int brightness = 0;
bool fadeUp = true;

// ================== SETUP ==================
void setup() {
pinMode(ledR, OUTPUT);
pinMode(ledG, OUTPUT);
pinMode(ledB, OUTPUT);

for (byte i = 0; i < 6; i++) {
pinMode(switches[I], INPUT_PULLUP);[/I]
[I] }[/I]
[I]}[/I]

[I]// ================== FONCTIONS LED ==================[/I]
[I]void clearLED() {[/I]
[I] analogWrite(ledR, 0);[/I]
[I] analogWrite(ledG, 0);[/I]
[I] analogWrite(ledB, 0);[/I]
[I]}[/I]

[I]void setLED(bool r, bool g, bool b) {[/I]
[I] digitalWrite(ledR, r);[/I]
[I] digitalWrite(ledG, g);[/I]
[I] digitalWrite(ledB, b);[/I]
[I]}[/I]

[I]// ================== ANIMATION NON BLOQUANTE ==================[/I]
[I]void animationAttenteMillis() {[/I]
[I] unsigned long currentMillis = millis();[/I]

[I] if (currentMillis - previousMillis >= interval) {[/I]
[I] previousMillis = currentMillis;[/I]

[I] // Variation luminosité[/I]
[I] if (fadeUp) {[/I]
[I] brightness++;[/I]
[I] if (brightness >= 255) fadeUp = false;[/I]
[I] } else {[/I]
[I] brightness--;[/I]
[I] if (brightness <= 0) {[/I]
[I] fadeUp = true;[/I]
[I] animationStep = (animationStep + 1) % 3; // couleur suivante[/I]
[I] }[/I]
[I] }[/I]

[I] clearLED();[/I]

[I] if (animationStep == 0) analogWrite(ledR, brightness);[/I]
[I] if (animationStep == 1) analogWrite(ledB, brightness);[/I]
[I] if (animationStep == 2) analogWrite(ledG, brightness);[/I]
[I] }[/I]
[I]}[/I]

[I]// ================== LOOP ==================[/I]
[I]void loop() {[/I]

[I] // ---- Attente début jeu (S20) ----[/I]
[I] if (digitalRead(switches[5]) == HIGH) {[/I]
[I] animationAttenteMillis();[/I]
[I] return;[/I]
[I] }[/I]

[I] // ---- Lecture binaire S1 à S16 ----[/I]
[I] byte code = 0;[/I]
[I] for (byte i = 0; i < 5; i++) {[/I]
[I] code |= (digitalRead(switches[I]) == LOW) << (4 - i);[/I][/I]
[I][I] }[/I][/I]

[I][I] clearLED();[/I][/I]

[I][I] // ---- Sélection couleur ----[/I][/I]
[I][I] switch (code) {[/I][/I]

[I][I] case 0b11010: // ce code binaire lit directement les S1, S2, S4, S8, S16 et S20 , tu peux ainsi rajouter d'autres combinais[/I][/I]
[I][I] setLED(HIGH, LOW, LOW); // Rouge[/I][/I]
[I][I] break;[/I][/I]

[I][I] case 0b01010:[/I][/I]
[I][I] setLED(LOW, HIGH, HIGH); // Cyan[/I][/I]
[I][I] break;[/I][/I]

[I][I] case 0b00110:[/I][/I]
[I][I] setLED(LOW, HIGH, LOW); // Vert[/I][/I]
[I][I] break;[/I][/I]

[I][I] case 0b10110: // combinais on utilisable [/I][/I]

[I][I] break;[/I][/I]
[I][I] [/I][/I]
[I][I] case 0b11110:[/I][/I]
[I][I] setLED(HIGH, HIGH, HIGH); // Blanc[/I][/I]
[I][I] break;[/I][/I]

[I][I] default:[/I][/I]
[I][I] clearLED();[/I][/I]
[I][I] break;[/I][/I]
[I][I] }[/I][/I]
}
 
Dernière édition par un modérateur:
Bonjour Spectrer,

Merci pour ton programme, je vais essayer de le comprendre, les derniers programmes que j'ai écris étaient sur PB15 et plus tard PB100.
L Arduino pour les nuls est sympa si tu veux juste faire clignoter une led.
Pour ce qui est du high avant le low, c'est pour éteindre les leds avant la nouvelle séquence.
Comme le programme a été retouché plusieurs fois, il y a peut-être des oublis.
Bon courage pour ton Black Hole.
Je vais peut-être changer la couleur rouge par du jaune lors de la séquence à 2 Billes.

Bye
 
Pour ce qui est du high avant le low, c'est pour éteindre les leds avant la nouvelle séquence.

ok pour cela, dans le cas du code que je t'ai fait c est cette fonction clearLED(); qui le fait:

en mettant cette commande clearLED(); dans ton code tu appelles la fonction si dessous, ainsi tu tu as fonction que tu peux appeler plein de fois sans avoir à la ré ecrire.


Pour résumer ne fait pas 10 fois la même chose, fait là 1 fois et appelle là 10 fois, tu auras ainsi moins de ligne et cela augmentera ta comprehension de ton prope code



[I]void clearLED() {[/I]
[I]analogWrite(ledR, 0);[/I]
[I]analogWrite(ledG, 0);[/I]
[I]analogWrite(ledB, 0);[/I]
[I]}[/I]


Pour le Black hole, je n ai pas d'urgence je suis sur un projet pour le CREATURE FROM BLACK LAGOON
 
Dernière édition par un modérateur:
Quand vous voulez mettre du code sur le site il y a un bouton pour :)

Je vais vous modifier le texte en zone code, car on peut alors copier coller proprement, cela enlève tout type de formatage etc...
 
Utilisez le bouton là

1770471975284.png

Code En ligne
 
Retour
Haut Bas