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


Image:Friedrich_LXIX_Logo.JPG
Inhaltsverzeichnis

Ü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

Schaltplan der Motorbrücke

Schaltplan der IR-Schaltung


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

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
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

bild:Filepdf.gif Infrarot.pdf (Datenblatt des Infrarot-Moduls)
{Vorlage:3}
bild:Filepdf.gif TC4424.pdf (Datenblatt des Prozessors der Motorbrücke)
{Vorlage:3}
bild:Filepdf.gif Ultraschall.pdf (Datenblatt des Utraschall-Moduls)
{Vorlage:3}
bild:Filepdf.gif Doppel_Motorbruecke_mit_TC4424.pdf (Anleitung der Motorbrücke)
{Vorlage:3}
bild:Filepdf.gif LXIX_MM_Code.pdf (Sourcecode des MacroMasters (Infrarot))
{Vorlage:3}


Dokumentationen

Hardware Dokumentation

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)