Forum: Projekte & Code Roomba(581) Virtual Wall mit ATtiny13A


von J. -. (Gast)


Lesenswert?

Moin, hier eine Virtual Wall für den alten Zossen Roomba (581 u.a.) mit 
dem ATtiny13A. Kompiliert mit WinAVR.
Die 940nm-IR-LED ist über 68Ohm an PB0 angeschlossen.
1
// Roomba (581) Virtual Wall mit ATtiny13A, IR-LED an PB0 (OC0A)
2
// F_CPU = 9600000, MCU = attiny13a, FuseHIGH = 0xFF, FuseLOW = 0x7A
3
4
#include <avr/io.h>
5
#include <util/delay.h>
6
7
#define IR_on()    (DDRB |= (1<<PB0))
8
#define IR_off()  (DDRB &= ~(1<<PB0))
9
10
int main (void) 
11
{
12
  // TIMER0, 38kHz
13
  TCCR0A = (1<<COM0A0)|(1<<WGM01);// CTC, Toggle A, TOP = OCRA
14
  TCCR0B = (1<<CS00);    // clk/1    
15
  OCR0A = 126-1;      // 9600000/38000 = 252, 252/2 = 126 (Toggle)
16
  DDRB = (1<<PB0);    // OC0A = PB0 = Ausgang, alle andere Pins Eingang
17
  
18
  // RoombaVirtualWall-Protokoll
19
  while(1)
20
  {
21
    // 1. Paket
22
    IR_on();  // Ausgang OC0A einschalten
23
    _delay_us(500);
24
    IR_off();  // Ausgang OC0A ausschalten
25
    _delay_us(7500);
26
    
27
    // 2. Paket
28
    IR_on();  
29
    _delay_us(500);
30
    IR_off();  
31
    _delay_us(7500);
32
    
33
    // 3. Paket
34
    IR_on();  
35
    _delay_us(500);
36
    IR_off();  
37
    _delay_ms(134);
38
  }
39
}

Beitrag #6582074 wurde von einem Moderator gelöscht.
von Der Chef (Gast)


Lesenswert?

Servus,

ich weiß zwar nicht, was die Roomba(581) Virtual Wall sein soll, aber 
ein paar Anmerkungen zum Code:

1. Warum kein Brown-Out gesetzt?
Bei 9,6MHz braucht man mindestens ~3V (oder Brown-Out auf 2,7V gesetzt). 
Kann vor seltsamen Verhalten schützen.

2. Warum 9,6MHz?
Der Code sollte auch mit 4,8MHz oder noch weniger (dann per Prescaler) 
funktionieren, und der Stromverbrauch sinkt um knapp 50% (bei 9,6MHz ==> 
4,8MHz) oder noch weiter.

3. Nutzen von IDLE-Mode
Da sich der µC "die ganze Zeit" im _delay_us() befindet bietet es sich 
natürlich an, den µC während dieser Zeit schlafen zu legen (IDLE-Mode) 
und dann per Interrupt aufwecken zu lassen. Ist halt blöd, daß der 
einzige Timer schon fürs PWM verwendet ist.

Ideen:
- TIMER 0 Overflow verwenden und diese "hochzählen"
- Den ADC im free-Run laufen lassen, und per ADC-Interrupt diesen dann 
als regelmässige Taktquelle verwenden. Da muß man aber schauen, ob man 
per ADC-Prescaler den richtigen Takt hinbekommt.
==> Vorteil: man lernt den µC kennen (das schadet nie) und spart noch 
ein paar mA (auch ganz nett)

Gruß

von Oliver S. (oliverso)


Lesenswert?

Man könnte auch einfach einen größeren Tiny oder auch Mega nehmen. Platz 
und Geld sollten das hergeben.

Oliver

von J. -. (Gast)


Lesenswert?

Der Chef schrieb:
> ich weiß zwar nicht, was die Roomba(581) Virtual Wall sein soll
Und ich weiß gar nicht, ob es das überhaupt noch gibt, weil die neueren 
Saugroboter wahrscheinlich schon wesentlich cleverer sind.
Die Virtual Wall wirkt wie eine Absperrung für den Roboter, so daß er 
den gepulsten IR-Strahl nicht kreuzt. Er fährt am Strahl entlang wie an 
einer Wand, kann aber das Gebiet auf der anderen Seite nicht erreichen. 
Das Protokoll kennt nicht jeder, und mit den delay-Angaben kann man 
sehen, wie es funktioniert. Auch für weniger alte Roombas (zumindest die 
700er) funktioniert es.

Die mitgelieferten VWs sind klobig, brauchen zwei Babyzellen, sind immer 
leer, wenn man sie braucht, und der Abstrahlwinkel ist ziemlich breit.
Der kleine Tiny und eine 3mm IR-Led lassen sich einfacher verstecken, 
und sie hängen bei mir an einer dünnen 5V-Leitung hinter der 
Fußbodenleiste.
> ein paar Anmerkungen zum Code:
Deine Vorschläge sind für Batteriebetrieb gut geeignet. Habe ich gar 
nicht drüber nachgedacht.

Oliver S. schrieb:
> Man könnte auch einfach einen größeren Tiny oder auch Mega nehmen. Platz
> und Geld sollten das hergeben.
Oder einen Cortex M4, da kann man auch noch mehr LEDs an die Pins hängen 
g. Die Tiny13A sind tatsächlich überdimensioniert für den Zweck, aber 
gibt es halt unverschämt günstig beim schnellen Ali.

von Uwe B. (uwebre)


Lesenswert?

Jürgen S. schrieb:
> Moin, hier eine Virtual Wall für den alten Zossen Roomba (581 u.a.) mit
> dem ATtiny13A. Kompiliert mit WinAVR.

Obercool, danke für die Anregung.
Ein "Prototyp" läuft auf Anhieb mit Teilen aus der Kiste (ATINY45, Timer 
angepasst, 5mmLED, Li-Ion Akku)

Uwe

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.