hello, arduino! what's up, android? (android rec 2012)
DESCRIPTION
Lightning Talk apresentado na Android Rec 2012 (28/04/2012) mostrando como integrar Android e Arduino com o Android Open Accessory.TRANSCRIPT
Hello, Arduino! What's up, Android?
Extensões com Android Open Accessory
Thiago Figueredo Cardosotfcardoso [at] gmail [dot] com
Extensões?
Android Open Accessory
Hardware
Android Open Accessory
Hardware USB Host: devices são USB client até agora!
Android Open Accessory
Software (Arduino) Implementação do Android Accessory protocol
Android Open Accessory
Software (Android) Google API● com.hardware.usb: 3.1+● com.android.future.usb: 2.3.4+
Android Open Accessory
Software (Android) Google API● com.hardware.usb: 3.1+● com.android.future.usb: 2.3.4+ Fabricante decide se suporta!
Hands-on
Software:● Google API● Arduino libs:
○ Android Accessory○ USB Host Shield
Componentes
Hardware:● Arduino Mega ADK● Google Device
Passo 1: Faça o Arduino Falar
1. Estrutura mínima void setup() {} void loop() {}
Passo 1: Faça o Arduino Falar
1. Estrutura mínima2. Incluir bibliotecas
#include <Max3421e.h>#include <Usb.h>#include <AndroidAccessory.h> void setup() {} void loop() {}
Passo 1: Faça o Arduino Falar
1. Estrutura mínima2. Incluir bibliotecas3. Definir acessório
#include <Max3421e.h>#include <Usb.h>#include <AndroidAccessory.h> AndroidAccessory acc(
"Robolivre.org","Hello","Hello, Android!","http://www.robolivre.
org","0000000000000001");
void setup() {...
Passo 1: Faça o Arduino Falar
1. Estrutura mínima2. Incluir bibliotecas3. Definir acessório4. Inicializar
... AndroidAccessory acc(
"Robolivre.org","Hello","Hello, Android!","http://www.robolivre.
org","0000000000000001");
void setup() {
acc.powerOn();} ...
Passo 1: Faça o Arduino Falar
1. Estrutura mínima2. Incluir bibliotecas3. Definir acessório4. Inicializar5. Esperar conexão
... void setup() {
acc.powerOn();} void loop() {
if (acc.isConnected()) {// Connected
} else {// Not connected
}}
Passo 2: Faça o Android Responder
1. Intent filter AndroidManifest.xml
<activity
android:name=".HelloArduinoActivity"
...
<intent-filter> <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" /> </intent-filter>
...
Passo 2: Faça o Android Responder
1. Intent filter2. Especificação do
filtro
AndroidManifest.xml
...
<intent-filter>
<action
android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
</intent-filter>
<meta-dataandroid:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"android:resource="@xml/accessory_filter"/>
...
Passo 2: Faça o Android Responder
1. Intent filter2. Especificação do
filtro
accessory_filter.xml
<?xml version="1.0" encoding="UTF-8"><resources> <usb-accessory model="Hello" manufacturer="Robolivre.org" version="1.0" /></resources>
Mesmos dados utilizados no Arduino!
Passo 3: Conexão
1. Encontrar acessório HelloArduinoActivity.java
public void onResume() {
...
Intent intent = getIntent();
UsbAccessory acc = intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);...
}
Passo 3: Conexão
1. Encontrar acessório2. Abrir acessório
HelloArduinoActivity.java
public void onResume() {
...
UsbAccessory acc = intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
if (acc != null) { openAccessory(acc); }...
}
Se aplicação não iniciar devido ao filtro, não haverá acessório na intent!
Passo 3: Conexão
1. Encontrar acessório2. Abrir acessório
HelloArduinoActivity.java
private void openAccessory(UsbAccessory acc) { UsbManager man = (UsbManager) getSystemService(Context.USB_SERVICE); ParcelFileDescriptor fd = man.openAccessory(acc); if (fd != null) { // Opened }}
Passo 3: Conexão
1. Encontrar acessório2. Abrir acessório3. Fechar acessório
HelloArduinoActivity.java
public void onPause() {
...
closeAccessory();...
}
Passo 3: Conexão
1. Encontrar acessório2. Abrir acessório3. Fechar acessório
HelloArduinoActivity.java
private void closeAccessory() { try { if (fd != null) { fd.close(); } ...}
fd é o file descriptor aberto em openAccessory()
Passo 4: Comunicação
Android FileInputStreamFileOutputStream Streams do file descriptor
Arduino acc.write()acc.read()
Demo
Dicas
● É possível conectar a um acessório não informado no AndroidManifest.xmla. Enumerar acessóriosb. Pedir permissão para acessar
● Android é Java (Unicode), Arduino é C (ASCII)
Links úteis
● Android Open Accessory Development Kit● USB Accessory● Arduino● Open Accessories for Android
Hello, Arduino! What's up, Android?
Extensões com Android Open Accessory
Thiago Figueredo Cardosotfcardoso [at] gmail [dot] com