Récup infos switchs sur flipper pour plein de projet

Bonjour tous le monde

Je suis sur un projet qui permet de récupérer l’information des remontées des switchs d’un flipper.

le projet se fait sur un data east « pi: marque de flipper » puis quand cela sera au point sur un « Bally »
les retours de switchs pourront permettre de lancer des séquences vidéo selon le switch activé, lancer des lumières biens spécifiques … enfin plein de choses mais ca sa sera la deuxième étape.

Présentation du matériel utilisé:
je pars sur le principe que j’ai 64 switchs qui remontent sur la CPU, d’un coté j’ai les 8 lignes drive sur le connecteur CN8 et les 8 lignes returns sur le connecteur CN10 de la CPU.

Pour être sur de bien protéger mon flip et ma RPI j’utilise 2 optocoupleurs avec 8 entrées, l’information est traitées ensuite par 2 PCF8674 et enfin sur une RPI 4 via le GPIO.

Voici un lien de la bête car je peux mettre qu’un média étant nouveau utilisateur (pour l’instant c’est un test et si cela fonctionne je ferai une PCB digne de ce nom)

Pour faire simple cela fonctionne quasiment comme un clavier, mais pas complètement:
Pour plusieurs switchs, il faut comprendre que la CPU ne valide qu’un Drive/Strobe à la fois et regarde l’état des 8 Return (qui n’ont donc qu’un seul créneau correspondant au SW activé) mais il peut y avoir 8 return avec cette même trame.
Par exemple si on as tous les SW de la colonne 1 actifs lors du créneau SW Strobe 2 tu liras les 8 Return à Zero (donc ton 8574 verra #00 hexa) et si aucun SW actif ce sera #FF)

Dans mon programme il déclenche INT sur les Strobes de CN8, vérifie quel est le strobe en cours (normalement 1 seul) ex. si sur le 8574 on lit #FE c’est Strobe2, #BF c’est strobe8, puis lire le 8574 CN10 et faire l’association ligne / colonne pour savoir quel SW est actif.

voici un plan détaillé fait par MR lioevry de flipjuke que je tiens à remercier pour son aide très précieuse (c’est lui qui a compris la logique de fonctionnement explication ci-dessus)

detailSW_8574.jpg
voila pour la théorie si une personne a compris ce sera déja une bonne chose :slight_smile:

Voici le programme que j’essaye de faire fonctionner, mais j’ai des soucis de synchro et parfois de faux retour donc je me dis que peut être une personne pourra m’aider pour fiabiliser ce morceau de programme qui est la base pour finaliser mon projet.
Pour votre info je suis très novice dans la programmation et pour cela je remercie l’IA

import tkinter as tk
from smbus2 import SMBus
import RPi.GPIO as GPIO
import logging

# Configurations
I2C_BUS = 1
PCF8574_CN8 = 0x25  # Adresse I2C pour CN8 (Strobe)
PCF8574_CN10 = 0x23  # Adresse I2C pour CN10 (Return)
INT_CN8 = 16  # GPIO pour INT CN8
INT_CN10 = 26  # GPIO pour INT CN10

# Initialisation du journal
logging.basicConfig(filename='/home/ludo/switch_log.txt', level=logging.DEBUG, 
                    format='%(asctime)s - %(message)s')

# Initialisation GPIO et I2C
GPIO.setmode(GPIO.BCM)
GPIO.setup(INT_CN8, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(INT_CN10, GPIO.IN, pull_up_down=GPIO.PUD_UP)
bus = SMBus(I2C_BUS)

# Lecture des modules PCF8574
def read_pcf8574(address):
    try:
        data = bus.read_byte(address)
        # Journalisation en binaire
        logging.info(f"Lecture de {hex(address)}: {bin(data)}")  # Log en binaire
        return data
    except Exception as e:
        logging.error(f"Erreur de lecture sur l'adresse {hex(address)}: {e}")
        return 0xFF

# Classe pour l'interface graphique
class SwitchGridApp:
    def __init__(self, root):
        self.root = root
        self.root.title("Grille des Switchs Activés")

        self.buttons = []
        self.create_grid()

    def create_grid(self):
        """Crée une grille de 64 boutons."""
        for i in range(8):
            row_buttons = []
            for j in range(8):
                btn = tk.Button(
                    self.root, 
                    text=f"SW{i+1}{j+1}", 
                    width=8, 
                    height=3,
                    bg="lightgray"
                )
                btn.grid(row=i, column=j, padx=5, pady=5)
                row_buttons.append(btn)
            self.buttons.append(row_buttons)

    def update_switches(self, switches):
        """Met à jour l'état des boutons selon les switches activés."""
        for i in range(8):
            for j in range(8):
                button = self.buttons[i][j]
                if f"SW{i+1}{j+1}" in switches:
                    button.config(bg="green")  # Actif
                else:
                    button.config(bg="lightgray")  # Inactif

# Gestion des interruptions
def handle_interrupt(channel):
    logging.info(f"Interruption reçue sur le canal {channel}")
    strobe_data = read_pcf8574(PCF8574_CN8)
    return_data = read_pcf8574(PCF8574_CN10)
    update_switches(strobe_data, return_data)

# Mise à jour des switchs actifs
def update_switches(strobe_data, return_data):
    switches_active = []
    for i in range(8):
        strobe_bit = (strobe_data >> i) & 1
        if strobe_bit == 0:  # Strobe actif
            for j in range(8):
                return_bit = (return_data >> j) & 1
                if return_bit == 0:  # Switch activé
                    switch_id = f"SW{i+1}{j+1}"
                    switches_active.append(switch_id)
                    logging.info(f"{switch_id} activé (Strobe: {bin(strobe_data)}, Return: {bin(return_data)})")
    app.update_switches(switches_active)

# Création de l'application principale
if __name__ == "__main__":
    root = tk.Tk()
    app = SwitchGridApp(root)

    # Configuration des interruptions
    GPIO.add_event_detect(INT_CN8, GPIO.FALLING, callback=handle_interrupt, bouncetime=100)
    GPIO.add_event_detect(INT_CN10, GPIO.FALLING, callback=handle_interrupt, bouncetime=100)

    # Lancement de l'application
    try:
        root.mainloop()
    finally:
        GPIO.cleanup()
        bus.close()

voici un morceau de log:
025-01-19 19:23:15,051 - Interruption reçue sur le canal 16
2025-01-19 19:23:15,051 - Lecture de 0x25: 0b11110111
2025-01-19 19:23:15,052 - Lecture de 0x23: 0b11101100
2025-01-19 19:23:15,052 - SW41 activé (Strobe: 0b11110111, Return: 0b11101100)
2025-01-19 19:23:15,052 - SW42 activé (Strobe: 0b11110111, Return: 0b11101100)
2025-01-19 19:23:15,052 - SW45 activé (Strobe: 0b11110111, Return: 0b11101100)
2025-01-19 19:23:15,097 - Interruption reçue sur le canal 26
2025-01-19 19:23:15,098 - Lecture de 0x25: 0b11111101
2025-01-19 19:23:15,098 - Lecture de 0x23: 0b11111111
2025-01-19 19:23:15,158 - Interruption reçue sur le canal 16
2025-01-19 19:23:15,159 - Lecture de 0x25: 0b11111110
2025-01-19 19:23:15,159 - Lecture de 0x23: 0b11111111
2025-01-19 19:23:15,200 - Interruption reçue sur le canal 26
2025-01-19 19:23:15,201 - Lecture de 0x25: 0b11011111
2025-01-19 19:23:15,202 - Lecture de 0x23: 0b11111111
2025-01-19 19:23:15,260 - Interruption reçue sur le canal 16
2025-01-19 19:23:15,261 - Lecture de 0x25: 0b11110111
2025-01-19 19:23:15,261 - Lecture de 0x23: 0b11101100
2025-01-19 19:23:15,262 - SW41 activé (Strobe: 0b11110111, Return: 0b11101100)
2025-01-19 19:23:15,262 - SW42 activé (Strobe: 0b11110111, Return: 0b11101100)
2025-01-19 19:23:15,262 - SW45 activé (Strobe: 0b11110111, Return: 0b11101100)
2025-01-19 19:23:15,305 - Interruption reçue sur le canal 26
2025-01-19 19:23:15,306 - Lecture de 0x25: 0b11111011
2025-01-19 19:23:15,307 - Lecture de 0x23: 0b11111111
2025-01-19 19:23:15,366 - Interruption reçue sur le canal 16
2025-01-19 19:23:15,367 - Lecture de 0x25: 0b11111101
2025-01-19 19:23:15,367 - Lecture de 0x23: 0b11111111
2025-01-19 19:23:15,408 - Interruption reçue sur le canal 26
2025-01-19 19:23:15,410 - Lecture de 0x25: 0b11110111
2025-01-19 19:23:15,411 - Lecture de 0x23: 0b11101100
2025-01-19 19:23:15,411 - SW41 activé (Strobe: 0b11110111, Return: 0b11101100)
2025-01-19 19:23:15,412 - SW42 activé (Strobe: 0b11110111, Return: 0b11101100)
2025-01-19 19:23:15,412 - SW45 activé (Strobe: 0b11110111, Return: 0b11101100)
2025-01-19 19:23:15,469 - Interruption reçue sur le canal 16
2025-01-19 19:23:15,470 - Lecture de 0x25: 0b11111011
2025-01-19 19:23:15,471 - Lecture de 0x23: 0b11111111
2025-01-19 19:23:15,512 - Interruption reçue sur le canal 26

voila pour un premier aperçu dite moi de quoi vous avez besoin pour m’aider

cordialement et merci pour aide CARI