Está en la página 1de 12

1.

- Arduino Mega ADK y Android Tutorial "Como Comenzar"


Hello World Arduino Mega ADK y Android Enciende y apaga un led (led pin 13) de tu Arduino Mega ADK por medio de un dispositivo Android.

Que rollo!!,, compraste un Arduino Mega ADK pensando que sera fcil programar algo, que en media hora estaras controlando ya la placa por medio de tu celular o de tu tablet? Ooo decepcin!! Si eres nuevo en Android y en Arduino a la vez, esto si que es una jalada, pero bueno para eso est hecho este tutorial. La pgina de Google ADK es bonita y explicativa? O claro que lo s (para una persona que llevo mnimo unos 5 aos trabajando en este rollo), pero si queremos comenzar no nos sirve, bueno, al menos hasta que nos motivemos viendo que hicimos algo bien, ya de all despegamos solos. Material: 1. 2. 3.

Un Arduino Mega ADK Un dispositivo Android (tu celular!!!!) Los cables para conectar =P

Vista preliminar

Y as se supone debe quedar todo

Sip, as mero
Software Necesario 1. IDE de Arduino (mnimo la 1.0.2) la cual incluye ya las librerias necesarias (Max3421e.h yUsb.h). link 2. Obtener las libreras del ADK (Google Tuto) o si bien no deseas descargar todo el repositorio con repo, aqu te coloco lo nico necesario para este tutorial y ms: android_accessories_descarga. Debo aclarar que ese cdigo viene directo del repositorio de google y no ha sido modificado. 3. Eclipse. Si ya tienes Eclipse instala bien el plugin para programar Android o si eres novato en esto recomiendo que descargues mejor el ADT Bundle (Version de Eclipse ya lista), o si ya eres master en esto saltatelo LOL!!!. 1. Debes tener las APIS de Google tal y como indica aqui.

APIS de Google instaladas

Comienza lo divertido.
Librearas para Arduino. Del repositorio que descargaste de Google copia las libreras necesarias al directorio delibrearas de Arduino IDE:

Copia los directorios: *android-accesories/adk1/board/AndroidAccesory *android-accesories/adk1/board/USB_Host_Shield a .../arduino-1.0.2/libraries/

Nuevo proyecto y APIS necesarias Crea un nuevo Android Application Project y ponle de nombre ArduinoBlinkLED, haz clic en Next, Next, Finish hasta terminar.

Nuevo Proyecto Android

Deberas tener mnimo:

Un layout principal llamado activity_main.xml

Un archivo de actividad java principal llamado MainActivity.java dentro del paquetecom.example.arduinoblinkled Un archivo manifest llamado AndroidManifest.xml

Que bonito Cdigo!!! Manos a la obra As es como se ver tu Package Explorer en Eclipse:

0 Agrega las APIS de Google al proyecto. 1. 2. Clic derecho a la carpeta del proyecto, propiedades Resource/Android y selecciona Google APIs como Project Buil Target

1 Cambia el cdigo de nuestro activity_main.xml por este:


Archivo: layout/activity_main.xml: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout android:layout_width="fill_parent" android:id="@+id/relativeLayout1" android:layout_height="fill_parent" android:layout_weight="0.72"xmlns:android="http://schemas.android.com/apk

/res/android"> <ToggleButton android:text="ToggleButton" android:id="@+id/toggleButtonLED" android:layout_width="500px" android:layout_height="200px" android:layout_centerVertical="true" android:layout_centerHorizontal="true" android:textSize="50px" android:onClick="blinkLED"></ToggleButton> </RelativeLayout>

2 Crea una carpeta dentro de "res" llamada xml y dentro de ella crea un nuevo archivo llamadoaccessory_filter.xml, coloca el siguiente codigo en el archivo:
Archivo: xml/accessory_filter.xml: <?xml version="1.0" encoding="utf-8"?> <resources> <usb-accessory manufacturer="Manufacturer" model="Model" version="1.0" /> </resources>

3 Modifica el cdigo de AndroidManifest.xml de tal manera que te quede algo parecido a esto:
Archivo: AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.arduinoblinkled" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="13" android:targetSdkVersion="16" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.arduinoblinkled.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <actionandroid:name="android.hardware.usb.action.USB_ ACCESSORY_ATTACHED" /> </intent-filter> <metadataandroid:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" android:resource="@xml/accessory_filter" /> </activity> <uses-library android:name="com.android.future.usb.accessory"></useslibrary> </application> </manifest>

En este ultimo paso se declara que se usaran las librearas USB accessory y tambin se pide permiso de que cuando conectes el dispositivo al aparato android nuestra aplicacin comience por default. Recuerda usar el minSdkVersion adecuado a tus libreras, para estar seguro puedes verificar las referencias de google. Referencias de google: http://developer.android.com/guide/topics/connectivity/usb/accessory.html

4 Cambia el codigo del archivo MainActivity.java por este:


Archivo: com.example.arduinoblikled/MainActivity.java package com.example.arduinoblinkled; import import import import import import import import import import import import import java.io.FileDescriptor; java.io.FileInputStream; java.io.FileOutputStream; java.io.IOException; android.app.Activity; android.app.PendingIntent; android.content.BroadcastReceiver; android.content.Context; android.content.Intent; android.content.IntentFilter; android.os.Bundle; android.os.ParcelFileDescriptor; android.util.Log;

import android.view.View; import android.widget.ToggleButton; import com.android.future.usb.UsbAccessory; import com.android.future.usb.UsbManager; public class MainActivity extends Activity { // TAG is used to debug in Android logcat console private static final String TAG = "ArduinoAccessory"; private static final String ACTION_USB_PERMISSION ="com.google.android.De moKit.action.USB_PERMISSION"; private private private private UsbManager mUsbManager; PendingIntent mPermissionIntent; boolean mPermissionRequestPending; ToggleButton buttonLED;

UsbAccessory mAccessory; ParcelFileDescriptor mFileDescriptor; FileInputStream mInputStream; FileOutputStream mOutputStream; private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (ACTION_USB_PERMISSION.equals(action)) { synchronized (this) { UsbAccessory accessory = UsbManager.getAccessory(intent); if (intent.getBooleanExtra( UsbManager.EXTRA_PERMISSION_GRANTED,false)) { openAccessory(accessory); } else { Log.d(TAG, "permission denied for accessory " + accessory); } mPermissionRequestPending = false; } } else if(UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)) { UsbAccessory accessory = UsbManager.getAccessory(intent); if (accessory != null && accessory.equals(mAccessory)) { closeAccessory(); } } } };

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mUsbManager = UsbManager.getInstance(this); mPermissionIntent = PendingIntent.getBroadcast(this, 0, newIntent(ACTION_USB_PERMISSION), 0); IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); filter.addAction(UsbManager.ACTION_USB_ACCESSORY_DETACHED); registerReceiver(mUsbReceiver, filter); if (getLastNonConfigurationInstance() != null) { mAccessory = (UsbAccessory) getLastNonConfigurationInstance(); openAccessory(mAccessory); } setContentView(R.layout.activity_main); buttonLED = (ToggleButton) findViewById(R.id.toggleButtonLED); } @Override public Object onRetainNonConfigurationInstance() { if (mAccessory != null) { return mAccessory; } else { return super.onRetainNonConfigurationInstance(); } } @Override public void onResume() { super.onResume(); if (mInputStream != null && mOutputStream != null) { return; } UsbAccessory[] accessories = mUsbManager.getAccessoryList(); UsbAccessory accessory = (accessories == null ? null : accessories[0]); if (accessory != null) { if (mUsbManager.hasPermission(accessory)) { openAccessory(accessory); } else { synchronized (mUsbReceiver) { if (!mPermissionRequestPending) { mUsbManager.requestPermission(accessory,mPermissionIntent); mPermissionRequestPending = true;

} } } } else { Log.d(TAG, "mAccessory is null"); } } @Override public void onPause() { super.onPause(); closeAccessory(); } @Override public void onDestroy() { unregisterReceiver(mUsbReceiver); super.onDestroy(); } private void openAccessory(UsbAccessory accessory) { mFileDescriptor = mUsbManager.openAccessory(accessory); if (mFileDescriptor != null) { mAccessory = accessory; FileDescriptor fd = mFileDescriptor.getFileDescriptor(); mInputStream = new FileInputStream(fd); mOutputStream = new FileOutputStream(fd); Log.d(TAG, "accessory opened"); } else { Log.d(TAG, "accessory open fail"); } }

private void closeAccessory() { try { if (mFileDescriptor != null) { mFileDescriptor.close(); } } catch (IOException e) { } finally { mFileDescriptor = null; mAccessory = null; } } public void blinkLED(View v){ byte[] buffer = new byte[1]; if(buttonLED.isChecked()) buffer[0]=(byte)0; // button says on, light is off else

buffer[0]=(byte)1; // button says off, light is on if (mOutputStream != null) { try { mOutputStream.write(buffer); } catch (IOException e) { Log.e(TAG, "write failed", e); } } } }

4 Carga el siguiente sketch a tu Arduino Mega ADK:


sketch:

____________________________________________________________
#include <Max3421e.h> #include <Usb.h> #include <AndroidAccessory.h> #define LED_PIN 13 AndroidAccessory acc("Manufacturer", "Model", "Description", "1.0", "http://example.com", "0000000012345678"); void setup() { // set communiation speed Serial.begin(115200); pinMode(LED_PIN, OUTPUT); acc.powerOn(); } void loop() { byte msg[0]; if (acc.isConnected()) { int len = acc.read(msg, sizeof(msg), 1); // read data into msg variable if (len > 0) { if (msg[0] == 1) // compare received data digitalWrite(LED_PIN,HIGH); // turn on light else digitalWrite(LED_PIN,LOW); // turn off light } } else digitalWrite(LED_PIN , LOW); // turn off light }

____________________________________________________________

Carga la aplicacin android a tu dispositivo androi (dgase celular, tableta...) Conecta el Arduino a tu PC y abre un SerialMonitor Conecta el dispositivo Android al Arduino Listo!!!!!!!!!!!