|     Inicio    |   |         |  |   FOROS      |  |      |      
   Elastix - VoIP B4A (Basic4Android) App inventor 2 PHP - MySQL
  Estación meteorológica B4J (Basic4Java) ADB Shell - Android Arduino
  Raspberry Pi Visual Basic Script (VBS) FireBase (BD autoactualizable) NodeMCU como Arduino
  AutoIt (Programación) Visual Basic Cosas de Windows Webs interesantes
Translate:
Búsqueda en este sitio:


.

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();
}

 

________________________________

- Mi correo:
juana1991@yahoo.com
- KIO4.COM - Política de cookies. Textos e imágenes propiedad del autor:
© Juan A. Villalpando
No se permite la copia de información ni imágenes.
Usamos cookies propias y de terceros que entre otras cosas recogen datos sobre sus hábitos de navegación y realizan análisis de uso de nuestro sitio.
Si continúa navegando consideramos que acepta su uso. Acepto    Más información