Roomba scheduler

Da raspibo.

Indice

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:

  1. Rele' (consigliato a 3 contatti per utilizzare il normalmente chiuso)
  2. Alimentatore per il rele'
  3. Led infrarosso (va benissimo riciclato da vecchio telecomando a infrarossi)
  4. Transistor e resistenza (per pilotare il led a infrarossi, il gpio da solo non basta)
  5. 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.

Strumenti personali
Namespace

Varianti
Azioni
Navigazione
Strumenti