🛠 Limites d'AOA sur Android moderne et alternatives
Objetivos
Hacer un repaso honesto de lo que funciona (o no) en 2026 con la Mega ADK y el protocolo AOA, y elegir la alternativa adecuada según el proyecto. Observaciones con fuentes: la placa está retirada (página oficial en docs.arduino.cc/retired, tienda con error 404); la documentación de Google ADK se ha retirado y redirige a la página genérica de «accesorios»; la wiki histórica de la ADK es un error 404 sin archivo; AOAv2 ha deprecado el audio USB en Android 8.0; AOA y MTP no pueden funcionar simultáneamente; las aplicaciones de accesorios deben gestionar correctamente el permiso USB y el evento device-detached, y algunos teléfonos muy recientes tienen drivers USB caprichosos (hilos de foros sobre placas ADK que se enumeran pero no se abren). El propio protocolo AOA sigue documentado (source.android.com) y el modo accesorio está disponible desde Android 3.1, retroportado a 2.3.4: por el lado de la API de Android, no ha desaparecido nada.
Material
- 1 × Arduino Mega ADK + teléfono Android reciente para pruebas de fricción
- Para las alternativas: a elegir — placa ESP32-S2/S3 (USB OTG nativo), módulo Bluetooth serie (HC-05 para clásico, o BLE), adaptador USB-OTG serie (FTDI/CP210x/CH34x) + cable OTG hacia el teléfono
- No es obligatorio comprar material nuevo: este tutorial es una matriz de decisión + una plantilla Android robusta
Código completo
Plantilla Java para la gestión robusta de un accesorio AOA en Android moderno (permiso, desconexión, reconexión):
// AccessoireBridge.java — le minimum vital sur Android récent
public class AccessoireBridge {
private UsbManager mgr; private UsbAccessory acc;
private FileInputStream in; private FileOutputStream out;
public boolean attacher(Intent intent) {
String a = intent.getAction;
if (UsbManager.ACTION_USB_ACCESSORY_ATTACHED.equals(a)) {
acc = UsbManager.getAccessory(intent);
if (!mgr.hasPermission(acc)) {
mgr.requestPermission(acc, PendingIntent.getBroadcast(ctx, 0,
new Intent("com.atelier.adk.PERM"), 0));
return false; // reprise après la popup
}
ParcelFileDescriptor pfd = acc.open(mgr, true);
if (pfd == null) return false; // le téléphone refuse parfois
in = new FileInputStream(pfd.getFileDescriptor);
out = new FileOutputStream(pfd.getFileDescriptor);
return true;
}
if (UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(a)) { detacher; }
return false;
}
public void detacher {
try { if (in != null) in.close; } catch (IOException ignored) { }
try { if (out != null) out.close; } catch (IOException ignored) { }
in = null; out = null; acc = null; // l'UI passe « hors ligne »
}
// Côté manifeste : intent-filter ACCESSORY_ATTACHED + accessory_filter
// (accessory-manufacturer) ; ne JAMAIS envoyer de trame sans out != null.
}
Verificación esperada
Con la Mega ADK: el teléfono se enumera correctamente con VID 0x18D1, pero la apertura del flujo puede fallar en algunos modelos recientes — la plantilla anterior debe entonces mostrar «fuera de línea» sin bloquearse, y reconectarse al volver a enchufar. Si el teléfono cambia a MTP (modo de transferencia de archivos por defecto en muchos fabricantes), AOA no se inicia: hay que volver a enchufar en modo solo carga. Conclusión de la matriz: para un proyecto nuevo, AOA en esta placa retirada ya no es una opción por defecto; mantenla para el host HID y la preservación patrimonial, y pasa a las alternativas siguientes para el enlace con el teléfono.
Errores frecuentes
- Creer que AOA está «muerto en el lado de Android»: la API UsbAccessory sigue funcionando; lo que ha desaparecido es el ecosistema ADK (paquete de 2011, wiki, docs), y los drivers USB de los teléfonos son variables.
- Olvidar gestionar ACCESSORY_DETACHED y las IOException: en Android reciente, el sistema «desconecta eléctricamente» el cable (cambio a MTP, ahorro de energía) sin avisar a la aplicación.
- Usar el audio USB de AOAv2: deprecado desde Android 8.0 — no construyas un proyecto sobre esto.
- Cadena de versión ausente en el descriptor de accesorio: posible reinicio de teléfonos Android ≤ 10 durante la enumeración.
- Alternativas mal elegidas: el adaptador USB-OTG serie (FTDI/CP210x) asume que el teléfono es el host — lo contrario del modelo AOA — y exige el driver USB-serial-android; el ESP32-S2/S3 ofrece USB nativo Y Bluetooth/BLE, y el Bluetooth serie o BLE es casi siempre más simple que AOA en 2026; el BLE es la vía sin cable ni permiso USB.
- Comparar velocidades: AOA 1.0 sigue siendo un enlace USB a velocidad completa (el MAX3421E es un controlador de velocidad completa; > SIN VERIFICAR: 12 Mbit/s exactos, hoja de datos no recuperada) — ampliamente suficiente para sensores y comandos; si tu proyecto exige flujo de vídeo o audio, cambia de familia de hardware.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.inoArduinobouton-led.inoArduinoscan-hote-usb.inoArduinoadk-chat-android.inoArduinoadk-telemetrie.inoArduinohote-clavier-usb.inoArduino