El processador dels Linksys, té alguns pins GPIO lliures o bé que un cop inicialitzat l'equip ja no serveixen per res. S'hi poden fer algunes coses força sofisticades (adquirir temperatures i lectures analògiques si s'implementa un bus I2C per soft, per exemple), però com a primera aproximació, s'hi pot connectar un relé per tal d'actuar en remot sobre una càrrega... ja sigui un altre router per tal de poder-lo resetejar, un calefactor, un ventilador, etc...
El circuit del rele és un transistor NPN BC237 o similar amb una resistència de base de 2K2 amb l'emissor a massa (0 V) i el col·lector a un pin del relé. L'altre pin del relé va a 12V. S'inclou un diode 1N4007 o similar entre els pins del rele per tal d'evitar les tensions induïdes en la commutació del relé:
+12V
^
|
----------
| |
---- -----
|---| / \
---- ---
| Rele | Díode
----------
|
\
\
\ Resistència
| ------
Transistor |----| |---------------> Al pin GPIO5
| ------
/
/
\/
|
|
----
0V
El circuit es connecta tal i com es veu a la foto. El cable vermell son els 12V, el del seu costat la massa, i el que queda més apartat, és la sortida GPIO5 del uProcessador del router.
Tant el pin de GPIO 5 com de 12V i 0V si no m'equivoco són al mateix lloc en totes les versions del router per sota de la 5...
Compte, que durant la inicialització del sistema, aquest pin passa per uns instants a nivell alt i fa actuar el relé. Si no es desitja aquest comportament, s'hauria de complicar una mica el circuit.
Un petit programa per poder controlar aquest relé:
#include <stdio.h>
#include <fcntl.h>
#define RELE 32 // GPIO 5
#define REVISIO "0.8"
#define INSTRUCCIONS "Funcionament: rele <on | off>"
#define ESTAT_ON "Rele ON"
#define ESTAT_OFF "Rele OFF"
int main(int argc, char **argv) {
unsigned int uValor;
int hOutEnable, hOut;
printf("WRT54G - Control de rele rev.%s\n",REVISIO);
printf("Pere R. Franquesa <pere__a__franquesa.com>\n\n");
if (argc!=2) {
puts(INSTRUCCIONS);
exit(1);
}
if (!strcmp(argv[1],"on")||!strcmp(argv[1],"off")) {
hOutEnable=open("/dev/gpio/outen",O_RDWR);
read(hOutEnable, &uValor, sizeof(uValor));
uValor |= RELE;
write(hOutEnable, &uValor, sizeof(uValor));
hOut=open("/dev/gpio/out",O_RDWR);
read(hOut, &uValor, sizeof(uValor));
if (!strcmp(argv[1],"on")) {
uValor|=RELE;
puts(ESTAT_ON);
} else {
uValor&=~RELE;
puts(ESTAT_OFF);
}
write(hOut, &uValor, sizeof(uValor));
} else puts(INSTRUCCIONS);
return 0;
}
Si algú el vol fer servir i no disposa de les eines per compilar-lo, el pot descarregar d'aquí.
Per provar el programa sense haver-lo de posar dins el firmware del router, es pot fer el següent:
1.- Posar en un servidor ftp l'arxiu rele i donar permisos.
2.- Entrar al router que te el circuit del rele
3.- cd /tmp
4.- wget ftp://usuari:password@ip_servidor_ftp/rele
5.- chmod 700 rele
6.- Activar i desactivar el rele amb les instruccions "./rele on" i "./rele off"

