Création FLIPPER "mécanique"

Bonjour

je souhaite de l’aide pour la fabrication d’un flipper mécanique

Pour la partie fabrication, je n’ai aucun problème
c’est la partie informatique programmation car je ne maitrise pas du tout

Je voudrai contrôler le flipper avec un raspberry 4

Il y aura un écran 20 à 24" qui affichera les 4 joueurs avec leurs scores respectifs et pourquoi pas une animation

un 1er bouton qui appuie prolonger 3 sec = remise à zero des scores et nombre de joueurs
et simple appuie monte le nombre de joueur de 1 à 4

lors du jeu
chaque bumper et autres cibles seront montés avec un interrupteur à levier
quand la bille tapera les élastiques et cibles cela fera une pression sur le levier
et le raspberry détectera chaque impulsion pour compter les points et jouera un son

Comme un vrai flipper chaque joueur joue une bille chacun son tour jusqu’à 3 parties
bien entendu le raspberry devra detecter également le bille qui sort du jeu pour passer au joueur suivant voir la fin de partie si les 3 billes par joueur ont été jouées

puis les scores affichés, pourquoi ne pas faire une liste des meilleurs scores avec rajout du nom (15 meilleurs scores devrait suffire)

Le programme se lancera tout seul au démarrage en plein ecran avec une animation

Voila mon projet mais pour la partie informatique la je bute vraiment. je me suis arrêté au langage turbo pascal et au basic…

une fois le projet lancé, je mettrai en ligne son avancé et les plans à disposition de tous

Merci à tous

Yo,

Comme ça, à l’arrach’ entre le footing de 10 km et la préparation du repas, je vois un code python qui envoie des actions lors de la pression sur des boutons poussoirs.

Mais :

  • Sauf pour la partie « détecter également le bille qui sort du jeu »
  • Combien de bouton va-t-il falloir car le nombre de GPIO n’est pas illimité :slight_smile:

++

Merci pour la réponse

pour la bille qui sort du jeu j’ai pensé
soit à un détecteur de présence infrarouge
soit un cercle de métal et au centre une autre partie métallique (la bille faisant contact entre les deux comme un interrupteur)

pour le nombre de GPIO
je pense que 5 devraient suffire, un qui compte 1 points 5,10, 15 et 20 points
rien n’empêche de connecter plusieurs leviers interrupteurs sur la borne GPIO 5 points par exemple

un GPIO pour un reset, et la definition du nombre de joueur de 1 à 4
il y aura surement un, pour envoyer la bille de la sortie vers le rail de lancement (declenchement d’une bobine avec une tige qui pousse la bille vers le rail) lorsque on définie le nombre de joueurs (la partie commence) ou quand elle sort et que les 3 tours ne sont pas joués

hello,

Super projet ! comme je n’imagine même pas comment on fabrique un bumper ni les élastiques ni même les targets je n’ai que deux remarques:

. oublie pas le tilt :wink:
. comme le souligne Nabla tu vas avoir besoin d’un paquets de GPIO en entrée.

pour le tilt un composant doit faire le job ( SW-520D ) sur cette page https://osoyoo.com/2017/06/19/raspberry-tilt-switch/ tu trouveras des explications et les programmes ( C++ et python )
à noter que ce composant SW520D qui est en fait un interrupteur se trouve sous la forme d’un simple composant. ( pas d’une carte )

pour les GPIO il existe des composants ( Shift Registers ) qui permette d’augmenter le nombre d’entrée
dont le 74HC165 une explication la : http://robsraspberrypi.blogspot.com/2016/01/raspberry-pi-adding-more-inputs-using.html
a noter qu’il existe aussi un moyen d’augmenter les sorties ( 74HC595 )
cette vidéo explique en détail leurs fonctionnements ( avec arduino mais ça doit s"adapter « facilement » au Rpi - utilise le SPI ) https://www.youtube.com/watch?v=Ys2fu4NINrA

1 J'aime

je n’avais pas pensé au tilt
donc un gpio pour le tilt…

pas besoin d’avoir trop de GPIO

je peux tres bien brancher 5 interrupteurs à lamelle sur le même GPIO en parallèle pour un comptage de point identique

5 GPIO « points » en entrée suffisent un GPIO comptera 1 points puis un autre 5 points, 10, 15 et 20

j’avais pensé des interrupteurs type joystick mais des interrupteurs à lamelle seront plus efficaces derrières les élastiques

Une solution plus simple, quoique un peu plus lente que le duo 74hc165 et 595 (sur SPI) est le MCP23017 (bidirectionnel, comme les ports du RPi; ladyADA a fait une bibliothèquepour le RPi qui m’a satisfait, et des tutoriaux simples https://learn.adafruit.com/using-mcp23008-mcp23017-with-circuitpython/overview)
Il est plus lent, mais mange moins de ports du RPi (I2C: 2fils vs SPI 3/4 fils) et se gére pratiquement comme une patte de RPi. On peut rajouter jusqu’à 8 MCP23017 (adresse configurable), gerant jusqu’a 8*16 128 fils…

au final ce n’est pas la partie mecanique qui me bloque c’est la partie informatique et programation python

je voudrai un raspberry en mode kiosk
qui lance une video animation au demarrage puis player 1 2 3 et 4 apparait

puis on choisi le nombre de joueurs en appuyant sur un bouton en mettant en surbrillance les joueurs
et enfin 5 GPIO relié à des interrupteurs lamelles qui comptent des points à chaque touché chaque GPIO comptent différemment les point un pour 1 points un autres 5 puis 10 15 et 20

une animation pour chaque tour de joueur style « PLAYER ONE » etc…
c’est le programme en python qui me pose problème je ne sais pas programmer

as tu fais un organigramme ?
dans le principe ça ressemblerait (vaguement) a un truc comme ça :

le but du jeu étant de détailler au plus possible les traitements (saisie des entrée, calcul des points, les tests ( ponctuels ou indiquant une boucle ))
une fois le programme ainsi organisé, la programmation devrait être plus simple ( enfin en théorie au moins :wink: )

Yo,

Cela va te prendre du temps.
Dans l’idée, je pense qu’il faut une boucle While et des définitions d’action

En gros, le programme se lance et balance une vidéo puis attend

  • Si bouton 1 pressé = action 1
  • Si bouton 2 pressé = action 2
  • Si bouton 3 pressé = action 3 puis attente
    • Si bouton 4 pressé = action 4 (possible que si action 3 lancé)
    • Si bouton 5 pressé = action 5 (possible que si action 3 lancé)
  • Si bouton 6 pressé = action 6

Maintenant, va falloir lire et coder de petits trucs pour apprendre :slight_smile:

Perso, j’ai « appris » sur le tas = bcp de temps d’investi ; un réel apprentissage par cours et/ou lecture est nettement préférable.
Malgré mon âge frôlant le 1/2 siècle, je suis resté un jeune con tout feu tout flamme (hyper-actif ??? :crazy_face:), mais le conseil est VRAIMENT de lire des ouvrages de référence.

++

pour rebondir sur le post de Nabla il y a aussi outre l’apprentissage nécessaire du langage, la copie des ressource qu’offre le net; l’idée étant que plutôt que de réinventer l’eau chaude, on gagne a réutiliser les exemples qui pullule sur le web …
par exemple l’affichage d une video en python avec tkinter :

from tkinter import *
import imageio
from PIL import Image, ImageTk
def stream():
    try:
        image = video.get_next_data()
        frame_image = Image.fromarray(image)
        frame_image=ImageTk.PhotoImage(frame_image)
        l1.config(image=frame_image)
        l1.image = frame_image
        l1.after(delay, lambda: stream())
    except:
        video.close()
        return   
########### Main Program ############

root = Tk()
root.title('Video in a Frame')
f1=Frame()
l1 = Label(f1)
l1.pack()
f1.pack()
video_name = "video.mp4"   #Image-path
video = imageio.get_reader(video_name)
delay = int(1000 / video.get_meta_data()['fps'])
stream()
root.mainloop()

ou cette explication de la gestion des GPIO:


source du programme : https://www.codespeedy.com/video-streaming-in-tkinter-with-python/

merci

je vais procéder pas à pas
l’organigramme est pas mal
je vais l’exploiter et l’améliorer puis je vais essayer de programmer chaque partie et vous l’exposer
pour la video j’avais trouvé un code cet AM

import pyglet
window = pyglet.window.Window(1920,1080) # dimension de la fenetre
player = pyglet.media.Player() # création d’un player
MediaLoad = pyglet.media.load(« test.mp4 ») # chargement de la video
player.queue(MediaLoad) # insertion de la video la dans le player
player.play() # jouer le media
@window.event
def on_draw(): # affichage
window.clear()
player.get_texture().blit(0,0)
pyglet.app.run()