Construya una cabina de fotos con un Arduino Yun, una Cámara Web y Dropbox

February 12, 2015
Redactado por

yP6wadbOXp1OQQQK8alavd8n2Z-BAt4dS70c6t9A5SbRuNHohD_oT6DX5IFQuDu9Oq4qTF_zDfnUmF-Ic7yMOaVzeTJ3TqOSNpoIrcUm4V6_6tjN5CawDVrIaESjuP92ia5zgv-c

El Arduino Yun es un Arduino con WiFi incorporado y Linux. Con el Yun, no sólo puede hacer todos los trucos de hardware que usted esperaría de un Arduino, sino que también se puede conectar a Internet y ejecutar programas en su lenguaje de programación favorito.

En este tutorial, vamos a construir un concepto de prueba para una cabina potenciada de fotos Arduino, que sirva de base para enseñar a mi perro que me envíe selfies utilizando Twilio MMS. La meta es:

  • tomar una foto con una cámara web conectada al Arduino Yun
  • subir la imagen seleccionada a Dropbox utilizando Python
  • realizar estas acciones a través de la pulsación de un botón

El resultado final va a ser algo como esto:

 

Comenzando

Este tutorial se basa en nuestro tutorial:  Comenzando con el Arduino Yun, el cual cubre

  • Cómo formatear la tarjeta SD para su uso en el Yun
  • Cómo actualizar a la última versión de OpenWRT-Yun
  • Como instalar el IDE Arduino
  • Cómo ejecutar su primer esquema en el Yun

Suponiendo que haya completado estos pasos, este tutorial para cabina de fotos le llevará unos 30 minutos. Los componentes que necesitará son:

Cámara Web y el Arduino Yun

Es sorprendentemente fácil usar una cámara web con un Arduino Yun. Cualquier cámara web que use el protocolo UVC (la mayoría de ellos lo hacen) funcionará. Si no tienes una cámara web por ahí, revisa el Logitech C270 ($ 23 en Amazon).

Para comenzar:

  • conecte la cámara web en la ranura USB del Arduino Yun
  • inserte su tarjeta microSD en la Yun
  • ejecute SSH en Yun Arduino
ssh root@arduino.local

Si no puede realizar el SSH en su Yun o no ha formateado la tarjeta microSD para trabajar en su Yun, revise nuestro link Comenzar con la guía Yun.

Una vez conectado a su Yun, tendrá que

  • actualizar el gestor de paquetes OpenWRT
  • instalar controladores para la cámara web
  • instalar fswebcam, “Una aplicación de cámara web limpia y sencilla.”

Desde la línea de comando:

opkg update
opkg install kmod-video-uvc
opkg install fswebcam

Tipee cd en la raíz de su tarjeta SD:

cd /mnt/sda1

Vamos a correr la utilidad fswebcam con dos parámetros:

  • dónde guardar el archivo
  • la resolución con la que va a disparar
fswebcam pic.jpg -r 1280x720

Usted verá un montón de texto, algunos de los cuales se ven como un mensaje de error. No lo tenga en cuenta. En tanto que usted vea “Writing JPEG image to pic.jpg', está todo bien:

 

Si desea verificar que ese archivo es realmente una imagen, se puede extraer la tarjeta SD de su Yun, conectarlo a su ordenador y verlo allí.

Dropbox y Arduinos

Usted podría decir, “Pero Greg, que tan bueno es una imagen en la Yun si tengo que salir de la tarjeta SD para mirarla?” Ya lo he oído antes. Vamos a buscar esas fotos de la Yun en la nube.

Para interactuar con la API de Dropbox, tenemos que crear una nueva aplicación de Dropbox. Regístrese para obtener una cuenta de Dropbox si ya no lo ha hecho, a continuación, visite el sitio crear página de aplicaciones en la consola del programador. Entonces:

  • Seleccione una aplicación API de Dropbox
  • Seleccione “Files and datastores only”
  • Seleccione “Yes – My app only needs access to files it creates.”
  • Dele a su aplicación un nombre (que tiene que ser único en el mundo Dropbox)
  • Haga clic en Crear

Una vez creada la aplicación, tendrá que generar un token de acceso:

Debe mantener esa pestaña abierta. Vamos a necesitar el token de acceso en pocos minutos.

Instale pip en el Arduino Yun

Vamos a escribir algunos códigos para interactuar con la API de Dropbox. Esto es cuando el poder del Yun brilla. En lugar de trabajar con las API en el lenguaje de programación de Arduino, usted puede escribir programas en el lenguaje de programación con el que está más familiarizado. Aquí vamos a hacerlo en Python ya que eso es lo que viene preinstalado en el Yun, pero se puede instalar Ruby o Node si eso le produce problemas.

Dropbox tiene una facilidad para utilizar el SDK de Python. Antes de instalarlo, sin embargo, tendremos que instalar pip, un gestor de paquetes de Python.

Desde la línea de comandos:

opkg install distribute 
opkg install python-openssl 
easy_install pip

Y esto es todo.

Por defecto, pip instalaría los paquetes de Python en la memoria incorporada del Yun, sin embargo, los archivos del Arduino Yun contienen una ominosa advertencia que dice: “No se recomienda el uso de la memoria no volátil incorporada en el Yun, ya que tiene un número limitado de escrituras”. Vamos a instalar el SDK de Dropbox en la tarjeta SD en su lugar.

Eso requiere tres pasos:

  • Crear un nuevo directorio en la tarjeta SD para nuestros paquetes de Python
  • Decirle a Python que realice la búsqueda de esos paquetes
  • Forzar pip para instalar el SDK de Dropbox allí

Conecte la tarjeta SD de nuevo en su Yun si no lo ha hecho. A continuación, cree un directorio:

mkdir /mnt/sda1/python-packages

Ahora vamos a editar nuestro / etc / profile y establecer una variable de entorno PYTHONPATH de modo que Python sepa buscar aquí.

vim /etc/profile

Usted verá varias líneas que comienzan con “export”. Mueva el cursor hacia abajo por debajo de esas líneas, a continuación, pulse i para entrar en el modo de inserción. A continuación, pegue esto:

export PYTHONPATH=/mnt/sda1/python-packages

Presione ESC para volver al modo comando. Escriba: wq para guardar el archivo y salir de vim. Entonces, desde la línea de comandos, vuelva a cargar su entorno escribiendo:

source /etc/profile

Por último, instale el SDK de Dropbox con una bandera para instalar en nuestro directorio recién creado:

pip install --target /mnt/sda1/python-packages dropbox

Cargar un archivo en Dropbox desde el Arduino Yun en Python

El Arduino Yun requiere un código llamado arduino  para residir en el directorio de la tarjeta SD. Vamos a crear ese directorio y navegar hasta allí:

mkdir /mnt/sda1/arduino
cd /mnt/sda1/arduino

Ahora vamos a crear un nuevo archivo y editarlo en vim:

vim upload-to-dropbox.py

A continuación, pulse i para entrar en el modo de inserción.

El código que vamos a copiar y pegar hará lo siguiente:

  • importar las bibliotecas de Dropbox y de fecha y hora
  • utilizar de fecha y hora para crear un nombre de archivo único para cada foto
  • inicializar un cliente de Dropbox con nuestro token de acceso
  • abrir la imagen tomada por nuestra webcam
  • guardar el archivo en Dropbox con nuestro nombre de archivo único
  • imprimir la respuesta de la API de Dropbox
import dropbox
import datetime

suffix = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")
filename = "photobooth-" + suffix + ".jpg"

client = dropbox.client.DropboxClient('YOURACCESSTOKENGOESHERE')
f = open('/mnt/sda1/pic.jpg', 'rb')
response = client.put_file(filename, f)
print "uploaded:", response

Asegúrese de que sustituye la instrucción YOURACCESSTOKENGOESHERE con el token de acceso que ha generado en el tablero de Dropbox. A continuación, pulse ESC y escriba: wq para guardar el archivo y salga.

(Si desea más detalles sobre lo que está sucediendo en estos últimos cuatro líneas, echa un vistazo a la excelente documentación de Dropbox en usando el API Dropbox Core en Python.)

Vamos a ver si funciona. Abre tu carpeta de apps en Dropbox y haga clic en la carpeta de su aplicación recién creada. Debe estar vacío. Ahora ejecute la secuencia de comandos de Python desde el terminal:

python upload-to-dropbox.py

Ahora compruebe la carpeta Dropbox de nuevo.

 

Cargar un archivo con un esquema Arduino

Si todo lo que quería hacer era tomar una foto con una cámara web y subirlo a Dropbox, usted no necesita un Arduino. La razón por la que estamos haciendo esto en el Yun es para que podamos hacer unos cuantos trucos de hardware junto con nuestro software de escritura.

Para interactuar con los pines de la placa, vamos a tener que escribir algunos código en el lenguaje de programación de Arduino (curiosamente, no tiene nombre oficial aparte de eso). Así que vamos a escribir primero un esquema que activará el comando shell para tomar una foto y la secuencia de comandos de Python para cargar una imagen, a continuación, lo manejaremos con el botón.

Abra el IDE de Arduino y cree un nuevo esquema. En la parte superior del esquema, se incluyen las bibliotecas de puentes y de proceso:

#include <Bridge.h>
#include <Process.h>

El Arduino Yun tiene dos procesadores: el “chip de Arduino” que controla los pines y las interfaces con el hardware y las corridas y el “Chip de Linux y Wi-Fi”. Estos dos chips se comunican entre sí a través de la biblioteca Puente. La biblioteca de Procesos es la forma en que realizan los comandos de Linux desde los códigos de Arduino.

Su esquema viene pre-cargado con las funciones setup () y loop (). Volveremos a estos en un minuto.

En primer lugar, vamos a escribir la función para tomar una imagen:

void takePicture() {
  Process p; // Create a new process
  p.begin("fswebcam"); // Run the fswebcam utility, but first...
  p.addParameter("/mnt/sda1/pic.jpg"); // add a path parameter
  p.addParameter("-r 1280x720"); // and a resolution parameter
  p.run(); // now run it and and wait for its termination
}

A continuación, escribimos la función para cargar el archivo desde Arduino a Dropbox:

void uploadPicture() {
  Process p; 
  p.begin("python"); 
  p.addParameter("/mnt/sda1/arduino/upload-to-dropbox.py"); 
  p.run(); 
}

Bastante simple, ¿eh?

Ahora, de vuelta a nuestro setup () y loop (). La función setup () se ejecuta una vez después de cargar el esquema a su Arduino.

Nuestra comando setup () simplemente inicializará el puente:

void setup() {
  Bridge.begin();
}

Una vez que el setup () está terminado, el loop () se ejecuta continuamente. Nuestro bucle será tomar una foto, cargar la foto, y luego hacerlo de nuevo. El loop () puede ejecutarse miles de veces por segundo, pero nuestros procesos sincrónicos de Linux reducirán la velocidad considerablemente (si alguna vez tiene que reducir la velocidad más, puede introducir un retardo o delay ().

void loop() {
  takePicture();
  uploadPicture();
}

Eso es todo. Haga clic en el botón de carga en la parte superior izquierda de la IDE de Arduino para cargar su esquema al Arduino. A continuación, abra la carpeta de Dropbox, sonría para la cámara, y debería ver algo como esto:

Fotos con sólo pulsar un botón

Ahora que nuestras funciones están trabajando, vamos a activarlas con un botón en lugar de ejecutar un bucle infinito. Para nuestro circuito vamos a necesitar:

  • Tablero de circuitos
  • Tres cables de puente
  • Una resistencia de 10K Ohm
  • Interruptor de Pulsador táctil momentáneo

La idea general es que tenemos un circuito que va desde el pin de 5V, a través de un botón, y de nuevo en GND. Cuando se completa el circuito - es decir, el botón se pulsa - enviamos una señal al PIN 7.

Este circuito se basa en un ejemplo del excelente libro introductorio de Massimo Banzi llamada Primeros pasos con Arduino. Así es como luce:

 

Una vez que se ha construido el circuito, vamos a actualizar el esquema con un broche de oro adicional - en lugar de tener que presionar el botón para tomar una fotografía de inmediato, haremos que los LED parpadeen tres veces para indicarnos de estar listo, entonces tomaremos una foto.

Las dos primeras líneas de su esquema actualmente están incluidas. Debajo de estas, añadir dos constantes para identificar el LED y el pin que nos dice si el botón ha sido presionado:

const int LED = 13;
const int BUTTON = 7;

En el setup (), añada estas dos líneas para preparar los pines para  la salida y entrada, respectivamente:

pinMode(LED, OUTPUT);
pinMode(BUTTON, INPUT);

A continuación, cree una nueva función al final de esquema para hacer parpadear el LED - encenderlo durante medio segundo, luego retirarlo por una décima de segundo - y hacer esto tres veces:

void blink() {
  for(int i = 0; i < 3; i++) {
    digitalWrite(LED, HIGH);
    delay(500);
    digitalWrite(LED, LOW);
    delay(100);
  }
}

Por último, reemplace el bucle loop () con el código que se lee desde el pin que hemos identificado como BUTTON. Si es HIGH (es decir, la corriente se está ejecutando a través de él) entonces:

  • el LED parpadea
  • toma una foto
  • sube la foto a Dropbox
void loop() {
  if (digitalRead(BUTTON) == HIGH) {
    blink();
    takePicture();
    uploadPicture(); 
  }
}

Sube este nuevo esquema para el Arduino, pulse el botón y verá que el Dropbox se llena con las fotos.

Próximos pasos

La revelación completa - empecé a trabajar en esta serie de tutoriales Arduino Yun porque quería enseñar a mi perro a enviar selfies. Hasta ahora hemos logrado configurar un Arduino Yun, tomar fotografías con sólo pulsar un botón, y enviar esas imágenes a la nube. En nuestro siguiente tutorial, vamos a aprender cómo enviar SMS y MMS desde el Yun Arduino .

¿Y qué pasa con usted? Tal vez podría:

  • Transmitir vídeos desde la webcam
  • Disparar la cámara con un sensor de movimiento en lugar de un botón
  • Almacenar datos de otros dispositivos de entrada, tales como sensores ambientales o un teclado
  • Construir una cabina de fotos real

Cuando Arduino salió por primera vez, las posibilidades parecían bastante amplias. Ahora que puede ejecutar secuencias de comandos en su lenguaje de programación favorito y conectarse a Internet, las posibilidades parecen ilimitadas. Me encantaría escuchar lo que  ha construido con su Yun y estaré feliz de ayudar si surge algún problema. Puede dejar un comentario más abajo o envíeme un correo electrónico a gb@twilio.com. Y si usted ha disfrutado de esta publicación, es posible que desee seguirme en Twitter.

Diviértase con estos trucos

Recursos

Estos recursos fueron increíblemente útiles cuando escribí este tutorial: