Roomba scheduler
Qualche tempo fa ho comprato un robot Roomba 615 per la pulizia dei pavimenti. Questo robot è studiato per la pulizia quotidiana dei pavimenti, ma spesso di dimenticavo di avviarlo quando uscivo di casa e farlo funzionare mentre si è in casa è un pò scomodo anche se accettabile.
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.
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
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"