Spanish Proyecto Arduino Mega ADK y Basic4Android

CanguroCode

Active Member
Licensed User
Longtime User
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
  • 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

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

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:

CanguroCode

Active Member
Licensed User
Longtime User
He estado posteando en el Foro en ingles y hemos logrado algunos resultados, los quisimos compartir con ustedes. Por favor denme sus comentarios. Un saludo
 
Last edited:

Jomagom

Member
Licensed User
Longtime User
Hola, hace algún tiempo cree una aplicacion para controlar arduino.
en este enlace podrás ver la aplicación y el codigo.
Android y Arduino - Arduino Forum
podrás controlar todos los pines digitales y los PWM, así como todos los analogicos, tambien podras controlar las salidas pwm con el acelerometro y puedes mandar comandos extras que programes en el arduino.
Un Saludo
Jomagom
 

Heppy

Active Member
Licensed User
Longtime User
Gracias por postear esta información.

Estoy intentando comunicar el HTC con algún dispositivo electrónico y me parece que me decantaré por Microchip y el F24.

Tengo mucho para estudiar, pero mucho
 

Heppy

Active Member
Licensed User
Longtime User
Con 24FJ256GB110

Hola.

Estoy haciendo pruebas con el kit del 24FJ256GB110 de Microchip y funciona perfectamente en un HTC Explorer con Android 2.3.5

Pero con Basic Android, el accesorio USB me lo encuentra perfectamente, se supone que lo abre, pero el asyncStream lo inicializa pero no funcionan. Al pulsar el botón de escritura me dice que no existe el dispositivo (no such device) y por supuesto, no recibe nada de nada.

La versión del BasicAndroid es 2.30 y la de la libreria USB la 0.96

Seguiré probando.
 

charro98120165

Member
Licensed User
Longtime User
Estoy realizando un proyecto en el cual senso un pin digital del arduino adk y mando un caracter a una tablet alguien me podria explicar paso a paso esto utilizando la libreria usb? o una forma sencilla y practica de hacerlo? gracias
 
Top