Cómo agregar un botón de encendido/apagado a la Raspberry Pi


Siempre debemos apagar con  seguridad nuestra Raspberry Pi ,pues de lo contrario nos exponemos  a perder  el sistema de arranque y  tener que volver  a  crear una  imagen  con todo el trabajo que esto conlleva  respecto a las personalizaciones que tanto nos gustan
Raspberry Pi no cuenta con   un pulsador de encendido para intentar competir con su clones  y de este modo  mantener el precio «bajo»,  aunque  sin embargo, es muy fácil  añadir  el suyo propio  como vamos a ver en este post donde añadiremos un botón de encendido a su Raspberry para que puede encender o  apagar esta con total de seguridad .
No nos bastara añadir el pulsador pues tendremos  que usar unos scripts que vigilen  dos pines GPIO (general entrada/salida) en el Pi para que cuando se presione el botón activar o desactivar el  Pi.

 

raspberrypi

¿Por qué es importante un botón de encendido ?

Como comentábamos  nunca deberíamos «tirar» del cable de alimentación de su Raspberry Pi pues esto puede conducir a la corrupción de los datos graves (y en algunos casos, dañar físicamente tu tarjeta SD) pues para ello se puede cerrar con seguridad el Pi a través de un comando de consola (shutdown)  o por supuesto también  desde el propio interfaz gráfico de Raspian (shutdown)

Veamos  ahora como podemos añadir un pulsador  pero entes tenemos que entender cómo despertar la Raspberry Pi de un estado de suspensión antes de construir la funcionalidad de apagado.

Una manera fácil de comprobarlo es apagando  con sudo shutdown -h now y conectando los pines 5 y 6 con un cable hembra a hembra. Sólo necesitará cortarlo momentáneamente y entonces usted debe encontrar que la Raspberry Pi se «despertó».

En este punto es interesante destacar que cuando «apaga» el Pi, lo enviará en un estado de suspensión, lo cual significa  que sigue consumiendo una cantidad muy pequeña de  energía ( muy  similar a cómo todos modernos equipos trabajo cunado quedan en stand-bye).

Lógicamente  si  agrega un botón de encendido podrá tanto detener como despertar el Pi de un estado detenido, pero si su Raspberry Pi se ha apagado, usted puede desconectar de forma segura la fuente de alimentación  sin la preocupación de corrupción de datos.

 

El equipamiento hardware como vemos es muy sencillo pues basta dos cablecillos que conectaremos en los pines 5 y 6  de la Raspberry PI del conector de expansión( justos los dos de la tercera columna empezando por la drecha)

IMG_20181018_224306[1].jpg

 

Sencillamente, si se cortocircuitan entre sí los pines 5 y 6 (GPIO3 y GND) se pondrá nivel bajo el pin correspondiente al GPIO y podremos actuaren consecuencia con la Raspberry Pi

Obviamente el cortocircuito lo sustituiremos por un pequeño pulsador normalmente abierto  que conduciremos con dos cablecillo  a los pines 5 y 6  de nuestra Raspbery Pi

 

IMG_20181018_224929[1]

Finalmente sujetaremos el pulsador con cinta de doble cara , pegándolo o practicando un agujero al contenedor de la Raspberry Pi

 

IMG_20181018_225410[1]

 

 

La solución de sleep es bastante sencilla, pero para cerrar con seguridad el Pi vamos a tener que utilizar una solución de software. Ya que sabemos que vamos a utilizar los pines 5 y 6 para el Pi, vamos a usar estos pines para apagarlo tambien . Tanto así que podemos conectar nuestro botón a los alfileres y se concluirá y despertar la Pi.

Vamos a tener que escribir un script que escuche una pulsación y  cierre el Pi. Antes nos fijamos en la secuencia de comandos, vamos a discutir algunos enfoques diferentes. En primer lugar, podríamos escribir un script que inicie un bucle infinito y espere un cambio en el estado de los pines GPIO.

Usando  seudo-código, podría ser algo como:

while True:
    if GPIO3 is pressed:
        shutdown the pi

Mientras que esto funcionaría y probablemente no tenga problema de rendimiento real, hay realmente una manera mejor:podemos escuchar  una interrupción (un cambio de estado de bajo a alto o alto a bajo) que interrumpa  el procesador para qeu realize uan determinada accion .

Afortunadamente la biblioteca de RPi.GPIO proporciona un método llamado wait_for_edge que bloqueará la ejecución de nuestro script hasta que se detecte una interrupción. Así configuramos GPIO3 y una vez que detectamos un borde de caída vamos a apagar el Pi.

Entonces, vamos a usar un script llamado listen-for-shutdown.py.

Para crear el script, podemos usar el editor nano asi  que después de conectar con el Pi, ejecute el siguiente comando para crear este

sudo nano listen-for-shutdown.py

Luego, pegue el código siguiente en el archivo y pulse CTRL-X y salida, Y para guardar cuando se le solicite.

#!/usr/bin/env python


import RPi.GPIO as GPIO
import subprocess


GPIO.setmode(GPIO.BCM)
GPIO.setup(3, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.wait_for_edge(3, GPIO.FALLING)

subprocess.call(['shutdown', '-h', 'now'], shell=False)

A continuación necesitamos poner este script en el arranque por lo que  deberemos copiar el script en lar uta de  usr y hacerlo ejecutable , acciones que haremos con los dos siguintes comandos:

sudo mv listen-for-shutdown.py /usr/local/bin/
sudo chmod +x /usr/local/bin/listen-for-shutdown.py

Pero este script solo apagaria la placa  y nosotros queremso tambien qeu se pueda arrancar pulsando el boton por lo que  añadiremos otro script llamado listen-for-shutdown.py: que e enciende/apaga nuestro servicio.

Para crear el script  escriba  la secuencia de comandos:

sudo nano listen-for-shutdown.sh

Introduzca el código siguiente en el archivo y guárdelo:

#! /bin/sh

### BEGIN INIT INFO
# Provides:          listen-for-shutdown.py
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO

# If you want a command to always run, put it here

# Carry out specific functions when asked to by the system
case "$1" in
  start)
    echo "Starting listen-for-shutdown.py"
    /usr/local/bin/listen-for-shutdown.py &
    ;;
  stop)
    echo "Stopping listen-for-shutdown.py"
    pkill -f /usr/local/bin/listen-for-shutdown.py
    ;;
  *)
    echo "Usage: /etc/init.d/listen-for-shutdown.sh {start|stop}"
    exit 1
    ;;
esac

exit 0

 

Ahora necesitamos coloque este archivo en /etc/init.d y hacerlo ejecutable, acciones que haremos con los dos siguientes comandos.

sudo mv listen-for-shutdown.sh /etc/init.d/
sudo chmod +x /etc/init.d/listen-for-shutdown.sh

Ahora registramos la secuencia de comandos para ejecutar en el arranque y le pasaremos el parámetros de arranque con los dos siguientes comandos.

sudo update-rc.d listen-for-shutdown.sh defaults
sudo /etc/init.d/listen-for-shutdown.sh start

 

Seguro querido lector que por lo menos la próxima vez que desconecte su Raspberry de forma violenta recuerda que podría haber puesto un botón para hacer el apagado seguro…  Y por cierto si tiene una Orange Pi u otro clon , este sencillo truco le puede servir tambien..

 

 

Fuente  howchoo.com

Como usar una webcam standard con una Raspberry Pi


Una de las opciones que, a priori, puede parecernos más   atractiva  y tal vez útil por las posibilidades  que  no ofrece como cámara de seguridad, reconocimiento de imágenes, cámara trasera para vehículos , etc   para nuestra Raspberry Pi  es  conectarle una cámara e  intentar  visualizar y/o  capturar en el monitor la imagen captada por la misma..

Lamentablemente  en el universo Linux es algo más complicado añadir drivers para todo el hw disponible ,  y es ahí  donde por desgracia no le son ajenas las cámaras web usadas para pc pues en lugar de utilizar el módulo de la cámara  nativa del Raspberry Pi  que suele tener un coste ciertamente elevado es mas interesante  utilizar una versátil webcam USB estándar para tomar fotos y vídeo en la Raspberry Pi.Tenga en cuenta que la calidad y capacidad de configuración del módulo de cámara nativo con interfaz CSI  es muy superior a una webcam USB estándar,  pero por el contrario este también tiene una gran limitación : la longitud del cable de cinta que excepto compremos que dos  adaptadores de CSi a HDMI (lado cámara) , de HDM a CSI (lado Raspberry Py)   y luego un largo cable hdmi   solo se podría situar tan solo unos pocos centímetros respecto a la Raspberry Pi .

raspberrypi

Requisito previos

Una vez que tengamos una cámara para operar con nuestra RasPi hemos de asegurarnos de que la misma es “soportada” por el S.O. Linux que estamos utilizando.

La consulta de la lista de compatibilidad puede ayudar  pero podemos comprobarlo en desde  linea de  comandos para verificar si el sistema la identifica correctamente.

Antes de conectar la cámara al sistema iremos al terminal y teclearemos el comando dmesg | tail, lo que hará que se nos muestren los últimos mensajes generados por la RasPi.  Ahora conectamos la cámara a la Raspberry Pi y repetimos el comando anterior (dmesg | tail), y en este caso se nos deberán mostrar algunos mensajes que hagan referencia al nuevo hardware detectado.

Otra comprobación interesante es verificar si la cámara ha sido detectada como dispositivo Linux, para ello teclearemos ls /dev , lo que hará que aparezca  , si es que el sistema la detecta , como dispositivo  /dev/videoX ( normalmente /dev/video0 pero asegurese con un ls /dev)

De forma previa podemos instalar  el  software para poder visualizar de una forma cómoda los ficheros obtenidos  para poder verlos desde el propio terminal dentro del entorno gráfico pues la visualización de imágenes desde el entorno gráfico se puede efectuar con solo “pinchar” en la imagen a mostrar desde el navegador gráfico de archivos para los cual podemos instalar el sw de imagen magick

Para instalar el paquete citado  basta teclear:

 sudo apt-get install imagemagick

Existen varias utilidades para capturar imágenes  desde un web cam  veamoslas:

Fswebcam

En efecto la  herramienta fswebcam, que funciona bajo línea de comandos,  nos permite capturar imágenes a través de la Webcam USB, para ello en primer lugar, instale el paquete:fswebcam  con el comando sudo , es decir:

sudo apt-get install fswebcam 

Ahora escriba el comando seguido de un nombre de archivo y una imagen se tomaron con la cámara web y se guardarán al nombre de archivo especificado como por ejemplo fswebcam /dev/video0 image.jpg

Este comando mostrará la siguiente información:

pi@raspberrypi:~ $ fswebcam -d /dev/video0 pepe.jpg
--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
Adjusting resolution from 384x288 to 352x288.
--- Capturing frame...
Captured frame in 0.00 seconds.
--- Processing captured image...
Writing JPEG image to 'pepe.jpg'

Como vemos la resolución por defecto es pequeña y ademas se complementa en la parte inferior con un pequeño banner  que muestra la fecha y hora.

prueba.PNG

En caso de utilizar una web cam hd,  para especificar la resolución podemos forzar que la imagen para sea tomada  a mayor resolución , para ello se puede  utilizar la bandera:1280 x 720-r

fswebcam -r 1280x720 -d /dev/video0 pepe2.jpg

Este comando mostrará la siguiente información:

--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
Adjusting resolution from 1280x720 to 640x480.
--- Capturing frame...
Captured frame in 0.00 seconds.
--- Processing captured image...
Writing JPEG image to 'pepe2.jpg'

Puede   quitar el banner inferior puede añadir el siguiente parámetro:--no-banner :

fswebcam -r 1280x720 --no-banner image3.jpg

El cual  muestra la siguiente información:

--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
--- Capturing frame...
Corrupt JPEG data: 2 extraneous bytes before marker 0xd6
Captured frame in 0.00 seconds.
--- Processing captured image...
Disabling banner.
Writing JPEG image to 'image3.jpg'.

Ahora con  ese parámetro ya   se toma la imagen a resolución completa  sin banner

Script de captura

Puede escribir un script de Bash para que tome una foto con la webcam por lo que la secuencia de comandos  que vamos a vera continuación guarda las imágenes en el directorio,

En primer lugar  crear el subdirectorio primero en:/home/pi/webcamwebcam  conmkdir webcam

Para crear una secuencia de comandos, abra su editor de la opción y escriba el siguiente código de ejemplo:

#!/bin/bash

DATE=$(date +"%Y-%m-%d_%H%M")

fswebcam -r 1280x720 --no-banner /home/pi/webcam/$DATE.jpg

Este script tome una fotografía y usa como nombre del archivo con una marca de tiempo.

Para poder ejecutar el script webcam.sh en primer lugar nos gustaría hacer el archivo ejecutable:

chmod +x webcam.sh

Luego ejecutar con:

./webcam.sh

Al ejecutarlo dar la  siguiente salida:

--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
--- Capturing frame...
Corrupt JPEG data: 2 extraneous bytes before marker 0xd6
Captured frame in 0.00 seconds.
--- Processing captured image...
Disabling banner.
Writing JPEG image to '/home/pi/webcam/2013-06-07_2338.jpg'.

Time-lapse con cron

Usted puede utilizar para tomar una fotografía en un intervalo dado, como cada minuto para capturar un time-lapse.cron ,para ello primero abra la tabla cron para editar:

crontab -e

Esto tampoco pedirá que editor que desea utilizar, o abrirá en su editor predeterminado. Una vez que tenga el archivo abierto en un editor, agregue la línea siguiente para tomar una fotografía cada minuto (refiriéndose a la secuencia de comandos de Bash desde arriba):

* * * * * /home/pi/webcam.sh 2>&1

Guardar y salir y usted debería ver el mensaje:

crontab: installing new crontab

Asegúrese de que su gscript no permite guardar cada fotografía tomada con el mismo nombre de archivo. Esta acción sobrescribirá la imagen cada vez.

 

Uvcpature

Para poder utilizar las prestaciones de nuestra cámara web también podemos instalar los paquetes uvccapture y libv4linux-0

Antes de hacerlo puede ser preciso (recomendable) actualizar las fuentes de instalación con: sudo apt-get update  y para descargar los paquetes ejecutaremos:

 sudo apt-get

install uvccapture libv4l-0

Conectada la cámara y teniendo los programas adecuados ya instalados, vamos a realizar una prueba simple de que todo está funcionando correctamente. Desde el terminal tomamos una instantánea con los parámetros estándar (opción -m) :

 uvccapture -m

Ahora listamos la carpeta para comprobar que se capturó el fichero snap.jpg (nombre por defecto de la captura) y luego lo visualizamos mediante el comando display snap.jpg

En caso de que  el fichero capturado (snap.jpg) salga  bastante obscuro podemos ver como están los ajustes por defecto de la cámara mediante el parámetro -v , uvccapture -m -v

También si el brillo está muy bajo, podemos capturar una nueva imagen pero subiéndolo bastante mediante el comando (parámetro -Buvccapture -m -B50

Además de los parámetros comentados, el comando uvccapture nos permite otra serie de interesantes opciones, como por ejemplo podemos parametrizar una nueva captura – modificando brillo y contraste – pero guardando la misma en un fichero llamado “captura.jpg

uvccapture -m -B50 -C10 -o”captura.jpg”

Por si fuera poco el comando uvccapture permite que efectuemos de forma secuencial, – y en un lapso de tiempo elegido por nosotros – la captura consecutiva de tomas desde la cámara USB. No debemos confundir esta posibilidad – aunque se le parezca – con la toma de un “stream” o flujo de vídeo continuo. Lo que obtendremos al efectuar esta captura consecutiva es imágenes cada cierto intervalo. Así que vamos a verlo con un ejemplo…

Ejecutamos el comando uvccapture con el parámetro -t , el cual hace que se capture una imágen cada cierto número de segundos (3 segundos en nuestro ejemplo), el cual, si no se especifíca algo diferente se guardará en el fichero snap.jpg.

uvccapture -m -B70 -C40 -S5 -t3   (pulsar VTRL+c para finalizar el bucle de captura)

El resultado de la captura será una toma cada 3 segundos que se guardará en el fichero por defecto (snap.jpg). La única desventaja de este método radica en que el fichero de captura se “machaca” con cada una de ellas, por lo que solo estará a nuestra disposición el último de los generados.

Para subsanar esto podemos hacer uso de una de las prestaciones del programa uvccapture que nos permite ejecutar un comando Linux inmediatamente después de efectuar una captura. ¿Y que podemos ejecutar?… pues parece claro que lo más idóneo sería algún tipo de comando o sucesión de estos que nos permita salvaguardar la última captura, de forma y manera que al realizarse la siguiente toma esta no sea “machacada” impunemente de forma muy similar a como vimos en el script anterior.

 

 

 

Otras herramientas útiles

Otras herramientas están disponibles que puede ser útil cuando se utiliza la cámara o una webcam:

  • SSH  Utilizado para acceder remotamente el Raspberry Pi en su red local
  • SCP  Sirve para copiar ficheros sobre SSH  ypara obtener copias de las fotografías tomadas en la Pi en el ordenador principal
  • rsync : Uso para sincronizar la carpeta de imágenes tomadas en una carpeta entre el Pi al ordenadorrsync
  • cron Utilizar para programar tomar una fotografía en un intervalo dado, como cada minuto para capturar un time-lapsecron

 

 

 

Mas  información en  raspberrypi.org