Error en RetroPie: Unsupported OS

retropiewebsitelogo

RetroPie es una de las maneras más fáciles de convertir una Raspberry Pi en una máquina emuladora para videojuegos. Se instala sobre Raspbian, por lo que no es una distribución propiamente; solo un simple programa que puede ser instalador sobre Debian y derivadas.

Distribuciones derivadas de Debian hay muchas, pero el instalador de RetroPie no tiene en cuenta esta variedad y podemos encontrarnos con el mensaje “Unsupported OS” que no nos permite avanzar.

Para corregir este error, debemos añadir a uno de los scripts del instalador el nombre de nuestra distribución, que además viene indicado en el propio mensaje de error. En mi caso, y para este ejemplo, estoy usando la distribución MX.

La solución es tan sencilla como navegar hasta la carpeta scriptmodules incluida en la descarga de RetroPie, y modificar con un editor de texto el script system.sh. Usamos el buscador del editor de texto para localizar lo siguiente: Raspbian|Debian). Y utilizando la misma sintaxis, añadimos a continuación el nombre de nuestra distribución. En este ejemplo, en los dos resultados de búsqueda que se obtienen las líneas quedan de la siguiente manera:

Raspbian|Debian|MX)

Rotar pantalla con Raspberry Pi

En algunos escenarios es más útil contar con un monitor en vertical: dashboard, lectura / edición o incluso para matar marcianos en máquinas recreativas. Habitualmente utilizo xrandr desde la línea de comandos para rotar la imagen, pero en Raspbian esta opción no me daba resultados.

portrait_lcd_polarization

La solución es sencilla. Editamos el archivo config.txt ubicado en la carpeta /boot. Para ello, podemos utilizar nano desde la terminal:

sudo nano /boot/config.txt

Al final del archivo añadimos la siguiente línea:

display.rotate=1

El valor numérico puede ser 1, 2 o 3, según queramos rotar la pantalla 90º, 180º o 260º, respectivamente. Solo queda guardar el archivo y reiniciar.

Raspberry Pi: botón para enviar mensaje vía Telegram

IMG_20160727_235155

Lo que pretendo en esta ocasión es poder tener una Raspberry Pi en la entrada de casa, para que cuando entre pueda clicar un botón y envíe automáticamente un mensaje por Telegram al número o números indicados. Se trata de un simple aviso del estilo “Ya estoy en casa“, para que tanto mi pareja como yo sepamos que la casa y el perro ya no están solos.

El proyecto es igualmente útil en otros escenarios en que queramos simplificar el envío de un aviso a otra persona: entornos laborales, personas que puedan requerir ayuda de otros… En este caso voy a utilizar un botón extraído de un antiguo PC, que va conectado directamente a los pines GPIO de la Raspberry Pi. Podrían valorarse otros diseños como utilizar un botón grande estilo recreativa, un sensor capacitivo, un hat específico… Es también tentador utilizar un sensor PIR, pero resulta poco útil si hay una mascota en casa o no se hace un buen calibrado.

Paso 1. Instalar Telegram en el teléfono o teléfonos.

Resulta evidente; es necesario contar con Telegram instalado en aquellos móviles a los que queramos enviar el mensaje. Lo podemos hacer directamente desde la Play Store. En la lista de contactos del teléfono tendremos guardado el contacto de la persona a la que queremos enviar el mensaje. Por cautela, algo me dice que también será útil crearnos un contacto que seremos nosotros mismos. Es decir, un contacto nuevo, con el nombre que quieras, pero con nuestro número propio de teléfono. No está de más.

Paso 2. Instalar telegram-cli en la Raspberry Pi.

Empezamos copiando a nuestra Raspberry Pi el programa, clonándolo del repositorio de Github. Este es el comando, que ejecutamos desde la terminal:

git clone –recursive./configure https://github.com/vysheng/tg.git
Ahora tendremos una carpeta de nombre “tg” a la que accederemos:
cd tg
Antes de empezar a configurar el programa, instalaremos librerías necesarias para su funcionamiento:
sudo apt-get install libreadline-dev libconfig-dev libssl-dev lua5.2 liblua5.2-dev libtool libevent-dev libjansson*
Para después configurar Telegram:
./configure
Y seguidamente compilarlo, para lo cual se tomará unos minutos:
make
Ahora ejecutamos Telegram:
bin/telegram-cli k tg.pub
¿No funciona? ¿Recibes este mensaje?:
I: config dir=[/home/pi/.telegram-cli]
> telegram-cli: tgl/mtproto-utils.c:101: BN2ull: Assertion `0′ failed.
SIGNAL received

En ese caso modificamos el archivo mtproto-utils.c ubicado en la carpeta tgl. Vamos directamente a las líneas 101 y 115, y las eliminamos. Este es su contenido:

assert (0); // As long as nobody ever uses this code, assume it is broken.

Una vez guardados los cambios, volvemos a la carpeta inicial (/home/pi/tg) y volvemos a compilar:

make

Ahora sí, al ejecutar Telegram arrancará correctamente:

bin/telegram-cli k tg.pub

Paso 3. Configurando Telegram.

Al ejecutar el anterior comando, inicia la configuración. Lo primero que necesita el programa es que indiquemos nuestro numero de teléfono. Debe estar siempre precedido del prefijo del país. En el caso de España, escribimos +34 seguido de nuestro número de teléfono.

Una vez escrito presionamos enter, y recibimos un SMS en nuestro móvil con el código a indicar en la siguiente línea que nos solicita el programa. Después ya tenemos el programa iniciado y esperando ejecutar los comandos que le indiquemos.

Para comprobar que el servicio funciona, ejecutaremos el comando msg para enviar un mensaje por Telegram. La sintaxis es la siguiente:

msg NombreDelContacto Mensaje

No es necesario teclear el nombre del contacto completo; si ponemos las primeras letras la tecla de tabulación hará el autocompletado. Si en el paso 1 de este tutorial nos hemos añadido a nosotros mismos en la agenda de contactos del móvil, en esta prueba podemos indicar que nos envíe el mensaje a nuestro propio número y así comprobar que lo recibimos correctamente.

Finalmente, escribimos el comando quit para salir de Telegram.

quit

Paso 4. Crear script que envíe mensaje de Telegram al pulsar el botón físico.

El script es bastante sencillo, un bash script que podéis descargar desde aquí, y del que se detalla fuente y autoría en su cabecera (¡Agradecidos! Echadle un ojo). Este es el código que incluye:

#!/bin/bash
######
###
# telegram-cli bash script r0.1
# change 'to' to your own  Telegram account name
# by =  Mohammad Hafiz bin Ismail  [mypapit@gmail.com]
# url=  https://blog.mypapit.net/
###
######

## Replace 'to' with your account name

to=Replace_this_with_your-Telegram_account_name

##

function show_usage {

        echo "Usage $0 [message]"
        exit
}




if [ $# -lt 1 ]
then
  show_usage
fi


(echo "contact_list";sleep 20;echo "msg $to $1"; echo "safe_quit") | telegram-cli

Para descargarlo en la Raspberry Pi utilizo el comando wget, y así queda copia en la carpeta en la que estamos trabajando:

wget https://blog.mypapit.net/upload/files/send-telegram.sh.txt

Si nos fijamos, el archivo descargado tiene extensión txt, que facilita la lectura del código desde un navegador web. Pero necesitamos que quede con extensión sh para que se pueda ejecutar como bash script. Lo hacemos con el siguiente comando:

mv send-telegram.sh.txt send-telegram.sh

Ahora personalizamos el script a nuestros intereses. Para ello lo abrimos con nuestro editor preferido. En este caso utilizaré Nano:

nano send-telegram.sh

La primera línea a modificar es la siguiente:

to=Replace_this_with_your-Telegram_account_name

Simplemente le indicamos después del “to=” el nombre de usuario de Telegram al que queremos enviar el mensaje automatizado. Para esta prueba, nos podemos poner a nosotros mismos. Para el uso doméstico de aviso al estilo “Ya estoy en casa”, le indicaremos el nombre del grupo que contiene los contactos a notificar, substituyendo los espacios por una barra baja (ejemplo: nombre_del_grupo). Si evitamos espacios y símbolos, no nos complicamos la vida.

La siguiente modificación la realizamos al final de la última línea. En ella se indica que debe ejecutarse “telegram-cli”, pero no está indicada la ruta en la que se encuentra. Por lo tanto, modificamos “telegram-cli” por “bin/telegram-cli”.

Realizados los cambios, salimos de Nano guardando los cambios (Ctrl+X, presionando la “y” para sobre-escribir cambios, e intro para confirmar el nombre del archivo).

Antes de probar el script le daremos permisos de ejecución:

chmod a+x send-telegram.sh

Ahora sí, ejecutamos la prueba pertinente:

./send-telegram.sh “Mensaje a enviar”

Si no introducimos el mensaje entre comillas es posible que solo se envíe la primera palabra. Como podemos observar, con el script se ejecuta Telegram, carga la agenda de contactos, busca el contacto que hemos indicado en su código (a nosotros mismos, en el ejemplo), envía el mensaje y cierra Telegram. Todo con un solo comando.

Paso 5. Ejecutar el script al presionar un botón.

Esta parte se basa en la modificación del tutorial Raspberry Pi 2: botón de encendido, apagado y reset. Unicamente modificaremos el envío de la orden de reinicio por la de ejecución del script.

En primer lugar conectaremos un botón a los pines 5 y 6. Si situamos la Raspberry Pi delante nuestro, con los pines en la parte más cercana a nosotros, se trata de la tercera fila de pines. Este tipo de botón se puede comprar, pero si tenéis a mano algún ordenador antiguo podéis reciclar los botón de encendido o reset.

Para comunicarnos con la máquina mediante el botón utilizaremos un script Python. Lo descargamos en la Raspberry Pi:

wget https://raw.githubusercontent.com/gilyes/pi-shutdown/master/pishutdown.py

El script ahora contiene código preparado para apagar la Raspberry Pi, y por eso recibe ese nombre. Para evitar confusiones, lo renombramos:

mv pishutdown.py boton-telegram.py

Vamos a modificar el script con un editor de texto, de manera que ejecute el envío del mensaje vía Telegram si presionamos el botón, pero mantendremos la opción de apagar la Raspberry Pi si dejamos el botón presionado durante 3 segundos, pues siempre nos puede ser útil:

nano boton-telegram.py

Nos dirigimos a la línea 35 en la que encontramos esta orden de reinicio:

call([shutdown, -r, now], shell=False)

Y la substituimos por la ejecución del script de envío de mensajes de Telegram, indicando además qué mensaje queremos enviar cada vez que se presione el botón:

call([‘./send-telegram.sh “He llegado a casa”‘], shell=True)

Advertencias:

  • Las líneas 35 y 32 son muy parecidas, pero no iguales. Cuidado de modificar la 35, y no la 32 (perderíamos la posibilidad de apagar desde el botón, y deberíamos dejar el botón presionado para enviar el mensaje por Telegram).
  • Es necesario, como se observa en el código indicado, cambiar de False a True en la variable “shell”.

Ahora podemos guardar los cambios en Nano (Ctrl+X, presionando la “y” para sobre-escribir cambios, e intro para confirmar el nombre del archivo), para seguidamente ejecutar el script Python:

python boton-telegram.py

Ejecutado el script, si presionamos el botón veremos en pantalla cómo procede a enviar el mensaje vía Telegram, y permanece a la espera hasta la siguiente vez que se presione. Podemos presionar Ctrl+C para detener el script una vez comprobamos que funciona.

Error de Omxplayer en Raspberry Pi: “COMXAudio::Decode timeout”

Tengo una de las Raspberry Pi dedicada a descargar torrents principalmente, aunque por comodidad alguna vez también la uso para reproducir películas mediante Omxplayer. Al lanzar el programa desde Raspbian me devolvía el siguiente error de forma repetida:

“COMXAudio::Decode timeout”

Ha sido un buen rato el que he necesitado para localizar qué fallaba. Uniendo de allí y de allá, al final resulta que Omxplayer necesitaba más memoria dedicada a la GPU para funcionar como es debido. En las últimas versiones de Raspbian podemos modificar este valor desde el Menú Principal del Sistema – PreferenciasRaspberry Pi Configuration. Bastará acceder a la pestaña Performance para aumentar la memoria de la GPU hasta 128.

Script: copiar y reproducir archivos de Raspberry Pi en nuestro PC

El escenario es el siguiente: Raspberry Pi con sensor PIR que graba fragmentos de vídeo cuando detecta movimiento, y necesidad de revisar los vídeos sin tener que desmontar la Raspberry Pi ni añadir pantalla ni teclado. Los pasos que se describirán son igualmente útiles para copiar cualquier tipo de archivo de la Raspberry Pi al ordenador local.

IMG_20160501_121431

Para mayor comodidad, vamos a crear un script que ejecute las siguientes acciones:

  1. Copiar archivos de vídeo de Raspberry Pi al ordenador local.
  2. Eliminar los archivos de vídeo de Raspberry Pi, para liberar espacio.
  3. Reproducir los vídeos copiados en VLC.

El primer paso es crear un archivo de texto con la extensión .sh, lo cual indica que se trata de un bash script. En mi caso he llamado al archivo “Videos.sh” y lo he ubicado en el Escritorio.

Editamos el archivo con un editor de texto (Leafpad, Gedit…) e incluimos el siguiente contenido:

#!/bin/bash

scp pi@192.168.1.133:~/*.h264 ~/Escritorio/Videos

ssh pi@192.168.1.133 ‘rm ~/*.h264′

vlc ~/Escritorio/Videos/*.h264

En cada caso será necesario adaptar los comandos al contexto:

· Comando 1: scp pi@192.168.1.133:~/*.h264 ~/Escritorio/Videos

scp es la orden para copiar archivos vía ssh

En “pi@192.168.1.133” debe sustituirse “pi” por el nombre de usuario que accede a la Raspberry Pi (por defecto es “pi”), y los números de la IP deben ser los asignados a la Raspberry Pi en tu red local (la aplicación Fing de Android ayuda a identificarlo).

Con “~/*.h264″ le indico que copie todos los archivos de extensión .h264, y mediante “~/” le hago saber que se encuentran en el directorio Home de la Raspberry Pi. Si tenemos los archivos en otro lugar, lo debemos especificar.

Con “~/Escritorio/Videos” indico que los archivos deben ser copiados en la carpeta local Videos de mi escritorio. Algunas distribuciones mantienen el nombre en inglés “Desktop” para el escritorio.

· Comando 2: ssh pi@192.168.1.133 ‘rm ~/*.h264′

Los comentarios de los párrafos anteriores son aplicables al comando “ssh pi@192.168.1.133 ‘rm ~/*.h264′”; debemos tener en cuenta el nombre de usuario indicado (“pi” en el ejemplo), la IP de la Raspberry Pi, la ubicación de los archivos en la Raspberry Pi (“Home” en el ejemplo) y el tipo de archivos (*.h264 en el ejemplo).

La diferencia en este comando es la ejecución de “rm”, con el fin de eliminar los archivos de la Raspberry Pi después de haber sido copiados en el comando anterior.

· Comando 3: vlc ~/Escritorio/Videos/*.h264

Por último, puestos a automatizar, pedimos a VLC que reproduzca los vídeos. Tan solo tendremos que modificar la ruta hacia esos vídeos, que en el caso mostrando se copian a la carpeta “Videos” del escritorio.

Si en nuestra máquina el formato de vídeo h264 nos da problemas, y acostumbramos a convertir los archivos antes de reproducirlos, podemos añadir una linea previa a la ejecución de VLC con el comando que utilizamos para la conversión.

Ahora solo queda convertir el archivo de texto que hemos creado en ejecutable: clicamos con el botón derecho sobre él y accedemos al diálogo “Propiedades”, y en la pestaña “Permisos” indicamos que se trata de un archivo ejecutable.

De esta manera ya cumplimos el objetivo de automatizar la tarea. Al ejecutar el script, se nos pregunta cada vez la contraseña del usuario para acceder a la Raspberry Pi. Indagando he encontrado una solución para obviar este paso: crear dos archivos que guardan estas contraseñas.

En el ordenador local ejecutamos desde una terminal:

ssh-keygen –t rsa

El comando nos preguntará por la ubicación para guardar los archivos y por una contraseña: presionamos enter en ambos casos sin introducir valor ninguno. Los archivos serán creados en la carpeta oculta .ssh de nuestro directorio de usuario. Debemos copiar el archivo id_rsa.pub dentro de la misma carpeta ubicada en la Raspberry Pi (si no existe, la creamos). Y una vez copiado, lo renombramos a authorized_keys2.

Raspberry Pi 2: botón de encendido, apagado y reset.

Cansado de tener que desconectar y conectar el cable de alimentación para encender la Raspberry Pi, y de teclear el comando de apagado, procedo a añadir un botón físico de encendido, apagado y reset.

El primer requisito es hacerse con un botón, que se conecte mediante cable a dos pines GPIO de la Raspberry Pi. He decidido retirar el botón de reset de una placa madre antigua que conservo y no utilizo, aunque podremos usar igualmente el de encendido. Aquí una imagen:

raspberry-on-off-button

Conectamos el botón a los pines 5 y 6 de la Raspberry Pi 2, que corresponden al GP3 y al Ground. Venden unas plaquitas muy útiles que ayudan a identificar cada pin, pero una consulta rápida en el buscador nos devuelve imágenes identificativas. En todo caso, se trata de la tercera fila de pines (cada fila tiene dos pines) empezando a contar desde la esquina más próxima de la placa.

En este punto ya podemos encender la Raspberry Pi con el botón. Pero para poder apagarla y resetear, es necesario crear un script que ejecute la orden correspondiente al detectar actividad en los pines a los que tenemos conectado el botón. Un problema tan común como es el apagado de la popular Raspberry Pi lo encontramos ampliamente documentado en internet, y el script en Python de https://github.com/gilyes/pi-shutdown se adapta perfectamente a lo que necesitamos. En la página de GitHub vemos un botón para descargar los archivos en un ZIP (Download ZIP): copiamos el archivo pishutdown.py a nuestra Raspberry Pi.

Para comprobar que funciona correctamente, ejecutamos desde la Raspberry el script Python con el siguiente comando:

sudo python pishutdown.py

Ahora la Raspberry Pi debería reiniciarse si se presiona el botón, y apagarse si se presiona durante tres segundos. Cabe decir que pasan unos segundos hasta que puede verse como inicia el proceso de apagado.

Una vez realizada esta prueba, el botón no vuelve a funcionar para apagar o resetear hasta que ejecutemos nuevamente el script. Por ello lo añadiremos al Cron, el gestor de tareas de Linux que permite indicar cuando ejecutar cada una de ellas. En la Raspberry Pi ejecutamos:

crontab -e

Es posible que os permita seleccionar el editor con el que modificar el Cron: la opción 2, el editor Nano, es la recomendada. Para ejecutar el script al iniciar el sistema tan solo debemos añadir al final del archivo lo siguiente:

@reboot sudo python /home/pi/pishutdown.py

Debe modificarse la ruta del script si se ha copiado en otra carpeta distinta de la Raspberry Pi. La combinación de teclas “Ctrl X” es para salir del editor, guardando los cambios del archivo cuando nos pregunte.

 

Raspberry Pi como cliente de descargas torrent, controlado remotamente

El resultado final es una Raspberry Pi, sin teclado ni pantalla, dedicada a descargar torrents. Desde nuestro ordenador principal podremos visualizar las descargas en curso o pausadas, añadir nuevos torrents y copiar (o eliminar) los archivos descargados a nuestro equipo.

Según el uso, puede interesar dejar a la Raspberry Pi conectada una memoria USB de gran capacidad o bien un disco duro externo. Por otro lado, se recomienda situar la Raspberry Pi al lado del router para poder contar con una conexión por cable con más garantías respecto a las conexiones wifi (velocidad, caídas, desconexiones…).

Cliente torrent

La primera elección a tomar es el cliente torrent que usaremos. Un cliente sin entorno gráfico, que podamos utilizar desde la terminal, consumiría menos recursos. Pero para facilitar las cosas elijo el clásico Transmission, pues cuenta con un cliente web para acceso remoto sencillo y completo. Para instalarlo, desde una terminal:

sudo apt-get install transmission

Una vez instalado, abrimos Transmission y nos dirigimos al menú Editar – Preferencias, y seguidamente a la pestaña Descargas.

Nos puede interesar marcar la opción “Automatically add .torrent files from”, pues añadiendo los archivos torrent de forma remota a la carpeta específica ya se sumarían a la cola de Transmission. En mi caso, desmarco la segunda opción “Show the Torrent Options dialog” pues no nos va a resultar útil que muestre un diálogo que no veremos, y dejo marcado “Mover archivo torrent a la papelera” para que se elimine una vez el programa lo añada a la cola de descargas. Si nos fijamos, la última casilla nos permitiría ejecutar un script cada vez que se complete una descarga (por ejemplo para avisarnos vía e-mail, con un sonido o con algún tipo de alarma visual). Por otra parte, también en estas opciones de configuración indico a Transmission en qué lugar descargar los archivos: en mi caso en un disco USB para no llenar la escasa capacidad de la tarjeta SD.

En la pestaña Escritorio, del mismo modo, podemos desmarcar todas las opciones que únicamente muestran avisos en pantalla que no veremos, pues no tendremos ninguna conectada.

Y por último, y más importante, en la pestaña Remote dejamos marcado “Allow remote access”, para activar el cliente web que usaremos desde nuestro ordenador principal para controlar Transmission.

Activar SSH

SSH (Secure Shell) nos permite acceder vía terminal remota a nuestra Raspberry Pi, y así poder visualizar los archivos descargados. Posiblemente ya tengamos SSH activado, pero para asegurarnos lanzamos desde consola:

sudo raspi-config

Este comando abre la configuración de Raspberry Pi; solo hay que situarse en la opción de activar SSH y después reiniciar la Raspberry Pi.

Desde el terminal de nuestro ordenador principal, podemos acceder a los archivos de la Raspberry Pi con la siguiente sintaxis:

ssh nombre-de-usuario-de-Raspberry-Pi@IP-de-Raspberry-Pi

Si usamos el usuario por defecto, sería “ssh pi@X.X.X.X”, cambiando las “X” por los valores de nuestra IP. Para conocer de la ip de la Raspberry Pi de forma remota puede ser útil este post, aunque yo uso la app Fing de Android.

También podemos acceder a los archivos de forma remota desde nuestro explorador de archivos. En mi caso, usando PCManFM, simplemente pongo en la barra de dirección: sftp://X.X.X.X, siendo nuevamente las “X” los valores de la IP de la Raspberry Pi. Desde el explorador (PCManFM, Thunar, Nautilus…) podemos abrir los archivos, copiarlos a nuestro equipo o eliminarlos fácilmente.

Visualizar y gestionar la cola de descargas

Para esta tarea utilizamos el entorno web generado por Transmission, abriendo nuestro navegador e introduciendo la IP de la Raspberry seguido del puerto 9091. Por ejemplo: 192.168.1.128:9091

transmission_web_interface

Desde esta interface podemos añadir directamente el enlace al torrent, sin descargarlo, pausar las descargas y configurar Transmission como si lo hiciéramos desde la misma Raspberry Pi. Una opción interesante es configurar las horas de descarga, por si queremos activarlas únicamente cuando no estemos en casa o mientras dormimos, y así no interferir en el uso que hacemos de internet durante el día.