Configurar apagado y reinicio desde botón en Rabsperry Pi

Una de las virtudes que tiene la Rabsperry Pi es que su encendido y apagado se hace enchufando o desenchufando su cable de corriente. Esto es perfecto para una máquina arcade ya que con un único interruptor de corriente general conectado a una regleta en su interior puedes arrancar todo el sistema con un simple botón.

En otro tipo de proyectos es mas elegante el poder hacer reinicio o apagado la Rabsperry Pi desde un botón o interruptor. Por ejemplo un proyecto que está muy de moda es hacer clones o réplicas de consolas retro con una impresora 3D albergando en su interior una Rabsperry Pi. En este tipo de proyectos se hace necesario el poder utilizar los botones externos para hacer estas acciones.

Lo primero que necesitamos es comprar los botones. Os recomiendo botones de servicio o también llamados “monetarios”, os recomiendo que sean los mas delgados y pequeños posibles.

Aquí tenéis un ejemplo, además son muy económicos:

También vais a necesitar para conectar estos botones a la Rabsperry Pi del siguiente cableado “female-male jumper wire” (2 cables por botón):

El jumper hembra irá a la GPIO como voy a detallar mas abajo y el conector macho debe ir conectado a al botón. Para ello lo puedes hacer de varias formas, soldando el cable directamente a la patilla del botón o crimpando el cable con un conector Faston usando una crimpadora.

Por lo tanto deben quedar los cables conectados a cada botón similar a la siguiente imagen

Una vez tengamos nuestros botones con sus correspondientes cables toca conectarlos al puerto GPIO. En la imagen de abajo os pongo como está distribuido el puerto GPIO en una Rabsperry Pi 2/3.

Uno de los cables del botón tiene que ir conectado a tierra y el otro cable a otro puerto cualquiera (que no sea ni tierra ni tenga algún voltaje 5V o 3V).

Por ejemplo podéis conectar uno de los botones al pin número 13 y 14 y el otro botón al pin 33 y 34. MUY IMPORTANTE que recordéis el número de estos pines ya que los tendremos que poner en el script que os voy a detallar mas abajo.

Una vez tengamos los botones conectados tenemos que conectarnos por ssh a la rabsperry pi y ejecutar los siguientes comandos:

Primero instalamos Python que será necesario para ejecutar el script de apagado y reinicio

sudo apt-get install update
sudo apt-get install python-dev
sudo apt-get install python3-dev
sudo apt-get install gcc
sudo apt-get install python-pip

Luego nos descargamos el módulo de Python para controlar el GPIO

wget https://pypi.python.org/packages/source/R/RPi.GPIO/RPi.GPIO-0.5.11.tar.gz

Lo descomprimimos

sudo tar -zxvf RPi.GPIO-0.5.11.tar.gz

Nos vamos al directorio creado

cd RPi.GPIO-0.5.11

Instalamos el módulo

sudo python setup.py install
sudo python3 setup.py install

Nos creamos una carpeta donde guardaremos nuestros scripts. Va a ver un script para el reset y otro script para el apagado

mkdir /home/pi/scripts

Creamos el script de apagado con nuestro editor favorito

sudo nano /home/pi/scripts/shutdown.py

Y pegamos esto dentro del fichero. Fijaos en el numero del puerto GPIO “13” y la instrucción de apagar el sistema “shutdown – h now”

#!/usr/bin/python
import RPi.GPIO as GPIO
import time
import subprocess

# we will use the pin numbering to match the pins on the Pi, instead of the 
# GPIO pin outs (makes it easier to keep track of things)

GPIO.setmode(GPIO.BOARD)  

# use the same pin that is used for the reset button (one button to rule them all!)
GPIO.setup(13, GPIO.IN, pull_up_down = GPIO.PUD_UP)  

oldButtonState1 = True

while True:
    #grab the current button state
    buttonState1 = GPIO.input(13)

    # check to see if button has been pushed
    if buttonState1 != oldButtonState1 and buttonState1 == False:
      subprocess.call("shutdown -h now", shell=True, 
        stdout=subprocess.PIPE, stderr=subprocess.PIPE)
      oldButtonState1 = buttonState1

    time.sleep(.1)

Nos creamos ahora el script de reiniciar la Pi.

sudo nano /home/pi/scripts/reboot.py

Y pegamos esto dentro del fichero. Fijaos que el puerto GPIO es el “33” y que la sentencia es la de reiniciar el sistema “shutdown – r now”

#!/usr/bin/python
import RPi.GPIO as GPIO
import time
import subprocess

# we will use the pin numbering to match the pins on the Pi, instead of the 
# GPIO pin outs (makes it easier to keep track of things)

GPIO.setmode(GPIO.BOARD)  

# use the same pin that is used for the reset button (one button to rule them all!)
GPIO.setup(33, GPIO.IN, pull_up_down = GPIO.PUD_UP)  

oldButtonState1 = True

while True:
    #grab the current button state
    buttonState1 = GPIO.input(33)

    # check to see if button has been pushed
    if buttonState1 != oldButtonState1 and buttonState1 == False:
      subprocess.call("shutdown -r now", shell=True, 
        stdout=subprocess.PIPE, stderr=subprocess.PIPE)
      oldButtonState1 = buttonState1

    time.sleep(.1)

Ahora tenemos que reiniciar

sudo reboot

Para que nuestros script se ejecuten cuando arranque el sistema operativo tenemos que editar este fichero

sudo nano /etc/rc.local

Y añadir estas dos lineas al final del fichero (antes de la instrucción exit)

sudo python /home/pi/scripts/shutdown.py &
sudo python /home/pi/scripts/reboot.py &

Reiniciamos y ya tenemos operativos nuestros 2 botones de power y reset

sudo reboot

Convertir de 7Zip a Zip múltiples ficheros de forma recursiva en Rabsperry Pi

Puede ocurrir que tengas una carpeta con infinidad de ficheros comprimidos en 7zip y tengas una aplicación que necesite que todos los ficheros estén en Zip, como por ejemplo multitud de emuladores de juegos, es una tarea muy tediosa tener que ir fichero a fichero descomprimiendo y comprimiendo en otro formato.

En Windows, WinRar te convierte de forma masiva ficheros en diferentes formatos. En Linux se puede hacer con este pequeño script:

Primero es necesario instalar estas dos aplicaciones.

sudo apt-get install atool
sudo apt-get install p7zip-full

Luego habría que crearse este pequeño script en bash con formato .sh y darle permisos de ejecución. Mucho cuidado porque primero realiza una descompresión y compresión en Zip y luego borra todos los ficheros 7Zip originales. Si no quieres borrar los ficheros en 7 Zip sólo habría que quitar la última línea del script.

#/bin/sh
find . -iname '*.7z' -exec arepack -e --format=zip '{}' \; 
find . -iname '*.7z' -exec rm '{}' \;

El Script recorre de forma recursiva desde el directorio donde estas hacia abajo descomprimiendo y comprimiendo en Zip todos los ficheros que tengan extension .7Zip

Resolución de problemas con determinadas tarjetas micro SD en Rabsperry Pi

Parece que hay un pequeño problema con algunas tarjetas (casi siempre Samsung) después de copiar la imagen de tu distribución favorita en la tarjeta micro SD, no arranca la distribución en la Rabsperry Pi.  

Una posible solución es descargar estos dos ficheros:

Start_X.elf

Fixup_x.dat

Una vez los ha descargado hay que renombrarlos a start.elf y fixup.dat  y reemplazar los existentes en la partición boot de tu tarjeta micro sd.

Configurar Wifi Rabsperry Pi

Para configurar el Wifi desde línea de comandos en una Rabsperry, tenemos que asegurarnos que nuestra Rabsperry  ha detectado el interfaz wifi correctamente. Para ello editamos este fichero desde linea de comandos:

sudo nano /etc/network/interfaces

Y comprobamos que están estas líneas en el fichero:

allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

Con estas líneas estamos activando el dispositivo Wifi USB, que obtenga la IP dinámica por DHCP y que lea el fichero wpa_suplicant.conf con la información de la redes wifi a las que quieres conectarte.

Además tenemos que saber 2 parámetros de la red a la que nos queremos conectar. Uno de ellos es el nombre ESSID y el otro password.

Con este comando podemos rastrear todas las redes wifi que tienes a tu alrededor y saber el nombre exacto ESSID de la wifi a la que nos queremos conectar:

sudo iwlist wlan0 scan

Una vez sepamos el ESSID y la contraseña Wifi tenemos que darlo de alta en este fichero:

sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

En este fichero añadimos todas las redes que queramos que se conecte de forma automática de la siguiente forma:

network={
    ssid="Nombre SSID"
    psk="Tu contraseña Wifi"
}

Descarga de carátulas y descripción de roms de forma automática para Rabsperry Pi en OSX usando SSELPH/SCRAPER

Una de las geniales funcionalidades que tienen las distribuciones arcade para Rabsperry Pi, es que descargan de forma automática la sinopsis y la carátulas de tus roms. Por ejemplo en la versión 2 de EmulationStation viene con un “scraper” de serie, el problema es que no va del todo fino y en muchos casos cuando se tienen muchas roms el proceso tarda una eternidad, no acaba nunca o presenta errores.

Existe una alternativa que te permite hacerlo de forma rápida y sencilla. Para ello necesitamos instalar el lenguaje “go” que para poder instalarlo en un. Mac usaremos brew:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew doctor
brew update && brew upgrade
brew install go

Una vez lo tenemos instalado descargamos el código fuente del scraper y lo compilamos:

mkdir ~/go && cd $_
export GOPATH=$HOME/go
export PATH="$GOPATH/bin:$PATH"
export PATH="$PATH:/usr/local/opt/go/libexec/bin"

go get github.com/sselph/scraper
go build github.com/sselph/scraper

Ahora ya lo tendríamos listo para usarlo, para ello vamos desde el terminal a la ruta de la carpeta donde tenéis la roms y ejecutamos el siguiente comando (ejemplo roms de MAME):

scraper -mame -mame_img "t,s"

Con este comando conseguimos que se descargue la sinopsis, las carátulas y si no encuentra la carátula se descarga una captura del juego. Podéis consultar el resto de comandos en:

scraper -help

Con este proceso conseguimos descargar las imágenes y el fichero games.xml. Es muy posible que no te genere correctamente los paths donde se almacena las imagenes de cada roms en tu distribución arcade, esto se soluciona abriendo con cualquier editor de texto (como Sublime Text) y buscar y remplazar las ruta de las imágenes “./images” por “.emulationstation/downloaded_images/advmame” por ejemplo.