La mayoría de dispositivos móviles tiene la posibilidad de comunicación inalámbrica por Bluetooth. Este sistema es fácil de programar con AppInventor pero hay que tener una serie de cosas claras:
La propuesta que se plantea consiste en conectar el smartphone/tablet con Arduino. Para ello emplearemos un módulo HC-05 o HC-06 de JY-MCU, o similar, de bajo coste (sobre 6€).
Las tarjetas o módulos Ethernet, WIFI o Bluetooth y en general, en las redes informáticas, tienen un número que las identifica, como si fuera un número de serie, se denomina MAC (Control de Acceso a Medios). Esta MAC consta de 6 agrupamientos de cifras hexadecimales separados por ":". El código hexadecimal se basa en un sistema de 16 números distintos: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. Donde las letras corresponderían a 10, 11, 12, 13, 14 y 15 respectivamente.
Por lo tanto, un ejemplo de MAC=00:B0:D0:86:BB:F7
NOTA: si no sabes qué es Arduino o no sabes programar una tarjeta Arduino pincha aquí.
/*
* Name: ConfigBt
* Vers: v0.1alfa
* Date: 27/03/2019 ddmmyyyy
* Auth: FJRAC
* Lang: Spanish
* Descripción:
* Configura el HC-06 con:
* -Velocidad de conexión Bluetooth a 9600
* -Nombre del dispositivo --------> AT+NAME[nombre]
* -Pin de emparejado(4dígitos) ---> AT+PIN[xxxx]
* Se emplea la librería SoftwareSerial para compatibilizar
* con cualquier tarjeta Arduino. SoftwareSerial.h
* Se crea y configura la comunicación serie:
* SoftwareSerial SerialBT(Rx,Tx);
* Conexiones:
* HC06 -------- Arduino (SoftwareSerial)
* TX ---------> pin2 (RX)
* RX <--------- pin3 (TX)
* VCC <--------> 5V
* GND <--------> GND
* El Monitor serie debe estar "sin ajuste de linea"
*/
#include <SoftwareSerial.h>
#define Rx 3
#define Tx 4
#define velocidad 9600
SoftwareSerial BT(Rx,Tx);
char i=' ';
void setup(){
Serial.begin(velocidad);
while(!Serial);
Serial.println("Comunicando por USB");
BT.begin(velocidad);
delay(2000);
}
void loop() {
if(BT.available()){
i=BT.read();
Serial.print(i);
}
if(Serial.available()){
i=Serial.read();
BT.print(i);
}
}
La propuesta consiste en activar por bluetooth una luz conectada a un arduino. La luz puede ser un LED directamente o un Relé conectado a una bombilla convencional de 220V de alterna. Con una pequeña modificación puedes realizar el control del cierre de una puerta de garaje.
Al final de la página puedes descargarte todos los ficheros necesarios para reproducir o ejecutar el ejemplo
Empezaremos con la parte Diseñador:
Se trata de colocar:
De tal manera que antes de conectar con el dispositivo Bluetooth, debemos cargar la lista de dispositivos posibles:
Una vez pulsado el botón "CONECTA" se abre una lista con los dispositivos Bluetooth disponibles, tras pulsar uno (nuestro módulo HC-06) comprobamos si se ha abierto la conexión, si no, se desconecta.
Para salir del programa, al pulsar el botón "Salir", se cierra la aplicación.
Para activar la linterna, Se pulsa el botón ON. El proceso consiste en enviar el carácter "H" y se espera la respuesta: si se recibe "H", entonces el fondo del botón cambia a verde, si no, el fondo del botón será gris.
Para desactivar la luz de la linterna, se pulsa el botón de OFF. El procedimiento es muy parecido al del botón ON, se manda un carácter, en este caso "L" y se espera la respuesta, si se recibe el mismo carácter, el color de fondo del botón pasará a rojo, si no será gris.
Y ya está...
/******************************************
NAME: linterna
VERS: v0.1alpha
DATE: 01/01/2018 (dd/mm/yyyy)
AUTH: Francisco Javier Arteaga Cardineau
basado en el programa del módulo 3 realizado
por Javier García Real
LANG: Spanish
LICENSE: CC-BY-NC-SA
DESCRIPCION:
Programa del Curso de Arduino+AppInventor
del CRFP de Castilla-La Mancha
Enciende y apaga un led asociado al pin13
con los datos recibidos por Bluetooth.
* H -> Enciende el led
* L -> Apaga el led
Tras recibir y ejecutar la orden debe enviar
* H -> Ya encendido
* L -> Ya apagado
Conexión de módulo Bluetooth HC-06
RX -> pin3
TX -> Pin4
VCC-> 5V
GND-> GND
******************************************/
//-- Zona de librerías --
// Comunicación serie por software
#include <SoftwareSerial.h>
//-- Zona de definiciones --
#define LED 13
#define RX 3
#define TX 4
//-- Zona de variables globales
SoftwareSerial BT1(RX,TX);
//-- Configuración --
void setup() {
pinMode(LED,OUTPUT);
BT1.begin(9600);
}
//-- Programa principal --
void loop() {
//Zona de variables locales dato enviado por Android
char recibido=0;
//Si se ha recibido un dato
if(BT1.available()==true){
recibido=BT1.read(); //Se carga en la variable recibido
}
switch(recibido){
case('H'):
//Si es un carácter "H", se enciende el LED
digitalWrite(LED,HIGH);
delay(10);
//Se lee el pin del LED si es de nivel alto, envía un carácter "H", por bluetooth
if(digitalRead(LED)==HIGH){
BT1.write('H');
}
break;
case('L'):
//Si es un carácter "L", se apaga el LED
digitalWrite(LED,LOW);
delay(10);
//Se lee el pin del LED si es de nivel bajo, envía un carácter "L", por bluetooth
if(digitalRead(LED)==LOW){
BT1.write('H');
}
break;
}
}
La propuesta consiste en monitorizar, vía Bluetooth, desde el dispositivo Android los pines digitales de entrada del 5 al 12 de una placa Arduino compatible.
Puedes encontrar todo lo necesario para reproducirlo al final de la página.
Interesante de este programa es la forma de comunicar el estado de Arduino a Android. Emplearemos una técnica muy empleada en microcontroladores.
Vamos a comunicar los valores de los 8 pines encapsulados en un byte, de tal manera que:
7 6 5 4 3 2 1 0 <--Peso
2 2 2 2 2 2 2 2 <--bits de un Byte
12 11 10 9 8 7 6 5 <--Pin correspondiente donde se guardará su valor
Un ejemplo:
0 0 1 1 0 0 0 1 => 1*20 + 0*21 + 0*22 + 0*23 + 1*24 + 1*25 + 0*26 + 0*27 =>1+16+32 =>4910 =>31HEXADECIMAL
Del lado de la recepción, 31H => dividir por 2 un byte es lo mismo que bit a bit moverlos hacia la derecha rescatando el resto:
0 1 2 3
00110001-> (/2)-> 00011000.1 -> (/2)-> 00001100.0 -> (/2)-> 00000110.0 -> (/2)-> 00000011.0 ->
4 5 6 7
(/2)-> 00000001.1 -> (/2)-> 00000000.1 -> (/2)-> 00000000.0 -> (/2)-> 00000000.0
De tal manera que si asociamos las posiciones, los restos y los pines:
Posición 0 ->1 = Pin5
Posición 1 ->0 = Pin6
Posición 2 ->0 = Pin7
Posición 3 ->0 = Pin8
Posición 4 ->1 = Pin9
Posición 5 ->1 = Pin10
Posición 6 ->0 = Pin11
Posición 7 ->0 = Pin12
Otra manera de volver a pasar de paralelo (Byte) a serie (bit a bit) que es utilizar una máscara de bits. Es decir, para extraer bit a bit:
00110001 AND 00000001=> 1 <-Pin5
00110001 AND 00000010=> 0 <-Pin6
00110001 AND 00000100=>0 <-Pin7
00110001 AND 00001000=>0 <-Pin8
00110001 AND 00010000=>1 <-Pin9
00110001 AND 00100000=>1 <-Pin10
00110001 AND 01000000=>0 <-Pin11
00110001 AND 10000000=>0 <-Pin12
Este método también es muy utilizado y más fácil de automatizar con AppInventor.
En Arduino, el Byte se construye de tal manera que el pin5 sea el bit de menor peso y el pin12 sea el bit de mayor peso. El algoritmo es el siguiente: se inicializa el dato a "0", se establece una repetición
dato=0
repite peso de 1 a 8
dato=dato+valor[pin]*2^(peso)
fin repite
Donde:
En AppInventor, se obtiene cada pin, dividiendo por 2, cada vez, y ver resto: si el resto es 0, el bit es "0"; si el resto es mayor de 0, el bit es "1". El algoritmo es el siguiente:
repite peso de 1 a 8
si(resto(dato/2)>0)
dato_pin[peso]=1
si no
dato_pin[peso]=0
fin si
dato=entero_inferior(dato/2)
fin repite
Donde:
Nota:
El segundo método descrito, su algoritmo es el siguiente:
repite peso de 1 a 8
dato_pin[peso]=(dato&&2^(peso-1));
fin repite
/**********************************************
NAME: monitoriza
VERS: v0.1alpha
DATE: 01/01/2018
AUTH: Francisco Javier Arteaga Cardineau
LANG: Spanish
LICENSE: CC-BY-NC-SA
DESCRIPCION:
Programa del Curso de Arduino-AppInventor
del CRFP de Castilla-La Mancha
Monitoriza las entradas digitales de Arduino
por Bluetooth. Del Pin5 al Pin12, convirtiendo
los datos en un byte para ser transmitido.
7 6 5 4 3 2 1 0 ->posicion
2 2 2 2 2 2 2 2
p12 p11 p10 p9 p8 p7 p6 p5 ->pin
Pin a pin se guarda en dato_pin
para construir el byte, emplearemos:
dato=dato+dato_pin*2^posicion
Conexion del modulo Bluetooth HC-06:
RX-->Pin3
TX-->Pin4
Vcc->5V
GND->GND
**********************************************/
//--Zona de librerias--
//Comunicacion serie por software
#include <SoftwareSerial.h>
//--Zona de definiciones--
#define RX 3
#define TX 4
//--Zona de variables globales--
SoftwareSerial BT1(RX,TX);
//--Configuracion--
void setup() {
pinMode(5,INPUT);
pinMode(6,INPUT);
pinMode(7,INPUT);
pinMode(8,INPUT);
pinMode(9,INPUT);
pinMode(10,INPUT);
pinMode(11,INPUT);
pinMode(12,INPUT);
BT1.begin(9600);
}
//--Programa principal--
void loop() {
//Variables locales
boolean dato_pin;
byte dato=0;
for(int posicion=0;posicion<8;posicion++) { //encapsulado bit a bit del byte
dato_pin=digitalRead(posicion+5);
dato=dato+dato_pin*2^posicion;
delay(1);
}
BT1.write(dato); //Envía el dato
delay(250); //Espera 1/4 de segundo para que le dé tiempo a procesar la parte de Android
}
Básicamente es la imagen de una Arduino UNO con los pines correspondientes (5-12):
La pantalla queda de la siguiente manera, para ello utilizaremos:
Como con la aplicación de la linterna, empezaremos con el elemento ListPicker (ListaDispositivos), parecido a un botón, con el texto "Conecta", que consta de dos grandes grupos de bloques así como el botón de "Salir":