Alimenter une RaspberryPi comme un PC

1. Introduction

1.1 Du blabla...

La Raspberry (RPi) est un micro ordinateur, portable et de faible consommation. Cependant, vous voudrez sûrement, un jour, peut-être, arrêter de la promener pour la montrer aux copains et l'intégrer à un vrai projet machine pour bénéficier de sa puissance de calcul !

Puissance de calcul... mais pas puissante du tout... En effet, comme tout élément informatique, une telle carte ne peut sortir que quelque mA et il serait d'ailleurs idiot de vouloir plus : ça ne vous viendrais pas à l'idée de faire tourner un moteur avec votre téléphone ! Et bien là, c'est pareil ! On arrive donc au point où l'on souhaite associer notre petite RPi avec une alimentation de puissance (entendez par là plusieurs Ampères sur du +5V, du +12V etc...). Il serait idiot de vouloir tout créer, alors le candidat idéal est : une alimentation ATX.

1.2 Matériel nécessaire

  • Un voltmètre : avant de brancher la RPi, il sera bon de vérifier que vous ne vous êtes pas trompé de ligne : du 12V tuerait votre RPi. En règle générale, c'est utile pour comprendre ce qu'il se passe sur une alim.
  • Une alimentation ATX : neuve ou de récup
  • Une RaspberryPi sur Rasbian
  • 2 x NPN 2N2222 : d'autre plus petits feront l'affaire, mais c'est le générique des NPN basse puissance, vous devriez en avoir plein sous le coude !
  • 2 x Résistance 4.7kΩ
  • 2 x Résistance 2.2kΩ
  • 1 x Résistance 470Ω
  • 1 x LED : de la couleur de votre choix, comme indicateur ON/OFF
  • 1 x Switch : type "pulse" OFF-ON-OFF
  • Du fil logique : type strap, vous pourrez acheter des connecteurs adéquats si vous voulez un beau montage : le connecteur CI ATX 20pin se trouve sur Lextronic.
  • 1 x Molex 4*1 femelle : attention, personne ne sait si c'est mâle ou femelle du fait de la structure foireuse de ces connecteurs, au niveau des pins ce sont des mâles (ça rentre dans maman alim), mais au niveau plastique ce sont des femelles (le plastique coté alim qui est mâle rentre dans la femelle). Mettez vous bien la structure en tête avant d'acheter. Si vous commandez, prendez des couples, vous ne serez pas déçu de recevoir le mauvais genre.
  • 1 x câble USB-microUSB type chargeur de téléphone : normalement ils passent tous du 2A si vous n'utilisez pas le DATA, au pire le câble fondera.

2. Généralité sur l'alimentation ATX

Rien de super nouveau, une alimentation ATX c'est juste le nom d'une alimentation de PC. La même que dans votre PC de bureau. Conçu pour travailler avec l'informatique, elle dispose de quelques fonctions de base, utiles, pour s'associer en douceur avec l'informatique. Mais d'abord, voyons un peu ce qu'une alimentation de base (~30€) a dans le ventre :

2.1 Caracteristiques EVGA 430W

  • +3.3V : 24A
  • +5V : 15A
  • +12V : 34A
  • -12V : 0.3A
  • +5Vsb : 3A

Je ne vais pas vous faire une description inutile de ce que ça veut dire, je vais juste expliquer ce qu'est le +5Vsb : il s'agit d'une ligne de veille, toujours active même lorsque l'alimentation est éteinte. En gros, si vous voulez récupérer un +5V quand tout est éteint (par exemple pour faire tourner un ventilo X temps après l'extinction ou pour faire une LED de veille, c'est sur ça que vous vous relierez).

Pour le reste, la puissance suffira amplement pour bon nombre de projets !

2.2 La broche 20pin ATX

20 ou 24 finalement on s'en fou. Les 4 pins qui font la différence sont juste des pins d'alimentation CPU, ils sont toujours "volants" sur l'alimentation et toujours associés sur la carte mère.

Brochage ATX
Figure 1: Brochage d'un connecteur ATX 20 pins

 

Comme vous pouvez le voir en Figure 1. la majorité des pins sont des GND (ground, masse, 0V) et des sorties puissances (+3.3V, +5V surtout, qui alimente la carte mère et la RAM). Vous vous en doutez, ce ne sont pas eux qui sont interessant... Les pins d'intérêts sont PS_ON et PWR_OK.

2.3 Fonctionnement général d'une alimentation ATX

Pour notre explication, on va utiliser PS_ON, PWR_OK et +5V. +5V symbolisant l'ensemble des lignes de puissances (+12V, +3.3V) du connecteur 20 pins mais aussi des MOLEX, SATA, etc...

Cinétique d'une alimentation
Figure 2: Cinétique d'une alimentation

Sur une alimentation ATX, seul PS_ON agit en INPUT : c'est à dire qu'on ne communique avec l'alimentation qu'avec ce pin. Réciproquement, on ne tire aucune info de ce pin. Lorsque notre alimentation est branchée mais éteinte (Figure 2. A), PS_ON est à un niveau HAUT (+2.8V), tout le reste est à un niveau BAS (sauf Vds, voir avant) : logique, l'alimentation est éteinte, le but c'est qu'elle soit... éteinte.

Dès lors que l'on appuie sur notre bouton d'alimentation PC, on shunt PS_ON avec GND ramenant le signal HAUT vers BAS (Figure 2. B), il s'agit du signal de démarrage de l'alimentation. Durant cette phase où le signal passe de HAUT vers BAS, nous somme dans le flou : +5V va démarrer à un moment où le signal sera suffisamment BAS mais pas toute de suite, cette phase dure quelques m-µ secondes. A partir du moment où le signal est considéré comme BAS sur PS_ON, +5V démarre (Figure 2. C), notre alimentation est démarrée mais pas stable, le +5V sera entre 0V et 5V ce qui n'est pas compatible avec l'informatique qui est sensible à tout ça (même si cette phase dure aussi quelques msecondes).

Il est donc nécessaire d'empêcher le PC de démarrer durant cette phase : c'est là qu'entre en jeu PWR_OK. PWR_OK restera BAS tant que tout ne sera pas parfaitement démarré et stabilisé. Dès que tout est OK, PWR_OK passe à HAUT (Figure 2. D). Cela prend également un poil de temps, ce n'est pas grave, qu'importe le moment où le PC décide de démarrer durant cette transition, tout est OK.

On arrive donc au moment où tout est OK, démarré et stable (Figure 2. E), l'alimentation est démarrée. Dès que le pin PS_ON repasse à HAUT, tout s'éteint (Figure 2. F-G).

On comprendra aisément que le bouton du PC ne suffit pas pour maintenir un PC allumé. En effet, vous ne restez pas le doigts appuyé sur le bouton durant vos sessions de jeux et le bouton n'est pas un interrupteur ON/OFF comme pour votre luminaire... (ce fut le cas dans le temps). Il y a donc un circuit interne à la carte mère du PC qui maintient PS_ON en BAS jusqu'à ce que vous fassiez "PC>Éteindre le PC" (ce qui passe par la couche informatique) ou que vous mainteniez le bouton pendant 3-5 secondes (ce qui passe par la couche électronique).

2.4 Réaliser le circuit de contrôle ATX

Comme dit précédemment, une carte mère dispose d'un circuit interne permettant le maintient et le contrôle de PS_ON. C'est ce que je vous propose faire maintenant. Ce circuit est purement empirique (je ne suis pas électronicien), fonctionne parfaitement et est très stable, lobodol vous l'améliorera si il juge ça intéressant niveau réduction de composant ou stabilité.

Circuit de contrôle ATX
Figure 3 : Circuit de contrôle ATX

Comment fonctionne ce micro-circuit ?

Rappelez vous, lorsque l'alim est OFF, V+5 est à 0V. Ce circuit ne fait donc rien lorsque l'alim est éteinte : la première étape étant donc de l'allumer.

Pour allumer l'alim, comme expliqué précédemment, il faut mettre POS_ON en BAS. Pour ce faire, une simple pression sur SWITCH shuntera POS_ON avec GND et démarrera l'alimentation. Si on se contentait de ça, dès que l'on relâcherait le doigts, l'alimentation s'arrêterait d'elle même.

Pour éviter ce phénomène, on utilise le fait que lorsque l'alimentation démarre (grâce au SWITCH), elle va commencer à fournir du V+5. Ce V+5 est donc relié à la base de Q1, ce qui va permettre un passage entre PS_ON (collector de Q1) et GND (emitter de Q1). V+5 maintient Q1 passant tant que Q1 est passant : dans mon jargon de biologiste, on appelle ça un feedback positif.

Ok, c'est bien beau tout ça mais pour l'éteindre, on fait comment ?

Il y avait l'option on rappuie et ça éteint (bascule ON/OFF sur NE555), mais personne n'éteint son PC en débranchant l'alimentation ! Il faut donc que l'alim se coupe quand le PC (ici le RPi) envoi la consigne : "j'ai fini mon process d'extinction, on coupe le jus maintenant".

C'est le rôle de Q2. Ici Q2 agit en shunt de Q1 : dès que le RPi envoie le signal par RPi GPIO (on verra plus tard comment), Q2 devient passant, ramène la tension de R2 à 0V (pull down) ce qui fait que la base de Q1 n'est plus activée. Q1 est bloqué, POS_ON n'est plus en BAS : l'alimentation s'éteint. R3 est également une résistance de tirage qui permet (dieu sait comment) d'améliorer les vitesses de déclenchement et d'éviter que le rail +5V mette 10 secondes à se vider. Probablement inutile une fois monté avec le RPi, ça change beaucoup pendant les tests sans.

Et quand on parle des tests : Tout ça est indépendant de la RPi ! Avant de brancher ça sur votre bébé à 30€, vérifiez le bon fonctionnement ON/OFF : et pour tester le OFF, branchez simplement RPi GPIO sur V+5 ou Vds.

Une magnifique LED est simplement branchée sur V+5 comme indicateur ON/OFF.

3. La RaspberryPi

Cet article n'a pas vocation d'expliquer qu'est ce qu'une RaspberryPi. Si vous pensez qu'il s'agit d'une framboise mathématique, je pense que vous ne serez pas intéressé par la suite !

3.1 Alimenter une RaspberryPi

Alimenter une RPi est vraiment tout con : on branche un câble micro-USB sur une alimentation type "chargeur de téléphone" de plus de 2A. Il faut donc savoir une chose qui va grandement nous simplifier la vie : le contrôle PWR_OK se fait en interne dans la RPi. Il n'y a pas besoin de donner une alimentation "propre" par l'USB puisque par nature, une alim USB est dégueulasse. Je vais donc vous présenter un montage simple ne passant pas par le PWR_OK. Cette "option" serait facilement ajoutable (avec un relai?), vous pourrez le faire, et ajouter le schéma en commentaire ;)

3.2 Préparer votre adaptateur MOLEX-microUSB

Vous pouvez faire ça propre, ou à la méthode dégueux, comme moi. Le but est simple, reliez le +5V et GND du molex sur le V+ et le GND du micro-USB.

Adaptateur MOLEX vers micro-USB
Figure 4 : Adaptateur MOLEX vers micro-USB

Les deux solutions présentent avantages et inconvénients.

La première, la plus propre (Figure 4. A), permet de relier le connecteur micro-USB directement sur la MOLEX en utilisant du câble de gros calibre. On limite donc les risques de surchauffe du cable USB qui n'est pas forcément fait pour passer 2.5A. Limite uniquement, car le faible tronçon entre le connecteur micro-USB et les câbles multi-brin reste limitant et pourra fondre en cas de surcharge. La meilleurs option étant donc de limiter cette surcharge : c'est le but de cet article, utiliser une ligne de puissance plutôt que les pin d'alimentation de la RPi.

La seconde, la plus crade (Figure 4. B), est très simple à mettre en œuvre, le connecteur USB se soudant très bien. Ce montage permet également de garder un câble "élégant" plutôt que deux fils multibrin qui se baladent. Pensez juste à protéger la fiche USB soudée avec de la gaine pour éviter un court-circuit inopiné.

3.3 Envoyer le signal d'extinction (halt)

Comme vous le savez (ou pas), on ne contrôle pas au niveau software l'état des GPIOs quand le RPi est halt (off). Dans notre situation, il faut qu'au boot, le signal soit impérativement à 0V (BAS) en OUTPUT et après halt, à 3.3V (HAUT). Si ce n'est pas le cas (imaginons que le signal au boot soit HAUT), Q2 serait passant, shunterai Q1 et couperait l'alim direct ! Si après le halt le signal est BAS, bas Q2 serait saturé, ne shunterai pas Q1 et l'alim resterai ON.

Pour ce faire, nous passons par le device tree blob (dt-blob) : ce petit fichier permet de configurer les états par défaut des GPIO avant et après que l'OS soit chargé.

Lancer votre RPi, connectez vous à ce dernier, mettez vous en sudo (sudo su) et lets go :

Tout d'abord, et si ce n'est pas déjà fait, on install le logiciel permettant de compiler les device tree.

apt-get install device-tree-compiler

Créez ensuite un fichier dans votre répertoire courant :

nano /home/pi/dts-blob.dts

Et copiez-y le contenu officiel accessible sur ce lien.

Il faudra ensuite modifier ce fichier (donc ne le fermez pas). Selon votre modèle de RPi (B 1.0, B 1.1, 3, etc...) vous devez accéder à la bonne branche. Sur nano, faites Ctrl + W (recherche) et tapez selon votre modèle :

Modèle CTRL+W
RaspberryPi 3 pins_3b1
RaspberryPi 2B 1.1 pins_2b2
RaspberryPi 2B 1.0 pins_2b1
... ...

Au delà j'imagine que vous savez lire un fichier... d'ailleurs, ce n'est qu'une aide. L'idéal serait de lire ce fichier et de le comprendre ;)

Dans mon cas je recherche pins_3b1 et j'accède donc à la configuration des pins pour la RPi3.

Après le bloc "pin@default" j'ajoute ma ligne de définition :

Dans dts-blob.dts :

pin@p17 { function = "output"; termination = "pull_up"; polarity = "active_high"; startup_state = "inactive"; };

Sur le pin 17 (BCM) soit le GPIO_0 (utilisez "gpio readall" pour connaître les correspondances, nécessite WiringPi par exemple) j'ordonne qu'au démarrage le pin soit inactif (BAS) et qu'à l'extinction, il soit HAUT (pull_up pour qu'en état stable il soit HAUT, active_high pour ne pas qu'il soit activement maintenu BAS).

Voilà, on a programmé notre pin. Il ne reste plus qu'à compiler ce fichier et l'ajouter au chargement de boot :

dtc -I dts -O dtb -o /boot/dt-blob.bin /home/pi/dts-blob.dts

Cela va générer un .bin qui sera chargé au prochain boot. On reboot donc !

reboot

Puis on éteint

halt

Et on débranche :)

4. Résultat final

4.1 Branchement

  1. Mettez l'interrupteur général de l'alim sur O
  2. Easy to do. On branche d'abord notre circuit de contrôle sur l'alimentation à l'aide de strap. Retournez voir le schéma du connecteur 20pin si besoin.
    • V+5 : fil rouge, strap rouge, V+5 sur notre circuit
    • POS_ON : fil vert, strap vert, PS_ON sur notre circuit
    • GRND : fil noir, strap noir, GRND sur notre circuit
    • Branchez ensuite votre RPi à l'aide de l'adaptateur MOLEX vers micro-USB.
  3. Branchez votre RPi avec l'adaptateur MOLEX vers micro-USB
  4. Reliez le GPIO_0 (BCM17) sur RPI GPIO de notre circuit
  5. Reliez un GRND (RPi) sur RPi Ground de notre circuit

Il est important de partager le GND entre notre RPi et l'alimentation ! Sans quoi ça ne marcherait pas et risquerait de mettre en danger notre RPi (bien que protégé, il ne faut pas que notre GPIO (3.3V) deviennent le GND du V+5).

4.2 Lets go!

Et c'est parti !

  1. Mettez l'interrupteur général de l'alim sur I
  2. Appuyez sur votre SWITCH : l'alim démarre ainsi que le RPi.
  3. Connectez vous au RPi en sudo
  4. Éteignez le RPi (rappel commande : "halt")
  5. L'alimentation se coupe juste après la cloture de l'OS.
Résultats
Figure 5 : Résultats

Bravo à vous ! Vous avez une RPi alimenté par une ATX, ne vous reste plus qu'à poursuivre vers des circuits de puissance pour utiliser tout ce que votre alimentation peut fournir : en restant prudent, un mauvais branchement pouvant détériorer votre RPi.

4.3 Améliorations

Bien sûr, il y a plein d'améliorations à apporter, qu'elles soit fonctionnelles, esthétiques ou de convenances. Voici une liste de ce qui pourrait être bien de faire et que vous pourriez partager sur Fire-DIY quand vous l'aurez fait !

  • Faire une carte d'interface alim doté d'un VRAI connecteur ATX et de bornier/connecteur de puissance
  • Rajouter une étape POWER_OK à l'aide d'un relais permettant de démarrer la RPi et ses périphériques quand l'alim est stable.
  • Ajouter un GPIO_IN pull_up sur le POS_ON pour qu'un nouvel appui sur le bouton quand le RPi est allumé envoie (par un signal BAS) une consigne HALT (par script python par exemple)
  • Ajouter sur le bouton un petit circuit RC permettant, après maintient de 4-5 seconde, le shunt de Q1 et forcer l'extinction (HARD_OFF)

 

Bon courage à vous et Fire !

Vos réactions (0) :

Soyez le/la premier(e) à commenter cet article !

Vous avez besoin d'aide ? Utilisez le Forum plutôt que les commentaires.

Un commentaire ?

* Champs obligatoires