Introducción
La búsqueda de la comunicación entre un sistema embebido y el mundo exterior siempre es apasionante. El poder controlar el entorno desde la palma de nuestra mando ha sido un tema interesante. En este paper se busca explicar de forma simple y breve como comunicar un Sistema Android con un microcontrolador montado sobre una tarjeta llamada Arduino. El proyecto lo estamos trabajando en conjunto con un amigo experto en electrónica (Julio –es reservado y aun no se inscribe en los foros- ) y yo (nada experto, pero un poco hábil en la programación) y nos encaminamos a hacer funcionar este cacharro. Lo compartimos con ustedes.
Objetivo
Material
Software
Código de Android
El código usado hasta este momento para Android en Basic4Android is:
La idea inicial del código la obtuve del post creado por el usuario Diego:
http://www.b4x.com/forum/basic4android-updates-questions/18292-arduino-uno-usb-host.html#post105928
Código para Arduino
Antes de compilar el código debes de colocar las librerias en la carpeta de Librerias del compilador de Arduino, sino el codigo no compilara y marcará errores.
El código creado hasta este momento para Arduino:
Conclusiones
Hasta hoy 13 de Septiembre se ha logrado enviar una cadena de caracteres (“Hola”) al Arduino la cual se puede visualizar por medio del monitor Serial. Tambien se ha enviado del Arduino al Android la misma cadena. Gracias al tipo de dato AnsyncString el envio y recepción de datos puede ser incluso al mismo tiempo (o eso aparenta al usuario final) y el sistema no se bloqueará.
Otros Comentarios y Pendientes
Este codigo aun no esta finalizado y esta en desarrollo, por lo tanto no está optimizado, quizas exista una mejor manera, por lo pronto así funcióna. También falta implementar un protocolo adecuado para la comunicación entre Arduino y Android (estoy pensando en usar el mismo que usa Google en su Demokit). Como he comentado los avances que se vayan dando los iré actualizando en este post.
Agradecimientos
Erel. Por darme la corrección para obtener los permisos al accesorio.
Jerel.Por darme la corrección para el envió de datos.
(En el post en Ingles)
Breve biografía y Links
Connect via USB Sockets
AsyncStreams Tutorial
USB Library information
Post en Ingles
Este es el post en ingles por si gustas seguirlo:
Arduino mega Adk Project Basic4android
Aquí voy actualizando mas rápidamente la información.
Cualquier comentario es bienvenido. Un saludo
La búsqueda de la comunicación entre un sistema embebido y el mundo exterior siempre es apasionante. El poder controlar el entorno desde la palma de nuestra mando ha sido un tema interesante. En este paper se busca explicar de forma simple y breve como comunicar un Sistema Android con un microcontrolador montado sobre una tarjeta llamada Arduino. El proyecto lo estamos trabajando en conjunto con un amigo experto en electrónica (Julio –es reservado y aun no se inscribe en los foros- ) y yo (nada experto, pero un poco hábil en la programación) y nos encaminamos a hacer funcionar este cacharro. Lo compartimos con ustedes.
Objetivo
- Mandar señales de control desde un sistema Android a las salidas digitales del Arduino. Esto puede servir para: encender o apagar un led hasta para encender/apagar un motor (con el arreglo electrónico adecuado, el cual no será tratado en este paper).
- Se busca monitorear datos de temperatura y humedad que sean provistos por sensores.
- Controlar un servomotor.
Material
- Arduino Mega Adk o alguna variante:
- Leds
- Sensores de temperatura y humedad (aun están por definirse, quizás un LM35 y algún otro para la humedad) (still to be defined, maybe a LM35)
- Servomotor (aun por definirse quizás un Dynamixel)
Software
- Basic4Android (obviamente)
- Compilador de Arduino
- Dos librerías para Arduino: USB_Host_Shield and AndroidAccesory (links pendientes)
Código de Android
El código usado hasta este momento para Android en Basic4Android is:
B4X:
Sub Process_Globals
Dim Accesorio As UsbAccessory
Dim Manejador As UsbManager
Dim AStreams As AsyncStreams
End Sub
Sub Globals
Dim Button1 As Button
Dim Label1 As Label
End Sub
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("Escritorio")
If FirstTime = True Then
EncuentraAccesorio
End If
End Sub
Sub Activity_Resume
EncuentraAccesorio
End Sub
Sub Activity_Pause (UserClosed As Boolean)
End Sub
Sub EncuentraAccesorio
Manejador.Initialize
Dim ListaAccesorios () As UsbAccessory
ListaAccesorios = Manejador.GetAccessories
For i = 0 To ListaAccesorios.Length - 1
If ListaAccesorios(i).Description = "Prueba" Then
Accesorio = ListaAccesorios(i)
Log(Accesorio.Description)
Log(Accesorio.Manufacturer)
Log(Accesorio.Serial)
End If
Next
If Accesorio <> Null Then
Dim Permiso As Boolean
Dim r As Reflector
r.Target = Accesorio
Permiso= Manejador.HasAccessoryPermission(r.GetField("accessory"))
If Permiso==True Then
Manejador.OpenAccessory(Accesorio)
Log (AStreams.IsInitialized)
If AStreams.IsInitialized==False Then
Try
AStreams.Initialize(Accesorio.InputStream,Accesorio.OutputStream,"AStreams")
Catch
Log("No se inicializo AncyStreams")
End Try
End If
Else
Manejador.RequestAccessoryPermission(r.GetField("accessory"))
Permiso= Manejador.HasAccessoryPermission(r.GetField("accessory"))
If Permiso Then
Manejador.OpenAccessory(Accesorio)
End If
If AStreams.IsInitialized==False Then
Try
'AStreams.Initialize(Accesorio.InputStream,Accesorio.OutputStream,"AStreams")
AStreams.InitializePrefix(Accesorio.InputStream,False,Accesorio.OutputStream , "AStreams")
Catch
Log("No se inicializo AncyStreams")
End Try
End If
End If
Else
Log("No hay accesorio reconocido")
End If
End Sub
'Funcion especial de los AStreams////////////////////////////////////
Sub AStreams_NewData (Buffer() As Byte)
Dim msg As String
msg = BytesToString(Buffer, 0, Buffer.Length, "UTF8")
Label1.Text=msg
'ToastMessageShow(msg, False)
Log(msg)
End Sub
Sub AStreams_Error
ToastMessageShow(LastException.Message, True)
End Sub
'///////////////////////////////////////////////////////////////////
Sub Button1_Click
If AStreams.IsInitialized=False Then Return
Dim Cadena As String
Cadena="Hola"
AStreams.Write(Cadena.GetBytes("UTF8"))
End Sub
http://www.b4x.com/forum/basic4android-updates-questions/18292-arduino-uno-usb-host.html#post105928
Código para Arduino
Antes de compilar el código debes de colocar las librerias en la carpeta de Librerias del compilador de Arduino, sino el codigo no compilara y marcará errores.
El código creado hasta este momento para Arduino:
B4X:
#include <Max3421e.h>
#include <Usb.h>
#include <AndroidAccessory.h>
#define ARRAY_SIZE 25
AndroidAccessory acc("Google, Inc.",
"Prueba",
"Prueba",
"1.0",
"http://www.android.com",
"0000000012345678");
char hello[ARRAY_SIZE] = {'H','o','l','a',' ',
'M','u','n','d','o',' ', 'd', 'e', 's', 'd', 'e ',' ',
'A', 'r', 'd', 'u', 'i', 'n', 'o', '!'};
byte rcvmsg[255];
byte sntmsg[ARRAY_SIZE];
void setup()
{
Serial.begin(115200);
acc.powerOn();
}
void loop() {
if (acc.isConnected()) {
//read the sent text message into the byte array
int len = acc.read(rcvmsg, sizeof(rcvmsg), 1);
if (len > 0)
{
for(int x = 0; x < 4; x++)
{
Serial.print((char)rcvmsg[x]);
delay(250);
}
Serial.println();
delay(250);
}
for(int x = 0; x < ARRAY_SIZE; x++)
{
sntmsg[x] = hello[x];
}
acc.write(sntmsg, ARRAY_SIZE);
delay(250);
}//Fin del if que verifica si el accesorio esta conectado
}
Conclusiones
Hasta hoy 13 de Septiembre se ha logrado enviar una cadena de caracteres (“Hola”) al Arduino la cual se puede visualizar por medio del monitor Serial. Tambien se ha enviado del Arduino al Android la misma cadena. Gracias al tipo de dato AnsyncString el envio y recepción de datos puede ser incluso al mismo tiempo (o eso aparenta al usuario final) y el sistema no se bloqueará.
Otros Comentarios y Pendientes
Este codigo aun no esta finalizado y esta en desarrollo, por lo tanto no está optimizado, quizas exista una mejor manera, por lo pronto así funcióna. También falta implementar un protocolo adecuado para la comunicación entre Arduino y Android (estoy pensando en usar el mismo que usa Google en su Demokit). Como he comentado los avances que se vayan dando los iré actualizando en este post.
Agradecimientos
Erel. Por darme la corrección para obtener los permisos al accesorio.
Jerel.Por darme la corrección para el envió de datos.
(En el post en Ingles)
Breve biografía y Links
Connect via USB Sockets
AsyncStreams Tutorial
USB Library information
Post en Ingles
Este es el post en ingles por si gustas seguirlo:
Arduino mega Adk Project Basic4android
Aquí voy actualizando mas rápidamente la información.
Cualquier comentario es bienvenido. Un saludo
Last edited: