J’avais acheté une multiprise “maître esclave” : lorsque le courant consommé sur la prise maître dépasse un certain seuil, les prises esclaves sont activées. Problème : j’ai changé de PC, et avec celui-là, le courant consommé en veille est trop élevé, les prises esclaves restent actives. Il va donc falloir bricoler.

Les trucs qui marchent pas

D’abord, on (j’ai fait appel à un ami) a cherché à faire de l’ingénierie inverse sur le circuit fait par Legrand. Après des heures de recherches, on a fini par comprendre que ce qui déterminait la sensibilité du bazar, c’est la constante de temps du circuit oscillant, qui pilote un transformateur utilisé comme sonde. On a vite abandonné cette piste.

J’ai cherché sur toutes les connectiques, une sur laquelle le 5V se coupe en veille. J’ai fini par trouveer sur le DVI de ma GTX 1050… Trop compliqué à câbler, on va faire autrement.

Le projet

L’idée est d’utiliser l’Arduino Micro, relié en USB au PC, pour détecter un état de veille. Mon PC ne coupe pas l’alimentation des ports USB, il faut donc communiquer avec lui. Au niveau du code, c’est extrêmement simple : l’Arduino Micro donne accès à une fonction USBDevice.isSuspended(). Il suffit de faire un test là-dessus !

Le schéma

“C’est pas compliqué, tu mets un transistor NPN, une diode, et un relai”

Bon en vrai faut un peu plus : une résistance entre la base du transistor et la pin de contrôle de l’Arduino, pour limiter le courant, mais surtout, une pull-down entre la base du transistor et la masse ! Sinon on a une patte flottante, et donc un comportement non défini (en pratique, sans, le relai reste fermé – Oui, on l’avait oubliée au début !).

Schéma électronique

Le code

Le code est simple, mais pour un débutant comme moi, il y a un gros piège : oublier de passer les pins utilisées en mode sortie (“pinMode(…, OUTPUT)").

const int pinLed = LED_BUILTIN;
const int pinRelay = 5;
void setup() {
  pinMode(pinLed, OUTPUT);
  pinMode(pinRelay, OUTPUT);
}

On utilise la LED intégrée (LED_BUILTIN) à l’Arduino Micro comme témoin de marche du relai, et on déclare la pin D5 comme pinRelay.

void loop() {
  if(USBDevice.isSuspended())
   {
    digitalWrite(pinRelay, LOW);
    digitalWrite(pinLed, LOW);
   } else {
    digitalWrite(pinRelay, HIGH);
    digitalWrite(pinLed, HIGH);
   }
  delay(20000);
}

Si le PC est en veille, on met la LED et la pin de contrôle relai à LOW, ce qui va ouvrir le circuit. Sinon on passe à HIGH, fermant le relai, et donc tous les appareils sont alimentés.

J’ai ajouté un délai de 20 secondes à la boucle pour éviter que ça “clignote” à l’allumage de l’ordi : l’USB passe actif pendant l’UEFI, puis inactif, puis à nouveau actif pendant GRUB2, et à nouveau inactif, avant que le kernel ne prenne la main dessus. Avec un délai de 20 secondes on échappe à ce phénomène.