Oggi mi è stato chiesto se fosse possibile accendere o riattivare da uno stato di standby o di ibernazione un PC ad una data ora… è bastato unire un Arduino Pro Micro ad un modulo RTC ed ecco nato il progetto WakeMeUP…
Descrizione
WakeMeUP è un dispositivo USB che invia il segnale di wake al PC a cui è collegato ad un istante configurabile. Tutta la configurazione avviene tramite il collegamento seriale: l’Arduino utilizzato (Pro Micro) è infatti in grado di presentarsi al PC come device composito, che implementa:
[checklist]
- una porta seriale virtuale (CDC)
- un device di tipo human interface (HID), come tastiera o mouse
[/checklist]
Ad Arduino Pro Micro ho affiancato un modulo realtime clock (RTC) di SparkFun. Tale modulo è basato sul chip DS1307, collegato ad Arduino via bus I2C.
Ho realizzato il tutto su basetta millefori, inserendo sia l’Arduino che il modulo RTC in un unico zoccolo per circuiti stampati:
Wake e System Power States
Un computer può essere in diversi stati, codificati da un codice ACPI:
- S0 (working), stato di utilizzo normale
- S1–S2–S3 (sleeping), differenti stati di sleep (il PC è sospeso in memoria RAM)
- S4 (hyberntion), il PC sembra spento, il suo stato è memorizzato su disco fisso
- S5 (soft off), il PC è spento, solo alcuni componenti (scheda di rete, periferiche USB…) sono alimentate
- G3 (mechanical off), il PC è spento tramite interruttore fisico, nulla è alimentato
Normalmente tutte le schede madri supportano il wake dagli stati S1-S2-S3, mentre soltanto alcuni supportano anche il wake da S4-S5 (il wake da G3 è ovviamente impossibile non essendo alimentato il dispositivo USB).
La configurazione di questa feature avviene tramite il BIOS della scheda madre, dove è anche possibile decidere di alimentare le periferiche USB nei vari stati (è spesso utilizzata per poter ricaricare dei dispositivi via USB anche a PC spento):
E’ importante verificare nelle proprietà del dispositivo HID che sia flaggata l’opzione allow this device to wake the computer
Arduino
Lo sketch per Arduino è disponibile nel mio repository su Github.
Perché Arduino sia in grado di inviare il segnale di wake al PC, è necessario sostituire la libreria USB che viene fornita con l’IDE con una versione modificata dall’utente Mike T e resa disponibile sul forum ufficiale.
Lo zip (che potete scaricare anche qui) contiene 4 files, che vanno salvati (sostituendo gli esistenti) in \hardware\arduino\avr\cores\arduino (all’interno della cartella principale dove avete installato l’IDE).
Lo sketch utilizza anche la libreria RTCLib di Adafruit per dialogare con il modulo RTC: per la sua installazione potete sfruttare il nuovo Library Manager.
WakeMeUP supporta due semplici comandi, inviati via seriale:
- T, visualizza l’ora corrente, letta dal modulo RTC
- Whhmm, imposta (e memorizza nella EEPROM) l’orario in cui inviare il segnale di wake
La versione modificata della libreria USB consente di inviare il segnale di wake con un semplice comando:
USBDevice.wakeupHost(); |