Android Things

¿Alguna vez has intentado conectar un dispositivo periférico a los pines GPIO de tu SBC ODROID  con el sistema operativo Android? Por ejemplo, intentar conectar un interruptor para iniciar una aplicación o conectar un sensor de atenuación. El primer problema con el que te enfrentarás será la dificultad para manejar los pines GPIO desde tu aplicación o servicio Android y tal vez te topes con problemas de permisos para acceder a GPIO, PWM o I2C, ya que a una aplicación genérica de Android se le niega el acceso a recursos de hardware. La solución pasa por exportar una librería de bajo nivel, como wiringPi basado en C/C ++, pero será necesario que se comunique con tu aplicación a través de JNI (Interfaz Nativa de Java) usando NDK. Aun así, tienes que resolver el problema de los permisos.

Google ha presentado otro sistema operativo (SO) conocido como "Android Things", diseñado para ejecutarse en dispositivos integrados livianos y proporciona un entorno de trabajo con Java para manejar periféricos. Mi idea era incorporar el entorno de trabajo de Android Things en el software ODROID permitiendo a los usuarios usar los pines de expansión con facilidad. Sin embargo, el problema es que este sistema operativo no es de código abierto, por lo tanto, tuve que implementar el código en Android para ODROID. Afortunadamente, Google tiene abiertas las APIs del entorno de trabajo con su documento y Android Things SDK. Este hecho me animó a implementar la pila completa del entorno de trabajo que funciona como Android Things, de abajo a arriba.

Utilicé algunas APIs de las partes de gestión periférica de Android Things. Tiene muchas otras características, pero no son necesarias para nuestra tarea. Cree la interfaz para usar la API de Android Things. Para procesar y administrar la solicitud desde la capa de usuario a través de la API, compilé la arquitectura del servidor y cliente y la conecté a la capa de hardware a través de wiringPi para controlar el propio hardware. Para empezar, se implementaron las funciones GPIO, I2C y PWM, porque son las usadas con más frecuencia por las personas en lugar de otras funciones como SPI y UART. Explicar toda la implementación es lo mejor, aunque solo te mostraré cómo usarla.

Puesto que utilicé el proceso de ingeniería inversa. Mi solución puede volverse incompatible con el sistema operativo Android Things real y/o degradar su rendimiento. Sin embargo, espero que los usuarios que con anterioridad querían usar pines GPIO en Android le resulte más fácil trabajar en C gracias a mi trabajo. Déjame mostrarte un ejemplo de Android Things sobre GPIO, I2C y PWM para aprender cómo usarlo.

Fig. 01 - Arquitectura

No hay nada tan simple como usar Android Studio para crear, compilar y probar una aplicación o servicio que contiene Android Things. Simplemente necesita instalar Android Studio y agregar la opción oficial y el código oficial para usar Android Things e instalar un paquete en ODROID a través del puerto otg. y ejecutar un paquete ¡Simplemente funciona! Eso es todo. No necesitas hacer nada más.

Subí todo el código de ejemplo a mi repositorio de github (https://github.com/xiane/thingsGpioExample). Y cada uno de los ejemplos está separado por ramas. En la rama maestra, puedes controlar el pin GPIO. En la rama i2c_16x4, puede usar 16x4 lcd a través de I2C. En la rama PWM, puede controlar el PWM. En la rama i2c_weather_board, puede usar una placa meteorológica. Úsalo y pruébalo en tus propios proyectos.

Todo el código subyacente se basa en el sitio oficial de Android Things. Consulta el sitio oficial en: https://developer.android.com/things.

Manifesto

Antes de probar mis ejemplos, debe agregar las siguientes líneas a tu manifiesto:


Por ejemplo, aquí,  https://bit.ly/2spndDW.

Debe añadir dependencias a un archivo:

compileOnly 'com.google.android.things:androidthings:1.0'

GPIO

El siguiente es el Pin# GPIO y Pin Map.

Fig. 02 - Pin map GPIO 

La tabla de mapeo anterior se basa en la wiki de: https://bit.ly/37dXwFi.

Primero, debe obtener PeripheralManager. Puede obtener una instancia de GPIO y una lista disponible de GPIO desde la instancia del gestor.

import com.google.android.things.pio.PeripheralManager;
import com.google.android.things.pio.Gpio;
…
PeripheralManager manager = PeripheralManager.getInstance();
Puedes obtener una lista GPIO disponible a través del método getGpioList. Este método proporciona una lista de nombres GPIO disponible. De este modo los puedes seleccionar de la lista para utilizarlos. Cada pin tiene un nombre que proviene de un número de pin físico. Sí, el nombre del pin GPIO es el número de pin. Puede obtener una instancia GPIO a través del método openGpio con el nombre del pin como parámetro.
List gpioList = manager.getGpioList();

Gpio gpio = manager.openGpio(gpioList.get(0));
// or Gpio gpio = manager.openGpio(“7”);
En este ejemplo, te mostraré cómo usar un pin GPIO como salida. En el ejemplo, quiero usar el pin #7 como salida y si presiono el botón en mi aplicación, se encenderá un LED que está conectado al pin #7 GPIO. Al igual que antes, después de obtener una instancia GPIO, puedes fijar la dirección E/S del pin GPIO. Puede configurar la dirección mediante el método setDirection y los valores de dirección son DIRECTION_IN, DIRECTION_OUT_INITIALLY_HIGH y DIRECTION_OUT_INITIALLY_LOW. Elegí DIRECTION_OUT_INITIALLY_LOW para que el valor GPIO sea low.

Luego puedes establecer el valor mediante el método setValue. Si deseas que el valor de salida sea high o 1, necesitas pasar el parámetro True o puede pasar el parámetro false como low o 0. En este ejemplo, obtengo información desde botón de la aplicación. De este modo, cuando haces clic en el botón, se ilumina un LED.

gpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
Switch gpioSwitch = find ViewById(R.id.gpio_switch);

gpioSwitch.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
    try {
      Switch gpioSwitch = (Switch) v;
      if (gpioSwitch.isChecked()) {
        gpio.setValue(true);

      } else {
        gpio.setValue(false);
      }
    } catch (IOException io) {
      io.printStackTrace();
    }
  }
});
Android Things también proporciona otros métodos como getValue, setActiveType, setEdgeTriggerType y registerGpioCallback. Puede aprenderlos en la página web oficial. Sin embargo, el ODROID aún no proporciona registerGpioCallback correctamente. En particular, la configuración de devolución de llamada utilizando el controlador no se ha implementado todavía. Espero que lo hagan pronto.

Referencia al metodo GPIO  - https://bit.ly/2tXHUHI.

Fig. 03

Fig. 04

Fig. 05

Fig. 06

Fig. 07

Puedes controlar I2C y PWM revisando un ejemplo de mi github. Además, puedes obtener información sobre cada API periférica desde el sitio web.

I2C - https://developer.android.com/things/sdk/pio/i2c PWM - https://developer.android.com/things/sdk/pio/pwm

¡Espero que esto te ayude a utilizar mejor tus periféricos de Android!

Referencias

https://developer.android.com/things https://forum.odroid.com/viewtopic.php?f=178&t=37101

Be the first to comment

Leave a Reply