Hej udviklere.
Jeg og en makker er i gang med et robotprojekt
Project Hilde, hvor vi er stødt på et problem som vi har lidt svært ved at debug'e.
Robotten er opbygget som en tripod, hvor de to forreste hjul trækker robotten uafhængigt af hinanden. Det tredje hjul (baghjulet) er er fastgjort til en servo. Meningen er så at ved hjælp af vores manuelle kontrol kan styre hastighed ved hjælp af et potentiometer og vha et andet potentiometer kan vi styre forholdet mellem hastigheden på de to trækhjul. Når vi så justerer hastigheds-forholdet mellem trækhjulene er det meningen at baghjulet skal justeres trinløst, men den kode vi har brygget sammen virker ikke helt efter hensigten når den bruges på vores ATmega88 microcontroller.
Koden nedenunder er de to funktioner vi bruger til at beregne en vinkel (Grader) med 1 grads nøjagtighed.
Den første funktion tager et argument som er et tal mellem 0 og 110 og returnerer en vinkel i grader. Den beregner principielt omdrejningspunktet og den trekant som dannes af omdrejningspunktet, baghjulet og punktet i mellem de to forhjul. Herved kan vinklen beregnes for baghjulet.
Er klar over, at vi faktisk risikerer at dividere med nul, men det er ikke problemet.
- char calculateAngle (float adc_ratio)
- {
- float temp = adc_ratio / 110;
- float r = (float)(WIDTH / 2) * ((1 + temp) / (1 - temp));
- float angle_rad = arcTan((float)HEIGHT / r);
-
- return ((char)(angle_rad * 57.2958));
- }
Funktionen nedenunder er en Lagrange interpolation af ArcTan ved 3 punkter. Den tager et argument som er forholdet mellem de to sidder i en trekant som står vinkelret på hinanden og returnerer en vinkel i radianer.
- float arcTan (float angle_ratio)
- {
- return (float)(angle_ratio * (1.04415 - (0.253662 * angle_ratio))); // Radians
- }
Meningen med koden er at beregne en vinkel i forhold til det forhold der er mellem hastighederne på forhjulene, og når denne justeres skal baghjulet gerne følge med. Der ved ønsker vi altså en trinløs justering. Denne trinløse justering opnår vi dog ikke, men vi kan kun stå i midterstilling og de to yderstillinger.
Vi har snakket om hvad problemet er og vi er nået frem til vi muligvis mister noget information idet vi kun kan opnå yderstillingerne eller midterstillingen. Det virker som om vi mister alt decimal informationen, altså det tyder på at det er et casting problem, som om at ATmega'en ikke kan håndtere den kode jeg har postet her i tråden.
Denne konklusion er baseret på, at vi har prøvet at kopiere vores to ovenstående funktioner og bruge dem i et konsol program hvor i sagtens kan beregne individuelle vinkler for et hvert tal fra 0 - 110, men på vores ATmega88 virker det ikke. Vu har sågar tjekket det ved at sende vinkel information til en terminal på computeren og den viser også at microcontrolleren kun kan beregne vinklerne for yderpositionerne og midten.
Håber der er nogle herinde som har erfaring med microcontroller-programmering og kan hjælpe os.
På forhånd tak.
Med Venlig Hilsen
Kent