NLT

Het programmeren van de Leafy

Het bouwen van een Leafy

Het bouwen van de Leafy was naast de onduidelijkheid over de hoeveelheid draadjes en het motor shield niet echt lastig. Het originelen idee kwam namelijk van studenten van een andere middelbare school die als een instructable hadden geschreven over het bouwen van de Leafy. Er was echter geen code bij gegeven en ook de bijbehorende uitleg voor het bouwen bestond niet.

Het schrijven van een code

Ik ben met Max dit onderwerp begonnen, maar toen we tegen moeilijkheden aan zijn gelopen had Max geen behoefte om nog verder te gaan. Wel wist ik dat Timo iets meer doorzettingsvermogen heeft als het gaat over dingen die hij leuk vind en bijna alles wat met codes schrijven te maken heeft valt daar onder. Om die reden heb ik hem gevraagd of hij nadat ik een “Leafy” in elkaar had gezet verder wilde gaan met mij helpen door de code te schrijven en verbeteren. Ik deed hier vaak de constructie zoals de kabeltjes verbinden en noteren aan welke pin op het motor shield ze dan horen. Timo herschreef dit dan in de code om het duidelijker en overzichtelijker te maken. Wel liepen we in het schrijven van de code (die door Timo vanaf de grond is opgebouwd met kleine structurele help van het net) tegen van mechanische problemen aan. Zo was de motor zo gemonteerd (volgens de Leafy instructeble) dat één kant iets sterker was dan de ander. Hierdoor had het eindproduct steeds een afwijking naar rechts. Dit is op zich gemakkelijk te voorkomen door te experimenteren met verschillende motorniveaus en een formule op te stellen om de afwijking te compenseren. In ons geval was deze afwijking gewoon vermenigvuldigen met 1,1 of voor de andere motor 0,9. Dit is echter al gedaan met de code die een van de docenten bij ons op school heeft geschreven en wij wilde daar een significante verbetering op maken. Zo was de reactie snelheid van de sensor niet snel genoeg als je de motor op volle “toeren” liet draaien. Tijdens het testen liepen we dus tegen het dilemma: ‘Hoe zorgen we dat de robot niet overal tegenaan rijdt?’ aan. Ik en Timo hebben hier een mooie oplossing voor gevonden door het autootje steeds harder en zachter te laten rijden als hij meer ruimte had. Zodra hij in de buurt obstakel kwam remt de robot af zodat deze genoeg tijd heeft om te reageren. Daarna moest aan de code alleen nog een kleine vermenigvuldiggingsfactor toegevoegd worden om de afwijking tegen te gaan en de ‘Leafy’ was klaar voor gebruik.

Een overduidelijke verbetering van de code van de docenten.

Onze code

const int trigPin = 5; //stelt trigPin gelijk aan 5.
const int echoPin = 6; //stelt echoPin gelijk aan 6.
const int dirA = 12; //stelt dirA gelijk aan 12, de richting van motor A.
const int dirB = 13; //stelt dirB gelijk aan 13, de richting van motor B.
const int brakeA = 9; //stelt brakeA gelijk aan 9, de rem van motor A.
const int brakeB = 8; //stelt brakeB gelijk aan 8, de rem van motor B.
const int pwmA = 10; //stelt pwmA gelijk aan 10, de snelheid van motor A.
const int pwmB = 11; //stelt pwmB gelijk aan 11, de snelheid van motor B.
const int YEET = 255; //stelt de maximumsnelheid van de motoren (255) gelijk aan     YEET, gewoon omdat het leuk is.

long duration; //stelt duration als een grote variabele (minstens 32 bits)
int distance; //stelt distance als variabele

void setup() {
pinMode(brakeB, OUTPUT); //stelt 8 als output voor de remmen van motor B.
pinMode(brakeA, OUTPUT); //stelt 9 als output voor de remmen van motor A.
pinMode(pwmA, OUTPUT); //stelt 10 als output voor de snelheid van motor A.
pinMode(pwmB, OUTPUT); //stelt 11 als output voor de snelheid van motor B.
pinMode(dirA, OUTPUT); //stelt 12 als output voor de richting van motor A.
pinMode(dirB, OUTPUT); //stelt 13 als output voor de richting van motor B.
pinMode(trigPin, OUTPUT); //stelt 5 als output voor de activatie van         ultrasonensensor.
pinMode(echoPin, INPUT); //stelt 6 als de input voor de data van de ultrasonensensor.
Serial.begin(9600); //maakt een verbinding van 9600Hz met de serial monitor.
}

void loop() {
if(distance >= 100){ //als de afstand groter is dan 100 cm gaan de motoren op                    volle snelheid vooruit.
             digitalWrite(brakeA, HIGH);
             digitalWrite(brakeB, HIGH);
             digitalWrite(dirA, HIGH);
             digitalWrite(dirB, HIGH);
             analogWrite(pwmB, YEET*0.9);
             delayMicroseconds(10);
             digitalWrite(brakeA, LOW);
             digitalWrite(brakeB, LOW);
         };
         if(distance >= 50 && distance < 100){ //als de afstand tussen de 50 en 100 cm              ligt gaat de robot langzamer rijden.
             digitalWrite(brakeA, HIGH);
             digitalWrite(brakeB, HIGH);
             digitalWrite(dirA, HIGH);
             digitalWrite(dirB, HIGH);
             analogWrite(pwmA, 100*1.1);
             analogWrite(pwmB, 100);
             delayMicroseconds(10);
             digitalWrite(brakeA, LOW);
             digitalWrite(brakeB, LOW);
};
         if(distance < 50){ //als de afstand kleiner is dan 50 cm stuurt de robot          gedurende 500 miliseconden naar links (of rechts afhankelijk van de aansluiting van          de motoren).
             digitalWrite(brakeA, HIGH);
             digitalWrite(brakeB, HIGH);
              digitalWrite(dirA, LOW);
             digitalWrite(dirB, LOW);
             analogWrite(pwmA, 50);
             analogWrite(pwmB, 100);
             delayMicroseconds(10);
             digitalWrite(brakeA, LOW);
             digitalWrite(brakeB, LOW);
             delay(500);
};
        digitalWrite(trigPin, LOW); //deactiveert de ultrasonensensor.
        delayMicroseconds(2); //wacht 2 microseconden.
        digitalWrite(trigPin, HIGH); //activeert de ultrasonensensor.
        delayMicroseconds(10); //wacht 10 microseconden.
        digitalWrite(trigPin, LOW); //deactiveert de ultrasonensensor.
        duration = pulseIn(echoPin, HIGH); //stelt duration gelijk aan de tijd tussen de input en output van de ultrasonensensor.
        distance = duration*343/20000; //stelt de afstand gelijk aan          duration*343/20000, formule voor de afstand in cm met de snelheid van het geluid.
        Serial.print("Distance: "); //print Distance: in de serial monitor, hierbij geven de " " aan dat Distance: geen variabele is.
        Serial.println(distance); //print Distance in de serial monitor, distance is hier een variabele.
}

 

Leave a Reply