Arduino en español
Circuitos con Arduino - Juan Antonio Villalpando
-- Tutorial de iniciación a Arduino --
Volver al índice del tutorial
____________________________
46B.- Giroscopio. Acelerómetro. Sensor de temperatura. MPU6050. App Inventor (III).
- Tutoriales sobre el giroscopio:
46.- Giroscopio. Acelerómetro. MPU6050. I2C. (I)
46A.- Estudio del Giroscopio y Acelerómetro. MPU6050. I2C. (II)
46B.- Giroscopio. Acelerómetro. MPU6050. I2C. App Inventor. (III)
46C.- Giroscopio. Acelerómetro. MPU6050. I2C. App Inventor. Centro. (IV)
46D.- Giroscopio. Acelerómetro. MPU6050. I2C. App Inventor. Avión. (V)
--------------------------------------------------------------------------------------------------------------------
- Visto los tutoriales 46 y 46A, vamos a realizar éste el 46B, que trata de enviar los datos por Bluetooth a App Inventor, además de mostrarlos en una pantalla LCD.
- En el tutorial 46A, ya traté sobre los fondos de escala para el giroscopio y el acelerómetro.
- En estos tutoriales para App Inventor voy a establecer un fonde de escalar para el giroscopio de 250º/s y una aceleración de 2g
- Por eso utilizaré 131 y 16384 como factores de sensibilidad.
- El establecimiento de la escala la realizaré en los códigos.
_________________________________________
- Conexionado.
- En caso que no tengas pantalla LCD, podrás ver la salida en el Monitor Serie.
- En vez de poner la pantalla en LCD en A4 y A5 (SDA - SCL) se puede poner en los terminales indicados en la imagen.
_________________________________________
1.- Obtiene el vector aceleración, lo envía por Bluetooth a App Inventor y lo muestra en pantalla LCD.
- Este ejemplo muestra la aceleración en la pantalla LCD, en el Monitor Serie y en App Inventor.
- Si dejamos el módulo MPU-6050 quieto debe mostrar aproximadamente 9,8 m/s2
// Juan Antonio Villalpando
// KIO4.COM
#include <I2Cdev.h>
#include <MPU6050.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
MPU6050 sensor;
// Valores RAW (sin procesar) del acelerometro y giroscopio en los ejes x,y,z
int ax, ay, az;
int gx, gy, gz;
int x, y, x_vieja, y_vieja;
void setup() {
lcd.begin(16,2); // Columnas y filas de LCD
Serial.begin(9600); // Iniciando Monitor Serie
Wire.begin(); // Iniciando I2C
sensor.initialize(); // Iniciando el sensor
if (sensor.testConnection()) Serial.println("Sensor iniciado.");
else Serial.println("Fallo inicio del sensor");
// Vamos a configuración del sensor
configurar_sensor();
}
void loop() {
// Lee las aceleraciones y velocidades angulares
sensor.getAcceleration(&ax, &ay, &az);
sensor.getRotation(&gx, &gy, &gz);
float ax_m_s2 = ax * (9.81/16384.0);
float ay_m_s2 = ay * (9.81/16384.0);
float az_m_s2 = az * (9.81/16384.0);
float gx_deg_s = gx / 131.0;
float gy_deg_s = gy / 131.0;
float gz_deg_s = gz / 131.0;
// Serial.print("aceleraciones en m/s2 velocidades en grados/s):\t");
// Serial.print(ax); Serial.print("\t");
// Serial.println(ay); Serial.print("\t");
// Serial.print(ax_m_s2); Serial.print("\t");
// Serial.print(ay_m_s2); Serial.print("\t");
// Serial.print(az_m_s2); Serial.print("\t");
// Serial.print(gx_deg_s); Serial.print("\t");
// Serial.print(gy_deg_s); Serial.print("\t");
// Serial.print(gz_deg_s); Serial.print("\t");
// Vector aceleración.
// La raiz de la suma de los componentes al cuadrado.
float v = sqrt(pow(ax_m_s2,2) + pow(ay_m_s2,2) + pow(az_m_s2,2)) ;
Serial.print(v);
Serial.print("\n");
// En LCD
lcd.clear(); // Borra pantalla
lcd.setCursor(0,0); // Inicio del cursor
lcd.print(v);
delay(100);
}
void configurar_sensor(){
// Activa el MPU-6050
Wire.beginTransmission(0x68);
Wire.write(0x6B);
Wire.write(0x00);
Wire.endTransmission();
// Configura el acelerometro con (2g)
Wire.beginTransmission(0x68);
Wire.write(0x1C);
Wire.write(0x00); // 00000000 = 2g. Sensibilidad = 16384
Wire.endTransmission();
// Configura el giroscopio con (250º/s)
Wire.beginTransmission(0x68);
Wire.write(0x1B);
Wire.write(0x00); // 00000000 = 250º/s. Sensibilidad = 131
Wire.endTransmission();
}
|
_________________________________________
- App Inventor.
p9N2_giroscopio_BT.aia
- Varias cosas importantes:
- El Bluetooth de Android solo puede recibir hasta 9600 baudios, es decir en el código de Arduino no podemos enviarle información a una mayor velocidad con el Serial.begin(9600).
- Si el módulo Bluetooth está conectado a los terminales 0 y 1 de Arduino, cada vez que cargemos un programa al Arduino, debemos quitarle el cable de alimentación al módulo Bluetooth. Cuando ya se haya cargado el programa volvemos a poner ese cable de alimentación.
- Si el Arduino envía información muy rápido, ejemplo delay(100);
- Y el Intervalo del Reloj de App Inventor es lento, ejemplo IntervaloReloj = 200
- El Arduino enviará valores muy rápido y App Inventor no podrá mostrarla tan rápidamente, los irá guardando en un buffer y se irán mostrando valores envejecidos.
- Para evitarlo es conveniente que el Arduino tenga por ejemplo un delay(100); y el Reloj del App Inventor más rápido, ejemplo IntervaloReloj = 50
_________________________________________
- Diseño.
- IntervaloDelReloj = 50
_________________________________________
- Bloques.
- En vez de utilizar la gravedad en m/s2, se suele referenciar a la gravedad 9,8
- No es necesario los decimales, es mejor poner 0 decimales.
- Leer.
_________________________________________
2.- Obtiene ángulo izquierdo-derecho y delante-atrás, los envía por Bluetooth a App Inventor y lo muestra en pantalla LCD.
- Los ángulos principales son el X y el Y. Al Z no le prestamos atención.
- Los números varian muy rápidamente, he puesto un filtro de 3, es decir solo muestra variación cuando de un tiempo a otro, cambia más de 3 el valor de x o y.
// Juan Antonio Villalpando
// KIO4.COM
#include <I2Cdev.h>
#include <MPU6050.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
MPU6050 sensor;
// Valores RAW (sin procesar) del acelerometro y giroscopio en los ejes x,y,z
int ax, ay, az;
int gx, gy, gz;
int x, y, x_vieja, y_vieja;
void setup() {
lcd.begin(16,2); // Columnas y filas de LCD
Serial.begin(9600); // Iniciando Monitor Serie
Wire.begin(); // Iniciando I2C
sensor.initialize(); // Iniciando el sensor
if (sensor.testConnection()) Serial.println("Sensor iniciado.");
else Serial.println("Fallo inicio del sensor");
// Vamos a configuración del sensor
configurar_sensor();
}
void loop() {
// Lee las aceleraciones y velocidades angulares
sensor.getAcceleration(&ax, &ay, &az);
sensor.getRotation(&gx, &gy, &gz);
float ax_m_s2 = ax * (9.81/16384.0);
float ay_m_s2 = ay * (9.81/16384.0);
float az_m_s2 = az * (9.81/16384.0);
float gx_deg_s = gx / 131.0;
float gy_deg_s = gy / 131.0;
float gz_deg_s = gz / 131.0;
// Serial.print("aceleraciones en m/s2 velocidades en grados/s):\t");
// Serial.print(ax); Serial.print("\t");
// Serial.println(ay); Serial.print("\t");
// Serial.print(ax_m_s2); Serial.print("\t");
// Serial.print(ay_m_s2); Serial.print("\t");
// Serial.print(az_m_s2); Serial.print("\t");
// Serial.print(gx_deg_s); Serial.print("\t");
// Serial.print(gy_deg_s); Serial.print("\t");
// Serial.print(gz_deg_s); Serial.print("\t");
x = map(ax, -16600, 16600, -90,90);
y = map(ay, -16600, 16600, -90,90);
////////////////// FILTRO cambio mayor que 3 //////////////
// Esto hace que solo envie informacion al Bluetooh cuando el cambio es mayor de 3
// Se hace para que no muestre tanto baile de número.
if (x > (x_vieja + 3) || x < (x_vieja - 3))
{
Serial.print(x);
Serial.print("|");
Serial.print(y);
Serial.print("\n"); // Fin de línea. Importante.
x_vieja = x;
}
if (y > (y_vieja + 3) || y < (y_vieja - 3))
{
Serial.print(x);
Serial.print("|");
Serial.print(y);
Serial.print("\n"); // Fin de línea. Importante.
y_vieja = y;
}
////////////////// Fin de FILTRO cambio mayor que 3
// En LCD
// Aqui no he puesto filtro a 3, y cambiará más rápido
lcd.clear(); // Borra pantalla
lcd.setCursor(0,0); // Inicio del cursor
lcd.print(x); lcd.setCursor(8,0); lcd.print(y);
lcd.setCursor(0,1); // Siguiente renglón.
// Vector aceleración.
// La raiz de la suma de los componentes al cuadrado.
// float v = sqrt(pow(ax_m_s2,2) + pow(ay_m_s2,2) + pow(az_m_s2,2)) ;
// Serial.print(v);
// Serial.print("\n");
delay(100);
}
void configurar_sensor(){
// Activa el MPU-6050
Wire.beginTransmission(0x68);
Wire.write(0x6B);
Wire.write(0x00);
Wire.endTransmission();
// Configura el acelerometro con (2g)
Wire.beginTransmission(0x68);
Wire.write(0x1C);
Wire.write(0x00); // 00000000 = 2g. Sensibilidad = 16384
Wire.endTransmission();
// Configura el giroscopio con (250º/s)
Wire.beginTransmission(0x68);
Wire.write(0x1B);
Wire.write(0x00); // 00000000 = 250º/s. Sensibilidad = 131
Wire.endTransmission();
}
|
_________________________________________
- App Inventor.
p9N3_giroscopio_BT.aia
- Este ejemplo muestra el ángulo de inclinación izquierda-derecha y delante-atrás en la pantalla LCD, en el Monitor Serie y en App Inventor.
_________________________________________
- Diseño.
- IntervaloDelReloj = 50
_________________________________________
- Bloques.
_________________________________________
_________________________________________
_________________________________________
_________________________________________
- Otro ejemplo.
p9B_2_bluetooth_giroscopio.aia
- Conectamos el Giroscopio y el Bluetooth, en este ejemplo no conectamos la pantalla LCD.
- Obtenemos las velocidades angulares del giroscopio x, y, z.
_________________________________________
- Diseño.
_________________________________________
- Bloques.
_________________________________________
- Código.
- He puesto que solo emite valores cuando el cambio es mayor que 1.
// Juan Antonio Villalpando
// KIO4.COM
#include <I2Cdev.h>
#include <MPU6050.h>
#include <Wire.h>
MPU6050 sensor;
// Valores RAW (sin procesar) del acelerometro y giroscopio en los ejes x,y,z
int ax, ay, az;
int gx, gy, gz;
int x, y, x_vieja, y_vieja;
void setup() {
Serial.begin(9600); // Iniciando Monitor Serie
Wire.begin(); // Iniciando I2C
sensor.initialize(); // Iniciando el sensor
if (sensor.testConnection()) Serial.println("Sensor iniciado.");
else Serial.println("Fallo inicio del sensor");
// Vamos a configuración del sensor
configurar_sensor();
}
void loop() {
// Lee las aceleraciones y velocidades angulares
sensor.getAcceleration(&ax, &ay, &az);
sensor.getRotation(&gx, &gy, &gz);
float ax_m_s2 = ax * (9.81/16384.0);
float ay_m_s2 = ay * (9.81/16384.0);
float az_m_s2 = az * (9.81/16384.0);
float gx_deg_s = gx / 131.0;
float gy_deg_s = gy / 131.0;
float gz_deg_s = gz / 131.0;
// Serial.print("aceleraciones en m/s2 velocidades en grados/s):\t");
// Serial.print(ax); Serial.print("\t");
// Serial.println(ay); Serial.print("\t");
// Serial.print(ax_m_s2); Serial.print("\t");
// Serial.print(ay_m_s2); Serial.print("\t");
// Serial.print(az_m_s2); Serial.print("\t");
// Serial.print(gx_deg_s); Serial.print("\t");
// Serial.print(gy_deg_s); Serial.print("\t");
// Serial.print(gz_deg_s); Serial.print("\t");
x = map(ax, -16600, 16600, -90,90);
y = map(ay, -16600, 16600, -90,90);
////////////////// FILTRO cambio mayor que 3 //////////////
// Esto hace que solo envie informacion al Bluetooh cuando el cambio es mayor de 3
// Se hace para que no muestre tanto baile de número.
if (x > (x_vieja + 1) || x < (x_vieja - 1))
{
// Serial.print(x);
// Serial.print("|");
// Serial.print(y);
Serial.print(gx_deg_s);
Serial.print(",");
Serial.print(gy_deg_s);
Serial.print(",");
Serial.println(gz_deg_s);
x_vieja = x;
}
if (y > (y_vieja + 1) || y < (y_vieja - 1))
{
// Serial.print(x);
// Serial.print("|");
// Serial.print(y);
Serial.print(gx_deg_s);
Serial.print(",");
Serial.print(gy_deg_s);
Serial.print(",");
Serial.println(gz_deg_s);
y_vieja = y;
}
////////////////// Fin de FILTRO cambio mayor que 3
// Vector aceleración.
// La raiz de la suma de los componentes al cuadrado.
// float v = sqrt(pow(ax_m_s2,2) + pow(ay_m_s2,2) + pow(az_m_s2,2)) ;
// Serial.print(v);
// Serial.print("\n");
delay(100);
}
void configurar_sensor(){
// Activa el MPU-6050
Wire.beginTransmission(0x68);
Wire.write(0x6B);
Wire.write(0x00);
Wire.endTransmission();
// Configura el acelerometro con (2g)
Wire.beginTransmission(0x68);
Wire.write(0x1C);
Wire.write(0x00); // 00000000 = 2g. Sensibilidad = 16384
Wire.endTransmission();
// Configura el giroscopio con (250º/s)
Wire.beginTransmission(0x68);
Wire.write(0x1B);
Wire.write(0x00); // 00000000 = 250º/s. Sensibilidad = 131
Wire.endTransmission();
}
|
________________________________
|