Archives pour la catégorie Restauration d’un flipper Bally Pacman

Alors, comment on fait pour redonner vie à une épave de flipper ?

Interruptions et sound system

Yesss !! J’ai mis en place mon lecteur de carte SD et ma sortie audio (non-filtrée pour le moment). Je suis assez content car cette partie a été entièrement faite à partir de composants de récupération (sur carte son et autres PCBs qui traînent … au cas ou … dans mon antre).

Premiers tests sur la lecture du contenu des fichiers sur la carte SD : ça fonctionne nickel et du premier coup ! C’te classe !

Second tests : lecture d’un son stocké sur la carte SD : ça fonctionne nickel aussi (bon, le son n’est pas filtré du tout et on peut entendre les « battements » de l’arduino… 😀 ).

Intégration de l’ensemble au code d’origine et là, PAF ! Tout fonctionne mais le son est très … llllllllleeeeeeeennnnnnnnntttttttt ! :( Diantre, mais d’ou vient le problème ???

La faute à la gestion des lampes : je génère une interruption logiciel en utilisant le timer 2 (Nota : utiliser le kit 1.5 pour pouvoir utiliser les ISR en overflow du timer 2 !!!) . Cette interruption prend pas mal de temps(gère les switchs et les 96 lampes) et est exécutée assez souvent pour ne pas subir le clignotement des lampes (25 fois par seconde minimum). Les sons sont aussi générés via interruption (à 32 ou 64 KHz), du coup je n’ai plus assez de bus pour géré les 2 systèmes en même temp … il me faudrait un player 4 ou 8KHz (vu les sons de l’époque) pour que ça tienne je pense ….

Je pense donc ajouter un second arduino (par forcément un Mega du coup), connecté au premier, uniquement pour gérer les sons… :)

Une petite photo de la chose (ajout du lecteur SD et de la sortie audio) :

SD card et audio

 

 

Derniers switchs câblés

Voilà, j’ai terminé le câblage de l’ensemble des switchs (il me manquait la détection des monnayeurs, des différents Tilt et du bouton Crédit) :

Face Avant C’est beau ..hein !!?

Face Arrière  Bon, vu de derrière, c’est moins sympa…

Donc voilà, tous les switchs, les lampes et les solénoïdes sont câblés et gérés !! \o/

La suite :

–  le son (j’ai déjà soudé un connecteur sur un adaptateur SD/microSD en prévision …).

– les 6 afficheurs 7 segments…bon, c’est du 170-190V, va falloir faire attention !!

Bah voilà !!!

Hop ! J’ai collé la gestion des lampes (pas mal optimisée… ) ainsi que la détection des switchs dans une interruption contrôlée (j’ai trop de bouncing, il faut que je corrige ça) par le timer1 de l’Arduino. ça fonctionne mais je ne suis pas certain d’avoir tout compris, je vais faire un autre timer histoire d’être certain d’avoir capté la chose…

En tout cas, si je ne me trompe pas, mon interruption doit être exécutée toutes les 40 millisecondes, parfait pour la persistance des lampes !

Cette partie fonctionne indépendamment, j’ai donc remis le minimum syndical en terme de gameplay …(affichage de certaines cibles, remontée des cibles, remise en jeu, …)

Par contre, quel …, j’ai oublié de câbler les switchs de la « boite » : bouton crédit, les pièces, les tilts, …

Le Pacman a la particularité de disposer d’une grille de 5×5 lampes (par 2, en jaune et rouge) en plein milieu, je me suis dit qu’il serait intéressant d’y afficher des lettres…

J’ai récupéré une police minimaliste en 5×5 que j’ai retranscris en C. J’ai, par la même occasion, utilisé le module pgmspace qui me permet de stocker ce tableau en ROM plutôt qu’en RAM (8Ko sur le Mega2560). c’est assez génial à utiliser (et puis après avoir codé sur Jaguar, ça se comprend très facilement  😀 ).

Ma routine ne fonctionne que dans le jaune mais ça pourrait être intéressant d’en faire une capable de contrôler en même temps la matrice jaune et la matrice rouge, ça nous fait du 4 couleurs : noir, rouge, jaune et orange … tiens un mode graphique 2 bit en 5×5 !

Bon, mon câblage n’est pas optimal, du coup j’ai la police mais inversée…j’ai plus qu’à faire un reverse-nibble pour corriger ça (ou alors inverser 4 fils…et revoir un peu le code…) :

K...inversé !

J’ai aussi repéré des faux contacts au niveaux de connecteurs de la carte A5 (la carte d’entrée du circuit des lampes) qu’il va falloir démonter et refaire…

ça commence à être pas mal du tout !!! \o/

Du mieux sur les lampes

Bon, allumer toutes les lampes d’un coup, c’est bien…pouvoir choisir lesquelles allumer, c’est mieux…

Hier soir, j’ai réussi à mettre en place une routine permettant d’allumer les lampes en fonction de leur état dans un tableau… pas très propre, gourmand en mémoire (c’est un Arduino, pas un pc…) et par certains côtés, pas logique…

Azizzzz … LIGHTS !!!

Pour ceux qui n’aurait pas reconnu, c’est une célèbre réplique du 5ème élément !!

Après une longue série de tests, je me suis rendu compte que si je continuais de travailler sur les lampes en mode bit à bit , ça n’allait pas le faire…

Sur A5 (Lamp Driver) : 16 lampes x 4 contrôleurs = 64 commandes

Sur A9 (Auxiliary Lamp Driver) : 8 lampes  x 4 contrôleurs =32 commandes

Par commande : 12 changements d’état (4 pour le choix du contrôleur, 4 pour le choix de la lampe, et 4 pour générer 2 fronts montant pour activer la chose)

ça nous donne du 1152 modifications de bit … le tout 25 fois par secondes…. o_O

Va stocker ça correctement dans un tableau pour tout redécouper… Pfiouuu !

Et surtout, changer les entrées une à une, c’est pas génial et le résultat n’est vraiment pas terrible du tout (ça ne commute pas comme il faut). Du coup je me suis penché sur les « Register » de l’Arduino (si seulement je l’avais vu avant …).

Ces registres permettent de manipuler en 1 seule opération les 8 bits d’un registre (représentant un ensemble de 8 broches de l’Arduino )… Génial !!! SAUF QUE : Je n’ai pas câblé mes entrées/sorties en fonction de ces registres… (et puis la doc pèche un peu là-dessus, j’ai du fouiller dans les .h pour trouver des infos…)

De toutes façons, elle commençait à me gonfler cette nappe IDE … j’ai tout changé pour correspondre aux registres et j’en ai profité pour connecter l’Arduino directement sur le circuit :

Ah ouais, c'est beau !!

C’est bien plus simple à connecter et en plus toutes les I/O de l’Arduino sont accessibles sur le circuit !

Un code refait à zéro et j’ai pu… enfin … allumer toutes les lumières d’un coup (bon, j’en ai quelques une à changer) :

ça déchire !!

 

Par contre, plus rien de jouable pour le moment. snif. Je vais remettre la gestion des switchs et coller l’ensemble switchs/lampes dans une sympatique interruption (c’est le plan en tout cas…reste à trouver comment…)

 

Gestion câblée des lampes

Voilà, j’ai terminé l’ajout de le gestion des lampes sur mon circuit (pour la gestion des cartes contrôleur A5 et son extension A9) :

A3, A5, A9 et les switchs câblés!

J’ai commencé à écrire la routine de gestion des lampes. Grosse particularité : ça fonctionne exactement comme un tube cathodique, c’est à dire qu’il faut constamment « rafraîchir » l’état des lampes.

En gros : Je suis en 50Hz sur le secteur. Pour ne pas avoir trop de scintillement, je vais devoir tout rafraîchir 25 fois par secondes.  Chaque lampe doit être commandée séparément, ce qui me donne 120 commandes x 25 par seconde.

Il va être nécessaire de lancer cette routine à intervalle très régulier sinon ça risque de clignoter à tout bout de champs (rien qu’en attendant la fin de course d’un solénoïde…).

Bon, c’est pas un écran, il n’y a pas de VBL pour taper sur le 50Hz mais une petite interruption contrôlée par un timer devrait faire l’affaire… faut voir.

Edit du 27/09/2013 :

Hmm, ça ne fonctionne pas comme prévu. je vais me fabriquer un banc de tests pour valider  le fonctionnement de ces cartes une à une… J’ai une lampe qui reste allumée en permanence, que je l’active ou non…peut-être une puce de grillée…

Du mieux sur les switchs

Bon, petits tests rapides hier soir :

– « Saucer » gauche, une impulsion rapide du doigt :

a) avec condensateur : activé pendant 6s !!!! Autant dire qu’il ne se désactive jamais si la gestion de la solénoïde correspondante est activée…

b) sans condensateur :  activé pendant très peu de temps

J’ai donc, dans un premier temps, coupé les condensateurs de maintient du « saucer » gauche ainsi que des 2 bumpers et déjà, je note un nette amélioration au niveau des détections…

Prochaine étape : trouver un moyen de passer outre les problèmes de boucing …

Matrice, qu’est ce que c’est que cette zone ?

Hop, aujourd’hui soudure, je me suis décidé à en mettre un peu plus sur le circuit définitif . J’ai donc ajouté la gestion des switchs et fait en sorte de n’avoir qu’une seule nappe pour connecter l’arduino … 2h à implanter et souder la chose :

Solénoïdes et matrice de switchs

J’ai ensuite modifié mon code Arduino pour lire l’intégralité des switchs du flipper (40). Résultat bof, résultats étranges … pas glop quoi !

Merci L’Arduino, j’ai mis en place du debug pour pouvoir tester un à un les switchs :

des bugs ou debug ...

Tout fonctionne à peu près. Le « Saucer » de gauche prend bien son temps sur la colonne 2 pour retourner à l’état bas et les cibles 33 et 34 sont actives en permanence sur la colonne 4, c’est probablement pour ça que j’ai des résultats étranges.D’après ce que j’ai pu voir sur le net, certains vieux condensateurs ont tendance à se … court-circuiter… va falloir changer tout ça… ou les supprimer définitivement. Si on regarde de près le schéma de la matrice du pacman, on peut constater que seulement quelques condensateurs sont présents (alors qu’ils sont tous  en place sur mon flipper), je vais donc logiquement pouvoir en supprimer quelques uns :

Problème de matrice

 

Condensateurs ou pas… ces condensateurs sont là pour permettre au signal de rester au niveau haut un peu plus longtemps, le temps de laisser la MPU lire l’état. Ce phénomène était probablement valide sur une carte MPU équipée d’un Motorola 6800 à 1 ou 2MHz, pour lui laisser le temps de lire mais avec le µP à 16MHz de l’Arduino, ce n’est peut-être plus nécessaire… à tester.

Ah oui, petit détail, un fil, désoudé d’un côté et coupé de l’autre trainait sous le playfield…va falloir trouver son origine …

L'ordure !!!