IR-WolAndShut

De Kernel Fablab Lannion
Révision datée du 4 mai 2020 à 11:15 par Pofexpray (discussion | contributions) (Update version3)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)

Présentation

Le projet a pour but de pouvoir démarrer et éteindre un ordinateur via une télécommande infrarouge (universel ou via récupération de code de la télécommande de votre télévision). Le boitier doit être autonome et n'a pas besoin d'être programmé via un ordinateur avant utilisation, un logiciel doit être exécuter au démarrage sur l'ordinateur cible.

Deux versions possibles:

1ere version: Une version purement logiciel, l'allumage et l'extinction de l'ordinateur est fait via le réseau local (si carte réseau compatible sur le pc cible)

2eme version: Une version mécanique, un système que l'on fixe sur l'ordinateur, ce système doté d'un servomoteur allume et force l'extinction du pc via un appuie sur le bouton power

3eme version: La plus simple possible, peu de soudure, utilisation de composant sur étagère.

Exemple d'utilisation:

- Personne à mobilité réduite (télécommande spécialisé)

- Bouton de démarrage difficilement accessible

- Démarrer en avance un ordinateur long à démarrer

- Forcer l'extinction d'un ordinateur dans une autre pièce (l'ordinateur de l'ado qui ne veut pas venir manger)

- ...

Cout: 15e environ


Version 1: Un arduino, une chaîne logicielle.

Architecture

WolAndShutProto.jpg

Un arduino avec shield ethernet relié sur le même réseau local que l'ordinateur cible. Si l'ordinateur cible est relié en wi-fi au réseau local, seule la fonctionnalité d'extinction fonctionnera (pas de wake on lan sur carte wi-fi). Après l'installation du boitier et la mise en place du logiciel sur l'ordinateur, une procédure d'initialisation est à suivre (voir "installation"), ensuite tout est fonctionnelle. Cette procédure n'est pas à relancer en cas de coupure de courant sur l'arduino (les données sont gardées en mémoire par l'arduino). L'architecture de test: Une box, un switch, le boitier IR-WolAndShut sur le switch, un pc sur le même réseau (relié au switch ou à la box). Testé avec télécommande samsung et pentax.

Le boitier doit pouvoir être pointer grossièrement par la télécommande de l'utilisateur.

Hardware: - Arduino Nano (atmega328p) - Ethernet shield ENC28J60 (attention dans mon cas j'ai du alimenter ce shield en 5v malgré qu'on trouve les docs sur le net signalant qu'il est alimenté en 3.3v) - Récepteur infrarouge TSOP382 - Une led pour indicateur visuel - Deux boutons poussoir (type pullup), pour lancer les procédures d'installations.

Schema-WolAndShut.png

Eagle project (à optimiser mais les grandes lignes sont la): File:WolAndShut.zip Les librairies eagle (à installer dans le dossier lbr de votre install eagle: File:lbr.zip Software: - Arduino IDE 1.6.6

Côté arduino

Librairie arduino

- IRremote v2.01: Pour la réception infraouge (https://github.com/z3t0/Arduino-IRremote) - Ethercard: Pour la partie ethernet (https://github.com/jcw/ethercard) - IPAddress et EEPROM inclus avec l'IDE arduino 1.6.6

Code arduino

Le code pourra être très largement optimisé, il est largement commenté, tout est précisé dans le fichier ci-dessous: Fichier ino v0.2 File:WolAndShut_v0.2.ino.zip

Pour information, les codes de télécommande et l'adresse mac du pc cible sont enregistrés lors de la procédure d'installation en EEPROM. En cas de coupure électrique ou autre, les codes sont gardés en mémoire donc il n'est pas nécéssaire de refaire la procédure d'installation.

 En cas de problème de récupération de l'adresse mac, une version de code ou l'adresse mac est écrite en dur est disponible (variable destmac):

File:WolAndShut_ManualMac.zip

Côté PC Cible

Matériel

Une carte réseau compatible avec la fonctionnalité Wake on lan. Il y a plein de tuto sur le net sur cette fonctionnalité et voir pour activer ou vérifier l'activation: https://openclassrooms.com/courses/wake-on-lan Le boitier arduino et l'ordinateur doivent être sur le même réseau local (rélié sur la même box)

Code python

Le code pourra être optimisé. Créé sous python 2.7. Cette version du soft est uniquement compatible windows pour le moment (mais pourra être adapté facilement à linux) Pyinstaller a été utilisé pour générer l'éxécutable windows (pyinstaller -F -w XXXX.py)

L'utilisateur final n'a pas besoin d'installer python ou les librairies sur son ordinateur. Seul le fichier .exe est nécéssaire ainsi que deux autorisations dans le pare-feu windows.

Le fichier original en .py modifiable: File:WolAndShutPY.zip

Le fichier exécutable en .exe: File:WolAndShutEXE.zip

Installation Windows

Une fois l'arduino finalisé côté hardware et chargée avec le code vous pouvez procéder à l'installation:

 - Brancher l'arduino au réseau ethernet puis brancher l'arduino électriquement. L'arduino allumera la lampe verte le temps du démarrage (récupération de son adresse ip) puis la led s'eteindra.
 - Copier le fichier exe (WolAndShut.exe) dans votre menu démarrer (le soft démarrera automatiquement avec windows). Cette étape est indispensable !!!
 - Ouvrer le port UDP Entrant numéro 5003 sur le pare-feu windows (il y a plein de tutoriel sur internet si besoin)
 - Autoriser l'application .exe dans le pare-feu windows
 - Pour cette première installation, cliquer sur l'exe (pour lancer le logiciel), une tempo de 30s est faites avant de le programme ne tourne.
 - On passe du côté du boitier arduino maintenant
 - Appuyer sur le bouton poussoir qui controle l'initialisation de l'adresse mac (dans mon cas celui le plus proche de la led infrarouge, la led noire). Vérifier votre montage pour savoir lequel est le votre (toutes les indications sont dans la partie architecture). ATTENTION: Si vous utilisez le code avec l'adresse mac manuelle passez directement au réglage de la télécommande (le bouton pour la mac ne sert à rien).
 - La led se met a clignoter une fois (ou un peu plus si la réponse est longue à avoir).
 - La led est de nouveau éteintes (moins de deux secondes après, cela signifie que tous s'est bien passé). Si elle clignotte plus longtemp un problème pour récupérer l'adresse mac de l'ordinateur peut avoir lieu. Vérifier que vous avez bien démarrer l'executable du côté de l'ordinateur (le fichier exe WolAndShut.exe). Puis redémarrer l'arduino et recommencer l'installation du côté arduino.
 - Prenez votre télécommande, et regarder quels sont les deux boutons que vous allez utiliser pour les fonctionnalités wake on lan et shutdown (deux boutons distincts !!!!)
 - Appuyer sur le bouton poussoir qui controle l'initialisation des codes a utiliser pour la télécommande
 - La led se met a clignoter rapidement puis va rester allumer
 - Quand la led est allumé, appuyer sur la touche de la télécommande prévue pour le wake on lan
 - La led clignotte rapidement une fois le code reçu puis va rester à nouveau allumer.
 - Quand la led est allumé, appuer maintenant sur la touche de la télécommande prévue pour l'extinction du PC
 - La led va clignotter lentement 5s et va s'éteindre.
 - L'installation est finit. Si vous changer de PC cible ou si vous voulez changer de bouton de la télécommande vous devrez refaire la procédure d'installation (côté arduino et côté PC en cas de changement d'ordinateur)

Utilisation

 - Pointer votre télécommande vers le boitier WolAndShut
 - Si l'ordinateur est éteint: En cas d'appuie sur la touche de wake on lan, le pc va démarrer automatiquement. Un appuie sur la touche d'extinction ne fera rien.
 - Si l'ordinateur est allumé (session ouverte): En cas d'appuie sur la touche wake on lan, il ne se passe rien. Un appuie sur l'extinction va eteindre le PC après 30s en affichant un pop-up d'information. Toutes les applications seront fermés automatiquement. Pensez à sauvegarder votre travail

Bonus

Le boitier pour ma carte prototype (le boitier est assez spécifique car l'assemblage est un prototype) .(skp et stl) File:WolAndShutCase.zip

TODO

 - Compatibilité linux a mettre en place
 - Optimiser le code
 - Voir comment démarrer le logiciel .exe même si la session utilisateur n'est pas ouverte => Le mettre en tant que service
 - Voir si il est possible pour l'utilisateur d'annuler l'ordre d'extinction (techniquement faisable ? proteger par mot de passe ?)
 - Ajouter une aide en cas de besoin de débuggage (en cas de problème éventuel)



Version 2: Un arduino et un servomoteur

Architecture

Une architecture simple: une led, un arduino, un servomoteur et quelques composants (résistances et condensateurs). Sur réception d'un code infrarouge définit (appris par le systeme), le servomoteur réagit. Pour pouvoir arreter l'ordinateur de force (appuie long) ou faire l'allumage (appuie court), il faut deux codes infrarouge différents. En fonction du code reçu le servomoteur appuie plus ou moins longtemps sur le bouton power. L'arduino peut etre placé dans un boitier a coté du pc (fixé sur le pc derriere l'ecran par exemple sur un portable), le servomoteur doit etre fixé (via une bandevelcro qui fait le tour du pc portable par exemple) de facon a ce que le bras du cerveau moteur puisse appuyer sur le bouton power.

La led infrarouge doit pouvoir etre facilement pointé par la télécommande de l'utilisateur.

Hardware: - Arduino Nano (atmega328p) - Récepteur infrarouge TSOP382 - Une alimentation 5v - Une led pour indicateur visuel - Un bouton poussoir (type pullup), pour lancer la procédures d'apprentissage des codes infrarouge.

SchemaWolAndShutv2.jpg

Schema dessiné sous fritzing, projet compressé: File:WakeAndShutMeca-v2.zip

Software: Arduino 1.6.7

Côté arduino

Librairie arduino

- IRremote v2.01: Pour la réception infraouge (https://github.com/z3t0/Arduino-IRremote) - Servo et EEPROM inclus avec l'IDE arduino 1.6.6

Code arduino

Le code pourra être très largement optimisé, il est largement commenté, tout est précisé dans le fichier ci-dessous: Fichier ino Fichier:WakeAndShutMecanicv01.zip

Pour information, les codes de télécommande et l'adresse mac du pc cible sont enregistrés lors de la procédure d'installation en EEPROM. En cas de coupure électrique ou autre, les codes sont gardés en mémoire donc il n'est pas nécéssaire de refaire la procédure d'installation.

Côté PC Cible

Matériel

Un velcro qui fait le tour du portable pour tenir le servomoteur serré (voir image au debug du chapitre version2), un systeme qui permet de maintenir l'arduino proche du pc (lien filaire entre le servomoteur et l'arduino), un fil rigide pour pouvoir orienter la led infrarouge.

Installation

Charger le code dans l'arduino et faites des essais pour voir si tous se passe bien fonctionnellement. Proceder ensuite a la fixation du servomoteur afin que l'appuie soit fait sur le bouton power. Si vous voyez que l'angle pour le servomoteur ne va pas, il y a deux variables a changer dans le code: angleOrig et angleCible (angle au repos et angle d'appuis sur le bouton).

Si besoin de debug, brancher vous sur l'arduino avec un port usb et faites un debug via le serial.


Apprentissage des codes infrarouges:

 - L'arduino est allumé
 - Appuyez sur le bouton poussoir
 - La led visuel clignotte 5 fois (rapide)
 - La led visuel reste allumé et est en attente de recevoir un code de votre telecommande, envoyez le code qui correspondrait a un appui court sur le bouton power
 - La led s'eteint, clignotte 10 fois puis passe en attente de recevoir un code qui correspon a un appui long du bouton power
 - La led s'eteint et après 5 seconde votre systeme est opérationnel
 - Tester votre systeme en appuyant sur les touches prévue sur la telecommande, le servomoteur devrait faire les actions qui sont prévus a chaque appuie (n'appuyez pas trop vite, n'oubliez pas que le systeme est prévu pour arreter ou eteindre un pc, une operation qui n'arrive pas toute les 2 secondes)

Utilisation

 - Pointer votre télécommande vers le boitier (la led infrarouge)
 - Appuyez sur votre bouton, si le code correspond a l'appuie court ou long, le servomoteur réagira.
 - Si besoin de reprogrammer les codes infrarouges, un appuie sur le bouton poussoir relancera l'apprentissage (voir installation pour connaitre la signification du clignottement de la led)


Version 3: Un arduino, un shield et un servomoteur

Description

Cette version a pour but d'éviter au maximum les soudures et les composants electronique a utiliser. On prend des composants sur étagère pour faire le module. Le principe de base reste le même, une LED infrarouge reçoit les codes de la télécommande et actionne le servo moteur en fonction du code reçu.

Shopping list

 - 1x Arduino Nano (aliexpress exemple: Nano-CH340-ATmega328P-MicroUSB-Compatible-for-Arduino-Nano-V3/1950989_32572612009.html)
 - 1x Sensor Shield: (aliexpress exemple: 1 pièces UNO bouclier/Nano bouclier pour NANO 3.0 32906961218.html)
 - 1x Led réception infrarouge (TSOP382 ou équivalent): aliexpress 4000329873414.html
 - 1x Cable de connection: aliexpress 10000000553065.html
 - 1x Servo moteur: aliexpress 32890069044.html
Schematic

Code

Un code rapide, a améliorer ou optimiser (adapter à la télécommande utiliser).

#include <IRremote.h>
#include <Servo.h>
#define longpress1 0xFF10EF     //Different code capture from telecommande for long press on servomotor
#define longpress2 0x1A6A551    //Different code capture from telecommande for long press on servomotor
#define longpress3 0xD88422DE   //Different code capture from telecommande for long press on servomotor
#define longpress4 0x8C22657B   //Different code capture from telecommande for long press on servomotor
#define longpress5 0xA08CDC88   //Different code capture from telecommande for long press on servomotor

#define shortpress1 0xFF30CF  //Only one code capture from telecommande for short press

int RECV_PIN = 2;       //IR receiver pin
int SERVO = 8;          //Servo data pin

int anglepress = 20;    //Setting for radius on button press
int angleinit = 60;     //Setting for radius on sleep
int LONGDELAY = 7000;   //Time of long press
int SHORTDELAY = 1000;  //Time of short press

Servo servo;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  servo.attach(SERVO);     //servo pin
  servo.write(angleinit);  //Set radius init
}

void loop() 
{
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value

    if (results.value == longpress1 || results.value == longpress2 || results.value == longpress3 || results.value == longpress4 || results.value == longpress5)
    {
       Serial.println("Long PRESS DETECTED");
       servo.write(anglepress);
       delay(LONGDELAY); 
       servo.write(angleinit);
    }

    if (results.value == shortpress1)
    {
       Serial.println("Short PRESS DETECTED");
       servo.write(anglepress);
       delay(SHORTDELAY);
       servo.write(angleinit); 
    }
  }
  delay(20);          //General speed
}

Procédure pour le code infrarouge

Pour adapter le code infrarouge a la télécommande:

 - Brancher l'arduino a l'ordinateur (ayant arduino IDE)
 - Demarrer l'IDE et ouvrir la console serial (9600 pour la vitesse)
 - Faire un appuie ou plusieurs appuie sur la télécommande infrarouge, les codes HEXA s'affiche sur la console. 
 - Mettre a jour le code en fonction des valeurs reçu (longpress ou shortpress). Si plusieurs code reçu vous pouvez adapter le code pour en déclarer plusieurs.