Schritt 4: Controller (The Arduino Code)
Um den Beschleunigungsmesser verwenden benötigen Sie die HMC5883L-Bibliothek
Für die Infrarot-Kommunikation sollten Sie diese Bibliothek verwenden.
Erfand ich meinen Code auf einige Funktionen:
Float GetRotation (Char X):
Diese Funktion erhalten die Beschleunigungsmesser-Rotation und X -Variable definieren Hexe Achse zurück.
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 Verify (Float aktuell [3], Schwimmer Herkunft [4] [3], Byte-Zeile):
Diese Funktion zu überprüfen, wenn der Beschleunigungsmesser in einer bestimmten Position ist durch den Vergleich der gelesenen Daten im Array 'Current [3]"auf die Daten des Arrays"Herkunft [4] [3]"auf Lager hat dieses Array zu jedem Punkt 4 Zeilen (in unseren Zeichnungen haben wir nur 4 Punkte) und die Variable 'Row' Hexe Zeile zu verwenden.
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 Herkunft [4] [3]):
Diese Funktionen kombinieren die beiden letzten Funktionen und den Beschleunigungssensor Position zurück:
(Up(return 1), rechts (return 2), Down (Rückkehr 3), 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 vergleichen (Byte Mdrawing [4] [4], Byte-Zeile):
Diese Funktion die nachfolgenden Punkte zu bekommen und sehen, wenn sie in die gleiche Reihenfolge der Punkte in "Mdrawing[4] [4]" es lagernd sind, dass 4 Raws in diesem Array, von denen abhängt, wie viel Zeichnungen Sie deklariert haben, dabei haben wir nur 4 Zeichnungen
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 Herkunft [4] [3]:
Dieses Array enthält die Rotation der einzelnen Punkte, dass Sie es mit der Kalibrierung Datei definieren können. Es sieht aus wie:
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]:
Dieses Array enthält die Reihenfolge, in der die Punkte sollten damit die spezifische Zeichnung z. B.:(picture 1)