Introducing
Your new presentation assistant.
Refine, enhance, and tailor your content, source relevant images, and edit visuals quicker than ever before.
Trending searches
ADK trabalha encima do Arduino Mega;
ATMega328 versus ATMega2560;
14 portas digitais e 6 analógicas;
54 portas digitais e 16 portas analógicas;
15 portas PWS versus 6 portas PWM
ADK - Android Development Kit
Android Open Accessory Protocol
Até mesmo no Arduino AtMega328
Quer usar Arduino Mega? Pode... mas..
Biblioteca no Arduino e no Android;
- reconhecimento do hardware
- identificação do hardware
- troca de dados com classes extensamente usadas
ADK do Google
ADK do Google não é fácil achar;
Diversas opções no mercado.. só googlar
No Arduino
#include <AndroidAccessory.h>
AndroidAccessory acc("Fabricande", "Modelo", "Descrição", "Versão", "URI", "Serial");
void loop(){}
void setup(){}
No Arduino
void setup() {
acc.powerOn();
}
void loop() {
if (acc.isConnected()) {
//fazer algo
}
}
Fica ouvindo chegada de dados
Runnable commRunnable = new Runnable() {
public void run() {
int ret = 0;
byte[] buffer = new byte[255];
while (ret >= 0) {
try {
ret = mInputStream.read(buffer);
} catch (IOException e) { break; }
switch (buffer[0]) {
case COMMAND_X:
int textLength = buffer[1];
for (...) { .... }
}
}
}
};
Meta-dado para descrever o hardware
No Android;
AndroidManifest.xml;
<uses-library android:name="com.android.future.usb.accessory" />
//AndroidManifest, no IntentFilter
<activity ... >
<intent-filter ...>
<meta-data
android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
android:resource="@xml/accessory_filter" />
</activity>
//res->xml->accessory_filter
<resources>
<usb-accessory manufacturer="Fabricante" model="Modelo" version="Versao" />
</resources>
No Arduino
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);
Thread thread = new Thread(null, commRunnable, TAG);
thread.start();
} else {}
}
private void closeAccessory() {
try {
if (mFileDescriptor != null) {
mFileDescriptor.close();
}
} catch (IOException e) {}
finally {
mFileDescriptor = null;
mAccessory = null;
}
}
byte rcvmsg[255];
byte sntmsg[1] = {0xe};
//retorna o número de bytes - vetor de bytes, tamanho deste, naklimits
int len = acc.read(rcvmsg, sizeof(rcvmsg), 1);
if (len > 0) {
if (rcvmsg[0] == COMANDO_MORSE) { ... }
}
acc.write(sntmsg, 1); //vetor de bytes e tamanho
Configurar IntentFilter para o componente
desejado;
<activity ... >
<intent-filter>
<action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
</intent-filter>
</activity>
Classes necessárias no código Java
private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
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 {}
}
} else if (UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)) {
UsbAccessory accessory = UsbManager.getAccessory(intent);
if (accessory != null && accessory.equals(mAccessory)) {
closeAccessory();
}
}
}
};
private UsbManager mUsbManager;
private UsbAccessory mAccessory;
private ParcelFileDescriptor mFileDescriptor;
private FileInputStream mInputStream;
private FileOutputStream mOutputStream;
Verificação no onResume
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);
}
}