5.1 KiB
Boîte COF de l'AGB
Maurice, Sel, catvayor. Octobre 2024
Pour l'AG budget d'octobre 2024, HackENS a produit un contrôleur de projecteur pour le site de l'AGB à mettre entre les mains (responsables, voyons) du COF.
Le COF avait donc accès à la configuration d'un projecteur (motorisation, luminosité, couleur) et à un effet "color bump".
Réalisation
L'idée de départ est la suivante : un panneau de contrôle sans fil pour le COF, relié via l'API de Maurice aux projecteurs de l'AGB. Maurice a fourni une batterie (108 Wh !!) et via BiBi HackENS a récupéré des Raspberry Pi Zero, qui sont idéales pour ce genre de projet.
On a identifié 3 domaines lors du développement (on était 3, quel hasard) :
-
la mécanique/électronique : une boîte qui tient, avec joystick et boutons;
-
le software sur le contrôleur : comment programmer la Raspi et comment on communique avec l'API de l'AGB;
-
les hooks dans l'API de l'AGB, notamment rajouter le contrôle du projecteur dans les services offerts, ainsi que le système d'autorisation.
La distinction n'était pas toujours très claire toutefois : est-ce que la soudure, la détermination des pinout relève du point 1 ou 2 ? Est-ce que la trigo pour contrôler le projecteur de manière intuitive relève du contrôleur local ou de l'API ? On a travaillé principalement sur ces 3 points séparément mais on s'est entraidé donc les frontières floues entre ces points n'ont pas posé de problèmes.
Mécanique (Sel)
L'aspect le plus important de la boîte est son haut, avec le panneau de contrôle. Avec des pièces d'arcade qui traînaient, on était sûrs au début de mettre un joystick et deux boutons. Aussi, un potentiomètre semblait une option tentante. Mais installer un potentiomètre peut introduire de la complexité : a priori la Raspi Pico ne peut pas lire la résistance du potentiomètre directement car elle n'a que des entrées numériques...
La boîte fait environ 20cm x 20cm x 11cm, les dimensions étant choisies surtout pour contenir la (grosse) batterie de Maurice tout en ayant assez de hauteur pour installer les contrôles.
Initialement j'ai voulu réaliser une boîte beaucoup trop ambitieuse à la CNC, où les "murs" sont biseautés à 45° chacun avant d'être collés. Un étrange bug de soft limit sur la CNC a empêché l'usinage des pièces. Avec un peu trop d'enthousiasme, j'ai alors essayé d'usiner cela à la défonceuse. C'était une très mauvaise idée, comme en témoignent 4 pauvres chutes de bois encore à hackENS.
J'ai donc dû tout reprendre de 0 le dimanche pour le mardi, avec un design plus simple : 4 murs rectangulaires, avec deux paires égales car découpées ensemble. Les murs sont collés ensemble, et une planche de contreplaqué usinée à la CNC (bouton par bouton, pour éviter partiellement le bug) tient les contrôles : les 2 boutons, le joystick, un commutateur ON/OFF et un encodeur.
En effet, après avoir trouvé un encodeur numérique, qui donne par l'état de 8 interrupteurs l'angle de son axe, on a décidé de l'ajouter à la place du potentiomètre.
Le fond de la boîte a un rebord pour s'aligner sans jeu en dessous des murs, mais la boîte est fermée par 2 équerres dans tous les cas. Des pieds en caoutchouc s'assurent que la boîte ne glisse pas, même maltraitée, et permet aux équerres de ne pas racler le sol.
Software embarqué (catvayor)
Pour le software embarqué, la raspberry était sous nixos, avec une unité systemd pour interfacer les commandes avec l'API de l'AGB. La config nixos complète est ici, elle n'a rien de particulièrement mystèrieux, mise à part l'import du module pour faire une image prête à booter pour la carte sd. La connection internet se fesait par wifi en l'absence d'autre possibilité, qui pendant l'agb aura été fournit par mon partage de connection, car la solution prévue qui passait par une autre raspberry Pi n'a pas fonctionné. Pour pouvoir débugguer en live, on l'avait mis sur le VPN d'Hackens, ce qui n'aura pas été utile pour débugguer, mais pour autre chose.
L'interface entre les commandes et le serveur de l'agb se fait en C++, avec libgpiod pour lire les entrées des commandes, et un socket C pour envoyer les commandes correspondantes. Initialement, on voulais utiliser les endpoints HTTPS, mais on a remarquer une lenteur considérable de curl sur la raspberry pi, ammenant le temps de réponse à 700ms (on a pas pris le temps d'identifier la source du problème). L'authentifaction par token était alors pas possible, et on a choisi de modifier de serveur pour recevoir un flux de json par un simple socket, ouvert que sur le VPN.
Petit point à noter: certains des pins de la raspberry pi ont des usages particulier, ce qui peut poser problème si on les utilises, nottament, la raspberry ne bootait que si le décodeur était dans la bonne position, sinon les pins d'I2C est mis à gnd, ce qui gène manifestement le boot.