Programmierung eines Autonomen Vehikels mit objektorientierten Modulen
(EN google-translate)
(PL google-translate)


Die Möglichkeiten der Programmierung sind an der nachfolgend abgebildeten Platine zu ersehen:
|

Bild 0-1: Fahrzeugplatine
Konfiguration für Timer 1:
TCCR1A = (1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (0<<FOC1A) | (0<<FOC1B) | (1<<WGM11) | (1<<WGM10); TCCR1B = (0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (1<<CS11) | (1<<CS10); DDRD |= (1<<PB5) | (1<<PB4); //auf Ausgang setzen. OCR1A = 108;// 72...144, middle 108 OCR1B = 108;// 72...144, middle 108
Code 0-1: Passende Konfiguration für die Servos. - Es ergibt sich ein sinnvoller PWM-Bereich von 72 bis 144 (vergl. Kapitel 4.8 "Verfeinerte Winkelauflösung")
Konfiguration für den Analog-Digital-Wandler:
ADCSRA = (1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (1<<ADPS0); ADMUX = (0<<REFS1) | (0<<REFS0) | (1<<ADLAR) | (0<<MUX4) | (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (0<<MUX0); DDRA &= 0b11111110; Wert holen: int holeWert() { ADCSRA |= (1<<ADSC); while( (ADCSRA & (1<<ADSC)) ); x = ADCL; y = ADCH; return ((y<<2) | (x>>6)); }
Code 0-2: Kein Freilaufmodus. Neuer Wert wird bei Bedarf geholt.
Abstrakte Klassen
Über abstrakte Klassen mit virtuellen Methoden, können die Schnittstellen (Objektmethoden) einer Klasse vorab vereinbart werden: Die eigentliche Klasse erbt von der abstrakten Klasse und muss die dort vereinbarten Methoden exakt implementieren.
Hinweis: In Java kann dieses Konzept über Schnittstellen (Schlüsselwort interface) realisiert werden.
Hier ein Beispiel aus einem älteren Projekt mit änlicher Zielrichtung:
class CoachBASIS { virtual void start(); virtual void stop(); virtual int summe(int,int); };
Code 0-3: Datei CoachBASIS.h
class Coach : CoachBASIS { public: Coach() { } void start() { DDRA = 0b00000000; DDRB = 0b00000000; DDRC = 0b00000000; DDRD = 0b10111000; PORTA = 0b00000000; PORTB = 0b00000000; PORTC = 0b00000000; PORTD = 0b10111000; } void stop() //hier wie start() { DDRA = 0b00000000; DDRB = 0b00000000; DDRC = 0b00000000; DDRD = 0b10111000; PORTA = 0b00000000; PORTB = 0b00000000; PORTC = 0b00000000; PORTD = 0b10111000; } int summe(int x, int y) { return x+y; } };
Code 0-4: Datei Coach.h - erbt von CoachBASIS, muss start(), stop() und int summe(int,int) implementieren.
Übungen (3./4.6.2014)
Im Verlauf der kommenden Übungen und Vorlesungen soll basierend auf den obign Angaben ein modulares objektorientiertes Framework zur Programmierung der AVs umgesetzt werden.
Aufgabe 1 - Sicherer Start
Ähnlich zu Coach / CoachBASIS soll eine Klasse Fahrzeug umgesetzt werden, die die in FahrzeugBASIS vereinbarten Methoden implementiert.
Die Klasse Fahrzeug dient dazu, dass nach dem Einschalten des Mikrocontrollers das Fahrzeug mit der Start-Methode in einen sicheren Zustand überführt wird.
class FahrzeugBASIS { virtual void start(); virtual void stop(); virtual int summe(int,int); };
Code 0-5: Datei FahrzeugBASIS.h
Aufgabe 2 - Serielle Kommunikation
Setzen Sie nachfolgende abtrakte Klasse RS232BASIS in einer von ihr erbenden Klasse RS232 in sinnvoller Weise um.
Schreiben Sie ein passendes Testprogramm.
class RS232BASIS { virtual void start(); virtual void stop(); virtual void sendeZeichen(char); virtual char empfangeZeichen(); virtual void sendeText(char*); virtual void empfangeText(char*); virtual void sendeInt(int); virtual int empfangeInt(); };
Code 0-6: Datei RS232BASIS.h
Aufgabe 3
Setzen Sie nachfolgende abtrakte Klasse SensorBASIS in einer von ihr erbenden Klasse Sensor in sinnvoller Weise um.
Schreiben Sie ein passendes Testprogramm, welches RS232 verwendet und die aktuellen Sensorwerte anzeigt.
class SensorBASIS { virtual void start(); virtual void stop(); virtual int holeWert(); };
Code 0-7: Datei SensorBASIS.h
Aufgabe 4
Setzen Sie nachfolgende abtrakte Klasse LEDBASIS in einer von ihr erbenden Klasse LED in sinnvoller Weise um.
Hinweis: der übergebene Wert bei an(unsigned char), aus(unsigned char) bezeichnet die Nummer der zu schaltenden LED.
Schreiben Sie ein passendes Testprogramm, welches RS232 verwendet, um über ein PC-Terminal die LEDs zu schalten.
class LEDBASIS { virtual void start(); virtual void stop(); virtual void an(unsigned char); virtual void aus(unsigned char); };
Code 0-8: Datei LEDBASIS.h
Aufgabe 5
Schreiben Sie sinnvolle Klassen TasterBASIS und Taster nach dem gleihen Schema wie bei den vorangegangenen Aufgaben.
Gesamtkonzept
In der Vorlesung am 11.06.2014 wird abschließend beispielhaft ein Gesamtkonzept für ein sehr einfaches autonomes Vehikel umgesetzt.
Aufgaben hierzu (17.6./18.6.):
Aufgabe 1
|
Aufgabe 2
Das, was der Entfernungssensor im Verlauf einer Testfahrt geliefert hat, soll im Mikrocontroller gespeichert und bei Tastendruck an den PC geschickt werden.
Der Einfachheit halber soll dort in gtkterm ein zeilenweises Balkendiagramm sichtbar werden, um den Verlauf der Sensorwerte darzustellen, ähnlich wie nachfolgend (günstigerweise mit zusätzlicher Zeitangabe):
0.1s #### 0.2s ###### 0.3s ############ 0.4s ############## 0.5s ############## 0.6s ########## 0.7s ###### 0.8s ### 0.9s # 1.0s ###### 1.1s ########## 1.2s ############# 1.3s ##### 1.4s ## usw.
Code 0-9: Ausgabe des Sensorwert-Verlaufs auf gtkterm am PC.