Bom dia.
Neste pequeno artigo pretendo mostrar como é fácil e rápido codificar um Arduino com suporte a ADK e um smartphone para ambos se reconhecerem. Em um próximo artigo pretendo mostrar como funciona a troca de dados. Porém, vamos em partes.
Inicialmente precisamos definir o ADK e, nada melhor que pedir ajuda a criadora desta plataforma, o nosso ilustríssimo Google. Na página de desenvolvedores Android encontrei a seguinte definição: The Android Open Accessory Development Kit (ADK) is a reference implementation of an Android Open Accessory, based on the Arduino open source electronics prototyping platform.Ou seja, é um Arduino Mega com um protocolo Android específico.
Neste link encontram-se duas coisas valiosas. A primeira, encontrada no link com o texto "ADK package download", é o código para a placa ADK e o código para o aplicativo Android utilizado no famoso ADK DemoKit, mostrado em 99% das palestras sobre a tecnologia.
Mas, para iniciantes, talvez não seja uma boa idéia estudar este código, pode confundir um pouco as coisas. Então, porque não começar com o código mais simples possível. Uma espécie de esqueleto, o DNA da comuicação ADK-Aplicativo.
Começamos pela parte mais fácil, a do Arduino ADK. Vejam o código:
#include <Max3421e.h>
#include <Usb.h>
#include <AndroidAccessory.h>
AndroidAccessory acc("Fabricante", "Modelo", "Descricao", "Versao", "URI", "Serial");
void setup() {
Serial.begin(115200);
acc.powerOn();
}
void loop() {
if (acc.isConnected()) {
//fazer algo
}
delay(250);
}
Essencialmente temos apenas três linhas além do já tradicional código Arduino, que necessita dos métodos setup e loop. Além dos includes, mas esses serão sempre fixos então não precisam de tanta atenção.
Inicialmente é necessário criar um objeto AndroidAccessory. Os parâmetros passados são como uma identificação do ADK. Os mais importantes são o fabricante, o modelo e a versão. A URI também pode ser de grande utilidade, isso porque, se o Android não encontrar um aplicativo capaz de lidar com aquele ADK, ele pode pegar esta URI e mandar para a Google Play por exemplo.
No setup temos uma chamada ao método powerOn, que muda o estado do ADK para ativo. No método loop é feito um teste lógico para saber se o ADK já está conectado ao smartphone. Caso afirmativo, podemos iniciar a troca de informações entre o ADK e a aplicação Android. Mas isso é assunto para os próximos artigos.
E o código Android, será tão fácil quanto este? Sim.
A primeira mudança é no AndroidManifest.xml. Deve ser informada o uso da biblioteca com.android.future.usb.accessory.
<uses-library android:name="com.android.future.usb.accessory" />
Ainda no mesmo arquivo, vamos acrescentar mais um IntentFilter para a única tela da aplicação, o famoso Hello World.
<activity
android:name="com.example.firstappadk.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>
<action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
</intent-filter>
<meta-data
android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
android:resource="@xml/accessory_filter" />
</activity>
As mudanças ficaram em negrito. O filtro adicional responde a ação android.hardware.usb.action.USB_ATTACHED. Além disso, é necessário um meta-data, com um nome sempre fixo e a identificação de um recurso xml. No exemplo ele foi colocado dentro da pasta res, subpasta xml, arquivo accessory_filter.xml.
E o que encontramos neste XML? Veja abaixo:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<usb-accessory manufacturer="Fabricante" model="Modelo" version="Versao" />
</resources>
Perceba que os dados de fabricante, modelo e versão são os mesmos informados no código do Arduino. Por este motivo uma placa ADK pode ser construída especificamente para um aplicativo. E isso é fantástico, abre infinitas possibilidades de customização, de uso massivo de internet das coisas, internet física e todos estes termos inovadores.
Bem, em relação ao código é só isso. Sim, já acabou.
O leitor pode estar se perguntando, mas como eu sei qual Arduino é um ADK. Neste link você encontra esta listagem. Eu estou usando para testes o ADK da Seeed Studio, mais especificamente o ADK Dash Kit. E smartphones tenho o Galaxy Note 8 e o Motorola Razr I .Uma observação importante. Já testei em outros aparelhos Samsung, como o S3 e S4, e sempre funcionou. O único que me deixou na mão é o Razr I. Minhas suspeitas são em relação ao chip Intel do Razr, os outros que testei tem chips ARM.
Veja o vídeo do código em execução:
Dúvidas? Pergunte nos comentários. E aguarde os próximos posts.
E, último lembrete. A Academia Android da Globalcode tem um módulo que fala só de Arduino, Android e ADK.
Att.
Ricardo Oglliari
Neste pequeno artigo pretendo mostrar como é fácil e rápido codificar um Arduino com suporte a ADK e um smartphone para ambos se reconhecerem. Em um próximo artigo pretendo mostrar como funciona a troca de dados. Porém, vamos em partes.
Inicialmente precisamos definir o ADK e, nada melhor que pedir ajuda a criadora desta plataforma, o nosso ilustríssimo Google. Na página de desenvolvedores Android encontrei a seguinte definição: The Android Open Accessory Development Kit (ADK) is a reference implementation of an Android Open Accessory, based on the Arduino open source electronics prototyping platform.Ou seja, é um Arduino Mega com um protocolo Android específico.
Neste link encontram-se duas coisas valiosas. A primeira, encontrada no link com o texto "ADK package download", é o código para a placa ADK e o código para o aplicativo Android utilizado no famoso ADK DemoKit, mostrado em 99% das palestras sobre a tecnologia.
Mas, para iniciantes, talvez não seja uma boa idéia estudar este código, pode confundir um pouco as coisas. Então, porque não começar com o código mais simples possível. Uma espécie de esqueleto, o DNA da comuicação ADK-Aplicativo.
Começamos pela parte mais fácil, a do Arduino ADK. Vejam o código:
#include <Max3421e.h>
#include <Usb.h>
#include <AndroidAccessory.h>
AndroidAccessory acc("Fabricante", "Modelo", "Descricao", "Versao", "URI", "Serial");
void setup() {
Serial.begin(115200);
acc.powerOn();
}
void loop() {
if (acc.isConnected()) {
//fazer algo
}
delay(250);
}
Essencialmente temos apenas três linhas além do já tradicional código Arduino, que necessita dos métodos setup e loop. Além dos includes, mas esses serão sempre fixos então não precisam de tanta atenção.
Inicialmente é necessário criar um objeto AndroidAccessory. Os parâmetros passados são como uma identificação do ADK. Os mais importantes são o fabricante, o modelo e a versão. A URI também pode ser de grande utilidade, isso porque, se o Android não encontrar um aplicativo capaz de lidar com aquele ADK, ele pode pegar esta URI e mandar para a Google Play por exemplo.
No setup temos uma chamada ao método powerOn, que muda o estado do ADK para ativo. No método loop é feito um teste lógico para saber se o ADK já está conectado ao smartphone. Caso afirmativo, podemos iniciar a troca de informações entre o ADK e a aplicação Android. Mas isso é assunto para os próximos artigos.
E o código Android, será tão fácil quanto este? Sim.
A primeira mudança é no AndroidManifest.xml. Deve ser informada o uso da biblioteca com.android.future.usb.accessory.
<uses-library android:name="com.android.future.usb.accessory" />
Ainda no mesmo arquivo, vamos acrescentar mais um IntentFilter para a única tela da aplicação, o famoso Hello World.
<activity
android:name="com.example.firstappadk.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>
<action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
</intent-filter>
<meta-data
android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
android:resource="@xml/accessory_filter" />
</activity>
As mudanças ficaram em negrito. O filtro adicional responde a ação android.hardware.usb.action.USB_ATTACHED. Além disso, é necessário um meta-data, com um nome sempre fixo e a identificação de um recurso xml. No exemplo ele foi colocado dentro da pasta res, subpasta xml, arquivo accessory_filter.xml.
E o que encontramos neste XML? Veja abaixo:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<usb-accessory manufacturer="Fabricante" model="Modelo" version="Versao" />
</resources>
Perceba que os dados de fabricante, modelo e versão são os mesmos informados no código do Arduino. Por este motivo uma placa ADK pode ser construída especificamente para um aplicativo. E isso é fantástico, abre infinitas possibilidades de customização, de uso massivo de internet das coisas, internet física e todos estes termos inovadores.
Bem, em relação ao código é só isso. Sim, já acabou.
O leitor pode estar se perguntando, mas como eu sei qual Arduino é um ADK. Neste link você encontra esta listagem. Eu estou usando para testes o ADK da Seeed Studio, mais especificamente o ADK Dash Kit. E smartphones tenho o Galaxy Note 8 e o Motorola Razr I .Uma observação importante. Já testei em outros aparelhos Samsung, como o S3 e S4, e sempre funcionou. O único que me deixou na mão é o Razr I. Minhas suspeitas são em relação ao chip Intel do Razr, os outros que testei tem chips ARM.
Veja o vídeo do código em execução:
Dúvidas? Pergunte nos comentários. E aguarde os próximos posts.
E, último lembrete. A Academia Android da Globalcode tem um módulo que fala só de Arduino, Android e ADK.
Att.
Ricardo Oglliari
Comentários
É a mes a sensação que eu tenho. É como fazer parte de uma grande mudança na sociedade.
Quando criar algo quero ver post também hein, heheh