Accesorios para dispositivos Android con host USB

El SDK de accesorios de Android depende de que el accesorio tenga un host USB. Sin embargo, tengo entendido que las versiones más nuevas de Android (¿3.1, 2.4?) tienen soporte de host USB en el kernel. Y sé que muchos dispositivos Android existentes tienen soporte de hardware para host (seguramente la mayoría de las tabletas, Moto Droid, HTC Droid Incredible, etc.).

Entonces, mi pregunta es, dado un dispositivo Android que tiene un host USB, ¿cuál será la forma más simple/barata de conectar esto con un micro? Lo primero que se me ocurre es usar un chip FTDI USB->serial y un micro con UART. Pero no sé si los controladores FTDI se pueden instalar en dispositivos Android. De todos modos, probablemente haya una solución mucho mejor.

Preferiría una solución que no requiera un dispositivo Android rooteado, pero también me interesaría escuchar algunas de estas opciones.

no hay enlace en este momento, pero estaba observando esto con atención y no planean hacer que Android sea compatible con USB OTG o ser un host directamente. Esto significa que realmente tienes que usar sus especificaciones.
@Kortuk "ellos" significa que Google puede no estar planeando hacerlo, pero "ellos" significa que los fabricantes de dispositivos Android ya lo tienen, particularmente en el caso de algunas de las tabletas de panal, algunas incluso tienen puertos USB "A", por lo que no se necesita adaptador. Sin embargo, es probable que los controladores incorporados sean para cosas como almacenamiento masivo, teclados y ratones, no tengo idea si incluyen controladores FTDI o si eso requeriría modificaciones de kernel.
@ChrisStratton, ¿desea crear un producto basado en algunos fabricantes diferentes que tomaron decisiones antes de que Google anunciara una, que ahora tiene? Ojalá hubieran decidido apoyar USBonthego
@Kortuk como el protocolo ADK es una solución bastante fea que requiere que el accesorio proporcione energía externa para cargar el dispositivo Android, diría que la compensación realmente depende del mercado. Si el accesorio se vende para usar con un dispositivo Android específico, dependiendo de la funcionalidad específica del dispositivo puede estar bien (en algunos casos, el precio del accesorio puede eclipsar el de la tableta adjunta). Por el contrario, en el extremo inferior, poder usar un accesorio USB estándar para PC también puede ser una buena solución a pesar de la compatibilidad limitada, ya que hay poca inversión.
@ChrisStratton, todavía desearía haberse decidido por el soporte completo de USB-OTG
Vaya, eso es una locura. ¿Por qué no pondrían usb otg/host en el kernel? ¿No van a querer los dueños de tabletas poder usar accesorios genéricos?
Ahora estoy confundido. La API de Android 3.1 dice explícitamente que admite la interacción con accesorios USB (es decir, cosas con modo host) y dispositivos USB (cosas sin host), incluidas cosas como el transporte masivo, etc. Entonces, ¿este modo host no se ejecuta en el sistema android? ?
@Chinasaur Interesante... Veo que todo esto es nuevo en 3.1 (Desde: API Nivel 12). USBManager también parece ser un administrador de host USB. Creo que esto implica que USB-OTG en realidad será compatible de forma nativa, aunque no veo nada en la API que permita cambiar entre el host y el dispositivo en el nivel de la aplicación; supongo que lo hará automáticamente dependiendo de lo que acaba de pasar. se conectó ¿Te importa escribir un resumen de respuesta como respuesta? Me interesaría ver todas las opciones disponibles ahora.
@Jon, parece que estoy desactualizado, lo investigaré.
Ah, genial, ¡espero que realmente lo apoyen! Parece especialmente loco no hacerlo, ya que la comunidad con teléfonos rooteados ya ha resuelto los módulos del kernel necesarios. Y dado que el modelo de accesorios de Android basado en un accesorio con host ya es más o menos una "bendición" de un proyecto comunitario existente (USB Host Shield), parecería especialmente inconsistente no aprovechar la posibilidad de que el sistema Android admita host en su ¡propio!
Por lo tanto, parece que obtener un micro que pueda emular un tipo específico de dispositivo USB puede ser la forma más fácil de trabajar con un dispositivo Android que tenga capacidad de host. No sé mucho sobre los diferentes dispositivos USB estándar; ¿Algún enlace para un simple resumen de las capacidades de los diferentes para interactuar con el anfitrión?
@Chinasaur, aquí hay una lista de todas las clases de dispositivos USB: usb.org/developers/devclass_docs#approved La mayoría de los micros USB tienen un código de ejemplo para HID (teclado/ratón) y almacenamiento masivo. Tal vez puedas usar esto a tu favor. Además, si puede escribir un resumen de la respuesta, sería muy apreciado. Creo que esta información podría ser útil para otros que quieran seguir este camino.

Respuestas (5)

¿La forma más barata? Use un µC con USB incorporado. Muchos de los pic18 y posteriores tienen esto. También lo hacen muchas otras marcas de µC.

¿La forma más sencilla? Como ya indicó, conviértalo a RS-232 a niveles TTL con algún tipo de chip de conversión como el FTDI.

Sí, bien podría haber problemas con los controladores para ambas soluciones, pero es más probable que FTDI sea compatible de fábrica. Sin embargo, la primera solución tiene la ventaja de que puede hacer que el µC se vea como cualquier dispositivo que desee que se vea.

Ah, y aparte, algunos de los PIC de gama alta (por ejemplo, algunos chips pic32) también tienen un host USB incorporado. Solo pensé en mencionarlo...

¿Por qué el voto negativo? Sería bueno alguna crítica constructiva...

No soy un experto en Android, pero FTDI publicó una nota en la aplicación que detalla cómo puede incorporar compatibilidad con controladores para sus IC USB a serie en el kernel de Android .

No sé si esto es factible de hacer en un teléfono de producción, o si algún teléfono ya tiene este controlador integrado (lo dudo). En mi opinión, Google ha presentado una buena especificación para el accesorio abierto que probablemente estará disponible en esta generación de dispositivos Android y en la siguiente, dado que todos se actualizan a las versiones más nuevas del sistema operativo Android.

En el caso de accesorio abierto, el teléfono cambia a un dispositivo y el accesorio es el anfitrión. Implementar un host USB incorporado es un poco más complicado que usar un USB FTDI a IC serial, pero existen algunos micros específicos de aplicaciones bastante buenos que tienen soporte de hardware para la pila USB y hay algunos ejemplos del protocolo Open Accesorio. implementado en algunos de estos micros. Dado que el soporte ya está en el sistema operativo para accesorios abiertos (o lo estará en un futuro cercano para todos los dispositivos), creo que este es el camino a seguir.

Sí, pero esta es la forma "antigua" anterior al soporte oficial: con la excepción de las capacidades integradas como teclados y ratones, las API de host USB de Android esperan que el código de modo de usuario contenido en aplicaciones individuales hable de operaciones USB sin formato. Conceptualmente, se parece mucho a una aplicación de escritorio escrita contra libusb, en lugar de depender de un controlador de kernel para el periférico.

Actualización: cambié esto a la wiki de la comunidad

Parece que Android admitirá USB Host en el kernel. Android 3.1 ya tiene esto, creo que Android 2.4 lo volverá a portar, y seguramente Android 4 lo tendrá. Por lo tanto, si tiene un micro que puede emular un dispositivo esclavo USB apropiado, debería poder comunicarse con Android de manera bastante simple y económica, siempre que su dispositivo Android tenga hardware compatible con USB Host. La mayoría de los dispositivos más antiguos (p. ej., Droid, Droid Inc) son compatibles con el hardware, y los nuevos dispositivos deberían serlo.

No sé exactamente con qué dispositivos esclavos USB es fácil interactuar desde Android ( aquí hay una lista de tipos de dispositivos existentes ), pero seguramente el teclado (es decir, HID) es fácil de probar.

Editar: las API de host USB de Android se basan en la idea de que el código de modo de usuario contenido en las aplicaciones realice transferencias USB sin formato a los periféricos. Entonces, en lugar del modelo de "controlador del kernel", este es el modelo de "la aplicación comprende los detalles periféricos", conceptualmente muy similar a los programas de escritorio que usan libusb o similar para comunicarse con un periférico. Las excepciones serían los dispositivos HID, como teclados y ratones, que Android habla consigo mismo y utiliza de la manera esperada para proporcionar información al sistema en general. También vale la pena señalar que (con la excepción de algunos dispositivos en los que el proveedor ha hecho lo contrario) el sistema no implementa el almacenamiento masivo USB, por lo que una aplicación que quiera usar dicho dispositivo debe implementar tanto el código del sistema de archivos como el Protocolo de almacenamiento masivo USB, contra las API USB de Android sin procesar.

Hay una biblioteca AVR que proporciona una pila USB: http://fourwalledcubicle.com/LUFA.php . Con esto, debería poder hacer una emulación de teclado u otro dispositivo desde un AVR habilitado para USB. Incluir esto en su compilación de firmware AVR genérico no es demasiado difícil. Como señala Mihailo en los comentarios, asegúrate de usar una frecuencia de oscilador compatible con USB (8 o 16 MHz). No estoy seguro de si es posible hacer que esto funcione en el hardware estándar de Arduino.

Parece que la forma más fácil de abordar esto puede ser la nueva placa Arduino Leonardo: http://arduino.cc/blog/2011/09/17/arduino-launches-new-products-in-maker-faire/

¡Estoy seguro de que pronto saldrán clones de Leonardo más baratos/más simples/más pequeños, o rodarán los suyos propios!

ATMega8u2 es lo más barato que puedes comprar, ATMega32u4 es como un hermano mayor (aparece en Leonardo). Para una placa mínima, literalmente necesita 5 componentes pasivos para que funcione. También tiene un cargador de arranque DFU (Actualización de firmware del dispositivo), por lo que solo tiene que conectarlo a un puerto USB para programar, no se requiere un programador externo. LUFA viene con muchos controladores de ejemplo (teclado, mouse, joystick, ...) y es muy simple crearlos y probarlos (y luego adaptarlos a sus necesidades). Solo asegúrese de usar cristal de 8 o 16 MHz, de lo contrario, el USB no funcionará.
Todos los grandes puntos; ¡Gracias! Por más barato me refiero a que un Arduino Leonardo compatible saldrá más barato que los $20 oficiales. Pero, por supuesto, armarlo usted mismo es probablemente aún más barato y, como usted dice, bastante sencillo. Edité mi respuesta para reflejar algunos de sus puntos.
Por cierto, ¿es por eso que Arduino es de 16 MHz? Siempre pensé que era una elección extraña...
Probablemente lo sea, no estoy seguro, el Arduino más antiguo (el que tengo) tenía un chip FTDI USB a serie, los más nuevos tienen ATMEGA8U2. No he mirado los esquemas de los nuevos, si están usando solo un cristal, diría que es porque ATMEGA8U2 lo requiere.

No estoy seguro de qué quiere decir exactamente con barato, pero no creo que haya ningún problema con el uso de un chip FTDI UART->USB como FT232RL o Prolific PL2303... Son baratos.

Aún así, obviamente, hay dos formas de hacer esto:

  1. Obtenga una MCU con soporte USB:

ventajas:

R. No necesitará ningún chip externo para convertir niveles o implementar ningún protocolo.

Desventajas:

R. Deberá implementar el protocolo USB con la clase que necesita (como, CDC, HID, etc.) en su firmware por su cuenta.

B. Deberá comprar un VID y un PID si el fabricante de su MCU no permite usar el VID y el PID predeterminados.

  1. Usar chip FTDI:

ventajas:

R. No necesita implementar el protocolo. Una simple comunicación UART estaría bien.

B. Android es compatible con FTDI perfectamente. No estoy seguro de qué significa "necesita instalar los controladores en el teléfono Android", pero en mi experiencia, lo único que necesita para reconocer un dispositivo en Android es VID y PID, que coloca en el filtro de intención de su actividad siempre que Android y Host son compatibles con la clase que desea implementar.

Desventajas:

R. Si puede pagar el chip, no creo que haya ninguno.

Una sugerencia:

Si su MCU no realiza ninguna función (ejecuta procesos en subprocesos paralelos o implementa varias subrutinas de solicitud de interrupción, tiene devoluciones de llamada orientadas a eventos o interactúa con demasiados periféricos) además de la comunicación USB, entonces busque una MCU con soporte USB; de lo contrario, el chip FTDI siempre es mejor opción ya que solo usa un UART de MCU y no lo sobrecarga en absoluto.

¿Has considerado la placa Arduino ADK ? Aprovecha Google ADK para lograr la comunicación con Android.

Gracias, pero el ADK requiere el accesorio para implementar USB Host (por lo tanto, es mucho más costoso que un Arduino/micro estándar). La idea de esta pregunta es evitar implementar USB Host.