Android
Android
Android
January 1, 2018
El módulo eMMC Naranja de Hardkernel que usa el chipset Samsung eMMC 5.1, ha
estado enviándose desde Octubre de 2017
Recompilar imágenes Docker x86/amd64 para un Swarm ARM continua los recientes
artículos sobre cómo compilar swarm Docker en ARM, y como no había disponible
ninguna imagen ARM o no había disponible ninguna imagen ARM con una versión
reciente, sin lugar a duda era hora de cambiar esto.
No siempre nos desviemos de los extraños juegos indie para Android, pero durante las
vacaciones play store nos ha dotado con grandes títulos, así que sin más preámbulos
permite presentarte:
Este artículo explica como usar múltiples puertos UART en ODROID-C2 ejecutando el
Sistema Operativo Android
Mech Warrior es un juego de simulación de combate sobre los llamados “Mechs”, que
son robots gigantes pilotados por un humano.
Por favor, háblanos un poco sobre ti. Soy un ingeniero de software embebido, he
participado en muchos y diferentes proyectos comerciales desde 1994. Actualmente,
estoy desarrollando el software para un dispositivo móvil que se ejecuta sobre un
procesador ARM y trabaja principalmente con un driver de dispositivo o capa HAL/framework.
Home Assistant: Diseñando un Elegante Cuadro de Mandos
January 1, 2018 By Adrian Popa Linux, Mecaniqueo
en https://goo.gl/Hci4zm.
$ sudo systemctl enable appdaemon
$ cat
$ sudo systemctl start appdaemon
/home/homeassistant/.homeassistant/apps.yaml
hello_world:
Necesitarás crear una con guración por defecto
module: hello
preferiblemente dentro del directorio de
class: HelloWorld
con guración de HA y añadir aplicación para probar
tu con guración. El archivo de con guración Una vez que reinicies AppDaemon, las aplicaciones se
appdaemon.yaml también almacena las credenciales cargarán automáticamente. En este caso, deberías ver
para acceder a tu Home Assistant, o puede leerlas el mensaje “Hello from AppDaemon” en tus registros
desde el archivo “secrets.yaml”. log, lo cual indica que la con guración inicial se ha
cargado, puedes veri carlo con:
$ sudo su homeassistant
$ cat $ sudo journalctl f u appdaemon
/home/homeassistant/.homeassistant/appdaemon.y
aml La mejor manera de empezar es leyendo la
AppDaemon: documentación. Hay un completo tutorial que te guía
logfile: STDOUT por todos los pasos: https://goo.gl/ha5iC8. Además,
errorfile: STDERR
existe una referencia API para la búsqueda rápida:
logsize: 100000
https://goo.gl/QeJSYu. El entorno de trabajo está
log_generations: 3
basado en eventos, de modo que necesitas con gurar
threads: 10
HASS: “oyentes” para los varios eventos que tienen lugar en
ha_url: http://127.0.0.1:8123 Home Assistant, de esta manera tu código será
ha_key: !secret api_password llamado automáticamente. Además, puedes acceder
$ mkdir a todos los estados y atributos de las entidades de
/home/homeassistant/.homeassistant/apps
Home Assistant. Cuando estés familiarizado con el
$ cat
entorno de trabajo, puedes echar un vistazo a las
/home/homeassistant/.homeassistant/apps/hello.
aplicaciones de ejemplo para tener una idea de cómo
py
import appdaemon.appapi as appapi se hacen las cosas.
¿Te acuerdas del proyecto del calentador con Home
#
Assistant, publicado en el último número de ODROID
# Hello World App
Magazine? Pues bien, quizás porque me estoy
#
# Args: haciendo viejo, siento la necesidad de encender la
# calefacción durante ciertas horas del día y de la
noche, así que quería crear una aplicación que lo
class HelloWorld(appapi.AppDaemon): hiciera por mí. No obstante, hay un problema: quiero
disponer de algún tipo de panel de control que sea
def initialize(self):
fácil de usar dentro de Home Assistant y que me
self.log("Hello from AppDaemon")
permita seleccionar el momento en el que quisiera
self.log("You are now ready to run Apps!")
que se encendiera la calefacción, como si fuera algún
El código hello.py anterior ha sido sacado de las tipo de sustituto a la típica tarea cron. Considere
instrucciones de instalación, aunque también puede apropiados los intervalos de 15 minutos por
encontrar algunas aplicaciones útiles en el interruptor, de modo que si quería encender el
repositorio https://goo.gl/6nkzhm. Para activar y calentador de 4:00 a 4:30, tendría que pulsar dos
con gurar una aplicación, deberás añadir lo siguiente interruptores en la interfaz de usuario (4:00 y 4:15).
dentro de ‘apps.yaml’: Haciendo un cálculo rápido podemos concluir que un
día tiene 96 intervalos de 15 minutos, y puesto que
soy algo ojo y no quiero escribir todo este código de …
input_boolean:
…
heater_timer_00_00:
Figura 1 – Montones de interruptores de tiempo
name: Heater timer 00:00
initial: off Para que estos interruptores funcionen, hay que
icon: mdi:fire
hacer una aplicación que escuche sus cambios de
heater_timer_00_15:
estado y de este modo se llevarán a cabo las acciones
name: Heater timer 00:15
deseadas. Escribí un código para AppDaemon que
initial: off
icon: mdi:fire hace lo siguiente:
…
Al arrancar, empieza a escuchar eventos de entidades
$ cd ~homeassistant/.homeassistant/apps/
$ wget O switch_reset.py
https://raw.githubusercontent.com/home
assistant/appdaemon/dev/conf/example_apps/swit
ch_reset.py
$ wget O globals.py Figura 2 – Ejemplo de cuadro de mandos
switch_reset: dash_url: http://0.0.0.0:5050
module: switch_reset dash_password: !secret api_password
class: SwitchReset dash_dir:
log: "" /home/homeassistant/.homeassistant/dashboards
file:
La directiva dash_password es opcional. Para facilitar
"/home/homeassistant/.homeassistant/switch_sta
tes" el uso, es mejor no utilizar una contraseña, para que
delay: 10 los cuadros de mandos puedan cargarse al arrancar
sin la intervención del usuario. Necesitarás crear un
Tras reiniciar AppDaemon, los cambios en las cuadro de mando de muestra en
entidades input_boolean, input_number, input_select ~homeassistant/.homeassistant/dashboards. Primero
y device_tracker se almacenarán dentro de crea el directorio y luego ponle el nombre hello.dash:
/home/homeassistant/.homeassistant/switch_states,
$ mkdir Los cuadros de mandos generan dinámicamente
~homeassistant/.homeassistant/dashboards páginas web que pueden representar y controlar los
$ mkdir p estados de las entidades de Home Assistant. La
/home/homeassistant/.homeassistant/compiled/j mayoría de las entidades cuentas con los
avascript/css
correspondientes fragmentos de con guración del
$ mkdir p
cuadro de mandos, que permiten controlar las
/home/homeassistant/.homeassistant/compiled/cs
apariencias. La documentación de referencia la tienes
s
$ mkdir p disponible en https://goo.gl/G6iYib.
/home/homeassistant/.homeassistant/compiled/h Para empezar, debes especi car las dimensiones de
tml/default
la pantalla y pensar en cómo quieres dividir la
$ cd ~homeassistant/.homeassistant/dashboards
pantalla en widgets. Normalmente, la pantalla se
$ vi hello.dash
divide en celdas x*y, y cada celda tiene una anchura y
hello.dash una altura jas. Dispones de cierta exibilidad ya que
puede combinar celdas para crear una más grande y
#
también puede dejar celdas o las vacías. El tamaño
# Main arguments, all optional
# estándar de la celda es de 120×120 píxeles. Puesto
title: Hello Panel que la pantalla de 3.5″ tiene una resolución pequeña
widget_dimensions: [120, 120] (480 × 320), necesitaremos ser creativos e
widget_margins: [5, 5] implementar algún tipo de menú para saltar de un
columns: 8 panel a otro. También utilizaremos celdas pequeñas,
38×38, con un margen de 1 píxel y las combinaremos
label:
para crear widgets más grandes cuando sea
widget_type: label
text: Hello World necesario. Ten en cuenta que, si utilizas una pantalla
lo su cientemente grande puede y deberías usar,
layout: tamaños de widget más grandes para evitar así tener
label(2x2) problemas con el diseño.
Tras reiniciar AppDaemon, podrás acceder a esto en Con respecto a la navegación con menús,
http://[ip-odroid]:5050/hello, donde [ip-odroid] es la HADashboard tiene un widget de navegación que se
dirección IP del ODROID-C2. puede usar para cargar un cuadro de mando
diferente. La idea es crear un menú vertical de 8
elementos que aparecerá en todos los cuadros de
mandos permitiendo una rápida navegación, luego
rellenar los paneles de acuerdo a mis necesidades
con datos internos de Home Assistant, sensores,
interruptores, reproductores multimedia, cámaras y
datos externos tales como grá cos de Netdata o
datos meteorológicos online. Uno de los botones
puede servir como menú y cargar así un panel
diferente con más botones, así que dispones de
muchas opciones.
#
clock:
widget_type: clock
time_format: 24hr
show_seconds: 0
time_style: "color: yellow; fontsize: 40pt;
fontweight: bold;"
date_style: "fontsize: 16pt; fontweight:
bold;"
weather:
widget_type: weather Figura 4 – Panel de control con la navegación inservible
units: "°C"
Sin embargo, parece haber un problema con el
sub_style: "fontsize: 110%; fontweight:
diseño de los widgets de navegación. Si utilizaras las
bold;"
main_style: "fontsize: 75%; fontweight: herramientas de desarrollo de tu navegador y
bold;" analizas el diseño, veras que, aunque los widgets
unit_style: "fontsize: 250%;" están colocados correctamente, los iconos heredan
un estilo CSS que usa un posicionamiento absoluto
forecast:
que desplaza el icono de 43 píxeles hacia abajo. Esto
widget_type: sensor
es un problema porque el cuadro de mandos fue
title: Prognoza
diseñado para pantallas más grandes con widgets
title_style: "fontsize: 14pt;"
text_style: "fontsize: 16pt; fontweight: más grandes. Para evitar este problema, lo mejor es
bold;" crear un skin que cargue un archivo JavaScript
precision: 0 personalizado que restablezca el diseño absoluto de
entity: sensor.dark_sky_forecast_ro los iconos y también ajuste el tamaño. Para hacer
esto, necesitarás algunos conocimientos de Javascript,
Como puede ver, la mayoría de los widgets requieren
HTML y CSS, aunque puedes conseguir el skin
una entidad que proporcione el lazo de unión con los
completo en https://goo.gl/Fwcbti.
elementos de Home Assistant, un “type” y el resto de
con guración gestiona las fuentes, los colores y los $ sudo su homeassistant
iconos. Los iconos de los widgets pueden proceder de $ cd .homeassistant/
Home Assistant, aunque pueden sustituirse por $ mkdir p custom_css/defaultsmall
$ cd custom_css/defaultsmall
iconos de Material
$ wget O dashboard.css
Design, https://materialdesignicons.com, con el
https://raw.githubusercontent.com/mad
pre jo mdi, o de Font Awesome, ady/homeassistant
http://fontawesome.io, con el pre jo fa. customizations/master/appdaemon_skins/defaults
mall/dashboard.css
Si tuvieras que cargar este cuadro de mandos ahora
$ wget O dashboardsmall.js
mismo en un navegador introduciendo http://ip-
https://raw.githubusercontent.com/mad
odroid:5050/lcd35-hq, se vería como en la Figura 4.
ady/homeassistant
customizations/master/appdaemon_skins/defaults
mall/dashboardsmall.js
$ wget O variables.yaml
https://github.com/madady/homeassistant
customizations/blob/master/appdaemon_skins/def
aultsmall/variables.yaml
Ahora, si vuelve a cargar el cuadro de mandos y
especi cas un skin especi co, conseguirás mejores
resultados (http://[ip-odroid]: 5050/Icd35-hq?
Skin=defaultsmall)
en https://goo.gl/VuB9sr. El panel MPD se compone Home Assistant y usando el Widget de cámara. Los
de 3 cuadros de mandos similares en los que puedo botones se utilizan para controlar el control remoto
desplazarme utilizando los widgets de navegación virtual y conectarse a los componentes del script en
superiores. Éstos cargan 3 instancias MPD diferentes Home Assistant, así como a la entidad del script en
en la casa. La diferencia entre los paneles únicamente HADashboard. A continuación, tienes un ejemplo de
es la instancia cargada (ver mpdkitchen más abajo). El diseño y de los widgets:
diseño del cuadro de mando es bastante simple: layout:
include: navigationdefinition
layout:
home, streamtv(10x8), tv_living_off
include: navigationdefinition
mpd, tv_living_on
include: mpd
webcams, tv_living_source
home, navigationmpdliving(4x1),
tv, tv_living_mute
navigationmpdkids(4x1),
heating, tv_living_volume_up
navigationmpdkitchen(3x1)
cooling, tv_living_volume_down
mpd, mpdkitchen(11x7)
blinds, tv_living_ch_up
webcams
extendedmenu, tv_living_ch_down
tv
heating
streamtv:
cooling
widget_type: camera
blinds
entity_picture:
extendedmenu
http://192.168.1.4:8123/api/camera_proxy/camer
a.tv_living_image?
token=62f78994c790a89459e2f60cc6ed80bdfce3e9b5
ff5473633ba60e3d7089f0a6&api_password=odroid
refresh: 2
tv_living_off:
widget_type: script
entity: script.tv_living_power_off
icon_on: mdipowerplugoff title: Thermostat
icon_off: mdipowerplugoff step: 0.5
precision: 1
tv_living_on: entity: climate.heater_thermostat
widget_type: script unit_style: "color: yellow;"
entity: script.tv_living_power_on level_style: "color: yellow; fontsize:
icon_on: mdipower 48pt;"
icon_off: mdipower unit2_style: "color: yellow;"
level2_style: "color: yellow; fontsize:
Lo que diferencia al widget de cámara es que necesita 40pt;"
una URL a través de la API de Home Assistant. Esta level_up_style: "fontsize: 20pt;"
URL debe incluir la clave API y también un token que level_down_style: "fontsize: 20pt;"
layout:
include: navigationdefinition
include: sensors
home, heater(4x4), thermostat(6x8)
mpd
webcams
tv
heating, sensorliving(2x4), sensorkids(2x4)
cooling
blinds
extendedmenu
thermostat: Figure 9 – Control del Aire Acondicionado
widget_type: climate
El menú extendido no es más que un panel con más También prepararemos un script que ejecute
widgets de navegación. En él, tengo enlaces a un Chromium en modo Kiosco, sin almacenamiento de
cuadro de mandos de Netdata y un pronostico contraseñas, para que no te solicite contraseña cada
meteorológico cada hora e imágenes de mis cámaras vez que se desbloquee. Chromium también se
web, con espacio para más en el futuro. El panel de con gurará con un parche que hace que se olvide de
pronóstico del tiempo por hora utiliza el widget que se ha bloqueado, por lo que, en caso de un cierre
iframe para cargar una URL, mientras que el Panel de no limpio, no te preguntará si deseas restaurar la
Netdata carga una lista de URLs cada 5 segundos: sesión anterior. Además de esto, con guraremos el
monitor para que siempre esté encendido:
mynetdata:
widget_type: iframe $ cat /usr/local/bin/kioskmode.sh
refresh: 5 #!/bin/bash
url_list: /usr/bin/xset s off
http://192.168.1.5:19999/server1.html /usr/bin/xset dpms
http://192.168.1.5:19999/server2.html /usr/bin/xset s noblank
http://192.168.1.5:19999/server3.html /bin/sed i 's/"exited_cleanly":
http://192.168.1.5:19999/server4.html false/"exited_cleanly": true/'
http://192.168.1.5:19999/server5.html ~/.config/chromium/Default/Preferences
dashboard=lcd35hq
/usr/bin/chromiumbrowser noerrdialogs
incognito passwordstore=basic kiosk
http://odroidip:5050/$dashboard?
skin=defaultsmall
$ sudo chmod a+x /usr/local/bin/kioskmode.sh
Hardkernel ha presentado ahora el módulo eMMC Compatibilidad del Módulo eMMC naranja con
naranja, que utiliza el chipset eMMC 5.1 de Samsung, imágenes de sistema operativo de la serie XU4
el cual se ha estado enviando desde octubre de 2017.
Imagen SO Información del Estado
Archivo de
Imagen
esquemas están disponibles en eMMC PCB Rev 0.4. Debian Jessie Debian-Jessie- OK
1.1.4-20171121-
XU3+XU4.img
DietPi DietPi_OdroidXU4 OK
-armv7-(Jessie).7z
22-Nov-2017
Lakka Lakka- OK
OdroidXU3.arm-
2.1-rc6.img.gz
Batocera batocera-5.12- OK
xu4-
20171214.img.gz
Los eMMC de Sandisk tiene una versión hasta la 5.1 Figura 3 – Tabla de módulos eMMC de productos
con velocidad de transferencia de datos ligeramente actuales en ejecución 2016
$ dd if=/dev/zero of=test.tmp oflag=direct
bs=1M count=1024
$ dd if=test.tmp of=/dev/null iflag=direct
bs=1M
Ubuntu 16.04
Figura 4 – Módulos eMMC de antiguos productos Versión Kernel : Linux odroid64 3.14.79-115
Herramienta para pruebas : iozone revision 3.429
Referencias
Esquemas del módulo eMMC Revison 0.3 Esquemas Prueba de instalación y rendimiento de iozone:
del módulo eMMC amarillo revisión 0.4 Esquemas
$ sudo apt install iozone3
de la placa lectora eMMC
$ iozone e I a s 100M r 4k r 16k r 512k
r 1024k r 16384k i 0 i 1 i 2<
Dimensiones de la placa eMMC: 18.5mm x 13.5mm
/* 8G */
Hueco entre las PCBs: 1.1mm (Altura de los conectores
random random
B2B ensamblados)
kB reclen write rewrite read reread read write
102400 4 9290 13582 13570 13568 11900 8787
El conector está hecho por LS-Mtron Korea. En el 102400 16 10934 15680 27511 27484 25976 7699
módulo eMMC, se utilizó el GB042-34S-H10 (Socket- 102400 512 14943 23761 42163 42121 41361 15122
34pin). En la placa host, se utilizó el GB042-34P-H10 102400 1024 15140 28564 41951 41915 41196
(clavija-34pin). Las especi caciones del conector 16743
102400 16384 16559 24001 42308 42267 42287
están aquí Información sobre el eMMC Sandisk
28604
(iDisk Extreme) Información sobre el eMMC
/* 16G */
Samsung Información sobre el eMMC Essencore (el
random random
eMMC de 8GB se utiliza para XU4) Información kB reclen write rewrite read reread read write
sobre eMMC Toshiba 102400 4 14602 14622 18102 17953 16768 14421
102400 16 49363 49279 52902 52808 47450 48389
102400 512 49779 49993 138268 138315 137171 La nueva PCB roja eMMC de 8GB para el modelo
48836 ODROID-XU4 está basada en la tecnología eMMC 5.0
102400 1024 50005 49870 137522 137709 136958
de Essencore/AIO. Velocidad secuencial con prueba
49027
“dd”:
102400 16384 49861 50058 139358 139154 139299
50024
Escritura dd: 15.1 MB/s
/* 32G */
random random Lectura dd: 104 MB/s
(normal) está hecho con chipset Sandisk o Toshiba o de Ubuntu a las particiones de arranque y Linux
AIO. Los dispositivos ODROID-C1/C0/C1+/C2 usando “cp -afpv source destination”, luego inserta el
funcionan con los módulos eMMC negro y rojo. Los módulo eMMC y arranca como normalmente lo
Tras nalizar los recientes artículos sobre cómo Usaremos una imagen ya creada para esto
compilar swarm Docker en ARM de http://dockr.ly/2kmNgod. El registro proporciona
(https://goo.gl/2FjP8f) y (https://goo.gl/ZTXcp), me un lugar para almacenar e implementar tus imágenes
encontré con que quería activar servicios, para los personalizadas. Se trata de un excelente escenario
cuales no había imagen ARM disponible, o no había antes de enviar tu producto nal
ninguna imagen ARM con una versión reciente. Las a https://hub.docker.com o a cualquier otro registro
alternativas son tres: 1) prescindir de lo que quería, 2) que elijas.
conformarme con una versión anterior, o 3) averiguar
El front end del registro es simplemente un pequeño
cómo compilar lo que quería. Soy un poco chapucero
servicio muy útil para poner en marcha un registro
y me gusta tener al menos un conocimiento básico de
(http://dockr.ly/2D5DRt3). No entraremos en
mis herramientas, así que me decanté por la tercera
funciones avanzadas como eliminar imágenes, lo cual
opción. En su mayor parte, se trata un proceso
requiere una con guración adicional en el registro,
bastante sencillo, aunque de vez en cuando, terminas pero podremos navegar por nuestras imágenes y
modi cando algunas cosas. No te deje intimidar por obtener información sobre ellas.
ello, porque realmente merece la pena, y no es tan
Utilizaré go-carbon para el caché
difícil. Para facilitar las cosas, con guremos una pila
(https://goo.gl/hgjGZo). La razón fue simple, go-
Graphite. Para esta pila, necesitaré varios elementos,
carbon usa más de un núcleo en una única instancia.
además de un poco de soporte en forma de registro
Es realmente fácil de con gurar, y si tienes alguna
de imágenes alojado internamente.
Un registro
de nición de esquema, puede funcionar muy bien y asumiendo que dispones de una con guración por
también es compatible con el formato pickle. defecto y que el archivo está completo:
Usaré grafana para la interfaz de usuario de la yo he usado el nombre de host swarm. Esto es lo
pantalla, ya que es bastante común correcto para mi con guración, ya que tengo un
$ docker service rm carboncach $ curl L
$ docker service create name=carboncache https://github.com/tianon/gosu/releases/downlo
ad/1.10/gosuamd64 > /usr/sbin/gosu && \ $ docker tag grafanaxxlarm
swarm:5000/grafanaxxlarm
A esto: $ docker push swarm:5000/grafanaxxlarm
$ docker service create name=grafana
$ curl L
publish=3000:3000/tcp swarm:5000/grafanaxxl
https://github.com/tianon/gosu/releases/downlo
arm
ad/1.10/gosuarmhf > /usr/sbin/gosu && \
Monument Valley
Podría hablar largo y tendido de este juego, pero la
mejor reseña nos llega de la propia descripción de
Play Store: “En Monument Valley, manipularás
estructuras imposibles y guiarás a una princesa
sigilosa a través de un mundo increíblemente
hermoso. Monument Valley es una exploración
surrealista a través de una arquitectura fantástica y
una geometría imposible. Guía a la princesa sigilosa a
través de misteriosos monumentos, descubriendo
caminos ocultos, desplegando ilusiones ópticas y
burlando a la enigmática Crow People”.
Figura 1: Monument Valley te atrapará desde el Figura 2 – Aunque lo he comentado en el artículo, usa
principio tus auriculares para disfrutar al máximo
Este es un juego que elevará tu experiencia de juego Monument Valley en Play Store
como pocos lo harán, úsalo con tus mejores
Hopscotch
auriculares, no te arrepentirás de tener este juego en
tu colección. Un juego que canaliza el espíritu de M.C. Después de tanta grandiosidad con Monument Valley,
Escher, que te sumerge en una aventura que solo ¿qué juego deberíamos perseguir en nuestra
llegará su n cuando termines este asombroso juego, búsqueda de juegos? Todo parece tan trivial e inútil.
y luego cogerás el ODROID con el que jugaste y lo Todo era mucho más fácil cuando estábamos en la
enmarcarlas con una placa en la que se podrá leer la escuela, donde todo era más simple y nos
siguiente frase: “Jugué al Monument Valley con este divertíamos mucho. ¿Podríamos capturar este
hardware “(Compré otro ODROID después, por sentimiento? ¡Da la casualidad de que sí!
supuesto). Simplemente conecta tu pantalla táctil a tu ODROID e
instale Hopscotch. No tengo mucho más que decir al
respecto: “Prepárate para que te quiten tu dispositivo,
pero esta vez no será el profesor, sino cualquiera que
quiera sentir el gustado de jugas a este gran juego”.
Hopscotch en Play Store
Aqueducts
He estado usando un ODROID-C2 con LibreELEC desde Playstore, se puede descargar el APK e
durante bastante tiempo, pero me sentía muy instalarlo. La con guración del mando a distancia
decepcionado por la falta de compatibilidad con lleva algo más tiempo, ya que no logre encontrar un
Amazon Prime Video y Net ix. También he estado solo tutorial en línea que detallase todo el proceso.
usando un teclado/ratón inalámbrico para Esperemos que este artículo ayude a otros con este
controlarlo, lo cual me permitía censurar a su tema.
compañero, ya que deseaba tener único un mando a
El primer paso es instalar Android en una tarjeta
distancia de TV para controlar tanto el televisor
Flash. Android para C2 se puede descargar desde
(encendido/volumen) como el ODROID-C2.
https://goo.gl/cuLqSU. Cuando escribí este artículo, la
Aquí tienes el procedimiento que seguí. Doy por v3.5 era la última versión, y esa es lo que yo usé.
hecho que sabes moverte por Android, a la hora de Descarga la imagen, descomprímela e instálala en la
buscar aplicaciones y realizar con guraciones, tarjeta ash con Etcher, que está disponible para
necesitarás usar Linux a través de Android Terminal muchos sistemas operativos, o win32diskimager que
Emulator. se ejecuta en Microsoft Windows, o usa la utilidad dd
Este procedimiento no consiste en instalar sólo Kodi, de Linux. Puede encontrar más información
en https://goo.gl/RPyiwr.
sino también Youtube TV, Amazon Prime Video,
Net ix y algunas aplicaciones de Canales especí cas. Instala la tarjeta ash en el ODROID-C2 que tengas
También te ayudara a instalar aplicaciones desde conectado a un televisor a través de HDMI junto con
Google Playstore. Aunque Net ix no se instalaría un teclado/ratón USB y enciéndelo. Tarda unos
minutos, pero al nal acabarás teniendo un nuevo y Una vez completada la instalación, puedes abrir la
brillante sistema Android, y el ratón debería aplicación Google Play Store e instalar las siguientes
permitirle navegar por el sistema. aplicaciones:
Fue bastante fácil encontrar el código para controlar Puesto que las “teclas numéricas” son en su gran
mi viejo televisor. Encender, subir volumen, bajar mayoría inútiles para un TV (a excepción de los
volumen y silenciar es todo lo que verdaderamente números de los canal), las reasigné en el remote.conf
necesitaba. Deseaba que “Input select” funcionase para realizar operaciones como son Home en
para poder cambiar los puertos HDMI, pero nada de Android, Subir volumen/Bajar volumen/Mute en
lo que probé hizo que ese botón funcionara. Android y Avance Rápido/Volver atrás.
Afortunadamente, el ODROID-C2 es el único Para entender cómo una señal de IR entrante llega a
dispositivo de entrada que tengo, así que no es
la aplicación correctamente, debes tener en cuenta
necesario cambiarlo. Si alguna vez coloco un segundo que hay 3 señales independientes involucradas:
dispositivo HDMI, posiblemente será necesario volver
a investigar hasta encontrar una solución viable. el código IR enviado por el mando a distancia
código de dispositivo que activase todos los botones el código ACTION de Android
El primer comando (su -) te otorga privilegios de Los últimos cuatro dígitos del número que aparece al
SuperUser. La primera vez que la uses aparecerá una nal del mensaje de registro log nos dicen qué tipo de
ventana emergente que te pregunta si esta aplicación mando a distancia es este (0x 00 en mi caso). El
(Android Terminal Emulator) siempre debe tener este remote.conf por defecto de Android Odroid busca el
privilegio. Yo respondí “Yes” y la hice permanente. Se código 0x4db2. No estoy seguro de cuál es la
supone que todos los comandos que se ejecuten se probabilidad de que cuentes con un mando a
cargarán con privilegios de SuperUser. Si abandonas distancia con ese código si no estás utilizando el
Android Terminal Emulator y regresas de nuevo, es mando a distancia disponible en HardKernel
posible que necesite ejecutar nuevamente el (https://goo.gl/yVLVLC). Si no tiene suerte, y el
comando “su -“. mando a distancia que estás utilizando transmite
El segundo comando cambiará el sistema de archivos 0x4db2, entonces verá algo más en dmesg. Si no ves
nada en dmesg, entonces es que no está usando un
de /system de ReadOnly a ReadWrite. A continuación,
debemos editar /system/etc/remote.conf para activar mando a distancia que transmite el protocolo NEC y
debe buscar otro mando a distancia (o código de
la depuración. La depuración nos permitirá
dispositivo).
determinar qué códigos estamos recibiendo. Cambia
“debug_enable” de “0” a “1” con vi y actívalo con En mi caso, aquí es donde empecé a buscar los
remotecfg: códigos del dispositivo Dish Network 3.0 IR
investigado el dispositivo adecuado. Con guré el
# vi /system/etc/remote.conf
código del dispositivo en el mando a distancia y
# remotecfg /system/etc/remote.conf
presioné los botones para ver si obtenía las
Remotecfg lee el archivo remote.conf, el cual respuestas en dmesg. Probé muchos códigos hasta
analizará los contenidos y luego enviará la que estuve lo su cientemente cerca de mis
información al software amremote en el kernel Linux. necesidades con el código 709 de DVD Memorex, que
Esto normalmente se hace una vez en el arranque tal transmite el tipo de mando a distancia 0x 00.
y como se especi ca en /system/init.odroidc2.rc. Esto El extenso número HEX 0x7c83 00 es en realidad 2
supone una gran ventaja, ya que podemos hacer
trozos de información. Descomponiéndolos en bytes:
cambios y luego activarlos de inmediato. 7c 83 00, deberías observar que los primeros 2
Con debug_enable jado en “1”, cualquier mando a bytes son complementarios entre sí (es decir,
distancia que envíe un protocolo NEC será detectado, 01111100 -> 10000011 – ceros y unos invertidos). De
y el software amremote registrará los errores en el manera similar, los 3º / 4º bytes son complementarios
registro log del sistema. Usaremos “dmesg” para ver en muchos casos (pero no en todos). La “verdadera”
el registro log del sistema. Prueba el cambio usando información está en los bytes 2 y 3/4 (0x83 es el
estos comandos: botón, 0x 00 es el tipo de mando a distancia).
En este artículo, me gustaría compartir cómo llegué a hechas para usarse con la Raspberry Pi, necesitaba
montar un sistema Ambilight funcional con un adaptarlas al ODROID-C2.
ODROID-C2 y LibreElec. Previamente localicé otras
Raspberry Pi 3 Mediacenter + Hyperion Ambilight +
guías que se centraban principalmente en la NO soldering: https://goo.gl/q8q6PK Amblight
Raspberry Pi, así que tuve que recopilar información
project/guide – Hyperion – WS2801/ WS2812B /
usando Google y recurrir al método ensayo y error. APA102: https://goo.gl/CEgT1U
El diseño de alto nivel utiliza Hyperion instalado como Resulta que mi con guración está afectada por un
complemento para Kodi, desde el repositorio de
error bastante molesto, el cual se describe aquí:
LibreElec instalar HyperCon no es posible debido a https://goo.gl/HUwa2k
que la CPU es desconocida, y un Arduino para
La reproducción de video empieza a ralentizarse
controlar los LED usando la librería FastLED. Arduino
transcurrido un periodo de tiempo arbitrario (entre
está conectado al ODROID-C2 a través de un cable
30-70 minutos en mi caso) mientras que el audio
USB (el Arduino tiene un conversor USB a serie). Mi TV
continúa reproduciéndose a una velocidad adecuada,
es FullHD, así que no necesite recurrir a la magia (es
lo que provoca que el audio y el video no estén
decir, hacer overclock de RAM y cosas así) para el 4K.
sincronizados. Después de 30-60 segundos se
Utilicé las siguientes guías como base para el montaje
produce una pequeña pausa y salto, el audio y el
y la con guración. Pero como estas guías están
video vuelven a sincronizarse, hasta que vuelva a
suceder a los 30-70 minutos.
En el foro de LibreElec aún no está resuelto este Herramienta HyperCon para Hyperion
tema, ya que el problema está resultando bastante (https://goo.gl/7F5fDc)
en funcionamiento (ODROID-C2 con LE8/Kodi 17 con Librería FastLED para Arduino (descargar ZIP – –
no dude en contribuir con el archivo de con guración Esquema de control (script) para Arduino
(https://pastebin.com/2L9ZBhYe)
de Hyperion! Tengo pensado retocar la con guración
de Hyperion para ver si se puede hacer algo, pero
esto me puede llevar bastante tiempo
#include "FastLED.h"
Hardware
// How many leds in your strip?
ODROID-C2 mas carcasa y fuente de alimentación de #define NUM_LEDS 92
Hardkernel, que me costó alrededor de 72€ cuando lo
comprés en https://www.pollin.de el pasado año // For led chips like Neopixels, which have a
Tarjeta MicroSD Kingston 16GB Clase 10, que cuesta data line, ground, and power, you just
alrededor de 8€ en eBay // need to define DATA_PIN. For led chipsets
el archivo hyperion.con g.json. Luego utilicé los para pegarlo a la parte posterior de mi televisor.
números LED calculados para cortar la tira en piezas Necesite algo de adhesivo adicional en algunas zonas
con el tamaño adecuado y utilicé los cables del para que se adhiriera con rmeza. Desconecté la
conector de 3 pines para unirlos entre sí. Los cables placa Arduino de mi PC y la conecté a uno de los
del conector de 3 pines son necesarios para las puertos USB del ODROID-C2. Conecté el jumper del
esquinas del televisor, ya que la tira de LED por sí sola cable Dupont soldado al cable GND de la tira al pin
no se puede doblar para llegar a los 90 grados. GND y el jumper del cable Dupont soldado al cable
DATA de la tira al pin 12 del Arduino. Finalmente,
Ten en cuenta que estas tiras LED tienen una
conecté la fuente de alimentación a la clavija de
dirección. Solo el extremo inicial se puede usar para
potencia soldada al nal de la tira.
los controles de entrada y los distintos LED se
direccionan uno después del otro. Busqué la marca Con guración del software
“DI (Entrada de datos) en la tira, cerca de los LEDs. El LibreElec cargó el módulo CH341 automáticamente al
otro extremo tiene marcado “DO (Data Out). Puedes conectar la placa Arduino a USB, y apareció el
usar Google para localizar las especi caciones dispositivo /dev/ttyUSB0. Sin embargo, esto podría
WS2812b. ser diferente en tu caso Instalé el complemento
Mi experiencia me dice que los conectores de 3 pines Hyperion bajo la interfaz de Kodi, desde el repositorio
no pueden sujetar la tira con demasiada fuerza, así de LibreElec. Abrí el archivo hypercon.con g.json
que ten cuidado a la hora de montarla en la parte previamente guardado en mi ordenador y lo edité en
posterior de tu televisor. Si tiene experiencia con la 3 lugares: device, frame-grabber y e ects. La
soldadura de precisión, puede que sea mejor soldar actualización de la carpeta de efectos es necesario
los cables para conectar las partes de la tira en lugar porque es diferente cuando Hyperion es instalado
de utilizar los conectores de 3 pines. como complemento, en lugar de instalarlo con
HyperCon.
Instalé LibreElec en la tarjeta micro SD siguiendo las
instrucciones de https://libreelec.tv, luego la monté el Ten en cuenta que en otras guías se menciona usar
ODROID-C2 y con guré Kodi a mi gusto. Entre a 100000, 200000, etc. para la tasa de baudios. En mi
Settings -> Services -> Control in Kodi interface, y caso, esto derivo en un repetitivo mensaje de error
habilité tanto “Allow remote control from applications “Unable to open RS232 device (IO Exception (25):
on this system” como “Allow remote control from Inappropriate ioctl for device” en el registro log de
applications on other systems”. Instalé IDE Arduino en Hyperion. Cambiar a una velocidad de 115200
mi ordenador, luego extraje el archivo ZIP de la baudios hizo que el problema se solucionara.
librería FastLed en una subcarpeta independiente ¡Asegúrate de observar el orden del color invertido
bajo la carpeta libraries. Cuando inicié IDE Arduino “GRB”!
después, la librería FastLED aparecía disponible en el
// DEVICE CONFIGURATION
menú Sketch -> Available libraries. "device" :
Conecté la placa Arduino a mi ordenador con el cable {
"name" : "MyHyperionConfig",
USB. Copié el esquema en el IDE Arduino, jé el
"type" : "adalight",
número de LED de la tira en la la n. ° 4 (tendrá este
"output" : "/dev/ttyUSB0",
número de HyperCon) y el pin utilizado para el control
"rate" : 115200,
"delayAfterConnect" : 0,
"colorOrder" : "grb" ts"
}, ]
},
"amlgrabber" :
{ Cargué mi archivo hyperion.con g.json actualizado en
"width" : 64, la carpeta
"height" : 64, /storage/.kodi/userdata/addon_data/service.hyperion
"frequency_Hz" : 20.0, / en LibreElec. Esta es la carpeta donde el
"priority" : 880
complemento Hyperion busca el archivo de
},
con guración. El recurso compartido UserData se
"framegrabber" :
{ puede utilizar para la carga si el servidor SMB está
"width" : 64, habilitado. Luego reinicié LibreElec y, fue entonces
"height" : 64, cuando el sistema Ambilight funcionó correctamente.
"frequency_Hz" : 10.0, Espero no haber olvidado nada y que a alguien le sea
"priority" : 890 útil esta información. ¡Cualquier comentario o
},
sugerencia para mejorar será bienvenida!
"effects" : Para comentarios, preguntas y sugerencias, visita el
{ post original del foro en
"paths" : https://forum.odroid.com/viewtopic.php?
[
f=144&t=29334.
"/storage/.kodi/addons/service.hyperion/effec
Divirtiéndonos con GPIO en Android
January 1, 2018 By Justin Lee Android, Mecaniqueo
El ODROID-C1/C1+, ODROID-C2 y ODROID-XU4 tienen Puedes encontrar la ubicación del SDK de Android
pines GPIO (Entrada/Salida de Propósito General) que bajo este menú (File → Settings → Appearance &
permiten controlar dispositivos externos a través de Behavior → System Settings → Android SDK)
software. Para acceder correctamente al puerto GPIO,
debes instalar la imagen Android Marshmallow
versión 2.8 o superior en el ODROID-C2, la imagen
Android KitKat versión 3.2 o superior en el ODROID-
C1/C1+, y la imagen Android KitKat versión 6.0 o
superior, o la versión Android Nougat versión 1.3
20171214 o superior en el ODROID-XU4.
ODROID-XU4
$ sudo apt install git
$ git clone
https://github.com/codewalkerster/example
wiringPi b odroidxu
PWM
La Figura 12 muestra un ejemplo básico de control del Figura 13 – La placa meteorológica de Hardkernel mide
PWM. Puede escoger el número de salidas PWM (1 o las estadísticas medioambientales
2), así como controlar la frecuencia y el índice de
trabajo.
I2C
La Figura 15 muestra un ejemplo de código para
acceder a nuestra placa meteorológica para medir la
temperatura, la humedad, la presión atmosférica, la
altitud y la intensidad de luz visible/invisible a través
de la interfaz I2C.
#fatload mmc 0:1 ${loadaddr} Image
booti ${loadaddr} ${dtbaddr}
Después de editarlo
movi read dtb 0 ${dtbaddr}
# load kernel from vat or boot partition.
#movi read boot 0 ${loadaddr}
fatload mmc 0:1 ${loadaddr} Image
booti ${loadaddr} ${dtbaddr}
Figura 16 – Software demo para acceder al sensor de Carga la imagen del kernel desde la partición vfat i2c.
temperatura DS18S20 que se comunica con el protocolo
Si no puede encontrar el comando “fatload”, elimina
1-wire
/storage/internal/boot.ini y reinicie el sistema. Para
Kernel para I2C comentarios, preguntas y sugerencias, visita el
Abra la aplicación File Manager y edita el archivo artículo original de la Wiki
/storage/internal/boot.ini tal y como se muestra a en https://wiki.odroid.com/odroid-
continuación: c2/application_note/gpio/enhancement_40pins_on_
android.
Original
movi read dtb 0 ${dtbaddr}
# load kernel from vat or boot partition.
movi read boot 0 ${loadaddr}
UART Daisy Chain: Depuración Avanzada con el ODROID-C2
January 1, 2018 By Justin Lee ODROID-C2, Mecaniqueo
Hardware
Antes de empezar, tienes que hacerte con algunas
cosas. Primero, descarga el diagrama Fritzing
desde https://goo.gl/Q1YhP3. Comprueba el diseño
de los pines J2 2×20 en https://goo.gl/44XGpB.
PUERTO PIN b/arch/arm64/boot/dts/meson64_odroidc2.dts
index e6a25b0..fd41552 100755
TX RX
a/arch/arm64/boot/dts/meson64_odroidc2.dts
UART_A (ttyS1) 8 10 +++
HOSTCC scripts/dtc/util.o root@odroidc2:/ # mount o rw,remount /
HOSTLD scripts/dtc/dtc [ 1243.002784@2] EXT4fs (mmcblk0p2): re
CC scripts/mod/empty.o mounted. Opts: (null)
HOSTCC scripts/mod/mk_elfconfig root@odroidc2:/ # vi /ueueventd.odroidc2.rc
MKELF scripts/mod/elfconfig.h ueventd.rc
CC scripts/mod/devicetableoffsets.s root@odroidc2:/ # vi /ueventd.odroidc2.rc
GEN scripts/mod/devicetableoffsets.h
HOSTCC scripts/mod/file2alias.o /dev/ttyS* 0666 system system
HOSTCC scripts/mod/modpost.o
HOSTCC scripts/mod/sumversion.o Con gurar el código de ejemplo de la app de
HOSTLD scripts/mod/modpost Android
HOSTCC scripts/selinux/genheaders/genheaders Descarga la librería de WiringPi NDK
HOSTCC scripts/selinux/mdp/mdp de https://goo.gl/uuDeys, y el código fuente de la
HOSTCC scripts/kallsyms
aplicación desde GitHub en https://goo.gl/YNXTUn.
HOSTCC scripts/pnmtologo
HOSTCC scripts/conmakehash $ sudo apt install git
HOSTCC scripts/bin2c $ git clone
HOSTCC scripts/recordmcount https://github.com/codewalkerster/example
HOSTCC scripts/sortextable wiringPi b odroidc_3_uart
DTC arch/arm64/boot/dts/meson64_odroidc2.dtb
Warning (reg_format): "reg" property in /spi
gpio/spigpio@0 has invalid length (4 bytes)
(#addresscells == 2, #sizecells == 1)
Warning (avoid_default_addr_size): Relying on
default #addresscells value for /spi
gpio/spigpio@0
Warning (avoid_default_addr_size): Relying on
default #sizecells value for /spigpio/spi
gpio@0
#### make completed successfully (4 seconds)
####
Uno de mis recuerdos más tiernos de la infancia es la y anime en torno al tema, Mech Warrior es una
serie de juegos Mech Warrior. Recuerdo pasar horas y producción occidental que no está basada en la
horas a mediados y nales de la década de 1990 y cultura mecha japonesa.
principios de la década de 2000 jugando a todos los
Mech Warrior está basado en el universo/franquicia
juegos de la serie que estaban disponibles en ese BattleTech de FASA Corporation. Los diferentes clanes
momento. Al jugar a este juego me viene a la
y la llamada “Inner Sphere” luchan entre sí por
memoria recuerdos de cómo controlaba el joystick y
conquistar territorios y el liderazgo. Aunque al nal
el teclado al mismo tiempo: con gurando el Mech
los clanes están destinados a fracasar, a menudo son
para optimizar mi arma, la refrigeración y la
los propios clanes los que deciden en los juegos.
armadura a su máxima capacidad; y sentir el enorme
Mech Warrior 2 no es diferente. En este caso luchas
contrabajo de fabricación propia, retumbando bajo
como Clan Jade Falcon o Clan Wolf.
mis pies cada vez que mi compañero apretaba el
gatillo de su joystick.
$ imgmount d
Conclusion
Mech Warrior 2 sigue siendo bastante divertido de
jugar hoy día, y con ODROID es posible, incluso si la
experiencia no es exactamente la misma que en su
día. Desafortunadamente, no pude conseguir una
copia de la versión DOS 3DFx del juego, quizás
habrían mejorado los grá cos y el rendimiento algo
Figura 12 – La versión de Playstation de Mech Warrior 2 más, ya que nuestro DOSBox también tiene soporte
está reducida al mínimo, aunque está completamente Glide (3DFx).
texturizada
Hay muchas versiones diferentes y algunas pueden
La versión de Playstation de Mech Warrior 2 está
funcionar mejor que otras en ODROID. Puede que
totalmente texturizada, aunque por lo general es una
escriba un artículo comentario a éste para ver si el
versión inferior en comparación con las versiones de
resto de versiones pueden ejecutarse en ODROID.
DOS y Windows, porque se redujo al mínimo. Por
Hasta entonces, seguiré destruyendo a otros Mechs
ejemplo, toda la con guración de Mech ha
usando el teclado y el ratón para controlar mi Mech ¡y
desaparecido, dejando solo algunos ajustes
brindar más honor a mi clan!
preestablecidos. Los controles se simpli caron, pero
esto realmente no mejoró la jugabilidad. Aunque los
Conociendo un ODROIDAN: Dongjin Kim
January 1, 2018 By Rob Roy Conociendo un ODROIDian