|     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:


.

App inventor 2 en español
Cómo programar los teléfonos móviles con Android.
Bluetooth, Arduino y App inventor 2 - Juan Antonio Villalpando

-- Tutorial de iniciación de App Inventor 2 en español --

Volver al índice del tutorial

___________________________

10A.- Conexión con Arduino con cable USB OTG. Conexión Serie. Extensión. Pantalla LCD. FTDI.

- Mediante un cable OTG podemos conectar a nuestro móvil un ratón USB, una memoria USB,...

- En estos tutoriales vamos a conectar un Arduino.

- El móvil y el dispositivo que le conectemos deben reconocerse correctamente, eso dependerá de los códigos empleados, en nuestro caso utilizaremos una extensión que reconoce al Arduino UNO tanto el original como los de fabricación china que suelen tener el chip CH340 para la conexión USB. Además la extensión que vamos a utilizar funciona con tarjetas que contienen el ESP8266 y el ESP32, así como los que disponen de chips FTDI.

- La extensión que vamos a utilizar la encontramos en este envío de la Comunidad de App Inventor:

https://community.appinventor.mit.edu/t/using-serial-with-ftdi/14136

- Se denomina: com.SerialOTG.aix, está realizado por el usuario rkl099. El autor indica que funciona en los dispositivos que utilizan CdcAcm, PL2303, PL2303HX, FTDI, CP210x, CH341,...

- Vamos a ver algunos ejemplos, se trata de conectar Arduino UNO con chip CH340 al móvil por el conector USB, para ello necesitamos un cable OTG.

- Conectamos la parte microUSB al móvil y en el otro extremo conectamos el cable USB que irá al Arduino.

- IMPORTANTE:

En Ajustes del móvil, concretamente en Ajustes adicionales / OTG. Debemos activar la conexión USB On-The-Go.

_______________________________________________

0.- App Inventor envía los caracteres "a" y "b" para encender/apagar el LED13.

p10A_OTG_print_LED.aia

- Conectamos el cable OTG al móvil. Conectamos el cable USB al cable OTG y al Arduino.

- Habilitamos OTG en Ajustes adicionales.

- Se debe encender el LED de conexión en el Arduino.

- Si no conecta, reiniciamos el móvil.

OTG_print_LED13.ino


char caracter;

void setup() { 
  Serial.begin(9600);
  pinMode(13, OUTPUT); 
}

void loop() { 
  if(Serial.available()) {
  caracter = Serial.read(); 
  if(caracter == 'a'){ digitalWrite(13, HIGH);}
  if(caracter == 'b'){ digitalWrite(13, LOW);}
  } 
} 

_______________________________________________

- Diseño.

_______________________________________________

- Bloques.

__________________________
1.- Bloque PRINT. App Inventor envía un texto al Arduino mediante cable OTG, Arduino devuelve el mismo texto. Pantalla LCD.

p10A_OTG_print_LCD.aia

- Realizamos la conexión indicada en la imagen. He utilizado una pantalla LCD-I2C para ver los datos en el Arduino, si no tiene esta pantalla puedes continuar el ejemplo, ya que además de presentarse los datos en la pantalla se devolverá al móvil.

- Mediante el bloque PrintSerial enviaremos un texto, se mostrarán en la pantalla LCD-I2C y se devolverá al móvil.

- He utilizado un Arduino UNO con el chip CH340, una pantalla LCD-I2C y los cables.

- Un cable, el OTG lo conecto al móvil y el otro cable, el OTG lo conecto al Arduino y al cable anterior

- En este código, Arduino recibe el texto enviado mediante el bloque PrintSerial, llegará caracter a caracter al Arduino. Arduino irá devolviendo caracter a caracter según la van llegando mediante Serial.print(caracter). Cuando Arduino recibe fin de línea, esto es el caracter 10 (\n), se muestran la acumulación de todos los caracteres recibido en palabra, en la pantalla LCD.

- Para ejecutarlo debemos pulsar dos veces el Botón "Open Serial".

OTG_print_LCD.ino


// Juan A. Villalpando
// kio4.com

#include <Wire.h>
// Pantalla LCD
#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);

char caracter;
String palabra;

 void setup(){  
  Serial.begin(9600);  
  lcd.begin(16,2);// Columnas y filas de LCD.
  lcd.clear();
 } 
  
 void loop() { 
 if(Serial.available()) {
  caracter = Serial.read();
  Serial.print(caracter);
  palabra = palabra + caracter;
    if(caracter == 10) {
      palabra = palabra.substring(0, palabra.length() - 1); // Quita último caracter 
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print(palabra);
      palabra="";
    }
    delay(10); 
  }
}  

_______________________________________________

- Diseño.

 

_______________________________________________

- Bloques.

_______________________________________________
_______________________________________________
_______________________________________________

2.- Bloques WRITE. App Inventor envía un datos al Arduino, Arduino devuelve esos datos. Pantalla LCD.

p10A_OTG_write LCD.aia

- La misma conexión que la del ejemplo anterior.

- En este caso iremos enviando distintos tipos de datos mediante WRITE: texto, string hexadecimal, lista y byte.

- Observa que añadimos el caracter *, es el 2A y el 42 en ASCII, para indicar fin de mensaje.

- Cuando mediante el asterisco se recibe el fin de mensaje se reenvía la palabra obtenida mediante Serial.print(palabra) y se escribe en la pantalla LCD.

- Código:

OTG_write_LCD.ino


// Juan A. Villalpando
// kio4.com

#include <Wire.h>
// Pantalla LCD
#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);

char caracter;
String palabra;

 void setup(){  
  Serial.begin(9600);  
  lcd.begin(16,2);// Columnas y filas de LCD.
  lcd.clear();
 } 
  
 void loop() { 
 if(Serial.available()) {
  caracter = Serial.read();
  palabra = palabra + caracter;
    if(caracter == '*') {    
      palabra = palabra.substring(0, palabra.length() - 1); // Quita último caracter * 
      // Serial.println(palabra.toInt()* 2); // Si es un número, devuelve el doble.
      Serial.print(palabra);
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print(palabra);
      palabra="";
    }
    delay(10); 
  }
} 

_______________________________________________

- Diseño.

_______________________________________________

- Bloques.

_______________________________________________
_______________________________________________
_______________________________________________

3.- App Inventor envía texto mediante PRINT. Arduino envía texto mediante teclado.

p10A_OTG_LCD_Teclado.aia

- A este Keypad 4x4 le he añadido un módulo I2C, para poder conectarlo con solo dos terminales de datos al Arduino como indico en la imagen.

- Keypad.zip

OTG_LCD_3.ino


// Juan A. Villalpando
// kio4.com

#include <Wire.h>
// Pantalla LCD
#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);

char caracter;
String palabra;

 void setup(){  
  Serial.begin(9600);  
  lcd.begin(16,2);// Columnas y filas de LCD.
  lcd.clear();
 } 
  
 void loop() { 
 if(Serial.available()) {
  caracter = Serial.read();
  palabra = palabra + caracter;
    if(caracter == '*') {    
      palabra = palabra.substring(0, palabra.length() - 1); // Quita último caracter * 
      // Serial.println(palabra.toInt()* 2); // Si es un número, devuelve el doble.
      Serial.print(palabra);
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print(palabra);
      palabra="";
    }
    delay(10); 
  }
} 

_______________________________________________

- Diseño.

_______________________________________________

- Bloques.

_______________________________________________
_______________________________________________
_______________________________________________

4.- Arduino genera dos números aleatorios y los envía a la aplicación.

p10A_OTG__LCD_Temperatura.aia

- Arduino crea dos números aleatorios:

temperatura: 20...40

humedad: 50...90

Lo envía en forma de String, por ejemplo: 48,79

_______________________________________________

- Diseño.

 

_______________________________________________

- Bloques.

 

OTG_Temperatura.ino


// Juan A. Villalpando
// kio4.com

int temperatura;
int humedad;
String todo;

void setup() {
 Serial.begin(9600); 
}

void loop() {
  temperatura = random(20,40);
  humedad = random(50,90);
  todo = (String) temperatura + "," + (String) humedad;
  Serial.print(todo);
  delay(2000);
}

_______________________________________________
_______________________________________________
_______________________________________________

5A.- FTDI. Arduino envía caracter a Monitor Serie. Android envía texto a Arduino (I).

p10A_OTG_FTDI.aia

- En los ejemplos anteriores hemos visto que si conectamos el cable USB del Arduino al móvil mediante el cable OTG, no podemos ver la información en el Monitor Serie.

- En este ejemplo vamos a utilizar el Monitor Serie como lo hacemos normalmente, es decir conectando el Arduino al ordenador mediante su correspondiente cable USB

- Para conectar el móvil al Arduino, utilizaremos un módulo con un Chip de FTDI. Este chip convierte la información en formato USB a información en formato RX/TX.

- Es decir, lo utilizamos para conectar un USB a unos terminales RX/TX.

- Esto lo hace este Arduino con el chip CH340, conecta USB con los terminales RX/TX que están en los conectores 0 y 1 del Arduino. Mediante esta conexión el ordenador y el Arduino intercambian datos.

- Es este caso utilizaremos el módulo con el chip de FTDI para conectar el USB del móvil con el Arduino.

- Utilizaremos los terminales 10 y 11, ya que 0 y 1, está conectado al chip CH340.

- En el código de Arduino, debemos cargar la librería "SoftwareSerial" que puede configurar los terminales 10 y 11 como terminales Serie RX/TX.

- Podremos comunicar el Arduino con el ordenador mediante un cable USB, como lo hacemos normalmente y utilizar el Monitor Serie, y además podemos comunicar el Arduno con el móvil mediante el módulo FTDI y el cable OTG.

 

OTG_FTDI.ino


// Juan A. Villalpando
// kio4.com


#include <SoftwareSerial.h>
SoftwareSerial FTDI(10,11);
// El TX del módulo FTDI va al pin 10 del Arduino
// El RX del módulo FTDI va al pin 11 del Arduino
// El GND del módulo FTDI va al GND del Arduino

char caracter;
int aleatorio;

void setup(){
  FTDI.begin(9600);
  Serial.begin(9600);
}

void loop (){
// Lee del Android y escribe Monitor Serie.
  if (FTDI.available() > 0) {
    caracter = FTDI.read();
    Serial.print(caracter);
  }
  
// Crea un número aleatorio y lo envía a Android
      aleatorio = random(33,126);
      FTDI.write(aleatorio);
      
  delay(500);   
}

_______________________________________________

- Diseño.

_______________________________________________

- Bloques.

_______________________________________________
_______________________________________________
_______________________________________________

5B.- CP2102. Arduino envía texto a Android. Android envía texto a Arduino (II).

p10A_OTG_CP2102.aia

- Código similar al anterior.

- En este ejemplo envío un texto desde el Arduino al Android y viceversa.

- He utilizado el CP2102 porque es más fácil conectar al cable OTG. Fíjate en el ejemplo anterior con el módulo FTDI necesito el cable OTG y otro USB para conectarlo al móvil.

OTG_CP2102.ino


// Juan A. Villalpando
// kio4.com

#include <SoftwareSerial.h>
SoftwareSerial FTDI(10,11);
// El TX del módulo FTDI va al pin 10 del Arduino
// El RX del módulo FTDI va al pin 11 del Arduino
// El GND del módulo FTDI va al GND del Arduino

String de_android;
String a_arduino;

void setup(){
  FTDI.begin(9600);
  Serial.begin(9600);
}

void loop (){
// Lee del Android y escribe Monitor Serie.
  if(FTDI.available()) {
    de_android = FTDI.readStringUntil('\n');
    Serial.println(de_android);
  }
  
// Lee Monitor Serie y envía a Android.
  if(Serial.available()) {
     a_arduino = Serial.readStringUntil('\n');
     FTDI.print(a_arduino);
     Serial.println(a_arduino);
    }
  delay(5);   
}

__________________
- Bloques.

_______________________________________________
_______________________________________________
_______________________________________________

5C.- CP2102. El mismo ejemplo pero con Serial.event (III).

p10A_OTG_CP2102.aia (la misma aplicación del ejemplo anterior.)

- Ejemplo Serial.event de:

https://docs.arduino.cc/built-in-examples/communication/SerialEvent

OTG_CP2102_event.ino


#include <SoftwareSerial.h>
SoftwareSerial FTDI(10,11);
// El TX del módulo FTDI va al pin 10 del Arduino
// El RX del módulo FTDI va al pin 11 del Arduino
// El GND del módulo FTDI va al GND del Arduino

String de_android;
String a_arduino;

String inputString = "";       // a String to hold incoming data
bool stringComplete = false;  // whether the string is complete

void setup() {
   FTDI.begin(9600);
  // initialize serial:
  Serial.begin(9600);
  // reserve 200 bytes for the inputString:
  inputString.reserve(200);
}

void loop() {
  // Lee del Android y escribe Monitor Serie.
  if(FTDI.available()) {
    de_android = FTDI.readStringUntil('\n');
    Serial.println(de_android);
  }
  
  // print the string when a newline arrives:
  if (stringComplete) {
    FTDI.print(inputString);
    Serial.println(inputString);
    // clear the string:
    inputString = "";
    stringComplete = false;
  }
}

/*
  SerialEvent occurs whenever a new data comes in the hardware serial RX. This
  routine is run between each time loop() runs, so using delay inside loop can
  delay response. Multiple bytes of data may be available.
*/
void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline, set a flag so the main loop can
    // do something about it:
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}

_______________________________________________
_______________________________________________
_______________________________________________

6.- Movemos un potenciómetro en Arduino, se envía su valor mediante UART al móvil.

p10A_OTG_potenciometro.aia

- Un ejemplo parecido a este lo vimos con el Bluetooth, enviamos los valores de un potenciómetro desde Arduino al móvil mediante Bluetooth, dibujamos los valores recibidos en un gráfico.

- Ahora vamos a enviar los valores de un potenciómetro desde Arduino mediante UART, dibujaremos los valores recibidos en un gráfico.

____________________________________________________

- Conversores USB <--> UART.

- Aquí tenemos otros cuatro tipos de conversores USB <> UART, observa el tipo de conector. También se denominan conversor USB a TTL.

- Mediante estos conversores podemos adaptar la señal de USB al UART del Arduino, es decir a conexiones serie de tipo RX y TX.

- De estos cuatro tipos, es mejor utilizar el CP2102 ya que lo podemos conectar directamente al cable OTG.

- También necesitaremos un cable OTG.

- También será necesario habilitar OTG en el móvil.

____________________________________________________

- Conexiones.

- Video:

OTG_Potenciometro.ino


// Juan A. Villalpando
// http://kio4.com/appinventor/10A_OTG_LCD.htm

#include <SoftwareSerial.h> 
#include <Wire.h> 

SoftwareSerial UART(10, 11) ; // UART(TX,RX)

int value_pot0;

void setup() { 
  Serial.begin(9600);
  UART.begin(9600); 
  Wire.begin();
}

void loop() { 
    value_pot0 = analogRead(A0);
    Serial.println(value_pot0);
    UART.println(value_pot0);
    delay(100); // Debe ser más lento que el Reloj.
} 

____________________________________________________

- Diseño.

____________________________________________________

- Bloques.

__________________________________

 
- 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