Paso 4: Controlador (código de la Arduino)
Para usar el acelerómetro necesita la biblioteca HMC5883L
Para la comunicación infrarroja se debe usar esta biblioteca
Diseñé mi código para algunas funciones:
flotador getRotation (char x):
Esta función get la rotación acelerómetro y X variable definen ejes de bruja para volver.
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 verificar (flotador corriente [3], flotador origen [4] [3], fila bytes):
Esta función de verificar si el acelerómetro está en una posición específica mediante la comparación de los datos leídos en el array 'corriente [3]' a los datos de la matriz de origen [4] [3] esta matriz tiene 4 filas para cada punto (en nuestros dibujos tenemos sólo 4 puntos) y la variable 'row' fila de bruja para usar.
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 ;}
getPoint bytes (flotador origen [4] [3]):
Esta funciones las dos últimas funciones combinan y devolución la posición del acelerómetro:
(Up(return 1), derecha (vuelta 2), abajo (3 vuelta), 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 comparar (byte Mdrawing [4] [4], fila bytes):
Esta función obtiene los puntos sucesivos y ver si están en el mismo orden de los puntos almacenados en 'Mdrawing[4] [4]' hay 4 raws de esta matriz que depende cuánto dibujos ha declarado, en este tenemos solo 4 dibujos
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;}
origen del flotador [4] [3]:
esta matriz contiene la rotación de cada puntos que se puede definir con el archivo de calibración. Parece que:
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]:
esta matriz contiene la orden que lo debe para hacer un dibujo específico por ejemplo:(picture 1)