Diagonaal berekenen lukt, meerdere outputs nog niet
Dependencies: mbed FastPWM HIDScope MODSERIAL QEI
main.cpp
- Committer:
- s1600907
- Date:
- 2016-10-17
- Revision:
- 5:a9da7bc89b24
- Parent:
- 4:bd1db680e5a1
- Child:
- 6:ee243782bf51
File content as of revision 5:a9da7bc89b24:
#include "mbed.h" #include "math.h" #include "iostream" #define SERIAL_BAUD 115200 Serial pc(USBTX,USBRX); InterruptIn Button1(PTC6); // DIT WORDT EEN ANDERE BUTTON // tickers Ticker TickerCaseBepalen; Ticker TickerVeranderenXY; Ticker TickerAfstandBerekenen; Ticker TickerMotorHoekBerekenen; Ticker TickerBerekenenBewegingsHoek; Ticker TickerFlipperBewegen; // in te voeren x en y waardes volatile float x = 0.0; volatile float y = 305.5; volatile float vorigex = 0.0; volatile float vorigey = 0.0; // waardes volatile const float a = 50.0; // de afstand van gekozen assenstelsel tot de armas (assenstelsel precies in het midden) KEERTJE NAMETEN volatile const float Bar = 200.0; // lengte van de armen KEERTJE NAMETEN volatile const float pi = 3.14159265359; volatile float VorigeHoek1 = 1.0/3.0*pi; // begin hoek van 90 graden volatile float VorigeHoek2 = 1.0/3.0*pi; volatile float Step = 1; // EEN GOK VOOR HET STAPJE EN MOET DUS NOG AANGEPAST volatile float MaxHoek = pi - 30*pi/180; // de hoek voordat arm het opstakel raakt (max hoek is 24.9 tussen arm en opstakel) volatile float Dia1 = 0.0; volatile float Dia2 = 0.0; volatile float MotorHoek1 = 0.0; volatile float MotorHoek2 = 0.0; volatile float BewegingsHoek1 = 0.0; volatile float BewegingsHoek2 = 0.0; volatile bool Richting1 = true; // cw = true, ccw = false volatile bool Richting2 = true; volatile bool FlipperAan = false; // als true dan flipper aanzetten bool BezigMetCalibreren = true; // we beginnen met calibreren bool BeginnenMetFlippen = false; // om de flipper aan te zetten bool BezigMetFlippen = false; // om verandering in x en y tegen te houden tijdens het flippen. DIT WORDT VERANDERD IN SJOERDS DEEL (NAAM CONTROLEREN) // waardes die komen van Charlotte: true is aangespannen, false is niet aangespannen (NAAM CONTROLEREN) volatile bool BicepsLinks = false; volatile bool BicepsRechts = true; volatile bool Been = false; // nodig voor het switchstatement enum states {Flipper, Links, Rechts, Voor, Achter, GeenSignaal}; states MyState = Links; // het bepalen van welke case we hebben void CaseBepalen () { if (BicepsLinks==true && BicepsRechts==true && Been==true && BezigMetFlippen == false) { MyState = Flipper; // flipper bewegen } else if (BicepsLinks==true && BicepsRechts==false && Been==false && BezigMetFlippen == false) { MyState = Links; // naar links bewegen } else if (BicepsLinks==false && BicepsRechts==true && Been==false && BezigMetFlippen == false) { MyState = Rechts; // naar rechts bewegen } else if (BicepsLinks==true && BicepsRechts==true && Been==false && BezigMetFlippen == false) { MyState = Voor; // naar voren bewegen } else if (BicepsLinks==false && BicepsRechts==true && Been==true && BezigMetFlippen == false) { MyState = Achter; // naar achter bewegen } else if (BicepsLinks==false && BicepsRechts==false && Been==false || BezigMetFlippen==true) { MyState = GeenSignaal; } } // het berekenen van de nieuwe x en y en zorgen dat deze niet buiten het bereik komen void VeranderenXY () { // bepalen hoe de x en y waardes gaan veranderen switch(MyState) { case Flipper : BeginnenMetFlippen = true; // we zijn aan het flipper dus geen andere dingen doen break; case Links : vorigex = x; // ervoor zorgen dat als de motor te ver draait de x niet verder telt x = x - Step; break; case Rechts : vorigex = x; x = x + Step; break; case Voor : vorigey = y; // ervoor zorgen dat als de motor te ver draait de y niet verder telt y = y + Step; break; case Achter : vorigey = y; y = y - Step; break; case GeenSignaal : break; default : pc.printf("Er is geen verandering in x en y\r\n"); } // Grenswaardes LET OP: ARMEN MISSCHIEN GEBLOKKEERD DOOR BALK AAN DE BINNENKANT if (x > 200) { x = 200; } else if (x < -200) { x = -200; } if (y > 306) { y = 306; } else if (y < 50) { y = 50; // GOKJE, UITPROBEREN } pc.printf("x = %f, y = %f\r\n", x, y); } // functie om D1 en D2 te berekenen void AfstandBerekenen (){ float BV1 = sqrt(pow((a+x),2) + pow(y,2)); // diagonaal (afstand van armas tot locatie) berekenen Dia1 = pow(BV1,2)/(2*BV1); // berekenen van de afstand oorsprong tot diagonaal float BV2 = sqrt(pow((x-a),2) + pow(y,2)); // zelfde nog een keer doen maar nu voor de rechter arm Dia2 = pow(BV2,2)/(2*BV2); //pc.printf("Dia1 = %f, Dia2 = %f\r\n", Dia1, Dia2); } // functie om de motorhoek te berekenen void MotorHoekBerekenen (){ // eerst if loop doorlopen voor motor 1 if (x > -a) { MotorHoek1 = pi - atan(y/(x+a)) - acos(Dia1/Bar); } else if (x > -a) { MotorHoek1 = pi - (pi + atan(y/(x+a))) - acos(Dia1/Bar); } else { // als x=-a MotorHoek1 = 0.5f*pi - acos(Dia1/Bar); } // twee if loop doorlopen voor motor 2 if (x < a) { MotorHoek2 = pi + atan(y/(x-a)) - acos(Dia2/Bar); } else if (x > a) { MotorHoek2 = pi - (pi - atan(y/(x-a))) - acos(Dia2/Bar); } else { // als x=a MotorHoek2 = 0.5f*pi - acos(Dia1/Bar); } // limiten (als de hoek te groot wordt, reset dan de hoek en de x en y waardes) if (MotorHoek1 >= MaxHoek) { // is de maximale hoek in radialen MotorHoek1 = VorigeHoek1; x = vorigex; y = vorigey; } if (MotorHoek2 >= MaxHoek) { MotorHoek2 = VorigeHoek2; x = vorigex; y = vorigey; } //pc.printf("MotorHoek1 = %f en MotorHoek2 = %f \r\n", MotorHoek1, MotorHoek2); } // het verschil uitrekenen tussen waar we zijn en waar we heen willen OVERLAP MET SJOERD void BerekenenBewegingsHoek () { // Hoek 1: grootte beweging en richting BewegingsHoek1 = VorigeHoek1 - MotorHoek1; VorigeHoek1 = MotorHoek1; if (BewegingsHoek1 > 0) { Richting1 = false; // ccw } else { Richting1 = true; // cw } // Hoek 2: grootte beweging en richting BewegingsHoek2 = VorigeHoek2 - MotorHoek2; VorigeHoek2 = MotorHoek2; if (BewegingsHoek2 > 0) { Richting2 = true; // cw } else { Richting2 = false; // ccw } //pc.printf("Beweging 1 = %f, Beweging 2 = %f\r\n", BewegingsHoek1, BewegingsHoek2); } // als BeginnenMetFlippen aan staat voeren we deze functie uit. Zolang deze bezig is is BezigMetFlippen true void FlipperBewegen () { if (BeginnenMetFlippen == true) { // SJOERDS DEEL } else { // als BezigMetFlippen == false dan doe niks } } // als de button ingedrukt wordt dan stoppen we met calibreren void ButtonIndrukken () { BezigMetCalibreren = false; } int main() { pc.baud(SERIAL_BAUD); pc.printf("\r\n Nieuwe code uitproberen :) \r\n"); // calibreren gebeurt hier, zodat de tickers nog niet lopen en dit dus geen rekenkracht kost en je niet gebonden bent aan tijden // we gaan door met calibreren tot we de button indrukken while (BezigMetCalibreren == true) { // potmeter dingen aanpassen pc.printf("calibreren is bezig\r\n"); Button1.fall(&ButtonIndrukken); } TickerCaseBepalen.attach(&CaseBepalen, 1); // ticker om te bepalen welke case we gaan gebruiken TickerVeranderenXY.attach(&VeranderenXY,1); // ticker voor het veranderen van de x en y waardes TickerAfstandBerekenen.attach(&AfstandBerekenen,1); // ticker om de waardes van dia1 en dia 2 te berekenen TickerMotorHoekBerekenen.attach(&MotorHoekBerekenen,1); // ticker om de motorhoek te berekenen TickerBerekenenBewegingsHoek.attach(&BerekenenBewegingsHoek,1); // ticker om grote en richting vd beweging te berekenen TickerFlipperBewegen.attach(&FlipperBewegen,1); // ticker om de flipper te laten bewegen while (true) { } }