Fotomatón basado en la Raspberry Pi, conectado a tu impresora

Justo antes de las vacaciones de Navidad os contaba un proyecto con el que podíais conectar vuestra Raspberry Pi a Dropbox para subir allí las fotos que hicieseis con su módulo de cámara: el fotomatón. En este artículo os cuento cómo hacerlo para que, en lugar de subir la foto a Dropbox, se imprima a través de una impresora conectada a la Raspberry Pi (y reconocida por Raspbian). Esta variante viene motivada por mi primera interacción de verdad con los lectores del blog.

Common Unix Printing System
Common Unix Printing System

Pocos días antes de sacar el fotomatón basado en Dropbox me escribía un lector, llamado Pedro J, que estaba al tanto de mis intenciones de publicar un proyecto de tipo fotomatón paracido al que usé en el Pabellón de la Caza durante el directo. Me preguntaba si lo haría conectado a una impresora. Mi contestación fue que por el momento lo sacaría conectado a Dropbox, pero que era buena idea y trataría de cubrir esta variante de alguna forma y pese a que no tengo impresora. En el episodio 13 del podcast, del 22 de diciembre, hice una llamada a la acción para que compartieseis experiencias a la hora de imprimir desde Python en Linux, de tal forma que pudiese cubrir este apartado con vuestras colaboraciones. Casi inmediatamente, Antonio Hernán (@AH3rn4n) enviaba un material que me ponía sobre la pista de la impresión desde Python via CUPS (Common Unix Printing System).

Desde aquí mi agradecimiento a los dos, y… ¡al lío!

CUPS – Common Unix Printing System

CUPS es el acrónimo de Common Unix Printing System, sistema de impresión común a Unix. Es un software libre para impresión creado en 1999 por Apple, la misma compañía que hace y vende iPhones y Macbooks. Como su nombre indica, permite imprimir en todas las variantes de Unix, incluyendo todas las distribuciones de Linux y también Mac OS X: de ahí el común en su nombre. Además, permite imprimir tanto directamente a una impresora local a un ordenador como a través de una red ya sea ésta local o la misma internet.

El funcionamiento de CUPS es sencillo e intuitivo: crea un servicio en el ordenador que, siempre en ejecución, detecta y proporciona acceso a las impresoras conectadas al ordenador y a través de la red a la que tiene acceso. Proporciona un panel de control basado en una página web local, es decir, a través del navegador, a través del cual se pueden añadir impresoras, consultar los documentos que tiene en cola esperando a ser impresos, y un largo etcétera.

Veamos cómo instalarlo e instalar la impresora. Como no tengo impresora física, instalaré la clásica y siempre útil impresora virtual PDF.

Instalación de CUPS en la Raspberry Pi

Esta sección la enfocaré “en modo receta”, yendo directamente a listaros las órdenes que nos permitirán instalar CUPS en Raspbian, a través del terminal.

Lo primero que debemos hacer es actualizar los repositorios y los paquetes disponibles en Raspbian:

sudo apt-get update
sudo apt-get upgrade

Tardará un rato. Tras ello, instalamos los paquetes cupscups-pdf: el primero es el sistema propiamente dicho, y el segundo es una impresora en PDF que habremos de configurar.

Además, añadiremos al usuario actual (pi, a no ser que hayamos creado otro) al grupo de administradores de CUPS, lpadmin, es decir: nos daremos permiso para añadir y gestionar impresoras en el sistema.

sudo apt-get install cups cups-pdf
sudo usermod -a -G lpadmin pi

Instalar y probar la impresora

En esta sección instalaré una impresora virtual que guardará copias de los documentos que queramos imprimir, pero en formato PDF. Para tu impresora física, solamente deberás localizar la marca y modelo en las capturas de pantalla que verás en este apartado. Ten en cuenta, claro, que el resultado será una impresión física en lugar de un nuevo documento PDF en un subdirectorio del usuario actual. También sé coherente con el nombre que configures en estos paneles, ya que te deberás referir a la impresora mediante su nombre.

Abriremos un navegador y escribiremos en la barra de direcciones http://127.0.0.1:631. Veremos que se abre una página web de bienvenida de CUPS, ¡en español!

Página de bienvenida de CUPS
Página de bienvenida de CUPS

Vamos a hacer click en la pantalla Administración:

Panel de administración de CUPS
Panel de administración de CUPS

Una vez dentro, haremos click en el botón Añadir impresora, tras lo que el sistema nos pedirá que nos identifiquemos.

Identificación como administradores ante CUPS
Identificación como administradores ante CUPS

Introduciremos el usuario y la contraseña del usuario que hemos introducido en el grupo lpadmin, es decir, usuario pi y contraseña raspberry a no ser que hayáis cambiado algo desde la instalación de Raspbian. Es decir: debes introducir el usuario y la contraseña de acceso al sistema en Linux, o Raspbian, del usuario que usas normalmente.

Una vez hecho eso, encontraremos la siguiente secuencia de páginas, donde iremos configurando las opciones que os detallo en los pies de foto.

Primero, creamos una nueva impresora seleccionando la opción local, CUPS-PDF (Virtual PDF Printer).

Creamos una nueva impresora seleccionando la opción local, CUPS-PDF
Creamos una nueva impresora seleccionando la opción local, CUPS-PDF

A continuación, dejamos el nombre por defecto.

Daremos el nombre que se nos sugiere y pulsaremos "Siguiente"
Daremos el nombre que se nos sugiere y pulsaremos “Siguiente”

Seleccionamos marca Generic.

Seleccionaremos la marca como genérica (Generic) y pulsaremos "Siguiente"
Seleccionaremos la marca como genérica (Generic) y pulsaremos “Siguiente”

El modelo es Generic CUPS-PDF Printer (en).

Seleccionaremos el modelo indicado (Generic Cups-PDF Printer (en)) y pulsaremos "Añadir impresora"
Seleccionaremos el modelo indicado (Generic Cups-PDF Printer (en)) y pulsaremos “Añadir impresora”

Estableceremos las opciones predeterminadas de la impresora consultándoselas a ella misma.

Por último, el sistema nos pedirá que introduzcamos las opciones predeterminadas. Pulsaremos "Consultar a la impresora las opciones predeterminadas".
Por último, el sistema nos pedirá que introduzcamos las opciones predeterminadas. Pulsaremos “Consultar a la impresora las opciones predeterminadas“.

Si todo ha ido bien, veremos una página parecida a ésta, en donde CUPS nos ofrece la vista de gestión de la impresora recién configurada.

Vista de gestión de la impresora
Vista de gestión de la impresora

Tras ello podremos probarla desde el terminal. Navegaremos a un directorio donde tengamos algún tipo de fichero legible, ya sea una fotografía o un texto, y escribiremos la orden siguiente:

lp -d Virtual_PDF_Printer <nombre de fichero>

Por ejemplo:

lp -d Virtual_PDF_Printer clon2.jpeg

Esto emitirá un mensaje del tipo a

la id solicitada es Virtual_PDF_Printer-1 (1 archivo(s))

De ahí a unos instantes creará un archivo de igual nombre, pero extensión PDF, en el directorio /home/pi/PDF :

Directorio de trabajo de la impresora CUPS-PDF
Directorio de trabajo de la impresora CUPS-PDF

Lógicamente, el fichero PDF recién creado deberá contener el texto o la imagen que habéis impreso; lógicamente también, si tenéis una impresora física, el resultado debería ser una copia impresa.

Este señor, ya de sobra conocido por estos lares, es quien se escode tras la fotografía "clon2.jpeg" del ejemplo. Esta foto es del visor PDF, y muestra la foto encuadrada en un folio tamaño DIN A4.
Este señor, ya de sobra conocido por estos lares, es quien se escode tras la fotografía “clon2.jpeg” del ejemplo. Esta foto es del visor PDF, y muestra la foto encuadrada en un folio tamaño DIN A4.

Acceder a la impresora desde tus programas en Python

Para poder acceder a la impresora deberás instalar unas librerías. Tras ello os introduciré las líneas esenciales para imprimir un fichero y el código fuente del fotomatón completo.

Instalaciones necesarias: librerías de desarrollo de CUPS y pycups

Deberemos instalar la librería libcups2-dev para poder acceder a CUPS desde otros lenguajes de programación, ya sea Python o cualquier otro. Para ello ejecutamos en la consola:

sudo apt-get install libcups2-dev

Tras ello, deberemos instalar el módulo pycups en Python 3 mediante el uso del programa pip, que deberemos ejecutar con permisos de super usuario ya que debe realizar instalaciones adicionales en directorios del sistema:

sudo pip3 install pycups

Es posible que el comando superior falle, sobre todo recientemente (a mí me pasó) con un mensaje de error que termina con el texto “ImportError: cannot import name IncompleteRead “. En ese caso, deberás actualizar pip con el siguiente comando:

sudo easyinstall3 -U pip

Y después de ello, repetir la instalación de pycups.

Prueba de la impresión en Python y programa final

Para imprimir en Python basta con ejecutar las siguientes órdenes que puedes probar directamente desde IDLE para Python 3:

import cups
conexion = cups.Connection()
conexion.printFile ('Virtual_PDF_Printer',fichero, titulo, dict())

En este listado, la última sentencia es la que imprime; la segunda es solamente para conectarnos al servidor de impresión CUPS. En la sentencia de impresión deberemos indicar el nombre de la impresora; fichero  es la ruta al fichero que queremos imprimir, y titulo  el nombre del archivo PDF generado. El último parámetro, dict(), es una estructura de datos que alojaría las opciones de impresión. La enviaremos vacía, para imprimir con las opciones por defecto.

Con esta información y la experiencia en Python que ya hemos ganado es muy fácil modificar el programa del fotomatón (recuerda que utiliza el prototipo del pulsador) para obtener esta nueva versión:

#!/usr/bin/python3

import cups
import RPi.GPIO as GPIO
import os
import time
import picamera

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

## Conexión al sistema CUPS
print("Conectando a CUPS")
conexion = cups.Connection()

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
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_impresora = "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)

            # Imprimir el fichero
            idcups = conexion.printFile('Virtual_PDF_Printer',nombre_local,nombre_impresora,dict())
            print ('Foto enviada a la impresora (id trabajo = ' + str(idcups) + ')')
            # Incrementar contadores; 'local' siempre entre 0 y 10
            local = (local + 1) % 10
            total = total + 1
            print("Oprime el pulsador para hacer otra foto")
except KeyboardInterrupt:
    print("\nInterrupción del usuario, saliendo del programa")
finally:
    camera.close()
    GPIO.cleanup()
    print ("Fin del programa")

exit (0)

Espero que haya sido interesante. Podéis dejarme cualquier 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 entwitter, como en Facebook, y en Google+ también podéis seguir mis publicaciones, incluyendo las del podcast (iTunesiVooxRSS).

Un comentario en “Fotomatón basado en la Raspberry Pi, conectado a tu impresora

Deja un comentario

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