Fotomatón conectado a Dropbox con la Raspberry Pi

En el artículo de hoy quiero ofreceros un proyecto sencillo, útil y vistoso: se trata de montar un dispositivo que, cuando oprimas un pulsador en la placa de prototipado, te saque una fotografía y la suba a tu cuenta de Dropbox. Así, los invitados a tus fiestas podrán retratarse y dejar una estampa en una carpeta de tu espacio en la nube lista para compartir con ellos.

Para eso vamos a usar el siguiente material:

  • Una cuenta de Dropbox, valen las gratuitas
  • Una Raspberry Pi con conexión a internet
  • El módulo de la cámara de la Raspberry Pi, acerca de la cual puedes leer y aprender a montarla y configurarla en su propio artículo. El soporte es opcional, pero de alguna forma tendrás que sujetar la cámara en la posición deseada.
  • Una placa de prototipado con un prototipo como el que ya conocemos, que podéis ver en la imagen inferior y que consta de:
    • Una placa de prototipado, también llamada breadboard o protoboard
    • Una resistencia de 330 Ω
    • Una resistencia de 10 kΩ
    • Un LED
    • Un pulsador
    • 3 cables de interconexión, para el propio circuito
    • Una placa de expansión de GPIO con su cable plano, o bien los cables necesarios para alimentar el prototipo (+3,3 V y  0 V) y llevar a la placa una salida y una entrada por GPIO
    • Puedes leer sobre este prototipo aquí
Prototipo con pulsador. Puncha en la imagen para ampliarla.
Prototipo con pulsador que usaremos para disparar las fotos. Pincha en la imagen para ampliarla.

En el artículo veremos la configuración necesaria para la cuenta de Dropbox y el programa en Python que coordinará todas las acciones. En lo referente al montaje del prototipo y de la cámara os remito a los artículos correspondientes, pues son cosas que ya hemos hecho:

Configurar la cuenta de Dropbox para que sea posible cargar archivos desde un programa en Python

Para poder acceder a Dropbox desde nuestros programas deberemos primero crear la definición de nuestra aplicación en nuestra cuenta de Dropbox. Este proceso es muy sencillo: se trata de registrar nuestro programa (que es la aplicación) y obtener unas determinadas claves que la identifiquen y le concedan acceso a nuestra cuenta. Esta identificación permite a Dropbox, entre otras cosas, asignar y restringir permisos a nuestra aplicación así como relacionarla a ella y a su creador con las operaciones que realiza sobre los ficheros de lo usuarios (ojo: lo que hace, no la información que maneja). De esa forma disuade a cualquier delincuente de la realización de programas maliciosos o que roben información.

Antes de continuar, puedes estar tranquilo: la aplicación que vas a hacer sólo podrá acceder a una de tus carpetas que se creará a tal efecto, nadie más podrá hacerlo y tu información estará en todo momento en tu poder. En cualquier caso, si tienes cualquier duda puedes escribirme o dejar un comentario en esta entrada, y te responderé lo antes posible.

Para empezar, ve a tu cuenta de Dropbox y haz click en los tres puntos de abajo del todo, a la derecha de Privacidad, para desplegar el menú inferior que te muestro en esta imagen:

Menú de opciones adicionales. Desarrolladores.
Menú de opciones adicionales. Desarrolladores.

Una vez ahí haz click en Desarrolladores. A partir de este momento, la página sólo está disponible en inglés, pero te guiaré y te explicaré cada paso por si no manejas bien dicho idioma.

Haz click en Create your app, “Crear tu aplicación“.

Crear tu aplicación
Crear tu aplicación.

En la siguiente pantalla debes escoger lo siguiente:

  • Donde pone 1. Choose an API, “1) Escoge tu API” debes escoger Dropbox API. Es la opción que se corresponde con las cuentas de Dropbox para usuarios particulares, no empresas.
  • Donde pone 2. Choose the type of access you need, “2) Escoge el tipo de acceso que necesitas“, escoge App folder – Access to a single folder created specifically for your app, “Aplicación de carpeta – acceso a una única carpeta creada específicamente para tu aplicación“. De esta forma, nuestro fotomatón sólo podrá escribir en una carpeta específica que, además, se creará automáticamente. La otra opción daría acceso a toda tu cuenta de Dropbox, pero no es necesario.
  • Donde pone 3. Name your app 3) Da nombre a tu aplicación“debes introducir un nombre. Este nombre debe ser único en todo el conjunto de aplicaciones que puedan existir. Como ves en la imagen, yo he escogido “PItandoFoto“, que nadie ha solicitado anteriormente. Como sugerencia, puedes escoger un nombre que empiece por “PItandoFoto” y añadirle cualquier otra cosa, como tu nombre, un número o tu dirección de correo electrónico.
  • Cuando hayas terminado pulsa el botón Create app, “Crear la aplicación
Formulario para crear la aplicación
Formulario para crear la aplicación

El siguiente paso es copiar las claves de acceso. Tan pronto hayas pulsado el botón anterior verás un formulario como el siguiente:

Edición de la aplicación.
Edición de la aplicación.

Pulsa en el letrero azul Show, “Mostrar“, a la derecha de App secret para mostrar la clave secreta de la aplicación. Apunta el valor que sale además del inmediatamente superior, rotulado a la izquierda como App key. Pulsa también el botón Generate para Generar una clave permanente de acceso a la aplicación para tu usuario. De esta forma, tu programa no necesitará más que estos códigos para funcionar (realmente no necesitarás los tres, como veremos más adelante):

  • App key, que es una clave que identifica a la aplicación de forma pública en el ecosistema de aplicaciones de Dropbox. La podrías distribuir. En el programa la llamaré APP_KEY.
  • App secret, que es una clave secreta y que no podrías distribuir, y que identifica al programa que vas a escribir. No debes compartirla a través de internet, ya que permitirías a cualquier otro programador hacer un programa que suplantase al tuyo. En el programa la llamaré APP_SECRET.
  • Access token es una clave de acceso a tu cuenta de usuario que es equivalente, a todos los efectos, a haber autorizado a la aplicación a acceder a tu cuenta de Dropbox. Bajo ningún concepto deberías compartirla a través de internet, ya que te podrían suplantar a ti y acceder a tu cuenta de igual manera que si te hubiesen robado la contraseña. En el programa la llamaré ACCESS_TOKEN .

Una vez creada la clave secreta para acceder desde tu propia cuenta en el tercer paso, en ese preciso momento, en tu cuenta de Dropbox se crearán dos carpetas. Es posible que recibas alguna notificación. Son las siguientes:

  1. Aplicaciones. Es una carpeta de sistema dentro de la cual se crearán todas las carpetas de las aplicaciones que hayan sido creadas con la opción que ya hemos visto, App folder.
  2. Dentro de Aplicaciones, una carpeta de nombre igual al que has escogido: en mi caso, PItandoFoto.

Comprueba que dichas carpetas existen.

Carpetas creadas
Carpetas creadas

Si todo ha ido bien, hemos terminado por aquí. Puedes volver todas las veces que quieras a la página de desarrolladores y hacer click en My Apps para ver todas las aplicaciones que hayas creado, y editarlas o eliminarlas.

Descargar la librería de acceso a Dropbox para Python 3

La librería de acceso a las funciones de Dropbox está disponible en un repositorio de librerías de Python llamado Pip, que significa Python Package Index, traducido es más o menos “Índice (o directorio) de paquetes de Python“. Se trata de una red de servidores de ficheros del cual podemos descargar muchas librerías para muchos propósitos a través del programa de igual nombre, pip. Este programa se incluye siempre en las distribuciones de Python como las que incorpora la Raspberry Pi, con las siguientes consideraciones:

  • Si usas Python 2, el programa se llama pip
  • Si usas Python 3, deberás usar pip3

La librería que está disponible en Pip se corresponde con la versión 1 de lo que se conoce como API. Un API, o Interfaz del programador de aplicaciones, es un conjunto de funciones y estructuras de datos que se proporcionan a los programadores de aplicaciones para, de una forma fácil, acceder a una cierta cantidad de funcionalidades de un producto. En el caso de Dropbox, este API permite leer el contenido de la carpeta de Dropbox, subir y descargar ficheros, mantener directorios sincronizados,… todo lo que el cuerpo necesita, vaya.

Aquí iremos al grano para subir cada foto, pero si quieres consultar las posibilidades que tienes, puedes consultar la página de la versión 1 del API de Dropbox para Python.

Para descargar el cliente de Dropbox para Python 3, ya desde la Raspberry Pi encendida e iniciada la sesión con el usuario pi, debemos ejecutar la siguiente orden en el terminal:

sudo pip3 install dropbox

Con esto ya podremos empezar a usar el cliente para Dropbox en nuestros programas con sólo importar la librería con un import dropbox.

Programa del fotomatón

Una vez completados los pasos anteriores, pasaremos a escribir el programa. Vamos a usar cosas muy básicas, sabiamente combinadas, con la única novedad de la carga de un archivo en Dropbox. Esta carga se hace de la siguiente forma:

import dropbox

# Sustituye estos valores por los que has apuntado, conservando
# las comillas
app_key = 'APP_KEY'
app_secret = 'APP_SECRET'
cuenta = 'ACCESS_TOKEN'

cliente = dropbox.client.DropboxClient(cuenta)
print ('Cuenta autorizada: ', cliente.account_info())

f = open('gvisoc.jpg', 'rb')
respuesta = cliente.put_file('/gvisoc-subida.jpg', f)
print ('Subida:', respuesta)

La primera línea, claramente, sirve para importar la librería instalada mediante pip. A partir de ahí y usando las claves que hemos apuntado (líneas 5, 6 y 7) , obtenemos un objeto que nos permite acceder a Dropbox (línea 9). Realmente sólo estamos usando la tercera; las dos primeras nos servirían para programar un flujo de autorización entre nuestro programa y Dropbox de forma que la tercera de ellas se generase durante el proceso… pero está fuera de nuestras ambiciones de momento. Podéis dejar las tres claves o escribir sólo la tercera (cuenta = 'ACCESS_TOKEN'). Yo las dejaré como documentación, o recordatorio si lo preferís, de este último comentario.

Lo que queda por hacer es sencillamente subir un fichero local que podremos guardar en nuestra carpeta de aplicación con un nombre diferente (líneas 12 y 13).

Aunque no se muestra, cabe destacar que podremos controlar las excepciones en la subida capturando dropbox.rest.ErrorResponse. Si lo asignamos a una variable e, podremos inspeccionar el mensaje de error mediante e.user_error_msg. Así:

except dropbox.rest.ErrorResponse as e:
    print("Error al acceder a Dropbox: ", e.user_error_msg)

Entendido esto, lo único que tenemos que hacer es combinarlo mediante un bucle con la entrada mediante el botón, el encendido del led y la captura de una fotografía. Debemos repasar también, si es que lo hemos olvidado, el acceso a ficheros y los programas ejecutables.

#!/usr/bin/python3

import dropbox
import RPi.GPIO as GPIO
import time
import picamera

## Obtener una referencia a la cámara
camera = picamera.PiCamera()

## Conexión a la cuenta de Dropbox
# Sustuye estos valores por los que has copiado, conservando
# las comillas.
app_key = "APP_KEY" 
app_secret = "APP_SECRET"
# Las dos primeras claves no son en absoluto necesarias aquí, sirven
# para programar un flujo que generaría la siguiente (flujo de autori-
# zación OAuth2)
cuenta = "ACCESS_TOKEN"

print("Conectando a la cuenta de Dropbox...")
client = dropbox.client.DropboxClient(cuenta)
print("Cuenta de " + client.account_info().get("display_name") + " conectada.")
print("Oprime el pulsador para hacer la primera foto")

## Configuración GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings (False)
GPIO.setup(6, GPIO.IN)
GPIO.setup(12, GPIO.OUT)

## Bucle infinito del fotomatón
# Número total de fotos, para Dropbox
total = 0
# Número de fotos en la tarjeta SD, entre 0 y 10. Así no llenaré
# nunca el sistema de ficheros (sólo guardo 10 fotos en la
# Raspberry, "en local")
local = 0
try:
    while True:
        if (not GPIO.input(6)):
            nombre_local = "captura_" + str(local) + ".jpeg"
            nombre_dropbox = "captura_" + str(total) + ".jpeg"
            
            # Uso del LED para guiar al "modelo" de la foto
            print ("Cuando se apague el LED se hará la foto")
            GPIO.output(12, GPIO.HIGH)
            for i in range(0, 3):            
                print(str(3 - i) + "...")
                time.sleep(1)
            GPIO.output (12, GPIO.LOW)
            print ("¡Foto!")
            # Hacemos la foto
            camera.capture(nombre_local)
                
            # Subir la foto a Dropbox
            f = open(nombre_local, 'rb')

            print("Subiendo la foto a Dropbox de " + client.account_info().get("display_name") + "...")
            response = client.put_file(nombre_dropbox, f)
            
            tamanho = str(round(int(response.get("bytes")) / 1024,1))
            print("Foto '" + nombre_dropbox + " cargada: " + tamanho + " kB.")

            # Incrementar contadores; 'local' siempre entre 0 y 10
            local = (local + 1) % 10 # resto de dividir local + 1 entre 10.
            total = total + 1
            print("Oprime el pulsador para hacer otra foto")
            
except dropbox.rest.ErrorResponse as e:
    print("Error al acceder a Dropbox: ", e.user_error_msg)
except KeyboardInterrupt:
    print("\nInterrupción del usuario, saliendo del programa")
finally:
    camera.close()
    GPIO.cleanup()
    print ("Fin del programa")

Es hora de ejecutar el proyecto desde el terminal dando permisos de ejecución al programa previamente. Cuando hayas comprobado que todo está bien, puedes desconectar el monitor o la TV, el teclado y el ratón, y observar el funcionamiento del proyecto directamente desde otro ordenador, tu tableta o tu smartphone viendo cómo las fotos aparecen en tu cuenta de Dropbox a medida que las haces.

Podéis dejarme cualquier duda o comentario en esta misma entrada, o enviándome cualquier comentario a tavés del formulario de contacto y la dirección de correo que allí os indico. Recordad también que PItando está tanto en twitter, como en Facebook, y en Google+ también podéis seguir mis publicaciones, incluyendo las del podcast (iTunesiVooxRSS).

Espero que os hayáis divertido en el proceso y que saquéis partido al “chiringuito” 🙂

Anexo: borrar la aplicación

Puedes hacerlo volviendo a la página de Desarrolladores de Dropbox, y seleccionando My Apps, “Mis aplicaciones” en el menú de la izquierda. En la pantalla que aparece, si haces click en tu aplicación podrás acceder al menú de edición de la misma. Desplazándote hacia abajo hasta el final, verás el botón Delete app, “Borra la aplicación“.

Menú MyApps
Menú MyApps

Tendrás que confirmar el borrado (botón Delete), y ten en cuenta que la carpeta de tu aplicación permanecerá en tu cuenta. Pese a todo, recomiendo ser cauto y copiar las fotos que hayas sacado antes de confirmar el borrado, por si acaso en algún momento cambiasen este comportamiento o ocurriese cualquier error.

4 comentarios en “Fotomatón conectado a Dropbox con la Raspberry Pi

  1. Hola:
    Me encanta el blog felicidades me encanta la forma de enfocarlo y los contenidos
    Estoy trasteando con la rasberry pi 2 y he instalado el software webiopi me parece muy interesante ya que permite el acceso a los pines GPIO desde la web

    quizá podias hablar algo sobre este sistema un saludo !!!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *