Stap 4: Controller (The Arduino van code)
Voor het gebruik van de versnellingsmeter moet u de HMC5883L bibliotheek
Voor de Infrarood communicatie moet u deze bibliotheek
Ik bedacht mijn code aan paar functies:
zweven getRotation (char x):
deze functie krijgen de versnellingsmeter rotatie en X -variabele definiëren heks as om terug te keren.
float getRotation(char x) {float heading; sensors_event_t event; mag.getEvent(&event); //read the data from the accelerometer if (x=='x'){heading = atan2(event.magnetic.x, event.magnetic.y);} else if (x=='y'){heading = atan2(event.magnetic.y, event.magnetic.z);} else if (x=='z'){heading = atan2(event.magnetic.z, event.magnetic.x);} return heading * 180/M_PI; }
BOOL controleren (float huidig [3], van float oorsprong [4] [3], byte rij):
deze functie controleert u of als de versnellingsmeter is in een bepaalde positie door het vergelijken van de gelezen gegevens opgeslagen in de array 'stroom [3]' om de gegevens van de array "oorsprong [4] [3]" deze array heeft 4 rijen naar elk punt (we hebben in onze tekeningen slechts 4 punten) en de variabele 'rij' Stel heks rij te gebruiken.
bool Verify(float current[3], float origin_[4][3],int row){ byte toler=37;//this variable set the tolerance to respect //return True if the next conditions are true return origin_[row][0]-toler<=current[0] && current[0]<origin_[row][0]+toler && origin_[row][1]-toler<=current[1] && current[1]<origin_[row][1]+toler && origin_[row][2]-toler<=current[2] && current[2]<origin_[row][2]+toler ;}
byte getPoint (float oorsprong [4] [3]):
deze functies combineren van de twee laatste functies als resultaat de positie van de versnellingsmeter:
(Recht (retour 2), (retour 3), Up(return 1), Left(return 4))
byte getPoint (float origin__[4][3] ){ byte return_=0; float current[3]={getRotation('x'), getRotation('y'), getRotation('z')}; if(Verify(current, origin__,0)){return_=1;} else if(Verify(current, origin__,1)){return_=2;} else if(Verify(current, origin__,2)){return_=3;} else if(Verify(current, origin__,3)){return_=4;} return return_; }
BOOL vergelijken (byte Mdrawing [4] [4], byte rij):
deze functie krijgen de opeenvolgende punten en zien als ze dezelfde volgorde van de punten voorradig in 'Mdrawing[4] [4]' er zijn 4 raws in deze matrix die afhankelijk van hoeveel tekeningen die u hebt gedeclareerd, daarbij hebben wij slechts 4 tekeningen
bool Compare (byte Mdrawing[4][4],byte row){ byte Cpoint=getPoint( origin); //read the current point of the accelerometer(origin is a global variable ,it's the rotations of each point ) byte Ppoint=0;// this variable will stock previous points byte y=0; byte x=0; while(Mdrawing[row][x]!=0 && x<4){x++;}//get the number of columns that the value is different than 0 while(y<x){ Cpoint = getPoint( origin);//read the current point if (Cpoint==Mdrawing[row][y] && Cpoint!=0){Ppoint=Cpoint;//if the current point is in the same order of the point in 'Mdrawing' while (Ppoint==Cpoint && y!=x-1){Cpoint=getPoint(origin);}// wait that the current point change y++;}//pass to the next point else if(Cpoint!=Mdrawing[row][y] && Cpoint!=0){return 0;}}//if the current point is different than the point in 'Mdrawing' return 1;}
float oorsprong [4] [3]:
deze matrix bevatten de draaiing van elke punten u kunt definiëren met de kalibratie-bestand. Het kijkt als:
float origin[4][3]= {{71.93,149.56,-29.04},//up point {5.97,126.75,-82.03},//right point {-72.14,162.31,-134.71},//down point {97.64,-174.11,-52.44}};//left point
byte Mdrawing [4] [4]:
deze matrix bevatten de volgorde dat de punten moeten om een specifieke tekening bijvoorbeeld:(picture 1)