Lectura del sensor
Este codigo se encuentra en el repositorio (click aqui), corresponde a la forma en que se leen los datos del giroscopio, en este caso utilizamos el giroscopio del eje Y, asi que se accede a los registros del MPU por medio de la libreria <wire.h>
la cual permite la comunicación entre el Arduino y un dispositivo que posea comunicación I2C. En las tarjetas Arduino se tienen los pines SDA (linea de datos) y SCL (linea de reloj); estos pines se conectan directamente a los mismos pines del MPU6050 para realizar la comunicación entre el sensor y el arduino.
Se definen dos macros #define MPU 0x68, #define GYRO_CONFIG 0x1B
, se guarda la dirección de I2C del MPU y la dirección del registro de configuración del giroscopio respectivamente.
Wire.beginTransmission(MPU);
Wire.write(GYRO_CONFIG);
Wire.write(3<<3);
Wire.endTransmission(true);
Con estas lineas de codigo las cuales se implementan en void setup()
, se modifica el registro de configuración del giroscopio y se selecciona el rango total de las salidas del giroscopio, seleccinando ± 2000 °/s
Wire.write(0x45);
Wire.endTransmission(false);
Wire.requestFrom(MPU,2,true);
GY=Wire.read()<<8|Wire.read();
Implementando este codigo en void loop()
se realiza la lectura del valor en Y del giroscopio, el giroscopio transmite el valor en 2 partes de 8 bits cada una, iniciando en la direccion 0x45
y la siguiente, después de leer estas dos direcciones se suman los bits y se guardan en la variable int16_t GY
.
PWM
Este codigo se encuentra en el repositorio (click aqui), con este codigo se controla la velocidad y el sentido de giro del motor ya que se conecta a un puente H y dependiendo de la configuración que se le de a cada entrada de este, gira hacia un sentido y con cierta velocidad el motor.
if(valorpot>=0&&valorpot<=511){
digitalWrite(pinA1,HIGH);
digitalWrite(pinB1,LOW);
valorveloc=map(valorpot, 0, 511, 255, 90);
analogWrite(pinEN1,valorveloc);}
else if(valorpot>=512&&valorpot<=1023){
digitalWrite(pinA1,LOW);
digitalWrite(pinB1,HIGH);
valorveloc=map(valorpot, 512, 1023, 70, 255);
analogWrite(pinEN1,valorveloc);}
Luego de declarar pines de entrada y salida, se implementa este codigo para probar el funcionamiento del arduino junto con el puente H. La entrada es la lectura analogica de un potenciometro, que se divide en dos para que una mitad haga que el motor gire en un sentido y a determinada velocidad y la otra mitad hacia el otro lado. Las pruebas con este codigo arrojaron resultados positivos por lo tanto se implemento en el codigo final.
Codigo Final
Este codigo se encuentra en el repositorio (click aqui), y es la unión de los dos codigos anteriores pero se cambian las condiciones de los sentidos de giro de los motores para el pwm y el puente H, se organizan de modo que funcionen con los valores obtenidos del giroscopio, ademas de caracterizar los valores del giroscopio y darles unos limites a los positivos y negativos para realizar un control on/off de manera sencilla.