Advertisement
BorenPardo123456789

CODIGO NIVEL DIGITAL (MPU6050)

Nov 22nd, 2017
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.85 KB | None | 0 0
  1. /*RECUERDO QUE NO MODIFIQUEN LOS CALCULOS NI LA DECODIFICACION DEL ACELEROMETRO PUES SU RESULTADO PUEDE FALLAR*/
  2.  
  3. //PUEDEN AÑADIR LAS LIBRERIAS QUE NECESITEN SIEMPRE Y CUANDO NO BORREN LA LIBRERIA WIRE
  4.  
  5. #include <Wire.h>
  6.  
  7.  
  8. /////////////////////DECLARACION DE VARIABLES////////////////////////////
  9.  
  10. //Direccion I2C de la IMU
  11. #define MPU 0x68 //0x68 es el numero del acelerometro
  12.  
  13. //Ratios de conversion
  14. #define A_R 16384.0
  15. #define G_R 131.0
  16.  
  17. //Conversion de radianes a grados 180/PI
  18. #define RAD_A_DEG = 57.295779
  19.  
  20. //MPU-6050 da los valores en enteros de 16 bits
  21. //Valores sin refinar
  22. int16_t AcX, AcY, AcZ, GyX, GyY, GyZ;
  23.  
  24. //Angulos
  25. float Acc[2];
  26. float Gy[2];
  27. float Angle[2];
  28. float AngleOffset[2];
  29. ///////////////////DECLARACION VARIABLES DE CODIGOS///////////////////////
  30.  
  31.  
  32.  
  33.  
  34. // LO DEJARÉ EN BLANCO PARA QUE PUEDAN MODIFICARLO A SU GUSTO (O NECESIDAD)
  35.  
  36.  
  37.  
  38.  
  39.  
  40. ////////////////////////////////////////////////////////////////////////
  41. void setup()
  42. {///////////////////////////////DECLARACION DE TODO LO DEL ACELEROMETRO////////////////////////////////
  43. Wire.begin();
  44. Wire.beginTransmission(MPU);
  45. Wire.write(0x6B);
  46. Wire.write(0);
  47. Wire.endTransmission(true);
  48. Serial.begin(9600);
  49. // AngleOffset[0]=-81;
  50. // AngleOffset[1]=2;
  51. Serial.print("AngleOffset X: "); Serial.print(AngleOffset[0]); Serial.print("\n");
  52. Serial.print("AngleOffset Y: "); Serial.print(AngleOffset[1]); Serial.print("\n------------\n");
  53. ///////////////////////////////DECLARACION DE PINES DE CODIGOS//////////////////////////////////////
  54.  
  55.  
  56.  
  57.  
  58. // LO DEJARÉ EN BLANCO PARA QUE PUEDAN MODIFICARLO A SU GUSTO (O NECESIDAD)
  59.  
  60.  
  61.  
  62.  
  63.  
  64. }
  65.  
  66. void loop()
  67. {
  68. ///////////////////////////CALCULOS Y FUNCIONAMIENTO DEL ACELEROMETRO//////////////////////////////
  69. //Leer los valores del Acelerometro de la IMU
  70. Wire.beginTransmission(MPU);
  71. Wire.write(0x3B); //Pedir el registro 0x3B - corresponde al AcX
  72. Wire.endTransmission(false);
  73. Wire.requestFrom(MPU,6,true); //A partir del 0x3B, se piden 6 registros
  74. AcX=Wire.read()<<8|Wire.read(); //Cada valor ocupa 2 registros
  75. AcY=Wire.read()<<8|Wire.read();
  76. AcZ=Wire.read()<<8|Wire.read();
  77.  
  78. //A partir de los valores del acelerometro, se calculan los angulos Y, X
  79. //respectivamente, con la formula de la tangente.
  80. Acc[1] = atan(-1*(AcX/A_R)/sqrt(pow((AcY/A_R),2) + pow((AcZ/A_R),2)))*RAD_TO_DEG;
  81. Acc[0] = atan((AcY/A_R)/sqrt(pow((AcX/A_R),2) + pow((AcZ/A_R),2)))*RAD_TO_DEG;
  82.  
  83. //Leer los valores del Giroscopio
  84. Wire.beginTransmission(MPU);
  85. Wire.write(0x43);
  86. Wire.endTransmission(false);
  87. Wire.requestFrom(MPU,4,true); //A diferencia del Acelerometro, solo se piden 4 registros
  88. GyX=Wire.read()<<8|Wire.read();
  89. GyY=Wire.read()<<8|Wire.read();
  90.  
  91. //Calculo del angulo del Giroscopio
  92. Gy[0] = GyX/G_R;
  93. Gy[1] = GyY/G_R;
  94.  
  95. //Aplicar el Filtro Complementario
  96. Angle[0] = 0.98 *(Angle[0]+Gy[0]*0.010) + 0.02*Acc[0];
  97. Angle[1] = 0.98 *(Angle[1]+Gy[1]*0.010) + 0.02*Acc[1];
  98.  
  99. //Mostrar los valores por consola
  100. Serial.print("Angle X: "); Serial.print(Angle[0]); Serial.print("\n");
  101. Serial.print("Angle Y: "); Serial.print(Angle[1]); Serial.print("\n------------\n");
  102. //Angle[0] = Angle[0] + AngleOffset[0];
  103. //Angle[1] = Angle[1] + AngleOffset[1];
  104. // Serial.print("AngleCalibrated X: "); Serial.print(Angle[0]+AngleOffset[0]); Serial.print("\n");
  105. // Serial.print("AngleCalibrated Y: "); Serial.print(Angle[1]+AngleOffset[1]); Serial.print("\n------------\n");
  106.  
  107.  
  108. delay(10); //Nuestra dt sera, pues, 0.010, que es el intervalo de tiempo en cada medida
  109. ////////////////////////////////////////////////////CONDICIONES/////////////////////////////////////////////////
  110.  
  111.  
  112.  
  113.  
  114. // LO DEJARÉ EN BLANCO PARA QUE PUEDAN MODIFICARLO A SU GUSTO (O NECESIDAD)
  115.  
  116.  
  117.  
  118.  
  119.  
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement