TractorNXT

Uit RobotMC.be
Ga naar: navigatie, zoeken

TractorNXT door Ramacco

Deze creatie staat ook op de LEGO Mindstorms Project-site : NXT-Log

8284.jpg PLUS MindstormsNXT.jpg == ???
Wat krijg je als je een Lego Technics doos combineert met de Mindstorms ? Een TractorNXT !
TractorNXT1.jpg

Meer foto's vindt u achteraan deze pagina.

Het bouwen

De tractor (Lego 8284) is zeer gedetailleerd afgewerkt. Vele assen en overbrengingen zorgen ervoor dat alles mooi draait en beweegt : de zuigers van de motor, een centrale as, het differentieel voor de achterwielen, de hooimachine achteraan. Mooi... Als test werd eerst de motoren extern op de assen gemonteerd, zonder eigenlijk aan de tractor iets wezenlijk te veranderen. De NXT Brick (de controller) werd in een aanhangwagen geplaatst. Het werkte wel, maar had toch een aantal nadelen.

  • Ten eerste was het niet natuurlijk niet mooi meer om naar te kijken. De ene motor hing achteraan de cabine, de andere boven op het dak en dan nog die aanhangwagen.
  • Ten tweede leverde de motoren nogal veel kracht waardoor de tandwielen soms uit hun voegen kraakten, niet gezond.
  • Ten derde is met een aanhangwagen rijden niet eenvoudig. Vooruit gaat nog, maar achteruit draaien is niet simpel en binnen de korste keren zit je in de knoei.

Om dit alles op te lossen werden drastische maatregelen genomen. Ongeveer de volledige onderbouw en alle assen en aandrijfmechanismes werden gesloopt. Dit leverde voldoende plek om de motoren onder de motorkap en onder de cabine weg te werken. De brick werd achter de cabine gemonteerd. Hierdoor werd de tractor achteraan te zwaar en had hij de neiging om op z'n achterwielen te vertrekken als je vooruit rijdt. Spectaculair, maar niet echt wat ik wou. Een 5e wiel als steun was de oplossing. Doordat we de brick achteraan gemonteerd hadden moesten we ook de hooimachine opgeven. Spijtig, maar helaas....

Om alles te doen passen moesten hier en daar wel wat toegevingen gedaan worden. Niet alles is meer zoals in de originele tractor, maar toch slaagde ik erin alles redelijk in elkaar te krijgen en belangrijker : de drie oorspronkleijke problemen waren opgelost : het lijkt terug op de oorspronkelijke tractor, alles draait soepel en we hebben geen aanhangwagen meer.

Ackerman sturing

De meeste robots maken gebruik van twee onafhankelijk aangedreven achterwielen. Door het ene sneller te laten draaien dan het andere kan men bochten maken. Door ze in tegengestelde te laten draaien, kan men als het ware ter plekke draaien. Deze luxe hebben we hier niet omdat we met een stuurmechanisme zitten zoals in de meeste auto's : het voertuig kan alleen vooruit of achteruit bewegen. Draaien doen we door de voorwielen in een hoek te zetten. Dit noemt me de Ackerman sturing.

Een nadeel van deze werkwijze is dat als men bocht maakt, het wiel aan de buitenkant meer afstand moet afleggen dan het wiel aan de binnenkant. Als we hier niets zouden aan doen dan zouden de banden snel verslijten. De oplossing daarvoor is een zg. slipdifferentieel.

Een ander nadeel - en voor ons veel belangrijker - is dat we een redelijk grote draaicirkel hebben. Onze TractorNXT heeft een draaicirkel van 90cm. Meedoen aan RoboRama zal dus een moeilijke opgave worden, want voor het lijnvolgen specifieert men dat de draaicirkel een straal van 25cm kan hebben. Niet simpel dus. Net zoals een auto moet manouvreren om kort af te draaien zal onze robot dat ook moeten doen, wil hij kunnen deelnemen. Op dit moment is het niet zeker dat we dit opgelost krijgen.

Programma's

Voor alle programma's maakten we gebruik van de ontwikkelomgeving BricxCC en de programmeertaal NXC(Not eXactly C), wat zeer veel gelijkenis vertoont met C. Uiteraard hadden we de programma's ook met de grafische omgeving NXT-G van Lego zelf kunnen maken, maar NXC is gewoon leuker.

Hoofdprogramma

In het hoofdprogramma geven we op het scherm van de brick een menu. Met de pijltjes kan je op en neer gaan. Als je op de oranje knop drukt, worden de parameters ingesteld en start de gekozen deeltaak.

Code:

task main ()
{
    int huidig_commando = LCD_LINE3 ;
     
    ClearScreen () ;
    TextOut (0, LCD_LINE1, "Tractor commando");
    TextOut (10, LCD_LINE3, "Rij Nergens Op") ;
    TextOut (10, LCD_LINE4, "Zwarte Lijn") ;
    TextOut (10, LCD_LINE5,"Witte Lijn") ;
     
    TextOut (0, LCD_LINE3, ">") ;
     
    while (!ButtonPressed(BTNCENTER, true))
    {
          if (ButtonPressed (BTNLEFT, true) && huidig_commando < LCD_LINE3)
          {
            TextOut (0, huidig_commando, " ") ;
            huidig_commando += 8 ;
            TextOut (0, huidig_commando, ">") ;
          } else if (ButtonPressed (BTNRIGHT, true) && huidig_commando > LCD_LINE5)
          {
            TextOut (0, huidig_commando, " ") ;
            huidig_commando -= 8 ;
            TextOut (0, huidig_commando, ">") ;
          }

          Wait (500) ;
    }

    // Gemeenschappelijke constanten
    MIN_AFSTAND = 30 ;
    MAX_AFSTAND = 50  ;
    VOORUIT_POWER = 80 ;
    ACHTERUIT_POWER = 50 ;
    DRAAI_POWER = 40 ;
    DRAAI_HOEK = 20 ;
    MAX_HOEK = 30 ;
    ONDERGRENS = 50 ;
    BOVENGRENS = 55 ;
     
    switch (huidig_commando)
    {
           case LCD_LINE3 :  // Rij nergens op
                start rij_nergens_op ;
                break ;
                 
           case LCD_LINE4 : // Volg Zwarte Lijn  (Thuis)
                ONDERGRENS = 50 ;
                BOVENGRENS = 55 ;
                start volg_lijn ;
                break ;
                 
           case LCD_LINE5 :  // Volg witte lijn  (RobotMC)
                ONDERGRENS = 30 ;
                BOVENGRENS = 50 ;
                start volg_lijn ;
                break ;
    }
}

Taak 1 : Rij Nergens Op

Hier maken we gebruik van de afstandssensor. We rijden vooruit tot we op 30cm een object zien, dan draaien we links en rijden achteruit tot de afstand weer groter is dan 50cm. We zetten de wielen terug recht en rijden weer vooruit. Enz... Dit algoritme werkt redelijk goed, maar toch zijn er wat mankementen. Doordat we maar één sensor hebben, kunnen we niet goed schuin zien. Als we een muur schuin naderen, dan zien we die niet tijdig en rijden er tegenaan.

Code:

  • Vooruit-Achteruit-DraaiLinks-DraaiRechts zijn simpele defines die de motorfuncties verbergen
  • Alle getallen zijn als constanten gedefinieerd en zijn hier niet weergegeven
task rij_nergens_op()
{
   int afstand ;
   SetSensorLowspeed (IN_4) ;
   do {
   
      // Rij vooruit tot we een hindernis zien
      Vooruit (VOORUIT_POWER / 3 ) ;    // Traag vertrekken
      Wait (100) ;
      Vooruit (VOORUIT_POWER) ;        // Volle gas
   
      do {
         afstand = SensorUS(IN_4) ;
     } while (afstand > MIN_AFSTAND) ;
      
     // Hindernis. Draai en rij achteruit tot de afstand groot genoeg
     StopMotor () ;
     Achteruit (ACHTERUIT_POWER) ;
     DraaiLinks (DRAAI_HOEK, DRAAI_POWER) ;      // Draai

     do {
         afstand = SensorUS(IN_4) ;
      } while (afstand < MAX_AFSTAND) ;
      
     DraaiRechts (DRAAI_HOEK, DRAAI_POWER) ; // Wielen terug recht
     StopMotor () ;
      
     // Terug vooruit
 
  } while (true) ;
 
}

Taak 2 : Volg (Witte of Zwarte) Lijn

Hier maken we gebruik van de lichtsensor. Aangezien we maar één sensor hebben kunnen we niet op de lijn rijden, maar op de rand. We meten de grijswaarde. Ligt deze tussen 2 grenzen (experimenteel te bepalen) dan rijden we vooruit. Komen we onder de ondergrens dan draaien we links en rijden vooruit tot we weer binnen de 2 grenzen zitten. Komen we boven de bovengrens, dan draaien we rechts en rijden vooruit tot we weer binnen de 2 grenzen zitten. Dit algoritme werkt alleen voor parcours met een minimum draaicirkel met 90 cm diameter ! Deze taak wordt zowel gebruikt om een witte lijn op een zwarte achtergrond als een zwarte lijn op een witte achtergrond te volgen. Alleen de ondergrens en bovengrens zijn anders.

Code:

  • Vooruit-Achteruit-DraaiLinks-DraaiRechts zijn simpele defines die de motorfuncties verbergen
  • DraaiAbsoluutLinks en DraaiAbsoluutRechts zijn hulproutines die rekening houden met hoeveel we reeds gedraaid hebben. Als we te ver draaien (verder dan de toegelate max. hoek) zullen de motoren blokkeren. Deze berekent de delta en draait dan over de delta van de echte stand en de gevraagde hoek.
  • Alle getallen zijn als constanten gedefinieerd en zijn hier niet weergegeven
task volg_lijn ()
{
  int waarde, ticks ;

  //sensoren
  SetSensorLight(IN_3);
   
  do {
       waarde = SENSOR_3 ; 

        if (waarde < ONDERGRENS)
        {
           Vooruit (ACHTERUIT_POWER) ;
           DraaiAbsoluutLinks (DRAAI_HOEK, DRAAI_POWER) ;
        } else if (waarde > BOVENGRENS) {
          Vooruit (ACHTERUIT_POWER) ;
           DraaiAbsoluutRechts (DRAAI_HOEK, DRAAI_POWER) ;
        } else {
           Vooruit (VOORUIT_POWER) ;
           RechtDoor() ;
        }

    } while (true) ;
}

Foto's

Overzicht foto's

TractorNXT1.jpg


TractorNXT2.jpg


TractorNXT3.jpg


TractorNXT4.jpg


TractorNXT5.jpg


Detail foto's

TractorNXT d1.jpg


TractorNXT d2.jpg


TractorNXT d3.jpg


TractorNXT d4.jpg