Wirtualna ściana iRobot roomba

By | Luty 25, 2020

Od dawna sprzątaniem w domu zajmuje się „Marysia” sprytny robocik roomba. Ograniczałem jej obszar sprzątania ciężarkiem, który blokował przejście pomiędzy pomieszczeniami. Jednak gdy niechcący w niego kopnąłem, pomyślałem że muszę w końcu zrobić wirtualną ścianę.

Oczywiście rozpocząłem od przeszukania internetu, gdyż tak trywialny problem pewnie już ktoś przede mną rozwiązał. Po kilku minutach szukania znalazłem świetny artykuł na forbocie, w którym autor przeanalizował sposób działania takiej ściany i korzystając z jego opisu złożyłem szybko urządzenie prototypowe na płytce stykowej.

Prototyp ściany.

Urządzenie jest bardzo proste i składa sie z procesora Attiny13, diody nadawczej świecącej w podczerwieni, diody sygnalizującej pracę, dwóch rezystorów, koszyczka na baterie i kilku kabelków do połączenia tego razem.

Schemat ideowy

Programowanie ATtiny13 jest bardzo proste i z użyciem biblioteki microCore oraz programatora USBasp, można to robić z poziomu środowiska arduino.
Źródło programu pobrałem ze wspomnianej już wcześniej strony  Autor wykonał w tym kodzie kilka poprawek optymalizujących zużycie prądu:

#ifndef F_CPU
#define F_CPU 9600000UL
#endif

#include <avr/sleep.h>
#include <avr/wdt.h>
#include <avr/io.h>
#include <util/delay.h>

ISR(WDT_vect)
{}

#define pon do { \
        TCCR0A |= (1<<WGM01) | (1<<COM0A0);\
        TCCR0B |= (1<<CS00); \
      } while(0)
 
#define poff do { \
        TCCR0A &= ~((1<<WGM01) | (1<<COM0A0)); \
        TCCR0B &= ~(1<<CS00); \
        PORTB &= ~(1 << PB0);\
      } while (0)
 
int main(void)
{
    char i, n;
    DDRB |= (1 << PB0) | (1 << PB1);
    PORTB |= (1 << PB1);
    OCR0A = 125;
    
    // watchdog
    
    MCUSR &= ~(1<<WDRF);
    WDTCR |= (1 << WDCE) | (1 << WDE);
    WDTCR = 1 | (1 << WDCE);
    WDTCR |= (1 << WDTIE);
    
    sei();

    for (n=0;; n= (n + 1) & 7) {
        if (!n) PORTB |= (1 << PB1);
        for (i=0; i<3; i++) {
            pon;
            _delay_us(500);
            poff;
            if (i<2) _delay_us(7500);
        }
        if (!n) PORTB &= ~(1 << PB1);
        for (i=0; i<5; i++) {
            set_sleep_mode(SLEEP_MODE_PWR_DOWN);
            sleep_mode();
        }
    }  
}

Kolejny etap w pracach nad tym projektem to przygotowanie obudowy, w tym celu wymodelowałem w programie 3D bryłę ściany z miejcem wewnątrz na pomieszczenie koszyczka na baterię oraz elektronikę. N górze bryły umieściłem dwa otwory jeden na diodę LED sygnalizującą pracę oraz drugi w którym zamocowałem wyłącznik.

Modelowanie 3D.

Szczelina od frontu kryje diodę LED nadającą w podczerwieni odpowiednio zmodulowany sygnał który nie pozwala roombie przejechać dalej. Kształt tej szczeliny powoduje że wiązka w podczerwieni jest stosunkowo wąska i pozwala na łatwe ustawienie obszaru chronionego przed robotem.

Render obudowy wirtualnej ściany.

Jako że schemat elektryczny połączeń jest bardzo prosty, nie robiłem specjalnie płytki do tej konstrukcji tylko zmontowałem układ na płytce uniwersalnej.

Po zamontowaniu elektroniki w wydrukowanej obudowie ściana jest gotowa do pracy.

R.