viernes, 11 de octubre de 2013

Conectar pantalla LCD 16x2 a Raspberry Pi

Aunque el proyecto de la radio está muy olvidado, ahora que tengo algo de tiempo he investigado si en lugar de utilizar un Arduino de intermediario (como hacía hasta ahora) era posible conectar una pantalla LCD directamente al Raspberry Pi utilizando los puertos GPIO (General Purpose Input Output) que incluye. La respuesta es que sí que se puede, y que no es demasiado complicado. Así que, cuando continúe con el proyecto de la radio, posiblemente me decida a descartar el uso del Arduino y conectar todo al Raspberry. Para muestra, un botón:

IMG_0461

En mi caso, he usado una pantalla simple 16x2 compatible con el controlador HDD44780. Básicamente, cualquier pantalla económica de 16x2 que encuentres en eBay o similares será compatible con este controlador. Algunas, más caras, tienen una interfaz I2C o SPI que nos permiten entre otras cosas utilizar menos cables. La interfaz de dicha pantalla es paralela, con 4 cables para datos y, además, tiene algunos conectores adicionales para la luz, el contraste, el modo de funcionamiento, etc.

Para mostrar el texto en la pantalla utilizaremos un pequeño programa en Python (una vez hayamos instalado las librerías necesarias para poder controlar desde Python los puertos GPIO del Raspberry). Pero empecemos por el principio:

1. Realizando las conexiones


Además de los puertos que solemos usar en el Raspberry (USBs, Ethernet, HDMI, Audio…), tenemos disponibles otros puertos para conexiones de más bajo nivel. Entre otros tenemos un puerto serie, UART, I2C, SPI y 13 puertos GPIO que se pueden programar para adaptarse a nuestras necesidades. Para más información se puede consultar este enlace. Todos estos puertos están situados en los pines de la esquina del Raspberry:

RPi_P1_header

Y el diagrama de dichos puertos es el siguiente:

GPIOs

En cuanto a las pantallas 16x2 (aunque también hay disponibles otros tamaños como 20x4), todas tienen 16 pines cuyo diagrama es el siguiente:

Lcd_0

Los pines de datos son los DBX, aunque en la práctica se suelen utilizar sólo DB4-DB7. Para más información sobre estas pantallas se puede consultar este enlace, donde además se puede descargar el datasheet completo de las mismas.

Siendo el Pin 1 de la pantalla situado más a la izquierda (GND), las conexiones que hay que realizar entre el Raspberry y la pantalla son las siguientes (es conveniente ayudarse de una protoboard):

  • Pin 1 de la pantalla (GND) a tierra.
  • Pin 2 de la pantalla (VCC) a +5V.
  • Pin 3 de la pantalla (VEE) a tierra.
  • Pin 4 de la pantalla (RS) a GPIO 25.
  • Pin 5 de la pantalla (RW) a tierra.
  • Pin 6 de la pantalla (EN) a GPIO 24
  • Pin 7, 8, 9 y 10 de la pantalla desconectados.
  • Pin 11 de la pantalla (D4) a GPIO 23
  • Pin 12 de la pantalla (D5) a GPIO 17
  • Pin 13 de la pantalla (D6) a GPIO 21
  • Pin 14 de la pantalla (D7) a GPIO 22
  • Pin 15 de la pantalla (LED+) a 5V.
  • Pin 16 de la pantalla (LED-) a tierra.

Aunque con estas conexiones tenemos suficiente, podemos conectar un potenciómetro al pin 3 para poder regular el contraste de la pantalla (si lo conectamos a tierra, estará al máximo). Del mismo modo, podemos conectar un potenciómetro a LED+ para reducir el brillo de la misma (o incluso conectarlo a 3V3 Power, de proporciona 3.3V en lugar de los 5V).

El diagrama de las conexiones sería el siguiente:

UntitledEste diagrama (y gran parte de este tutorial está basado en el de la web de Adafruit).


2. Instalando los paquetes necesarios

El segundo paso es instalar en nuestra distribución (yo estoy usando Raspbian) los paquetes necesarios para poder ejecutar nuestro script. En este paso será necesaria una conexión a Internet en el Raspberry.

Comenzaremos instalando los paquetes de desarrollo de Python, Python PIP (una especie de Synaptic pero para las librerías de Python), las Setup Tools para poder instalar easy_install y git para descargar más adelante los códigos de ejemplo de la página de Adafruit:

sudo apt-get install python-dev python-setuptools python-pip git


A continuación actualizaremos la herramienta distribute (parte de setuptools), que nos ayudará a descargar la librería GPIO:


sudo easy_install -U distribute


Una vez hecho esto, por fin podremos descargar la librería GPIO para Python:


sudo pip install rpi.gpio




 


3. Descargando códigos de ejemplo


Adafruit mantiene un repositorio Git con diversos códigos de ejemplo para el Raspberry. La forma más sencilla de descargarlos a nuestro sistema es clonar el repositorio. Como ya instalamos git en el paso anterior, basta con introducir:


git clone git://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code.git


Tras unos instantes, se habrá creado en el directorio actual una carpeta llamada Adafruit-Raspberry-Pi-Python-Code con multitud de subcarpetas. A nosotros nos interesa en concreto la subcarpeta Adafruit_CharLCD:


cd Adafruit-Raspberry-Pi-Python-Code
cd Adafruit_CharLCD


4. Modificando el código de ejemplo (sólo Raspberry Pi Rev. 2)


El código de ejemplo que vamos a utilizar es Adafruit_LCD.py. Si tenemos un Raspberry Rev. 1 (las primeras Raspberry, que no tenían agujeros para tornillos en la placa y sólo tenían 256MB de RAM en el modelo B) el código funcionará perfectamente. Si por el contrario tenemos un Raspberry Rev. 2 (con agujeros para tornillos y 512MB de RAM en el modelo B), hay que realizar una pequeña modificación en el código. Para ello, podemos abrirlo con nano:


nano Adafruit_CharLCD.py 


Y en la línea donde pone:


def __init__(self, pin_rs=25, pin_e=24, pins_db=[23, 17, 21, 22], GPIO = None


Reemplazar el 21 por un 27 (esto es debido a un cambio en los puertos del modelo 2 del Raspberry. Para guardar el archivo modificado pulsamos Ctrl+O y salimos con Ctrl+X.


 


5. Probando todo


Sólo nos queda dar permisos de ejecución al programa y ejecutarlo con:

chmod +x Adafruit_CharLCD.py
sudo ./Adafruit_CharLCD.py

Si todo ha ido bien, deberíamos ver algo parecido a lo siguiente:


IMG_0463
En caso de no obtener el texto, lo más probable es que no hayamos hecho correctamente las conexiones entre el Raspberry y la pantalla, por lo que lo mejor es repasarlas para buscar posibles errores. También puede que nos hayamos saltado el paso 4 teniendo un Raspberry Rev. 2. Para asegurarte de tu versión de Raspberry, mira la siguiente imagen:


8429332057_c64051b253
El Raspberry de la izquierda es la revisión 1 y el de la derecha es la revisión 2. Se distinguen fácilmente por los agujeros para tornillos marcados con las flechas rojas.


 


6. Mostrando fecha, hora y dirección IP interna


Si queremos mostrar algo parecido a lo que se puede ver en la primera imagen de esta entrada, basta con ejecutar el otro ejemplo del directorio:

chmod +x ./Adafruit_CharLCD_IPclock_example.py
sudo ./Adafruit_CharLCD_IPclock_example.py

jueves, 10 de octubre de 2013

Unir dos ficheros PDF en Linux

Podemos unir fácilmente dos archivos PDF usando pdftk. No suele estar instalado por defecto, por lo que los pasos serán:

1. Instalamos pdftk. En Ubuntu lo haríamos con:
sudo apt-get install pdftk
2. Concatenamos los dos (o más archivos) con:
pdftk <archivo1.pdf> <archivo2.pdf> cat output <archivofinal.pdf>

lunes, 7 de octubre de 2013

Mejorar renderizado de fuentes en Netbeans

Al hilo de la anterior entrada sobre el renderizado de fuentes en Linux, seguramente nos haya pasado que en algunos programas como Netbeans o JDownloader los textos se vean peor que en el resto de aplicaciones del sistema operativo. La razón parece ser que dichas aplicaciones están programadas usando Swing (la biblioteca gráfica JFC de Java), la cual utiliza su propio motor de renderizado, y que en muchas ocasiones se traduce en que en Linux las fuentes se ven bastante mal.

Afortunadamente, los mismos programadores de Infinality, que vimos en la entrada anterior, se han encargado de parchear OpenJDK para conseguir un renderizado de fuentes decente con aplicaciones que usen Swing. Según dicen en su repositorio en Launchpad, sólo mantienen paquetes para la distribución de Ubuntu más reciente (a fecha de hoy es la 13.04) y la LTS que haya actualmente activa (a fecha de hoy es la 12.04). Por suerte estoy usando Ubuntu 13.04, por lo que instalar OpenJDK parcheado es tan sencillo como:

1. Añadir el ppa:
$ sudo add-apt-repository ppa:no1wantdthisname/openjdk-fontfix
2. Actualizar paquetes:
$ sudo apt-get update
3. Instalar OpenJDK:
$ sudo apt-get install openjdk-7-jdk

El resultado es prácticamente el de una aplicación que use el renderizador nativo: