Na twee middagen en avonden woest programmeren ben ik weer een mooi stukje verder gekomen. Ik denk zelfs dat het einde in zicht komt want ik heb een mogelijke oplossing voor het sturen in een richting verzonnen al moet dit natuurlijk wel getest worden.
Ik meet dus hoe lang een rondje duurt. Het is een soort stopwatch die na elk rondje opnieuw begint met tellen. De waarde die ik dan krijg bewaar ik en deel ik in 40 stukjes. Ik heb nu dus 1/40 ste deeltje van de totale omwenteling.
Ik heb nu 40 formules gemaakt met elk zijn eigen stukje van de omwenteling door dat deeltje te vermenigvuldigen met de plaats binnen de omwenteling. Wanneer bijvoorbeeld deeltje x 20 overeenkomt met de stopwatch die dan loopt is mijn omwenteling precies op de helft aangekomen.
Bij elke berekening van waar we zijn in de omwenteling heb ik verteld wat de servo van nick en roll op dat moment moeten doen. Als voorbeeld hier 3 van de 40 berekeningen.
Code: Selecteer alles
if (cyclecounter==0)//start of the cycle.This is the first cyclepart
{ rollcycle = rollinneg; //rollinput-negatif has 100% effect
nickcycle = nickinput-450; // nickinput has 10% effect
}
if ((int (cyclepart*1))==cyclecounter) //the second cyclepart
{ rollcycle = rollinneg-50; //rollinput-negatif has 90% effect
nickcycle = (nickinput-400); //nickinput has 20% effect
}
if ((int (cyclepart*2))==cyclecounter) //the 3rd cyclepart
{ rollcycle = rollinneg-100; //rollinput-negatif has 80% effect
nickcycle = (nickinput-350); //nickinput has 30% effect
}
Om de code te begrijpen moet je weten dat ik de signalen van de zender heb omgebouwd tot:
-500 stick links
0 stick midden
+500 stick recht
En omdat bijvoorbeeld stick rechts (roll rechts) twee verschillende bewegingen van de servo moet veroorzaken in één omwenteling (namelijk naar beneden in de richting waar we heen willen en naar boven in de tegenovergestelde richting). Moet het signaal -500 tm +500 omgedraaid worden.
Code: Selecteer alles
nickinneg = map(nickinput, -500, 500, 500, -500); // the inverse of rollinput needed for rollcycle front side
rollinneg = map(rollinput, -500, 500, 500, -500); // the inverse of nickinput needed for nickcycle left side
Hier een print van de 40 berekeningen dat laat zien wanneer elk stukje servo uitslag mag plaatsvinden
165.00 <de totale draaitijd
0,4,8,12,16,20,24,28,33,37,41,45,49,53,57,61,66,70,74,78,82,86,90,94,99,103,107,111,115,119,123,127,132,136,140,144,148,152,156,160, <40 punten binnen de totale draaitijd
Of dit gaat werken? geen idee...
De hele code is inmiddels 786 regels lang
niet slecht voor een eerste projectje