16 dic 2012

Añadir aplicación al menú de inicio en Lubuntu (LXDE)

En nuestra distribución Lubuntu, a pesar de tener muchas cosas buenas, hay algunas tareas que deberían ser sencillas y, sin embargo no lo son. Una de ellas es la de añadir un programa al menú de inicio. Existe mucha documentación sobre cómo realizar esto, pero trasteando y combinando diferentes tutoriales he encontrado el que para mí tiene que ser el procedimiento a seguir hasta que los desarrolladores incluyan algo nuevo que lo simplifique todo. El proceso consiste en primero crear un archivo con extensión ".desktop" que habrá que incluir en el directorio "/usr/share/applications". Para crear el archivo ".desktop" nos ayudaremos del "GUI Creator". En el ejemplo a continuación voy a añadir el programa Fritzing al menú. En un principio tengo en mi carpeta Downloads otra carpeta denominada fritzing-0.7.10b.linux.i386 que contiene el archivo ejecutable "Fritzing" (que será el que se deba ejecutar cuando sea llamado desde el lanzador del menú de inicio). Para utilizar el "GUI Creator" introducimos en un terminal el siguiente comando:

sudo lxshortcut -o /usr/share/applications/fritzing.desktop

En tu caso debes reemplazar fritzing por el nombre del programa que vayas a añadir al menú. Una vez lanzado este comando nos debe aparecer algo así 
Aspecto del Gui designer

Entonces procedemos a rellenar cada una de las casillas. Como nombre podemos darle el que queramos, evidentemente que sea representativo, el icono también podemos elegir uno cualquiera, mientras que lo más importante es el comando. Las aplicaciones ejecutables se encuentran en /usr/bin. Si por ejemplo quisiésemos añadir la aplicación Xmag, pues el comando sería /usr/bin/xmag. En mi caso, el ejecutable se encuentra en otro directorio, así que mi comando es

sh /home/paco/Downloads/fritzing-0.7.10b.linux.i386/Fritzing

Para el icono, en lugar de elegir alguno de los incluidos en el sistema, he descargado el propio de Fritzing, lo he guardado en la misma carpeta que el ejecutable y seleccionado. 
Entonces pulsamos OK y comprobaremos cómo nuestro programa aún no aparece en el menú de inicio. Esto es porque aún no lo hemos incluido en ninguna categoría. Y es aquí solía yo tener problemas, ya que desconocía la lista de posibles categorías. La lista total la podemos encontrar aquí, en la que separa las categorías registradas y las adicionales. En mi caso me interesa introducirla en Electronics, aunque podríamos haber elegido Education o cualquier otra. Por último añadimos la categoría a nuestro archivo .desktop creado. Para ello, de nuevo desde terminal:

sudo leafpad /usr/share/applications/fritzing.desktop

Y añadimos al final

Categories=Electronics

O lo que proceda. Guardamos el archivo, lo cerramos y ahora sí aparece el programa en el menú de inicio.

Arranque, parada e inversión de giro en motores con Arduino

Continúo mi andadura con Arduino y más concretamente con el proyecto relacionado con el coche. Una de las piezas claves de este son los motores que lo mueven, por lo que resulta vital poder controlarlos. A simple vista, se plantea un problema, y es que, según indican en la propia web de Arduino la corriente máxima que pueden suministrar la salidas de nuestra arduino uno es de 40 mA, que resultará insuficiente para mover un motor. Tal es así que puede resultar incluso perjudicial para nuestra tarjeta arduino el intentar conectarlo directamente, pudiendo dañar partes de ésta. Es por ello que necesitamos incluir algún otro elemento. Aquí es donde entra en juego el transistor, que actúa como interruptor. En el mercado de la electrónica existen multitud de ellos, por lo que es conveniente saber elegir cuál puede valer. Los factores más importantes a tener en cuenta son el voltaje máximo que admiten y la corriente máxima. Transistores bipolares como el 2N2222A (admite hasta 800 mA) o TIP 120 (que admite hasta 5A) son suficientes para los motores pequeños que usaré. Información relativa a cómo controlarlo hay mucha. Mis referencias son ésta y ésta otra. Además, al disponer en nuestro arduino de salidas PWM, podemos controlar la velocidad del motor.
Ahora bien, ¿qué ocurre si queremos realizar inversión de giro?. Las referencias indicadas anteriormente explican cómo controlar el motor para que gire en un sólo sentido. Si queremos además inversión de giro podemos utilizar un puente en H, denominado HBridge. Uno de los puentes más populares para pequeños proyectos es el L293D, del cuál podéis encontrar un tutorial sobre cómo usarlo con arduino aquí. Como yo no disponía de ningún HBridge a mano, he decido crearlo por mi cuenta. El montaje en la breadboard lo podéis encontrar en la imagen a continuación
Esquema de conexionado para crear un HBridge

Básicamente consiste en cuatro transistores de los cuales dos de ellos estarán activos para que el motor gire en un sentido y los otros dos para que lo haga en el contrario. En la imagen también se pueden apreciar 4 diodos que son muy importantes para proteger el circuito. Tratan de evitar el efecto flyback, que básicamente consiste en unos voltajes de pico muy elevados que se producen cuando se intenta un cambio de giro en un motor. Si queréis saber más al respecto podéis consultar en la wikipedia.
A continuación os dejo un vídeo de mis montajes en funcionamiento, el primero de ellos controlando el motor remotamente y el segundo realizando inversiones de giro (perdonad por la escasa calidad)

Y por último comentar que he realizado mi primer proyecto en Fritzing. Incluyo aquí el enlace.

Aumentando el número de salidas digitales en Arduino

En la reciente entrada "primeros experimentos con Arduino" hice un montaje que utilizaba un display 7 segmentos de 4 dígitos para mostrar datos numéricos. En ese momento tuve que utilizar una salida digital para cada uno de los siete segmentos del display y dos salidas más para controlar el dígito en el que se iba a mostrar el dato numérico. Evidentemente necesitar 9 salidas digitales para mostrar datos por un display 7 segmentos no es nada eficiente, teniendo en cuenta que nuestro arduino cuenta con sólo 14. Es por esto que necesitaba de algún método para poder utilizar el display con menos salidas digitales. Y es aquí donde entró en juego el registro de desplazamiento, que permite conversión de datos serie a paralelo y viceversa. En mi caso disponía de un registro de desplazamiento de serie a paralelo 74HC164D que obtuve (al igual que el display) del despiece de un TDT estropeado. Había olvidado un poco qué misión tenían los registros de desplazamiento, así que entre la múltiple información existente en internet utilicé ésta y éste tutorial de arduino con 7 segmentos para refrescarme la memoria. Con el circuito integrado a mano y con los conocimientos de su funcionamiento sólo restaba por realizar la programación en Arduino.  Y tengo que decir que más fácil es imposible, ya que existe una función en Arduino denominada ShiftOut en la cuál indicas cuál salida vas a utilizar como pin de datos, cuál como reloj, el orden (si usando el bit más significativo o el menos) y el byte que que quieres pasar. De esta forma, en lugar de 7 salidas digitales hemos utilizado 2. Un ejemplo de código pasa a ser algo tan reducido como

int clockPin=8;
int dataPin=9;
int digito1=11;//Indica la posición en el display del número a mostrar
int digito2=12;
byte cero=255-252;/*Para pintar un 0 en un 7 segmentos hay que enviar un valor binario de 1111110. Como el registro de desplazamiento tiene 8 bits, añadimos un bit más a esa cadena (da igual el valor) y tendremos entonces 11111100, que en decimal se corresponde con el 252. Este sería en principio el valor a enviar por el registro de desplazamiento, pero para el display que estoy utilizando necesito enviar los bits invertidos (un 0 enciende el led y un uno lo apaga), así que el valor a enviar, en binario, es 00000011, que en decimal es el 3 (255-252). Esto mismo hay que hacer para el resto de valores. */
byte uno=255-96;
byte dos=255-109;
byte tres=255-121;
byte cuatro=255-102;
byte cinco=255-182;
byte seis=255-190;
byte siete=255-224;
byte ocho=255-0;
byte nueve=255-230;

void setup(){
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(digito1, OUTPUT);
  pinMode(digito2, OUTPUT);
}
void loop(){
  shiftOut(dataPin,clockPin,LSBFIRST,siete);//Pintamos el valor 7 en el primer dígito
  delay(1000);
  digitalWrite(digito1,LOW);
  digitalWrite(digito2,HIGH);
  shiftOut(dataPin,clockPin,LSBFIRST,uno);//Pintamos el valor 1 en el primer digito
  delay(1000);
  digitalWrite(digito1,HIGH);
  digitalWrite(digito2,LOW);
  shiftOut(dataPin,clockPin,LSBFIRST,cinco);//PIntamos el valor 5 en el segundo dígito
  delay(1000);
  digitalWrite(digito1,HIGH);
  digitalWrite(digito2,LOW);
  shiftOut(dataPin,clockPin,LSBFIRST,cuatro);//Pintamos el valor 4 en el segundo dígito
  delay(1000);
  digitalWrite(digito1,LOW);
  digitalWrite(digito2,HIGH);
}

11 dic 2012

Comunicación infrarroja con Arduino

Del despiece del aparato TDT estropeado obtuve un sensor de infrarrojos, que era una de las piezas vitales que tenía pensado comprar (y de hecho compré) para poder llevar a cabo el proyecto del coche con control remoto con Arduino. Como aún no he recibido el receptor infrarrojos comprado, me he puesto directamente a trastear con el obtenido del TDT. En un principió me chocó no ver el tipo de receptor concreto que era para poder buscar una hoja de características (datasheet). Así que la solución por la que opté fue buscar imágenes de receptores infrarrojos en Internet hasta ver cuál podía corresponder y pronto la búsqueda resultó efectiva. Tenía ante mí a un PL-IRM0101-3. Si bien la documentación que encuentro relacionada con la recepción de infrarrojos usando Arduino no utiliza dicho sensor, sino más bien TSOP 1238 o algo por el estilo, el proceso es bastante similar. En las hojas de características se encuentra un esquemático sobre cómo montar el circuito para recibir señales. Podéis ver la imagen a continuación.
Esquema de montaje del receptor infrarrojos

Con todo listo, comencé a montar el circuito y la primera prueba fue un fracaso. Era incapaz de leer señal alguna, así que revisé el circuito, busqué diferentes librerías para recepción de infrarrojos en Arduino y seguía sin obtener absolutamente nada. Cuando llegué a pensar que el receptor estaba estropeado, pensé en alguna forma de probarlo directamente y fue entonces cuando me topé con un excelente artículo que explica los conceptos de receptores infrarrojos, cómo testearlos, cómo son las señales emitidas por el mando a distancia, cómo son interpretadas por el receptor y evidentemente cómo usarlo. El enlace al magnífico artículo lo podéis encontrar aquí. Como se encuentra en inglés, me parece interesante también destacar uno en castellano, menos detallado quizá pero muy sencillo de entender y que explica qué es el protocolo NEC aquí. Tras testear el receptor infrarrojos comprobé que funcionaba correctamente, así que decidí montar más cuidadosamente el circuito inicial (debía haber algo mal) y esta vez funcionó a la primera. 
Una vez resuelto, me decidí a realizar mi propio programa, que básicamente consiste en recibir las señales del mando a distancia, interpretarlas y mostrar por el display LCD cuál ha sido la tecla pulsada. Podéis ver el vídeo a continuación.

Por cierto, comentar que si compráis un receptor infrarrojos TSOP1838 procedente de DealExtreme (como es mi caso) debéis tener en cuenta que hay un cambio en las patillas del circuito. Más detallado aquí.
Y, aunque me parezca poco usable, cuelgo el código del programa que muestra la tecla pulsada en el display aquí.

9 dic 2012

Primeros experimentos con Arduino

Con el pedido de DealExtreme recibido he podido empezar a realizar experimentos con Arduino. Para empezar, una serie de ejemplos sencillos e incluidos en la propia aplicación de Arduino IDE. Encender un led, hacer que se encienda y apague progresivamente, y algún otro más por el estilo. Posteriormente le ha tocado el turno al display LCD con el controlador HD44780 y las librerías LiquidCrystal, que realmente hacen que programar el display sea cosa de niños. Todas las opciones de mover el cursor, desplazar el display... están incluidas en la librería. Podéis encontrar un esquema de montaje e información al respecto aquí
Arduino controlando un display LCD

Como también recibí un sensor de distancias por ultrasonidos HC-SR04, he decidido combinar ambos elementos basándome en un experimento que podéis encontrar aquí. El proceso de montaje es bastante sencillo y todo ha funcionado a la perfección a la primera. Podéis ver mi montaje en funcionamiento en la siguiente imagen.
Medida de distancia con Arduino, sensor y display LCD

Como todo esto lo he podido hacer sin programar (aunque he tratado de entender todos los programas que he utilizado), he decidido hacer una modificación, consistente en cambiar el display LCD por uno de 7 segmentos que obtuve de un aparato TDT estropeado. Para ello he tenido, en primer lugar, que buscar la hoja de características de dicho display, que resulta ser un 3942AX/BX-XX. Este display tiene 16 pines, si bien para este experimento solo he conectado los correspondientes a dos dígitos (la medida máxima del sensor de ultrasonido es inferior a 100 centímetros). Podéis ver un vídeo del montaje en funcionamiento a continuación

La programación es básica. Leemos la distancia que nos proporciona el sensor de ultrasonidos en centímetros y comprobamos si es menor que 10, en cuyo caso se puede enviar la medida directamente al primer dígito. Si es mayor que nueve, entonces debemos configurar los dos dígitos. Para ello, con el valor obtenido, el valor a mandar al dígito más significativo es el cociente de división de enteros por 10, mientras que al dígito menos significativo se manda el resto de dicha división. Dependiendo del número a enviar se encienden un determinado conjunto de leds. Podéis descargar el código completo aquí. Si queréis más información de displays 7 segmentos clicad aquí.
Comentar también otro experimento que me ha gustado, muy simple, que consiste en una especie de sensor de aparcamiento. Lo podéis encontrar aquí.

8 dic 2012

Compra de componentes electrónicos

En una de las entradas de mi blog hablé sobre DealExtreme he hice referencia a sus bajos precios pero largos tiempos de espera hasta recibir los pedidos. Pues bien, para que tengáis una referencia indicaros que el día 8 de Noviembre realicé un pedido de 8 dólares aproximadamente, el cuál recibí ayer 7 de Diciembre, es decir, prácticamente un mes. Por contra un pedido realizado en Ebay de un sensor por ultrasonidos tardó 4 días. En las imágenes a continuación podéis ver los diferentes artículos que he recibido
Diferentes artículos de un pedido de DealExtreme

Artículo recibido desde Ebay

Durante este casi mes he estado informándome sobre dónde comprar material electrónico, las posibilidades de DealExtreme a la hora de hacer un pedido, etc, y me parece interesante indicar los siguientes enlaces:
 ¿Dónde comprar electrónica? del blog Electrónica de otoño. Este artículo hace referencia a tiendas online, internacionales, nacionales y almacenes chinos, incluso haciendo recomendaciones. El blog está relacionado con el desarrollo de productos electrónicos y me parece muy interesante, de hecho recomendaré otro artículo en un futuro próximo relacionado con recepción infrarroja.
Consejos para compras chinas del blog Made in China en el que explican la protección del comprador, garantía de llegada del producto, etc. El blog me gusta, pero el que me encanta es otro de ese mismo autor, denominado Ikkaro, donde realiza y explica inventos y experimentos caseros. Muy recomendable.
Ya le estoy echando un ojo a una Arduino Nano por 11 dólares...

Abrir Pdf's, documentos de office y enlaces magnéticos directamente en Chromium en LXDE/Lubuntu

El navegador web incluido por defecto en Lubuntu es Chromium. Si bien he probado varios de ellos, puedo decir que éste es el que más me gusta, aunque tiene para mí el gran inconveniente de que cualquier enlace magnético, archivo PDF, documento de office, etc, no es abierto directamente desde el navegador, como sí que ocurre por ejemplo en Firefox. En mi caso tiendo a descargar archivos por torrent, utilizar listas de spotify o buscar documentos pdf y resulta bastante molesto no tener esa opción. Así que buscando he encontrado soluciones que pueden ser interesantes pero requieren de unos pequeños retoques. Veamos cómo hacerlo:
1.- Abrir enlaces magnéticos
La solución la he encontrado aquí. Básicamente consiste en, primeramente manipular la configuración del Gconf y posteriormente modificar el fichero xdg-open. Para esto, en una terminal introducimos los siguientes comandos:

gconftool-2 -t string -s /desktop/gnome/url-handlers/magnet/command "transmission %s"

gconftool-2 -s /desktop/gnome/url-handlers/magnet/needs_terminal false -t bool

gconftool-2 -t bool -s /desktop/gnome/url-handlers/magnet/enabled true

Y posteriormente, para modificar el xdg-open, introducimos en una terminal

sudo leafpad /usr/bin/xdg-open

Y modificamos la parte siguiente

#--------------------------------------
# Checks for known desktop environments
# set variable DE to the desktop environments name, lowercase
detectDE()
{
 if [ x"$KDE_FULL_SESSION" = x"true" ]; then DE=kde;
 elif [ x"$GNOME_DESKTOP_SESSION_ID" != x"" ]; then DE=gnome;
 elif `dbus-send --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.GetNameOwner string:org.gnome.SessionManager > /dev/null 2>&1` ; then DE=gnome;
 elif xprop -root _DT_SAVE_MODE 2> /dev/null | grep ' = \"xfce4\"$' >/dev/null 2>&1; then DE=xfce;
 elif [ x"$DESKTOP_SESSION" == x"LXDE" ]; then DE=lxde;
 else DE=""
 fi
}

Dejándola así

#--------------------------------------
# Checks for known desktop environments
# set variable DE to the desktop environments name, lowercase
detectDE()
{
# if [ x"$KDE_FULL_SESSION" = x"true" ]; then DE=kde;
# elif [ x"$GNOME_DESKTOP_SESSION_ID" != x"" ]; then DE=gnome;
# elif `dbus-send --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.GetNameOwner string:org.gnome.SessionManager > /dev/null 2>&1` ; then DE=gnome;
# elif xprop -root _DT_SAVE_MODE 2> /dev/null | grep ' = \"xfce4\"$' >/dev/null 2>&1; then DE=xfce;
# elif [ x"$DESKTOP_SESSION" == x"LXDE" ]; then DE=lxde;
# else DE=""
# fi
DE=gnome;
}

Con esto ya tenemos la opción de enlaces magnéticos activada. Si ahora por ejemplo intento abrir una lista spotify desde el navegador, aparece una ventana como la siguiente
Ventana de petición de uso de protocolo externo

Selecciona la opción lanzar aplicación y listo.
2.- Abrir documentos de pdf y office
Vamos ahora con los documentos pdf y de office. Para esto existen, dos alternativas, si bien la segunda en mi caso no ha funcionado (creo que si fuese una instalación limpia de Lubuntu sí lo haría). 
Opción 1:
La primera pasa por instalar una extensión denominada Visualizador de archivos PDF/PowerPoint. Esta extensión se encarga de abrir ese tipo de archivos con Google Docs. A mí personalmente no me gusta, de ahí que busqué otra opción, explicada a continuación.
Opción 2:
Pasa por utilizar las aplicaciones que por defecto se encargan de abrir ese tipo de archivos embebidas en nuestro navegador. Por ejemplo, abrir un pdf con evince o abrir un doc con libreoffice, todo sin salir del navegador. Para ello hay que instalar mozplugger y realizar algunas modificaciones. En un terminal

sudo apt-get install mozplugger

Si queremos utilizar evince para abrir los documentos pdf, según se explica aquí, hay que modificar el archivo mozpluggerrc. Para ello, desde terminal

sudo leafpad /etc/mozpluggerrc

Buscamos la parte de texto

### Acrobat Reader
define(ACROREAD, [repeat swallow(acroread) fill : acroread -openInNewWindow /a "$fragment" "$file"])

Y la modificamos, dejándola


### Acrobat Reader
# define(ACROREAD, [repeat swallow(acroread) fill : acroread -openInNewWindow /a "$fragment" "$file"])
define(ACROREAD, [repeat swallow(evince) fill needs_xembed : evince "$file"])

Si además tenemos libreoffice y queremos que utilice esa aplicación para documentos de office hay que, según se explica aquí, modificar la parte del archivo

### OpenOffice
define([OO],[swallow(VCLSalFrame) fill: ooffice2.0 -nologo -norestore -view $1 "$file"
swallow(VCLSalFrame) fill: ooffice -nologo -norestore -view $1 "$file"
swallow(VCLSalFrame) fill: soffice -nologo $1 "$file"])

dejándola así


### OpenOffice
define([OO],[swallow(VCLSalFrame) fill: libreoffice -nologo -norestore -view $1 "$file"
swallow(VCLSalFrame) fill: libreoffice -nologo -norestore -view $1 "$file"
swallow(VCLSalFrame) fill: libreoffice -nologo $1 "$file"])

Esta última opción de libreoffice es la que a mí no me ha funcionado. He realizado modificaciones en este archivo pero siempre obtengo el error 

Could not load MozPlugger 1.14.5 handles QuickTime and Windows Media Player Plugin

Lo cierto es que no sé muy bien el por qué de ese error, pero creo que puede ser alguna modificación previa que hice en el navegador. En Firefox funciona perfectamente. Trataré de informarme más al respecto y os mantengo informados.





4 dic 2012

Despiezando un estropeado aparato TDT

Últimamente estuve haciendo limpieza por casa y me percaté de la existencia de un estropeado TDT. Sin pensar lo que me podría encontrar dentro de él me puse ha desmontarlo. Y cuál fue mi alegría cuando descubrí diferentes partes que me podían ser muy útiles en un futuro. Al abrirlo me encontré con 3 partes principales, un circuito electrónico al que estaban anclados el TDT propiamente dicho y los euroconectores, otro circuito electrónico en la zona del frontal y una fuente de alimentación.

Interior del aparato TDT
Ésta última me viene genial a la hora de alimentar los circuitos electrónicos que tengo en mente montar, ya que ofrece salidas a 3.3, 5, 9, 12 y 30V.
Fuente de alimentación incluida en el TDT
Para la fuente de alimentación he decidido, modificando y recortando la carcasa del aparato, crear una caja que me permita acceder a sus salidas. El resultado obtenido es bastante chapucero, la verdad, pero me servirá para los propósitos que quiero darle.
Aspecto de la caja modificada para poder acceder a las salidas de la fuente de alimentación
Diferentes componentes obtenidos del TDT
En el circuito del frontal se encontraban componentes que también me pueden servir como un display 7 segmentos de 4 dígitos, un registro de desplazamiento, pulsadores y un receptor infrarrojos (que lo podré usar para el coche con control remoto). En el circuito principal había reguladores de voltaje y otros componentes varios que pueden venirme bien. 
Me parece importante destacar cómo conseguí desoldar los componentes de las placas, y es que es un método que encontré en youtube y que, al menos en mi caso me resultó muy sencillo, efectivo y que no estropeó ningún componente que desoldé. Os dejo el link del vídeo aquí.