Batak

PythonC

Ce projet était un projet étudiant en groupe fait lors de ma deuxième année d’école d’ingénieur. Le but était de créer un jeu de reflexes et de rapidité en utilisant des boutons lumineux et un microcontrôleur. Le jeu consiste à appuyer sur les boutons lumineux le plus rapidement possible lorsqu’ils s’allument, et le joueur doit appuyer sur le plus de boutons possible dans un temps limité. Un site web a été créé pour afficher les scores des joueurs et les statistiques des parties.

Le jeu peut être lancé directement depuis le Batak en appuyant sur le bouton central. Dans ce cas, une partie « invité » est lancée avec une durée de 60 secondes.

Le site web permet également à un utilisateur de se connecter et de lancer une partie en choisissant parmi plusieurs durées prédéfinies. Les résultats des parties sont ensuite associés à l’utilisateur lorsqu’il est connecté.

Batak

Réalisation

Durant le projet, mon groupe et moi avons réalisé :

  • Le panneau en bois avec les boutons lumineux
  • La programmation d’une carte Arduino pour gérer les boutons, les lumières et un affichage sur un afficheur 7-segments
  • La création d’un site web pour afficher les scores des joueurs hébergé sur une Raspberry Pi connectée à la carte Arduino via USB

Personnellement, j’ai :

  • Programmé la carte Arduino pour gérer les boutons et l’affichage des scores sur l’afficheur 7-segments
  • Travaillé sur le backend du site web, codé en Python avec le framework Flask
  • Fait communiquer la carte Arduino avec la Raspberry Pi via USB pour envoyer les scores des joueurs au site web

Le système est composé de trois parties : une carte Arduino qui gère le jeu et les périphériques, une Raspberry Pi qui collecte les données et héberge le backend, et un site web permettant de visualiser les résultats.

Schéma du système

Arduino

L’Arduino est responsable de la logique du jeu ainsi que de la gestion des périphériques. Il gère les boutons lumineux et l’affichage des scores sur l’écran 7-segments. Durant la partie, l’Arduino allume un bouton lumineux aléatoire et attend que le joueur appuie sur le bouton correspondant. Si le joueur appuie sur le bon bouton, le score est incrémenté et un nouveau bouton est allumé. En plus de cela, l’Arduino envoie à la Raspberry Pi l’identifiant du bouton qui vient d’être allumé afin de le transmettre au site web et d’afficher l’état de la partie en cours ainsi que les temps de réaction du joueur. À la fin de la partie, l’Arduino envoie le score final à la Raspberry Pi pour qu’il soit enregistré dans la base de données et affiché sur le site web.

Communication

La communication entre l’Arduino et la Raspberry Pi se fait via USB en série. La Raspberry Pi utilise pyserial sur un deuxième thread pour écouter les messages envoyés par l’Arduino. L’Arduino lie l’entrée série dans la fonction loop() à l’aide des fonctions de l’API série fournies par Arduino.

Un protocole simple, mais efficace a été mis en place pour échanger les informations entre l’Arduino et la Raspberry Pi. Chaque message commence par un byte qui représente le type de message, suivi des données associées. Par exemple, le message pour commencer une partie est représenté par le byte 0x01, suivi de la durée de la partie en secondes (configurable sur le site web).

Durant le développement, nous avons rencontré un problème où si aucune donnée n’était envoyée pendant un certain temps, la communication série se bloquait. Pour résoudre ce problème, j’ai mis en place un message “keep alive” qui est envoyé toutes les 10 secondes pour maintenir la communication active.

Raspberry Pi

La Raspberry Pi héberge le serveur Flask qui centralise les données provenant de l’Arduino. J’ai développé la partie backend ainsi que le stockage des statistiques dans une base de donnée SQLite.

Le backend reçoit les données de l’Arduino, met à jour l’état de la partie en cours et enregistre les statistiques des parties terminées dans la base de donnée. Les données de la partie en cours sont transmises au site web via WebSocket afin que l’affichage puisse être mis à jour en temps réel.

Pour ce projet scolaire, les comptes utilisateurs étaient volontairement simplifiés : les identifiants étaient stockés directement dans SQLite, avec une consigne explicite de ne pas utiliser de mot de passe sensible. Cette authentification n’avait pas vocation à assurer la sécurité de véritables comptes utilisateurs.

Interface web

Le site web, développé en React par un autre membre du groupe, permet de visualiser les données de la partie et les statistiques enregistrées. Il communique avec le backend Flask via WebSocket afin d’afficher les mises à jour en temps réel, et par des routes HTTP pour récupérer des classements et des statistiques.