De plaats tussen de 2 wielen is verkleint naar 9cm, waardoor we een kortere draaicirkel verkrijgen. Alsook staan de wielen wat scheef zodat de draaicirkel nog kleiner is 7cm.
De sensor array is breder geworden waardoor we beter de lijn kunnen volgen.
En als laatste hebben we ook andere motoren genomen, nu zijn het micro metalgear motoren van 100:1 HP.
Bij 6V:
320 RPM & 80 mA free-run, 2.2 kg-cm & 1.6 A stall.
Het betere aan deze motoren is dat het uitlopen korter is als ze niet meer worden bekrachtigd en ook is de maximumsnelheid is minder, waardoor we de pwm beter kunnen regelen, aangezien de pwm bij ons al zeer laag stond en hierdoor de motoren amper vooruit gingen en zo de tijd nog slechter was dan ervoor zonder de PID regeling.
In totaal met onze verbeteringen hebben we een verbetering van 10 seconden bereikt.
van 21 seconden in het begin naar 11,4 seconden nu.
Hopelijk krijgen we dezer dagen onze linefollower nog sneller, en ons doel is naar de 8 seconden te gaan!
Als we nog betere resultaten willen boeken zouden we een H-brug moeten implementeren. Waardoor we snel kunnen afremmen voordat we een bocht nemen. Misschien nog een kleine aanpassing dat we eventueel kunnen doen na de examens, om mijn oplossing toch eens uit te testen.
Voor het opslaan van de Kp, Ti en Td kunnen we gebruik maken van de volgende libary. Deze persoon heeft ervoor gezorgd dat we niet enkel bytes maar ook floats en doubles etc. kunnen opslaan in het EEPROM geheugen.
We hebben het apart een getest, en dit gaf een positief resultaat. Deze kunnen we dan volledig implementeren in het hoofdproramma van de Line-follower.
Om de afwijking ten opzichte van de zwarte lijn te meten, maken we gebruik van een parabolische interpolatie. Dit doen we softwarematig en gaat als volgt:
De sensoren worden uitgelezen en de waarden worden in een array geplaatst. Dan zoeken we de hoogste waarde van onze array, alsook de index van de sensor met de hoogste waarde. Als we weten welke sensor de hoogste waarde heeft, en dus het meest zwart is, kunnen we beginnen aan de interpolatie.
Een parabool heeft volgende functie: y = ax² + bx + c.
De sensor met de hoogste waarde heeft x-waarde 0. De sensor links daarvan heeft als x-waarde -1 en de sensor rechts daarvan heeft als x-waarde +1. De y-waarden zijn de uitgelezen waarden van de sensoren.
Dit geeft ons 3 vergelijkingen:
Y1 = ax² - bx + c (linkse sensor)
Y2 = c (middenste sensor)
Y3 = ax² + bx + c (rechtse sensor)
Nu kunnen we op zoek gaan naar a, b en c.
Uit de eerste vergelijking halen we: b = Y1
a Y2.
Vullen we dat in de derde vergelijking in, krijgen we: a = (Y3 - 2*Y2 + Y1) / 2.
Nu we alle waarden van de vergelijking kennen, kunnen we de top van de parabool berekenen. Dit doen we door de afgeleide van de functie gelijk te stellen aan 0.
Afgeleide: y' = 2ax + b.
Hieruit halen we de x-waarde als y' = 0 => x = -b / (2*a).
Dit is onze top zonder rekening te houden met de index van de sensor. Daarom moeten we 2.5 bijtellen bij onze top en de maximale sensorindex aftrekken van de top. (Omdat we 6 sensoren hebben en dus een index van 0 tot 5, gemiddeld 2.5) Zo zal onze top 0 zijn als de sensoren met index 2 en 3 gelijk zijn.
Dit wil zeggen dat als we bij het begin staan van een bocht we aan elke kant
18.75mm ruimte hebben om een bocht op te merken. Onze sensor arrey is 37.5mm breed (6 sensoren die elk 7.5mm
van elkaar staan). De bochten zelf hebben een staal van 100mm en onze maximale snelheid is 522mm/s
Met elementaire goniometrie weten we dat als onze line follower de bocht niet dedecteert en dus rechtdoor rijd hij na 58,296mm uit de bocht vliegt.
100-18,75 = 81.25
cos^-1(81.25/100) = 35,659°
sin(35,659°) = 58,296mm
Dus voor dat dit gebeurt moeten we minstens al 1 meting gedaan hebben. We hebben 112ms de tijd.
58,296/522 = 0.112s
In een ouder bericht op deze blog hebben we al de cyclus tijd geschat op1600µs. Dus we zullen ongeveer 70 metingen kunnen doen voor we uit de bocht vliegen.
De PCB van de microcontroller is wat aangepast, aangezien er geen LED was aangesloten op pin 13 en we hebben de print ook wat gebruiksvriendelijker gemaakt door de pinnen naar buiten te halen die nodig zijn voor de bootloader met arduino te kunnen branden op de atmega32u4. Alsook zijn er diodes in de ketens geschakeld, zodat bij verkeerde handelingen er geen schade zal ontstaan aan de controller.
De atmega32u4 heeft standaard al een bootloader. Dus als we onze printplaat verbinden met de PC, zal de PC hem onmiddelijk herkennen. Omdat we met de standaard bootloader niet kunnen programmeren met Arduino, moeten we hem veranderen.
Daarvoor hebben we een Arduino Duemilanove nodig. Eerst moet je het programma ArduinoISP uploaden op de Duemilanove. (Dat programma zit standaard bij Arduino)
Dan moet je volgende pinnen verbinden:
- Pin 10 Duemilanove met de reset van de Atmega.
- Pin 11 Duemilanove met pin 10 (MOSI) van de Atmega.
- Pin 12 Duemilanove met pin 11 (MISO) van de Atmega.
- Pin 13 Duemilanove met pin 9 (SCK of SCLK) van de Atmega.
Om na te gaan of er geen errors zijn, kan je volgende LED's nog aansluiten:
- Een LED met voorschakelweerstand aan pin 7 Duemilanove om te zien of er communicatie is met de Atmega.
- Een LED aan pin 8 Duemilanove die brandt als er een error is.
- Een LED aan pin 9 Duemilanove die pinkt als het programma runt.
Nu moet je alleen nog de 5v en Ground doorverbinden van de Duemilanove naar de Atmega zodat de Atmega ook gevoed wordt.
Als alles verbonden is, maak je USB-connectie met de Duemilanove en zet je de volgende opties in Arduino:
Extra => Board => Arduino Leonardo
Extra => Programmer => Arduino as ISP
Daarna druk je op 'Burn Bootloader' en na een minuutje zal de bootloader van de Atmega overschreven zijn.
Maak alle connecties los en maak verbindin tussen de Atmega en de PC. Normaal gezien zal je PC de Atmega nu moeten zien als een Arduino Leonardo.