Differenze tra le versioni di "Roomba scheduler"
Riga 1: | Riga 1: | ||
= Antefatto = | = Antefatto = | ||
− | Qualche tempo fa ho comprato un robot Roomba 615 per la pulizia dei pavimenti(e' un regalo e manometterlo mi sembrava brutto...). Questo robot è studiato per la pulizia quotidiana dei pavimenti, ma spesso | + | Qualche tempo fa ho comprato un robot Roomba 615 per la pulizia dei pavimenti(e' un regalo e manometterlo mi sembrava brutto...). Questo robot è studiato per la pulizia quotidiana dei pavimenti, ma spesso mi dimenticavo di avviarlo quando uscivo di casa e farlo funzionare mentre si è in casa è un pò scomodo anche se accettabile. |
= Descrizione generale = | = Descrizione generale = |
Versione attuale delle 21:52, 24 nov 2016
Antefatto
Qualche tempo fa ho comprato un robot Roomba 615 per la pulizia dei pavimenti(e' un regalo e manometterlo mi sembrava brutto...). Questo robot è studiato per la pulizia quotidiana dei pavimenti, ma spesso mi dimenticavo di avviarlo quando uscivo di casa e farlo funzionare mentre si è in casa è un pò scomodo anche se accettabile.
Descrizione generale
Questa pagina raccoglie una serie di informazioni che ho trovato in giro da varie fonti e spesso sbagliate o relative ad altri modelli di robot.
Il costruttore fornisce anche indicazioni sul funzionamento del robot con documenti ufficiali, ma sconsiglia di modificare il firmware e la cosa al momento non è di mio interesse.
I robot Roomba hanno un accessorio chiamato muro virtuale utilizzato per evitare che entri in determinate stanze. Casualmente ho visto questo progetto da cui ho intuito che roomba ha una interfaccia infrarossi.
Un altro accessorio è il telecomando ad infrarossi che può essere usare per telecomandare il robot, su questo sono anche stati sviluppati progetti per comandare il robot via wifi. Qualcosa che su vari siti consultati non viene riportato e' che quando il robot e' in carica va in uno stato di standby in cui non accetta comandi sul ricevitore ad infrarossi.
L'unico modo che ho trovato per risvegliare il robot e' disattivare la stazione di ricarica per qualche secondo tramite un rele'. Per risparmiare energia ho usato il contatto normalmente chiuso in modo da alimentare il rele' per i pochi secondi necessari a risvegliare il robot.
Ulteriore dettaglio, i comandi da dare al robot se ripetuti provocano la revoca del comando stesso.
Se invio il comando clean e poco dopo, mentre il robot sta scendendo dalla stazione di ricarica, invio un secondo comando clean, il robot si ferma perche' lo interpreta come un annullamento del comando.
Altri segnali, ad esempio quello del virtualwall, possono essere dati in continuazione.
Allo stesso tempo non ho un sistema per capire se il comando e' stato ricevuto. Per questo ho applicato alla base di ricarica un sensore di presenza (uno switch) per capire se il robot e' sceso dalla base ed e' partito.
Hardware
Tralasciando la board piFace che considero inutile per questo progetto i pezzi necessari sono:
- Rele' (consigliato a 3 contatti per utilizzare il normalmente chiuso)
- Alimentatore per il rele'
- Led infrarosso (va benissimo riciclato da vecchio telecomando a infrarossi)
- Transistor e resistenza (per pilotare il led a infrarossi, il gpio da solo non basta)
- Switch di fine corsa o contatto magnetico da applicare alla stazione di ricarica.
InfraRed
Per generare comandi ad infrarossi su Linux usiamo lirc per l'installazione fate riferimento alla pagina Accendere e spegnere 4 led tramite un ricevitore a infrarossi limitandovi alla sezione "Installazione/Configurazione LIRC e test di funzionamento".
Per generare i codici di comando di roomba per il file lirc.conf ho trovato questo pezzo di codice.
Incollo di seguito il prodotto dello script che va scritto nel file /etc/lirc/lircd.conf
# Automatically generated LIRC Roomba config file
begin remote
name iRobot_Roomba
flags RAW_CODES|CONST_LENGTH
eps 30
aeps 100
ptrail 0
repeat 0 0
gap 100000
begin raw_codes
name left
3000 1000 1000 3000 1000 3000
1000 3000 1000 3000 1000 3000
1000 3000 3000 17000 3000 1000
1000 3000 1000 3000 1000 3000
1000 3000 1000 3000 1000 3000
3000
name forward
3000 1000 1000 3000 1000 3000
1000 3000 1000 3000 1000 3000
3000 1000 1000 19000 3000 1000
1000 3000 1000 3000 1000 3000
1000 3000 1000 3000 3000 1000
1000
name right
3000 1000 1000 3000 1000 3000
1000 3000 1000 3000 1000 3000
3000 1000 3000 17000 3000 1000
1000 3000 1000 3000 1000 3000
1000 3000 1000 3000 3000 1000
3000
name spot
3000 1000 1000 3000 1000 3000
1000 3000 1000 3000 3000 1000
1000 3000 1000 19000 3000 1000
1000 3000 1000 3000 1000 3000
1000 3000 3000 1000 1000 3000
1000
name dock
3000 1000 1000 3000 1000 3000
1000 3000 1000 3000 3000 1000
1000 3000 3000 17000 3000 1000
1000 3000 1000 3000 1000 3000
1000 3000 3000 1000 1000 3000
3000
name small
3000 1000 1000 3000 1000 3000
1000 3000 1000 3000 3000 1000
3000 1000 1000 19000 3000 1000
1000 3000 1000 3000 1000 3000
1000 3000 3000 1000 3000 1000
1000
name medium
3000 1000 1000 3000 1000 3000
1000 3000 1000 3000 3000 1000
3000 1000 3000 17000 3000 1000
1000 3000 1000 3000 1000 3000
1000 3000 3000 1000 3000 1000
3000
name clean
3000 1000 1000 3000 1000 3000
1000 3000 3000 1000 1000 3000
1000 3000 1000 19000 3000 1000
1000 3000 1000 3000 1000 3000
3000 1000 1000 3000 1000 3000
1000
name pause
3000 1000 1000 3000 1000 3000
1000 3000 3000 1000 1000 3000
1000 3000 3000 17000 3000 1000
1000 3000 1000 3000 1000 3000
3000 1000 1000 3000 1000 3000
3000
name power
3000 1000 1000 3000 1000 3000
1000 3000 3000 1000 1000 3000
3000 1000 1000 19000 3000 1000
1000 3000 1000 3000 1000 3000
3000 1000 1000 3000 3000 1000
1000
name forwardleft
3000 1000 1000 3000 1000 3000
1000 3000 3000 1000 1000 3000
3000 1000 3000 17000 3000 1000
1000 3000 1000 3000 1000 3000
3000 1000 1000 3000 3000 1000
3000
name forwardright
3000 1000 1000 3000 1000 3000
1000 3000 3000 1000 3000 1000
1000 3000 1000 19000 3000 1000
1000 3000 1000 3000 1000 3000
3000 1000 3000 1000 1000 3000
1000
name stop
3000 1000 1000 3000 1000 3000
1000 3000 3000 1000 3000 1000
1000 3000 3000 17000 3000 1000
1000 3000 1000 3000 1000 3000
3000 1000 3000 1000 1000 3000
3000
name sendall
3000 1000 1000 3000 1000 3000
1000 3000 3000 1000 3000 1000
3000 1000 1000 19000 3000 1000
1000 3000 1000 3000 1000 3000
3000 1000 3000 1000 3000 1000
1000
name seekdock
3000 1000 1000 3000 1000 3000
1000 3000 3000 1000 3000 1000
3000 1000 3000 17000 3000 1000
1000 3000 1000 3000 1000 3000
3000 1000 3000 1000 3000 1000
3000
name virtualwall
3000 1000 1000 3000 3000 1000
1000 3000 1000 3000 1000 3000
3000 1000 1000 19000 3000 1000
1000 3000 3000 1000 1000 3000
1000 3000 1000 3000 3000 1000
1000
end raw_codes
end remote
Codice di start
Questo pezzo è scritto per essere utilizzato con la scheda PiFace che è montato sul mio Raspberry Pi, ma difficilmente interesserà altri perchè questa board monta due relè, ma non sopportano la tensione di rete, ma al massimo 20Volts. Ne ho utilizzato uno per pilotare un relè a 240Volts, ma è un pò uno spreco.
Inoltre ho dovuto cambiare il connettore di connessione tra il raspberry e Piface per permettere la connessione del led.
Lo riporto qui per spiegare quali sono le fasi di attivazione del Raspeberry ed i timer che sono fondamentali e hanno richiesto un pò di tempo per la calibrazione, ma va riscritto per chi lo volesse usare senza la board Piface aggiuntiva.
#!/usr/bin/python
from time import sleep
import pifacedigitalio
import os
#count is a counter of start attempts
count = 0
#maximum number of attemptes of start on fail after max_start exit
max_start=10
#use piface expansion board
pifacedigital = pifacedigitalio.PiFaceDigital()
#align led number 7 of piface board with limit switch sensor
pifacedigital.leds[7].value=pifacedigital.input_pins[7].value
#Turn off relay, when relay is off Roomba
print "Reset Relay"
pifacedigital.relays[0].turn_off()
sleep(2)
print "End Reset"
if pifacedigital.input_pins[7].value == 0 :
print "Roomba@work P7=" + str(pifacedigital.input_pins[7].value)
pifacedigital.leds[7].value=pifacedigital.input_pins[7].value
pifacedigital.relays[0].turn_off()
else :
print "Roomba@home P7=" + str(pifacedigital.input_pins[7].value)
print "Starting...."
while ( pifacedigital.input_pins[7].value == 1 and count <= max_start ) :
print "Roomba@home P7=" + str(pifacedigital.input_pins[7].value)
pifacedigital.relays[0].turn_on()
sleep(3)
os.system("/usr/bin/irsend SEND_START iRobot_Roomba clean")
sleep(3.5)
pifacedigital.relays[0].turn_off()
sleep(2)
os.system("/usr/bin/irsend SEND_STOP iRobot_Roomba ''")
pifacedigital.leds[6].value=pifacedigital.input_pins[7].value
sleep(3)
count=count+1
if count > max_start :
print "Maximun number of start: " + str(max_start) + " reached .. KO"
if pifacedigital.input_pins[7].value == 0:
print "Roomba started"
pifacedigital.leds[6].value=1
else :
print "Problem starting roomba"
Passaggi
Riassumendo:
- Configuro i pin del GPIO
- Attivo il rele -> Disattivo la stazione di ricarica
- Attendo 2 secondi -> Roomba si risveglia
- Spengo il rele -> Riattivo la stazione di ricarica (altrimenti Roomba ci va a sbattere perche' non emette segnali infrarossi)
- Verifico lo switch per capire se il robot e' gia' al lavoro o comunque fuori dalla postazione di carica, in questo caso lo script termina
- Se il robot e' sulla base, inizio un ciclo di massimo 10 tentativi di avvio
- Durante il ciclo invio il comando di start, attento 3.5 secondi e verifico se il robot si e' staccato dalla base altrimenti ricomincio.
Generalmente in 2/3 cicli il robot si avvia.