GIF timelapses con una Raspberry Pi

Timelapses es una de las primeras cosas que se encuentran en los tutoriales de rpi.  Posiblemente por que es muy sencillo: raspbian cuenta con un comando que se llama raspistill que permite sacar fotos directamente desde la terminal.

Hay varias formas de hacerlo y posiblemente la mía sea más rebuscada pero es la que mejor se adapta a mis necesidades:

  • Generar un jpg con raspistill.
  • Subirlo a Dropbox con una línea de comandos.
  • Convertir los jpgs en un GIF usando imagemagick desde mi mac.
  • Tener automatizado los primeros 2 pasos en una cron table.

Sacar una foto y subirla a Dropbox

Hay un shell script para subir archivos a Dropbox que anda muy bien, pueden instalarlo siguiendo las instrucciones en este Github repo. Van a tener que crear una app en Dropbox y obtener su Access Token, el script explica bastante bien los pasos a seguir así que no representa un traba importante.

Luego hice un script, camera_upload.sh que saca la foto, la sube y elimina la copia local luego.

#!/bin/bash
# DIR es el directorio en el que este script se ejecuta
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 

# DATE es una representación de la fecha actual en un string.
# Por ejemplo 2017-01-24_2115
DATE=$(date +"%Y-%m-%d_%H%M") 

UPLOAD_FOLDER=$(date +"%Y-%m-%d")

# Saco la foto.
# -vf vertical flip
# -hf horizontal flip
raspistill -vf -hf -o $DIR/$DATE.jpg 

# Ejecuto el script para subir la foto a Dropbox
/home/pi/Documents/Coding/Dropbox-Uploader/dropbox_uploader.sh upload $DIR/$DATE.jpg ./$UPLOAD_FOLDER/$DATE.jpg

# Ya no necesito más la foto. Así que la elimino.
rm $DIR/$DATE.jpg

No se olviden de darle permisos de ejecución, de lo contrario puede que tengan problemas en el siguiente paso: “automatizar el proceso en un cron table”.

chmod +x camera_upload.sh

Automatizar el proceso en un cron table

Algo que los usuarios de Linux suelen tener muy presente es el comando crontab. Una de las ventajas que encontré con este approach es que si mi rpi se reinicia por algún motivo, las tareas en programadas se van a ejecutar. Quizás pierda algún frame mientras la rpi está offline pero me evita tener que volver a correr un script.

Para editar el cron table, hay que escribir

crontab -e

Elegí como editor vim y agregué la siguiente entrada:

0,15,30,45 * * * * ~/Documents/Coding/camera_upload/camera_upload.sh

Eso significa que se va ejecutar el script ~/Documents/Coding/camera_upload/camera_upload.sh a cualquier hora, cualquier día, cuando los minutos sean igual a 0,15,30 o 45. También podría haber puesto */15, que quiere decir “cada 15 minutos”.

Crear el GIF

Van a tener que instalar imagemagick, lo pueden hacer con brew.

brew install imagemagick

Y finalmente correr el siguiente comando en la carpeta de Dropbox donde tienen los jpgs.

convert -resize 20% -delay 20 -loop 1 *.jpg myimage.gif

El resize me pareció necesario para no hacer un GIF con la resolución nativa de los jpgs. Lo hice la primera vez y terminé con un GIF de ~100 MB.

Algunos quizás se pregunten cuál es el punto de ejecutar el último paso en la mac en vez de la rpi. La respuesta es velocidad, las rpi son muy buenas para hacer tareas pequeñas pero en cuanto a capacidad de procesamiento de trata, ni se acerca a lo que son las computadoras modernas.

Puede fallar

¿Se me escapó algún detalle? ¿Me equivoqué en algo que dije? Por favor dejámelo saber en los comentarios.

Leave a Reply