Prova
Dependencies: Giroscopio X_NUCLEO_IKS01A2 mbed
main.cpp
- Committer:
- Salvatore94
- Date:
- 2017-02-09
- Revision:
- 0:3d72a547faad
File content as of revision 0:3d72a547faad:
#include "mbed.h" #include "x_nucleo_iks01a1.h" #define TEMPO 3 //in secondi #define ACCURATEZZA 2000 #define CONVERSIONE_UNITA 1000 #define INTERVALLO_MISURA 100 //in ms #define TS 10 //tempo di campionamento in ms bool Inizializzato=0; //deifinisco lo shield static X_NUCLEO_IKS01A1 *sensor_shield= X_NUCLEO_IKS01A1::Instance(D14, D15); //D14 e D15 sono i pind SDA e SCL sulla nucleo //definisco il giroscopio static GyroSensor *gyro= sensor_shield->GetGyroscope(); uint8_t GyroID; int32_t W_ini[3],W_ris[3];//X,Y,Z int Posizione[3];//X, Y, Z DigitalOut led(LED1); //Inizializzo i valori del giroscopio (velocità angolare e posizione) bool Inizializza_Giroscopio(int32_t W[], int Pos[]){ int32_t W_temp[]={0,0,0}; printf("--- Inizializzo il giroscopio ---\r\n"); led=1; for(int i=0; i<TEMPO; i++){ gyro->Get_G_Axes(W_temp); for(int z=0; z<3; z++) W[i]+=W_temp[i]; wait(1); } for (int i=0; i<3; i++){ W[i]= (W[i]/CONVERSIONE_UNITA)/TEMPO; Pos[i]=0; } led=0; return (Inizializzato=1); } //Leggo la velocità angolare in mdps void Leggi_Velocita(int32_t W[], int32_t W_ini[]){ int32_t W_letta[3]; gyro->Get_G_Axes(W_letta); for(int i=0;i<3;i++){ if(W_letta[i]>=(W_ini[i]-ACCURATEZZA) && W_letta[i]<=(W_ini[i]+ACCURATEZZA)) W[i]=0; else W[i]= W_letta[i]/CONVERSIONE_UNITA; } } //Ricavo le posizioni in gradi void Leggi_Posizioni(int Pos[], int32_t W_ini[]){ int32_t W[3]={0,0,0}, temp[3]={0,0,0}; for(int tempo=0; tempo<INTERVALLO_MISURA; tempo++){ Leggi_Velocita(temp, W_ini); for(int i=0; i<3; i++){ W[i]+=temp[i]; } wait_ms(TS); } for(int i=0; i<3; i++){ Pos[i]= (Pos[i]+W[i]*TS); //TS è il tempo di campionamento /*if(Pos[i]>360*CONVERSIONE_UNITA) Pos[i]-=360*CONVERSIONE_UNITA; else if(Pos[i]<-360*CONVERSIONE_UNITA) Pos[i]+=360*CONVERSIONE_UNITA;*/ } } int main() { //controllo l'id del giroscopio gyro->ReadID(&GyroID); printf("Il giroscopio ha id: %d \r \n",GyroID); while(!Inizializza_Giroscopio(W_ini, Posizione)); while(1) { printf("-------\r\n"); Leggi_Velocita(W_ris, W_ini); Leggi_Posizioni(Posizione, W_ini); printf("X: %d dps\tY: %d dps\tZ: %d dps\r\n",W_ris[0],W_ris[1],W_ris[2]); printf("Pos_X: %d\tPos_Y: %d\tPos_Z: %d\r\n",Posizione[0]/CONVERSIONE_UNITA,Posizione[1]/CONVERSIONE_UNITA,Posizione[2]/CONVERSIONE_UNITA); // wait(1); } }