Apparati > Elettronica & AP

Centralina controllo GPIO con wrt54gl e openwrt

(1/78) > >>

truthahn:
Riporto sinteticamente l'avventura del modding di un linksys wrt54gl v1.1 per gestire riscaldamento, luci interne ed esterne pi? l'apriporta di un centro sociale via wireless. Il centro, utilizzato per molte attivit? con orari fissi e variabili, presentava molti problemi di gestione soprattutto per il riscaldamento che, seppur programmato tramite termostato, veniva talvolta posto su manuale scaldando anche quando il centro era chiuso. Anche le chiavi erano spesso un problema: troppe copie in giro o chiamate da persone che ne erano prive e dovevano entrare. L'illuminazione poi, quella esterna soprattutto, rimaneva spesso accesa tutta notte. L'idea ? stata quella di gestire il tutto dalla sede comunale tramite wireless, non disponendo il centro di una linea adsl, con un'interfaccia semplice da poter essere usata da una impiegata. Il primo esperimento ? stato con una fonera 2100 che con i suoi GPIO ben in vista ? facile da modificare. Per poter trasferire l'esperimento in pi? sedi (palestra, biblioteca, scuole...) sempre da gestite dalla  sede comunale ho pensato di utilizzare i linksys wrt54gl che ho usato molte volte con tanta soddisfazione con openwrt. Son diventato matto con il trunk brcm47xx (8.09 kernel 2.6) come riportato qui http://www.nabuk.org/f/index.php?topic=2341.0 , ma questo funziona solo se si utilizza il linksys come "centralina" essendo il wifi inutilizzabile per problemi di sviluppo del driver b43. Son passato quindi al brcm-2.4 (8.09.2 kernel 2.4) che ha l'wifi pienamente supportato. Pensavo ci fossero per? problemi per la gestione GPIO invece qui http://downloads.openwrt.org/utils/gpio-uclibc-0.9.29.tar.gz si trova nel tgz sia il sorgente che il prog "gpio" con il quale si gestiscono molto facilmente le gpio del linksys. Modificando quindi il codice inserendo il prog "gpio" e altri piccoli accorgimenti tutto ? andato a meraviglia.
Per i rel? necessari ho acquistato tre di questi http://www.futurlec.com/Opto_Relay_4.shtml , che con le spese di spedizione e dogana (arrivati da Hong Kong dopo un mese dall'ordine) son costati circa 15 Euro all'uno contro i 35/37 trovati uguali in italia. Questa scheda va particolarmente bene in quanto chiude i rel? con logic 0 proprio come il wrt54gl (la fonera li chiude con logic 1 e quindi quando rebootta ti ritrovi con tutti i rel? chiusi). Quindi, con il prog "gpio", per accendere qualcosa bisogna disabilitare un GPIO (gpio disable x) e abilitarlo per spegnerlo (gpio abled x). L'altro vantaggio ? la presenza di tre connettori per il collegamento ai GPIO (5 volt, 1 2 3 4 , GRN: ai 5 volt va collegato un punto a 3,3 volt presente, ad esempio, sulla seriale del linksys), cos? mettendo in corto il GRN con un punto 1 2 3 4 si pu? attivare un rel? senza l'intervento dei GPIO. Questo per me sar? utilissimo per il riscaldamento in quanto per controllare l'antigelamento dell'ambiente installer? un semplice termostato che bypassa le GPIO e quando la temperatura scende sotto i 5 gradi attiva la pompa anche se fuori programma. Inoltre la scheda va alimentata a 12v, proprio come il linksys.

Sul wrt54gl si utilizzano i GPIO 2 3 (? molto pi? comodo girare la scheda e saldare nei punti corrispondenti... saldare sui led ? un casino)


e 4 7


servono poi i 12 V da prendere dal connettore principale e, come gi? detto i 3,3 dalla seriale.


I 12 vanno ad alimentare la scheda e i 3,3 servono per la TTL

Riposto le immagini dell'interfaccia web realizzata. Si tratta di semplici script .sh posti in /www/cgi-bin/webif/centralina, ho creato poi una cartella in /etc nominandola "centralina" dove vengono registrati i log e le configurazioni, e la cartella /bin/centralina per i comandi.
Ho utilizzato abbastanza "sed" e "awk" che comunque sono gi? installati con openwrt.
La prima pagina serve per comandare direttamente i rel?, si accendono e spengono semplicemente tranne per l'apriporta che accende per 3 secondi e poi stacca.


la seconda serve per programmare i comandi posti in /bin/centralina. Non fa altro che scrivere in /etc/crontab/root e riavviare il servizio ad ogni modifica. Oltre a cancellare un programma si pu? disabilitarlo e riabilitarlo (pone o toglie un # nella riga corrispondente.


La terza gestisce le chiamate telefoniche con pass da un asterisk e serve per aprire, per ora, la porta. Gli amministratori hanno pass "private" con le quali possono comandare tutti i rel? (riscaldamento, luci).


la quarta gestisce i log


ed ecco il pupo pronto. Ho gi? fatto un giorno di prove con un altro wrt54gl a 100 m di distanza con i suoi gommini... 1000 accensioni e spegnimenti e tutto va alla perfezione. Esiste un unico neo: il gpio7, quello del led DMZ, all'accensione resta acceso per circa mezzo minuto quindi nessun problema se il rel? corrispondente accende le luci o il riscaldamento in caso di mancata corrente e riavvio ma, naturalmente, non pu? essere associato all'apriporta che resterebbe aperta.
Ecco il pupo:




TechBek:
Veramente ottimo!!
Posteresti anche qualche esempio del codice?? Perch? non saprei proprio da dove partire se volessi fare qualcosa del genere!!

truthahn:
questa ? la pagina comandi, la pi? semplice ma con la quale si pu? comandare al volo i rel?.


--- Codice: ---#!/usr/bin/webif-page
<?
. /usr/lib/webif/webif.sh
############################################################################
#
# Descrizione:
# Controllo GPIO - Accendi  - Spegni
#       Questa pagina controlla lo stato dei Gpio 3 4 7  e se lo trova "0"
# abilita lo spegnimento altrimenti l'accensione.
#
#       Per il GPIO 2 collegato all'apriporta propone solo apri.
#
#               truthahn - Nabuk Family
#############################################################################

header "Info" "System" "<img src=\"/images/telecomando.jpg\" alt=\"@TR<<>>\"/>@TR<< Comandi >>"

periferica7="Luci Esterne"
periferica3="Riscaldamento"
periferica4="Luci Interne"
periferica2="Apriporta"


for n in 3 4 7;do
        gpio=FORM_gpio$n
eval gpio=\$$gpio
if equal $gpio "ACCENDI" ; then
gpio disable $n > /dev/null
echo 0 > /etc/centralina/gpio$n
fi
if equal $gpio "SPEGNI" ; then
gpio enable $n > /dev/null
echo 1 > /etc/centralina/gpio$n
fi
done

if equal $FORM_gpio2 "APRI" ; then
           gpio disable 2 > /dev/null
           echo 0 > /etc/centralina/gpio2
           sleep 4
           gpio enable 2 > /dev/null
   echo 1 > /etc/centralina/gpio2
fi


if equal $FORM_generale "SPEGNI_TUTTO" ; then
for n in 2 3 4 7;do
gpio enable $n > /dev/null
echo 1 > /etc/centralina/gpio$n
done
fi

display_form <<EOF
start_form|@TR<<&nbsp;>>
end_form
EOF

cat <<EOF
    <form method="get" action="comandi.sh"><p><p><center>
        <table width="60%">
            <tr><td><strong>PERIFERICA</td><td><strong><center>STATO</td>
             <td><strong><center>COMANDO</strong></td></tr>
EOF

for n in 3 4 7;do
     gp="$(cat /etc/centralina/gpio$n)"
     per=periferica$n
    eval per=\$$per
    if equal $gp "0"; then
       cat <<EOF
            <tr><td>$per:</td><td><center><img src="/images/lamp.jpg"></td>
            <td><center><input type="submit" name="gpio$n" value=SPEGNI ></td></tr>
      EOF
   else
       cat <<EOF
           <tr><td>$per :</td><td><center><img src="/images/lamp1.jpg"></td>
           <td><center><input type="submit" name="gpio$n" value=ACCENDI ></td></tr>
       EOF
    fi
done

cat <<EOF
         <tr><td>$periferica2 :</td><td><center><center><img src="/images/chiave.jpg"></td>
         <td><center><input type="submit" name="gpio2" value=APRI
          onClick="javascript:return confirm('Vuoi veramente aprire la porta?');"></td></tr>
         <tr><td>Generale :</td><td></td><td><center><input type="submit" name="generale"    value="SPEGNI_TUTTO"          ></td></tr>
        </table></form>
&nbsp;<p>&nbsp;<p>
EOF

display_form <<EOF
start_form|@TR<<&nbsp;>>
end_form
EOF

footer
 
?>

--- Termina codice ---

TechBek:
ottimo,
appena ho finito gli esami ci do un'occhiata....volendo ? possibile fare una cosa simile sulla fonera??

truthahn:
Certo. Ne ho due in funzione su fonera 2100 con openwrt 7.09. Non ho provato con l'8.09 ma non penso ci siano problemi.

Navigazione

[0] Indice dei post

[#] Pagina successiva

Vai alla versione completa