Je ne ferai pas d'article décrivant le "projet" de borne d'arcade, cette dernière sera très classique et basée sur les nombreux exemples que l'on trouve sur le net. Je vais juste documenter certaines parties de la construction : aujourd'hui l'alimentation électrique :-)
 

Objectif


Je veux utiliser une alimentation standard ATX car cette pièce est très facile à récupérer et on aura ainsi du 3.3V, 5V et du 12V. Le RaspberryPI est un peu pauvre niveau gestion de l'alim, il est principalement prévu pour être alimenté via le port micro USB. D'après mes lectures, les cartes SD supportent mal l'arrêt brutal. J'imagine bien que couper l'alimentation alors que l'OS est en pleine écriture ne doit pas lui plaire.

Mon objectif est d'avoir un fonctionnement strictement identique à une carte mère ATX de PC. Je veux aussi pouvoir piloter l'alim des périphériques comme l'ampli et l'écran, histoire que le tout consomme le moins possible en veille. Enfin, je souhaite aussi faire le moins de modif irréversible aux différentes briques (alim, écran, ampli, RPi), je dois donc passer par une ou des cartes qui feront l'interface niveau connectique.
 

Safe-shutdown du RPi


Le sujet revient assez souvent dans les discussions sur le RPi ou Recalbox, il faut idéalement faire un shutdown du système avant de couper l'alimentation électrique. Ca nous rappelle le bon vieux windows 95 et son écran "Vous pouvez maintenant éteindre votre ordinateur". J'oublie donc l'idée d'un gros interrupteur sur le 220v qui coupe tout violemment mais je n'ai pas envie de repasser par le menu de Recalbox pour éteindre le RPi puis un bouton pour éteindre la borne. J'ai regardé ensuite la piste des deux pins PEN (Power ENable) et RUN (alim du CPU) présentes sur la carte du RPi mais cela ne permet pas de faire un shutdown du système d'exploitation. Je parle de ces PINs là :
ep1_01.jpg

En creusant un peu la doc de Recalbox et du Raspberry, on trouve assez facilement une configuration pour faire ce shutdown avec un switch entre le gpio3 (pin 5) et la masse (pin 6 par exemple). Recalbox a l'air de surcharger la conf présente dans /boot/config.txt du debian avec son fichier recalbox.conf, ça tombe bien ce dernier est plus simple à éditer :-) Une documentation complète ici :
https://github.com/recalbox/recalbox-os/wiki/Ajouter-un-bouton-on-off-a-votre-recalbox-(FR)

En ssh, on se connecte à recalbox et on édite le fichier recalbox.conf :

cd /recalbox/share/system
vim recalbox.conf
system.power.switch=PIN56PUSH
reboot

On a maintenant un bouton pour éteindre le RPi "proprement", il sert aussi de rallumer le RPi si ce dernier est alimenté en 5V. J'aimerai vraiment que ce bouton pilote l'alim ATX comme un PC normal. Ainsi, une fois le RPi éteint, l'ATX couperait aussi les autres périphériques comme les ventillateurs et l'ampli audio aliementés en 12v.
 

Commander l'alim ATX


J'ai commencé ma réflexion en regardant le fonctionnement d'une alim ATX, sur la prise 24 pins (celle pour la carte mère). On a deux pins intéressantes : Le PS_ON qui démarre l'alim quand ce dernier est relié à la masse et le 5v permanent qui est alimenté (faible ampérage max, genre 700mA d'après mes lectures) même quand l'alim est éteinte. Ce +5VSB (SB = standby) servirait à des fonctionnalités comme le wake up on LAN. Je me dis qu'il y a un truc à faire pour piloter cette alim et je me lance à grand coup de recherches google sans le mot clé raspberry ou recalbox et en cherchant plutôt en anglais -> résultat, pas grand chose d'intéressant.

Etant bredouille, je finis par tenter ma chance avec une recherche en français sur recalbox et alim atx, bingo :D Ca aurait été étonnant que personne n'est voulue faire ça avant et comme souvent avec Recalbox, il y a beaucoup de docs en français. Avec un jeu de transistors, on peut assez facilement maintenir PS_ON à la masse tant que le RPi n'est pas éteint. J'ai basé le gros de ma réflexion sur cette documentation :
https://sitelec.org/cours/mathieu/raspberry/atx_module.htm

Pour résumer, on configure la pin 8 du RPi pour founrir du 3.3V quand le système est UP et passer à 0V quand le système est éteint. Cette pin va commander la pin PS_ON de l'alimentation ATX. Un second transistor est ajouté pour la phase de démarrage, le temps que la PIN 8 passe à 3.3V.
 

Montage minimal


On peut imaginer un premier montage, le plus minimaliste qui va simplement maintenir PS_ON à la masse quand le système est UP :
ep1_07.jpg

En gros, il faut appuyer 2 à 3 secondes sur le switch pour allumer le RPi et on ne peut l'éteindre que via le menu de Recalbox. En effet, de mes tests, maintenir la pin5 de RPi à la masse ne va pas le faire s'éteindre, il semble plutôt régair au changement d'état. Ce scénario est très limité, autant utiliser un switch on/off façon windaube 95. On va donc ajouter des composants ...
 

Montage complet


En plus du transistor de maintient du montage précédent, on rajoute un transistor pour la phase de démarrage (comme indiqué dans le tutoriel de sitelec.org) et un transistor pour l'arrêt du RPi. En effet, dans le tutoriel, ils utilisent un script qui attend un signal sur une pin, ici je veux utiliser la pin 5 utilisée par les power-scripts de Recalbox. Je dois donc ajouter un transistor pour mettre la pin 5 à la masse quand on appuie sur le switch. Voilà ma version :
ep1_06.jpg

Voilà une petite photo pendant mes tests :) A gauche, on a une petite carte pour utiliser l'alim ATX facilement (chercher 'atx breakout' sur ebay) :
ep1_02.jpg
 

Activer la pin 8 uart_tx


Modification du fichier config.txt pour actriver la pinuart_txd0 :

ssh root@recalbox
mount -o remount,rw /boot
vim /boot/config.txt
enable_uart=1
mount -o remount /boot (j'ai eu un problème avec le reboot)

Un reboot est nécessaire pour activer la configuration. D'après mes tests, la pin 8 passe à 0V assez tard dans le shutdown, le gros du système est déjà down.
 

Bonus power-scripts


On utilise jusqu'à présent le mode PIN56PUSH, c'est à dire une pression sur le switch pour éteindre le RPi et une pression pour l'allumer (détourné ici puisqu'on allume l'alim ATX). La documentation en français parle de la possibilité de quitter l'émulateur avec une pression courte sur le switch et de faire le safe-shutdown avec une pression longue (> 2s). J'ai eu pas mal de difficultés à faire fonctionner cela pour deux raisons.

Premièrement, cette fonctionnalité n'est pas disponible avec le mode PIN56PUSH, il faut utiliser le mode PIN356PUSHRESET, ce n'est pas clairement indiqué dans la documentation française. La version EN est plus explicite sur le mode a utiliser pour cette fonctionnalité et parle aussi d'une LED qui peut clignoter pendant l'arrêt, c'est bon ça :
https://github.com/recalbox/recalbox-os/wiki/Add-a-start-stop-button-to-your-recalbox-%28EN%29

Il faut remodifier le fichier recalbox.conf :

vim /recalbox/share/system/recalbox.conf
system.power.switch=PIN356PUSHRESET

Deuxième difficulté rencontrée, une fois ce mode activé, je n'avais plus de safe-shutdown, une pression longue sur le switch coupait le système brutalement ... Paye ta regression :-/ En faisant des mesures, je me rend compte que la pin 8 qui est à 3.3V constant avec le mode PIN56PUSH, se met à faire le yoyo avec le nouveau mode. J'ai regardé sur git la tronche des power-scripts python sans grand succès. Désespéré, je finis par me dire que je vais écrire mon propre script (alors que je voulais justement éviter ça, par rapport au tutoriel du site sitelec.org) et je regarde donc le script direct sur le RPi. Il n'avait pas du tout la même tronche que celui vu sur github. Rapidement, je comprend que cette fameuse LED est mappée sur la pin 14 aka la pin uart_tx utilisé pour maintenir l'alim ATX sur ON, tout s'explique :D

Il faut modifier le power-script recalbox pour mapper la led sur un autre pin que l'uart, par exemple la GPIO18 (pin 12) :

mount -o remount,rw /
vim /recalbox/scripts/rpi-pin356-power.py
LED = 18
mount -o remount /

Un petit reboot est nécessaire. A noter, qu'en cas de mise à jour de recalbox, la modif de ce scripot est écrasée et donc il faut la refaire.
 

Piloter l'écran


L'alim ATX pilote le 5V et le 12V mais pas le 220V de l'écran, j'ai simplement rajouté un petit relai 10A :) A noter, que l'écran d'occaz que j'ai trouvé, n'a pas un connecteur standard IEC mais un truc spécifique. Je pense que dans la borne définitive, je mettrai la partie 220V dans une boite de dérivation histoire de bien isoler le 220 du reste. Un pti essai sur ma borne de test :
ep1_09.jpg

A terme, j'aurai un connecteur IEC male sur l'extérieur de la borne qui sera connecté à un interrupteur on/off IP chépukombien puis relié à la boite de dérive du dessus.
 

Réalisation de la board d'alimentation


On arrive enfin dans le coeur du sujet, le reste était une introduction :D Cette étape m'a prit beaucoup plus de temps que prévu ! Je pensais qu'une fois le montage OK sur la platine de prototypage, le reste roulerait. L'implatation des composants sur la board m'a mis le cerveau en ébullition. J'ai fait sur papier des essais d'implantation du plus gros mais une bonne partie a été faite au fil de l'eau :D J'ai bien aimé la partie soudure, cela m'a prit une bonne soirée. Par contre, j'ai galéré pour que se soit fonctionnel car les premiers démarrages ont été catastrophiques (j'ai même flingué mon install de test de Recalbox et la SD a du être formatée).

J'ai vraiment été un boulet, j'avais mis les transistors à l'envers ... Sur la platine de prototypage, on travaille que sur une "face". Sur la plaque finale, on travaille sur les deux faces et je me suis emmelé les pinceaux avec les transistors, j'ai inversé collecteur et émetteur. J'avais des tensions bizarres aux bornes des transistors et j'ai plutôt cherché coté faux-contacts ou valeurs de résistance ... Bref, je débute en électronique (alors que j'en ai fait un paquet à l'IUT ...).

J'ai opté pour une carte reliée au RPi par un connecteur 40 PINs, un peu à l'image des shields Arduino mais décalé pour laisser passer le futur radiateur du CPU (car il est fat lol).
ep1_04.jpg

Pour l'ATX, j'ai plutôt opté pour souder des câbles reliant la board à la prise male 24 PINs. Les périphériques (écran, ampli, switch) viennent se connecter sur les deux cotés restant. J'ai décidé de faire passer l'alim du RPi par des cables cuivres me disant qu'il y aurait moins de résistance qu'en passant par une piste en étain.
ep1_03.jpg

Une vue d'ensemble avec l'imposante ralonge ATX où j'ai viré la prise femelle et les pistes homemades de la board :D J'aurai bien mis une prise 24 pins directement soudée sur la board mais j'imagine pas la galère pour l'implatation des composants et des pistes.
ep1_05.jpg

J'ai essayé de faire un schéma de l'implantation des composants et des pins qui soit précis mais encore lisible, cliquez sur l'image pour l'avoir en plus grand :
ep1_08.jpg

Pour les cables de la rallonge ATX, j'ai soudé les 24 fils pour pas être embêté et j'ai doublé les soudures pour que se soit mécaniquement plus résistant. Tout à gauche, j'ai ajouté (pour le fun) une LED cablée sur la pin power_good. Pour la partie 12v, j'ai laissé une place dispo si jamais j'ai au autre périphérique ayant besoin du 12.
 

Limitations


On a une première limitation avec ce montage, on ne peut plus redémarrer le RPi. En effet, lors du reboot, le RPi va éteindre l'uart_tx et l'alim ATX va donc se couper. Reboot = arrêt + pression manuelle sur le switch. En mode de fonctionnement nominal, on est pas sensé vouloir redémarrer mais c'est une limitation quand même !

Je n'ai pas, pour le moment, prévu d'utiliser le bouton reset du mode PIN356PUSHRESET. Il doit être cablé sur la PIN 3 et je vais manquer de place dans ce coin là de la board :D En plus, il ne me permettra pas de redémarrer le RPi, seulement de reset l'émulateur en cours d'exec.

Je pensais résoudre mon problème de sous-voltage (le ptit éclair en haut à droite sur l'écran) avec l'alim ATX et les cables de section un peu plus grosse mais les alims que j'ai testé me sortent un 4.7V :( Je n'ai pas prit le temps de creuser ce point, peut être la charge n'est pas assez importante pour avoir une bonne régulation ?

J'arrive pas à sortir du mode démo avec une pression courte sur le bouton power, alors que logiquement ça devrait sortir de l'émulateur courant et revenir au menu. Je pense soumettre une issue sur le git du projet, le mode demo semble assez récent.
 

Références


Je remet le lien du tuto qui m'a servi principalement :
https://sitelec.org/cours/mathieu/raspberry/atx_module.htm

Un lien plutôt utile pour le diagnostic des problèmes de boot du RPi (j'ai eu un bel écran arc-en-ciel quand la SD était kaput) :
https://elinux.org/R-Pi_Troubleshooting#Power_.2F_Start-up

Fichier drawio du schéma complet :
schema_complet.drawio

Fichier drawio du schéma minimaliste :
schema_minimaliste.drawio