Line follower "Friedrich LXIX"
aus MariaTheresia, der freien Wissensdatenbank
| Org.Unit | 4AHDVN |
| (Schul)jahr | 2006/07 |
| Teilnehmer | Lukas Hainzl, Lukas Leidinger, Patrik Schlögel,Florian Wolf |
| Keywords |
Roboter, Line follower, Slalom Enhanced, Robotchallenge |
Überblick
Wir sind ein 4-köpfiges Team aus dem 4.Jahrgang der HTL Spengergasse im Netzwerktechnik. Dieses Jahr (2007) wollen wir in der Disziplin "Slalom Enhanced" der RobotChallenge starten.
Aufgabenstellung
Regeln
Hier eine kurze Zusammenfassung der Herausforderungen:
- Fritz muss einer Linie mithilfe seiner Sensoren folgen können.
- Er muss eine Linienunterbrechung überbrücken und die Linie wiederfinden können.
- Ein Hindernis welches sich auf dem Weg befindet muss umfahren werden.
- Friedrich muss durch ein Tunnel passen.
Für die genauen Reglen unter Robotchallenge 07 (http://www.robotchallenge.at) schauen! Julian Knell vom Team Puck_Collect_"Pickup" wird zu der Zeit vermutlich in Wien sein und uns vertreten.
Technische Umsetzung
Grundaufbau
Es wird ein Funkferngesteuertes Auto hergenommen und der Empfänger und der Fahrtenregler entfernt, das heißt wir nehmen einfach nur das chassis des Autos und bauen Servo und Motor ein.
Linie folgen
- Für die Linienerkennung verwenden wir 5 IR-Dioden vorne und eine hinten.
- Die Dioden vorne an unseren Roboter sind so zu verstehen, dass wenn die mittlere Diode die Linie hat fährt der Roboter mit vollen Speed und um so weiter die Linie zu den äußeren Dioden kommt umso langsmaer fährt der Roboter und versucht die Linie wieder in die Mitte zu bekommen indem er einfach gegenlenkt.
Linienunterbrechung
- Die IR-Diode hinten ist für die Linienunterbrechung wichtig, damit wir wissen ob der Roboter die Linie ganz verloren hat oder ob die Linie unterbrochen ist, da der Abstand zwischen denr hinteren Diode und den vorderen Dioden größer ist als die Unterbrechung.
Linie verloren
- Wenn die Linie verloren geht setzt der Roboter zurück und lenkt in die Gegenrichtung, zu der Richtung in die er gelenkt hatte als er die Linie verloren hatte.
Hindernisse ausweichen
- Ein Ultraschalempfänger und -sender wird verwendet um das Hinderniss zu erkennen.
- Das Ultraschalmodul wird auf einen zweiten Servo montiert der beim erkennen des Hindernissen nach links schwenkt, da wir rechts am Hinderniss vorbei fahren, und wenn das Ultraschallmodul im Winkel 90° zum Hinderniss steht schwenkt der Servo wieder in die Ausgangsposition zurück und das Auto beginnt wieder auf die Linie zurück zu lenken.
Tunnel durchfahren
- Der Roboter darf den Tunnel nur nicht als Hinderniss erkennen.
- Die Austrahlungslänge und Austrahlungsgrad des Ultraschalmoduls muss entsprechend angepasst werden.
Benutzte Hardware
- 1x PIC16F877 Prozessor
- 1/2x TC4424 Motorbrücke (1/2 weil nur ein Motor zum steuern ist)
- 1x L293D & L293C Motorbrücke
- 1x TLE4201 Motorbrücke
- 2x Servos (einer zum Lenken, einer unter dem Ultraschallmodul)
- 1x Ultraschallempfänger - US400ST160
- 1x Ultraschallsender - US400SR160
- 6x IR-Dioden+Empfänger - CNY70
- 1x Chassis eines Funkferngesteuerten Autos
- 1x Elektromotor
- 1x Abschussrampe
Pläne
Status
20.12.2006
- Friedrichs Hirn ist fertiggestellt und funktionstüchtig. Kernteil ist die 16F877_Platine.
- Pause bis zum neuen Jahr - Unser Team braucht dringend Erholung ;) danach gehts mit dem Bauen los.
10.01.2007
- Großer Stress, morgen soll der Zwischenstand der Hardware präsentiert werden. Aus dem Grund, wird unser Auto morgen ausgehöhlt :)
- Die ersten grundlegenden Pläne werden auf Wolfs neuem Palm gezeichnet
11.01.2007
- Die Zwischenstand(präsentation) hat sich gelohnt, jetzt haben wir endlich begonnen und liegen gut im Rennen.
- Das Auto ist nun leer, bis auf den Motor (Die Abschussrampe haben wir natürlich aufgehoben ;) der Motor ist auch ausgetestet und läuft bei 7,2 Volt Spannung. (Abschussrampe läuft ab ca. 3 Volt bis ??)
- Heute sind wir auch draufgekommen, dass wir vorne wahrscheinlich 5 IR-Dioden&Empfänger verwenden werden... Aber mal sehen.
13.01.2007
- Größter Teile der Hardware sind jetzt in unseren Besitz.
- Es fehlt nur der Ultraschall Sender.
- Jetzt kann es mit dem bauen los gehen.
18.01.2007
- Vorgehensplan des Projekt wurde erstellt - Sowas ähnliches wie ein Schaltplan für das Team damit die Hardware beorgt werden kann und endlich alles zusammen gebaut werden kann.
- Grundplan der Motorbrücke wird erstellt, damit sie in den nächsten Wochen gebaut werden kann.
14.02.2007
- Nach den Semesterferien geht es jetzt mit der Software los
- Wir haben uns entschlossen die IR-Bauteile über einen MacroMaster anzusprechen, welches Florian Wolf übernehmen wird. Es werden alle IR/Ultraschall-Bauteile über diesen angesprochen. Zwischen MacroMaster und PIC besteht eine Verbindung mit Datenkanal und Steuerkanal da die Kommunikation nur einseitig zum PIC hin ist.
- Theorie der Kommunikation:
- Steuerleitung setzt der PIC auf HIGH wenn er nicht zum Empfangen bereit ist(Wenn nicht in der Empfang-Funktion) sobald er diesen Abschnitt erreicht -> LOW, MacroMaster darf senden, setzt Steuerleitung auf HIGH und sendet Daten, dann wieder Steuerleitung auf LOW.Dieser Mechanismus wird als eine Art LOCK.
- Definition des Übertragungsprotokols, Codierung:
- Richtungsbit
- 0 -> Rechts
- 1 -> Links
- Ausschlagsbit, Wie stark Ausschlagen
- 0 -> leicht
- 1 -> stark
- Geschwindigkeitsbit
- 0 -> leicht
- 1 -> stark
- Fahrtrichtung
- 0 -> Vorwärts
- 1 -> Rückwärts
- Richtungsbit
Bsp:
wenn Steuerleitung LOW
setzte Steuerleitung HIGH
schicke 101
setzte Steuerleitung LOW
Auswirkung: Das Auto lenkt leicht nach Links und fährt schnell.
18.02.2007
- Der Plan der Motorbrücke wurde fertiggestellt.
19.02.2007
- Die Motorbrücke wurde mit Hilfe einer Lochrasterplatine fertiggestellt, es muss nur noch der TC4424 Prozessor auf die Schaltung gelötet werden, da ich nur zwei Hände habe und bei bei den kleinen Lötstelle die der Prozessor benötigt funktionert es nicht in dem man den Draht nur in die nähe legt.
- Die Motorbrücke wird in der nächsten Stunde fertiggestellt.
22.02.2007
- Motorbrücke ist mit der Lochrasterplatine endgültig fertiggestellt
- Schaltplan für das IR-Modul ist auch fertig
- Der Großteil der IR-Schaltung ist schon fertig gebaut nur noch die A/D Wandler fehlen, da wir auf die Microchip Samples warten müssen
- Habe eine geäzte Platine vom Prof. Dabrowski erhalten.
27.02.2007
- Bauteile für die Motorbrücke und die IR-Schaltungen besorgt.
- Motorbrücke wurde mit der geäzten Platine vom Prof. Dabrowski fertiggestellt.
28.02.2007
- Die IR-Schaltung benötigt doch keinen A/D Wandler zwischen dem Infrarotsensor und dem PIC-Prozessor da die PIC-Prozessorschaltung 8 A/D Wandler Ports besitzt.
01.03.2007
- IR-Schaltungen wurden fertiggestellt.
- US-Module wurden fertiggestellt, die Bausätze vom Conrad wurden jetzt verwendet, weil der Prof. Dabrowski leider nicht da war.
08.03.2007
- Die Ansteuerung des Servos wurde getestet.
12.03.2007
- Alle Teile wurden entgültig am Auto angebracht.
05.03.2007
- Neue Motorbrücke fertiggestellt
12.04.2007
- Motorbrücke Testprogramm schreiben, Softwarefehler, finde diesen jedoch nicht.
19.04.2007
- Testen der Motorbrücke mit neuer Software - funktioniert soweit, jedoch Probleme beim anfahren, Motorbrücke ist vielleicht zu schwach
26.04.2007
- Nach langem Testen sind wir mit Herrn Prof. DAB zu dem Schluss gekommen, dass:
- Unsere Motorbrücke nicht funktioniert und
- Die Motorbrücke zu schwach für unseren Motor wäre.
Also müssen wir einen L293D kaufen und mit diesem die neue Motorbrücke bauen.
03.05.2007
- Chip heute in der Früh gekauft, Lukas H. baut mit DAB gerade die Motorbrücke.
- Lukas L. schreibt das Programm fertig.
17.05.2007
- Besprechung von ASM und C Code mit Wodnar, Strukugramme vereinbart.
24.05.2007
- Die dritte Motorbrücke wurde gebaut, nämlich die L293D.
- Diese Motorbrücke funktioniert wieder nicht optimal mit dem Motor, weil er zu viele Turns hat und deswegen den Speed über die Spannung aufbaut.
11.06.2007
- Struktogramm für den PIC-Code fertiggestellt und hochgeladen
PIC-C-Code
Zur leichteren Überschaubarkeit, eine Vereinfachung als primitives Struktogramm
/*
/*
PIC C Code des Friedrich LXIX
Lukas Leidinger
4AHDVN, 2006/07, HTBLVA Spengergasse
*/
#include "16F877a.h"
#include "atrox.h"
#fuses HS,NOWDT,NOPROTECT,NOWDT
#use delay ( clock=20000000 ) // 20Mhz
// B0 .... Signalleitung
// B1 .... Datenleitung
void recv ( int ret [ ] );
void steuerung ( int ctrl [ ] );
void motor ( int gas, int forBack ) ;
void servo ( int dir , int ausschlag );
void left ( int ausschlag );
void right ( int ausschlag );
void motordir ( short int dir );
void motorfree ( );
void motorstop ( );
void main ( void )
{
int receive [ 4 ];
receive [ 0 ] = 0;
receive [ 1 ] = 0;
receive [ 2 ] = 0;
receive [ 3 ] = 0;
while ( 1 )
{
recv ( receive );
steuerung ( receive );
}
}
void recv ( int ret [ ] )
{
if ( input ( pin_b0 ) ) //wenn Steuerleitung high -> dann empfange 4 Bits
{
int i;
motorfree ( ); //Leerlauf während dem empfang
for ( i = 0 ; i < 5 ; i++ ) //fülle Array mit 0en
{
ret [ i ] = 0;
}
if ( input ( pin_b1 ) )
{
ret [0] = 1;
}
if ( input ( pin_b2 ) )
{
ret [1] = 1;
}
if ( input ( pin_b3 ) )
{
ret [2] = 1;
}
if ( input ( pin_b4 ) )
{
ret [3] = 1;
}
}
}
void steuerung ( int ctrl [ ] )
{
servo ( ctrl [ 0 ], ctrl [ 1 ] ); //bit 1,2 für servosteuerung
motor ( ctrl [ 2 ], ctrl [ 3 ] ); //bit 3,4 für motorsteuerung
}
void motor ( int gas, int dir ) //PIN_C1,2 -> PWM
{
if ( !gas ) //Langsames fahren
{
gas = 125;
}
else //Schnelles fahren
{
gas = 255;
}
setup_ccp1 ( CCP_PWM );
setup_timer_2 ( T2_DIV_BY_16, 255, 10 );
motorfree ( );
if ( !dir ) { //vorwaerts
setup_ccp1 ( CCP_PWM );
setup_timer_2 ( T2_DIV_BY_16, 255, 10 );
output_bit ( PIN_C1,0 );
output_bit ( pin_c2,1 );
set_pwm1_duty ( gas );
} else { //zurueck
setup_ccp2 ( CCP_PWM );
setup_timer_2 ( T2_DIV_BY_16 , 255 , 10 );
output_bit ( PIN_C1 , 1 );
output_bit ( pin_c2 , 0 );
set_pwm2_duty ( gas );
}
}
void motorstop ( ) { // stoppt und bremst
setup_ccp1 ( CCP_OFF );
setup_ccp2 ( CCP_OFF );
output_bit ( PIN_C1 , 1 );
output_bit ( pin_c2 , 1 );
}
void motorfree ( ) { // freilauf - dreht weiter
setup_ccp1 ( CCP_OFF );
setup_ccp2 ( CCP_OFF );
output_bit ( PIN_C1 , 0 );
output_bit ( pin_c2 , 0 );
}
void motordir ( short int dir ) { //Richtung
setup_ccp1 ( CCP_OFF );
setup_ccp2 ( CCP_OFF );
output_bit( PIN_C1, dir );
output_bit( pin_c2 , !dir );
}
void servo ( int dir, int ausschlag )
{
if ( dir )
{
left ( ( ausschlag + 1 ) * 3 ); //-> leicht=0 -> (0+1)*3 = 3
} //-> stark=1 -> (1+1)*3 = 6
else
{
right ( ( ausschlag + 1 ) * 3 );
}
}
void left ( int ausschlag )
{
int i;
output_low ( pin_a4 );
for( i = 0 ; i < ausschlag ; i++ )
{
output_high ( pin_a0 );
delay_us ( 2500 );
output_low ( pin_a0 );
delay_ms ( 50 );
}
delay_ms( 500 );
}
void right ( int ausschlag )
{
int i;
output_low ( pin_a4 );
for( i = 0 ; i < ausschlag ; i++ )
{
output_high ( pin_a0 );
delay_us ( 250 );
output_low ( pin_a0 );
delay_ms ( 50 );
}
delay_ms ( 500 );
}
ASM-Master Code
; IR Auswertung Friedrich LXIX
; Florian Wolf, 4AHDVN 06/07
; Letzte Änderung am
; 24.05.2007
; Pinbelegung
;
; Pin 0 Steuerleitung (nur Eingang)
; Pin 1 Datenleitung (nur Ausgang)
; Pin 2 - 8 NICHT BELEGT
; Pin 9 - 13 IR vorne (nur Eingang)
; Pin 14 & 15 IR hinten (nur Eingang)
; Byteregisterbelegung
;
; B0 Bitfolge, die an PIC gesendet wird
; Bit 1->Richtung (0=rechts/1=links)
; Bit 2->Ausschlag (0=schwach/1=stark)
; Bit 3->Geschwindigkeit (0=langsam/1=schnell)
; Bit 4->Zurück (0=nein/1=ja)
;;
während RobotChallange: links/rechts
;
; B1 Zähler (für diverse Zwecke)
;
; B2 speichert den Pin, von dem zuletzt
; ein Signal empfangen wurde
; B3 während RobotChallange: stark/schwach
;
; W2 Initialisierung der Pins (B4,B5)
; Dokumentation
;
; Matrix.doc
; MacroMaster.xls
Init:
MOVBL B0,0x0
MOVBL B1,0x0
MOVBL B2,0x36
MOVBL B3,0x0
GOTO IRFront
IRScan:
PEEK W2
CMPBL B4,0x3E ; Linie erkannt?
JZ NoLineFront
CMPBL B4,0xC0 ; Linie erkannt?
JZ NoLineBack
CMPBL B4,0x36 ; Mitte
CMPBL B4,0x2E ; Rechts innen
CMPBL B4,0x3A ; Links innen
CMPBL B4,0x80 ; rechts hinten
CMPBL B4,0x40 ; links hinten
CMPBL B4,0x1E ; Rechts außen
CMPBL B4,0x3C ; Links außen
CMPB B4,B2
JZ SameIR
JC TurnLeft
JNC TurnRight
GOTO IRScan ; Sollte nie sein
NoLineFront:
CMPBL B1,0x50 ; DUMMYWERT
JZ IRBack
INCB B1
PAUSE 10 ; DUMMYWERT
GOTO IRScan
IRFront:
MOVWL W2,0x3E01 ; Frontsensoren
DIRS W2 ; Initialisierung
GOTO IRScan
NoLineBack:
CMPBL B1,0x50 ;DUMMYWERT
JZ IRFront
INCB B1
PAUSE 10 ;DUMMYWERT
GOTO IRScan
IRBack:
MOVBL B1,0x0
MOVWL W2,0xC001 ; Sensoren hinten
DIRS W2 ; Initialisierung
GOTO IRScan
SameIR:
MOVBL B1,0x0
GOTO IRScan
TurnLeft:
MOVB B2,B4
MOVBL B0,0x1
CMPBL B2,0x1E
JZ TurnHard
JNZ TurnSoft
TurnRight:
MOVB B2,B4
MOVBL B0,0x0
CMPBL B2,0x3C
JZ TurnHard
JNZ TurnSoft
TurnHard:
MOVBL B3,0x1
MOVBL B1,0x0
GOTO Send
TurnSoft:
MOVBL B3,0x0
MOVBL B1,0x0
GOTO Send
Send:
PIN 0
JZ Send
OUT 0
CMPBL B0,0x1
JZ SendLeft
GOTO SendRight
SendLeft:
CMPBL B3,0x1
JZ SendLHard
GOTO SendLSoft
LXIX_MM_Code
SendRight:
CMPBL B3,0x1
JZ SendRHard
GOTO SendRSoft
SendLHard:
CALL Send1
CALL Send1
CALL Send0
CALL Send0
GOTO SendEnd
SendLSoft:
CALL Send1
CALL Send0
CALL Send1
CALL Send0
GOTO SendEnd
SendRHard:
CALL Send0
CALL Send1
CALL Send0
CALL Send0
GOTO SendEnd
SendRSoft:
CALL Send0
CALL Send0
CALL Send1
CALL Send0
GOTO SendEnd
Send1:
HIGH 1
HIGH 0
PAUSE 10
RET
Send0:
LOW 1
HIGH 0
PAUSE 10
RET
SendEnd:
IN 0
GOTO IRScan
end
Datenblätter
| Infrarot.pdf (Datenblatt des Infrarot-Moduls) [info] {Vorlage:3} |
| TC4424.pdf (Datenblatt des Prozessors der Motorbrücke) [info] {Vorlage:3} |
| Ultraschall.pdf (Datenblatt des Utraschall-Moduls) [info] {Vorlage:3} |
| Doppel_Motorbruecke_mit_TC4424.pdf (Anleitung der Motorbrücke) [info] {Vorlage:3} |
| LXIX_MM_Code.pdf (Sourcecode des MacroMasters (Infrarot)) [info] {Vorlage:3} |
Dokumentationen
Links
Robotchallenge (http://www.robotchallenge.at)
16F877_Platine - Prozessor (http://wiki.atrox.at/index.php/16F877_Platine)
Motorbrücke (http://wiki.atrox.at/index.php/TC4424)
Grundlegendes zum IR-Modul (http://wiki.atrox.at/index.php/CNY70)
Grundlegendes zum Ultraschallsensor (http://www.roboternetz.de/phpBB2/login.php?redirect=zeigebeitrag.php&t=3412&start=0&sid=d81e9fc10c287b8820a917d3736606e4)
Motorbrücke Nummer 2 (http://wiki.atrox.at/index.php/TLE4201)
Motorbrücke Nummer 3 (http://wiki.atrox.at/index.php/L293D)

