Una ciabatta controllata da USB

Da raspibo.

A dire il vero questo progetto non e' realizzato con Raspberry PI ma con un Atmega8, potete comunque attaccare questa ciabatta a un HUB collegato al Raspberry PI per accendere e spegnere apparati. (Occorre l'HUB perche' quando tutti i Rele' sono attaccati forse non basta la corrente fornita dalle porte USB del Raspberry PI. Aggiornamento: l'ho provato senza HUB e ha funzionato egregiamente).

Ecco le foto:

USBpowerstrip.jpg

USBpsopen.jpg

Il progetto usa la libreria v-usb che implementa USB 1.1 completamente via software in microcontrollori atmega.

Come si vede dalla foto della ciabatta aperta ci sono due circuiti (collegati fra loro con un cavo flat):

  • quello attaccato al frutto, che ha la presa USB e il microcontrollore
  • quello fissato sul fondo dove sono installati i 4 rele' (con i 4 transistor BC547 e i diodi 1N4007 come descritto qui)

Tutto il circuito e' alimentato via USB. La tensione di rete e' attaccata solamente ai contatti delle commutazioni dei rele'.

Ecco lo schema elettrico della scheda USB:

Powerstrip.png

e questo e' lo schizzo della scheda rele' (sono 4 circuiti uguali con il transistor NPN che pilota un rele')

PoweRele2.png

Indice

Il software

PowerStrip.tgz

Il software si compone di due parti, una da caricare sul Atmega8 a bordo della ciabatta e l'altra serve per generare il comando che potete usare con un Raspberry PI o un altro computer.

Il circuito prevede l'uso di uno dei programmatori per AtMega della Tux graphics. Se usate un altro programmatore i fili sono gli stessi ma il connettore e' diverso.

Compilate il firmware (occorre sulla macchina GNU-Linux la toolchain per avr, avr-gcc)

cd firmware
make hex

poi collegato il programmatore caricate l'hex sulla scheda

make flash
make fuse

(se non settate i "fuse" non funziona, dovete settare il clock del microcontrollore indicando la presenza dell'oscillatore quarzato a 12Mhz).

A questo punto andate nella directory commandline. Ci sono due comandi: uno scritto in C e uno in Python. Per la versione C occorre il pacchetto Debian libusb-dev (o l'equivalente in altre distro), per la versione python occorre python-usb.

Per python se avete la libreria pyusb (caricata col pacchetto python-usb) tutto dovrebbe funzionare subito, per il C occorre chiamare "make".

Come Funziona

I quattro rele' sono indicati con le prime 4 lettere dell'alfabeto a,b,c,d, minuscole se il rele' e' spento e maiuscole se e' acceso. Il comando set-out (o set-out.py ha gli stessi parametri). Dovete essere root per accesere alle porte USB direttamente.

# ./set-out status
OUT is abcd

significa che sono tutti spenti.

La sequenza che segue e' auto-esplicativa. Accendo il primo e il terzo rele', controllo quali sono accesi, poi spengo il terzo e accendo il quarto, controllo quali sono accesi, Accendo il secondo, controllo, Spengo il secondo, controllo, accendo tutto, controllo, spengo tutto, controllo.

# ./set-out AC
# ./set-out status
OUT is AbCd
# ./set-out cD
# ./set-out status
OUT is AbcD
# ./set-out B
# ./set-out status
OUT is ABcD
# ./set-out b
# ./set-out status
OUT is AbcD
# ./set-out ABCD
# ./set-out status
OUT is ABCD
# ./set-out abcd
# ./set-out status
OUT is abcd

Il protocollo

E' ignominiosamente banale (KISS!).

Si usano messaggi di controllo USB. I sistema ne riconosce 3: Setta lo stato (1), leggi lo stato (2), il terzo e' un echo per provare il driver.

Il comando 2 legge un messaggio di controllo dal dispositivo questo fornisce in risposta un solo byte i cui 4 bit meno significativi rappresentano lo stato dei rele' (primo rele' 1, secondo rele' 2, terzo rele' 4, quarto rele' 8).

Il comando 1 ha un parametro di un byte che puo' assumere 8 valori: 0x8: accendi primo rele', 0x9 accendi il secondo e cosi' via 0xA il terzo e 0xB il quarto. Per lo spegnimento: 0x1: spegne il primo rele', 0x2 il secondo, 0x3 il terzo, 0x4 il quarto.

Fine del protocollo.

Riporto il programma python (e' anche nel file tgz!):

#!/usr/bin/env python
# Copyright 2013 Renzo Davoli
# License: GPLv2+ see license.txt

import usb
import sys

CUSTOM_RQ_ECHO=0
CUSTOM_RQ_SET_STATUS=1
CUSTOM_RQ_GET_STATUS=2

c2cmd={'a':0,'b':1,'c':2,'d':3,'A':8,'B':9,'C':10,'D':11}

busses = usb.busses()
for bus in busses:
  for dev in bus.devices:
    if dev.idVendor == 0x16c0 and dev.idProduct == 0x05dc:
      if len(sys.argv) < 2:
        print "FOUND!"
      else:
        out=dev.open()

        if  sys.argv[1] == "status":
          msg=out.controlMsg(requestType=0xc0,
              request=CUSTOM_RQ_GET_STATUS,
              value=0, index=0, buffer=4, timeout=5000)
          value=msg[0]
          print "OUT is", ("A" if value & 1 else "a") + ("B" if value & 2 else "b") + ("C" if value & 4 else "c") + ("D" if value & 8 else "d")

        else:
          for c in sys.argv[1]:
            if c in c2cmd:
              msg=out.controlMsg(requestType=0x40,
                  request=CUSTOM_RQ_SET_STATUS,
                  value=c2cmd[c], index=0, buffer=4, timeout=5000)

Pensieri Finali

Anche questo e' un dispositivo che sarebbe molto utile per tante applicazioni. Non c'e' nessuno li' fuori che voglia produrlo industrialmente (con marchio CE) o farne un kit...??? Questo progetto e' rilasciato CC-BY-SA, quindi non ha vincoli per lo sfruttamento commerciale! Basta che riportiate la licenza e scriviate nel manuale "si ringrazia Renzo Davoli e il gruppo RaspiBO" e potete venderne quanti volete.

Strumenti personali
Namespace

Varianti
Azioni
Navigazione
Strumenti