Sie sind auf Seite 1von 11

Problem: Steuerung eines Roboters

Voraussetzung: Roboter mit zwei unabhngig steuerbaren Rdern

Eingabe: gewnschte Geschwindigkeit

Aufgabe: Roboter fhrt geradeaus mit dieser Geschwindigkeit


1

Differentialantrieb

Analyse: Steuerung vs. Regelung

Problem: kleine Unterschiede zwischen Rdern


(Motorcharakteristik, Reibung, Steigung )

Folge: bei gleicher Ansteuerung drehen Rder


unterschiedlich schnell Roboter fhrt Kurve

Idee: statt Rder nur anzusteuern,


Regelung der Geschwindigkeit

Sensoren: messe Geschwindigkeit der beiden Rder

Regelung: berechne Motoranforderung fr beide Rder

Aktoren: steuere Motoren der beiden Rder


3

Sensoren: gewhlte Komponenten

Gabellichtschranke (infrarot)

Lochscheibe
(20 Lcher = 40 Segmente)

Sensoren: Funktionsprinzip

Schritt 1: zhle die Anzahl der


Segmentwechsel pro Sekunde

Schritt 2: berechne daraus die


Radgeschwindigkeit

Voraussetzung: Rad dreht sich


kontinuierlich in die gleiche
Richtung

Geschwindigkeit [m/s] = Radumfang [m]

gezhlte Segmente [1/s]


Segmente pro Umdrehung
6

Aktoren: Gleichstrommotor

Gleichstrommotor mit Motortreiber

Schnittstelle: gewnschte Drehzahl (PWM: 0-255)


7

Regelung eines Rads: Grundstruktur


Soll-Geschwindigkeit
(Fhrungsgre)

Ist-Geschwindigkeit

+_

gewnschte Drehzahl
(Stellgre)

Radgeschwindigkeit
(Regelgre)

Regler
Motortreiber

Segment-Impulse
(Messgre)

Sensor-
auswertung
Sensor

Software fr eingebettete Systeme

fortlaufende Interaktion mit Umgebung

Systemverhalten = Sequenz von Reaktionen

lese Eingaben, aktualisiere Zustand, schreibe Ausgaben

10

Software fr Arduino

Arduino-Software hat zwei wesentliche Funktionen:

setup: Funktion zur Initialisierung, einmalig zu Beginn

loop: wiederholter Aufruf danach


void setup () {
pinMode(pinEncLeft, INPUT);
pinMode(pinEncRight, INPUT);
pinMode(pinPwmLeft, OUTPUT);
pinMode(pinPwmRight, OUTPUT);
}
void loop () {
// ???
}

11

Sensorauswertung (1/2): Zhlen der Segmente


void detectSeg() {
int curEncLeft =
digitalRead(pinEncLeft);
if (curEncLeft != prevEncLeft) {
nrSegLeft++;
prevEncLeft = curEncLeft;
}

linke Lichtschranke
momentan geschlossen?

bei Zustandsnderung:
Zhler erhhen und
neuen Zustand merken

nrSegLeft zhlt die Anzahl der Segmente

Funktion detectSeg muss oft genug aufgerufen werden


12

Sensorauswertung (2/2): Radgeschwindigkeit


void computeWheelSpeed () {
vLeft = nrSegLeft
* wheelCirc / discSegs;
nrSegLeft = 0;
}

Radgeschwindigkeit aus
Zhler berechnen
Zhler fr die nchste
Berechnung zurcksetzen

Funktion computeWheelSpeed jede Sekunde aufrufen

nicht allzu hufig, da Segmente gezhlt werden mssen

nicht allzu selten, damit Geschwindigkeit aktuell ist


13