domingo, 26 de agosto de 2012

Instalando MPD y MPC para reproducir streams de audio

Una vez configurado el sonido en el RPi, necesitamos algún reproductor que nos permita cargar y reproducir las radios online. Cuando usaba Linux, solía utilizar los que venían en los reproductores gráficos como Exaile, Amarock o Rhythmbox. También existía un programa especializado, Streamtuner, que permitía elegir emisoras de radio de varias fuentes (Xiph, Shoutcast, etc.). En nuestro caso, sin embargo, es más cómodo un reproductor de consola, ya que no tendremos un monitor en el que mostrar la interfaz gráfica del reproductor, ni un ratón para interactuar con ella.

Mi idea es utilizar un pequeño mando IR como el de la imagen, o botones físicos y utilizar el Arduino para detectar las pulsaciones y comunicarlas al RPi mediante conexión serie. En el RPi, mediante un programa (en principio en Python), recoger las pulsaciones, realizar las acciones necesarias sobre el reproductor y responder al Arduino, ya sea que todo ha ido bien o que se ha producido algún error.

IMG_0403

Por este motivo estuve mirando varios reproductores de consola para Linux que fuesen compatibles con streams de audio, ya que parece que no hay nada especialmente pensado para la radio online. Algunas de las opciones que he encontrado son:

mpg123, lo recomiendan en varios sitios y al parecer su uso es tan sencillo como escribir mpg123 y la dirección del stream de audio. Tiene el inconveniente de no ser un demonio, por lo que tendríamos que utilizar algún sistema de terminal virtual como screen para las pruebas. Tampoco soporta listas de reproducción pls o m3u, aunque podríamos generar en un fichero de texto o en una pequeña base de datos las estaciones que queramos escuchar y luego invocar al reproductor con el stream correspondiente al seleccionar una. Una pequeña tabla con SQLite valdría perfectamente.

mplayer, es uno de los reproductores más populares de Linux, y también soporta stream de audio y listas de reproducción- Su funcionamiento sería muy parecido al de mpg123. Además hay tutoriales de como usarlo para escuchar radios por consola.

MOC, es un reproductor basado en NCurses, que es un sistema de interfaces en modo texto para consola de Linux. El inconveniente para nosotros es precisamente el que esté basado en NCurses, ya que no tenemos un display de 80x25, sino de 20x4 como máximo, por lo que se queda muy corto para mostrar esta interfaz. Sin embargo, al parecer también puede usarse directamente mediante comandos.

MPD y MPC, el primero es la abreviatura de Music Player Daemon y el segundo de Music Player Client. MPD es un demonio que se queda activo en segundo plano y mediante MPC podemos añadir, eliminar, reproducir pistas, etc. Un aspecto que me ha gustado bastante es que es posible obtener fácilmente la información de la canción (artista, álbum, título, etc.), por lo que es muy sencillo parsearla y enviarla al Arduino para que muestre la canción actual en el display:

IMG_0404

Por ahora he elegido MPD y MPC y he conseguido mostrar sin problemas el artista y la canción con el display (contaré como en próximos posts). Sin embargo, sigo abierto a probar otras alternativas. De hecho, si alguien quiere recomendar alguna de las demás opciones u otra que no haya contemplado aún, por favor, que lo haga en los comentarios.

Activar Wifi en RaspberryPi

Ya comentamos que aunque el RPi lleva conexión de red cableada, nuestra idea era utilizarlo mediante un Wifi USB, en concreto un OvisLink EVO-W541USB:

IMG_0401

Por suerte, su chipset es Atheros, con lo que para hacerlo funcionar, basta con descargar el firmware:

sudo apt-get install firmware-atheros wicd wicd-curses

También he seleccionado wicd y wicd-curses, que es un gestor de conexiones que nos permitirá conectarnos fácilmente mediante la consola a redes wifi.

Una vez instalado (no recuerdo si fue necesario reiniciar el RPi, creo que no), ejecutamos wicd-curses para conectarnos a nuestra red.

image

Para ello sólo hay que seleccionar nuestra red, pulsar la flecha derecha para configurarla, y pulsar C para conectarse a ella. En las opciones de conexión es conveniente pulsar en “Conectar automáticamente a la red” para que no tengamos que volver a repetir el proceso en el futuro. También se puede establecer una IP fija para que siempre se conecte con la misma IP y no tengamos que buscarla a la hora de conectarnos al RPi por SSH, en mi caso, lo hice reservando la IP en mi router pero también se puede hacer en Wicd.

Ahora sólo habría que desconectar el cable de red y comprobar que seguimos con conexión:

image

PD: En los foros de RPi comentan que determinados Wifi USB no funcionan correctamente dado que necesitan más energía de la que puede suministrar el RPi, por lo que recomiendan usar un HUB USB autoalimentado. En mi caso no ha sido necesario, pero más vale prevenir.

Configurando Raspbian

Una vez instalado Raspbian por primera vez es conveniente realizar una configuración mínima para poder trabajar con él más fácilmente. Yo he hecho lo siguiente:

Para empezar conecté un ratón y un teclado al RPi, un cable de red directo al router, la tarjeta con Raspbian instalado y un HDMI a mi monitor. Después de conectarlo todo, encendemos el RPi conectándole una fuente de alimentación (En mi caso el cargador del móvil funcionó perfectamente, aunque compré el RPi con un transformador de 5V 1A para ir sobrado).

Si no hay problemas, RPi arrancará y al finalizar mostrará un menú de configuración. Si no lo muestra basta con teclear en la terminal:

sudo raspi-config

En este menú podemos cambiar varios parámetros útiles. En mi caso modifiqué el layout del teclado para ponerlo en español (opción configure_keyboard). Configuré también el idioma del sistema (change_locale), el GMT (change_timezone), la contraseña (por defecto es raspberry) y activé el SSH, muy útil para poder controlar después nuestro RPi sin necesidad de conectarle nada. Hay más opciones, pero estas son las fundamentales para mi proyecto.

Una vez hecho esto, pulsamos en Finish y ya tenemos Raspbian listo para usar.

Como lo hemos conectado por cable a Internet, podemos aprovechar para actualizar el sistema. Para ello basta con escribir:

sudo apt-get update

sudo apt-get upgrade

Y esperar un rato a que actualice paquetes. En mi caso me preguntó actualizar ciertos scripts del sistema y elegí la opción por defecto de mantener la versión actual.

Si hemos activado el servidor SSH, podemos comprobar también que es posible acceder al RPi desde otro PC. Para ello usamos cualquier cliente de SSH (yo utilizo Kitty en Windows). Ahora bien, ¿con qué IP podemos acceder al RPi?. Hay varias formas de averiguarlo:

  1. Desde la terminal tecleamos ifconfig y nos fijamos en la ip del campo inet addr de la interfaz de red (eth0).
  2. Desde nuestro router accedemos a la opción de DHCP y seguramente tendremos una lista de los dispositivos conectados:

image

En cuanto podamos acceder por SSH a nuestro RPi, ya no será necesario conectarle teclado, ratón o pantalla, por lo que nos resultará bastante más cómodo trabajar con él.

Instalando Raspbian en Raspberry Pi

Una de las primeras cosas que haremos será instalar la distribución oficial del RPi para hacerlo funcionar. A diferencia de la instalación de un sistema operativo en un PC convencional, la instalación en el RPi es mediante un volcado directo del sistema a la tarjeta de memoria (que hará de disco principal del sistema). Aún así, los pasos son incluso más sencillos que en una instalación “normal”.

En mi caso he utilizado Windows 7 para instalar RaspBian, aunque se puede hacer en cualquier otro SO (MacOs, Linux).

  1. Accedemos a la sección de descargas de la página oficial de RPi: http://www.raspberrypi.org/downloads Una vez allí elegimos la opción Raspbian, que es la que nos recomiendan y la descargamos, ya sea mediante un Torrent o por descarga directa.image
  2. Si estamos utilizando Windows, descargamos el programa Win32DiskImager, que nos permitirá grabar la imagen en la tarjeta de memoria.
  3. Introducimos la tarjeta de memoria en un lector de tarjetas en nuestro PC y apuntamos la letra que le asigna Windows.
  4. Ejecutamos Win32DiskImager (no necesita instalación) y seleccionamos la imagen de Raspbian que hemos descargado previamente y la letra que Windows asignó a nuestra tarjeta (es importante no confundirse ya que podríamos equivocarnos e instalar Raspbian en el disco duro del PC y perder nuestros datos). Pulsamos en Write y esperamos a que termine de copiar los archivos.
  5. Una vez terminado el proceso de copia, sacamos la tarjeta del PC, la metemos en el RPi, y ya podríamos usarlo.

Radio Wifi con Raspberry Pi y Arduino

Hace tiempo que me llegó el mini ordenador Raspberry Pi. Llevaba bastantes meses siguiendo el proyecto y me pareció muy interesante, por lo que en cuanto salió a la venta compré uno para cacharrear con él cuando tuviese más tiempo.

Aunque para un uso normal como PC, Raspberry Pi (de ahora en adelante RPi) queda algo corto de potencia para tareas comunes como navegar por Internet (Su CPU es un ARM a 700MHz), su pequeño tamaño, bajo consumo y bajo precio lo hacen ideal para un montón de proyectos: Servidor de archivos, NAS, PC para dejar compartiendo torrents 24 horas (su consumo ronda 1W, incluso algo menos) y muchísimas cosas más.

Mi proyecto es construirme una radio que permita reproducir emisoras online. Mi idea es utilizar el Raspberry Pi con su distribución Linux oficial e instalarle algún reproductor que permita reproducir streams de audio (emisoras) de manera sencilla. Dado que el RPi tiene una salida de audio analógica (mini-jack), la idea es que sea él el que se encargue de reproducir y conectarle unos altavoces antiguos para amplificar la señal y poder oírla.

RPi también tiene un puerto de red para poderlo conectar a Internet con un cable estándar. Sin embargo, dado que no queremos limitar nuestra radio a estar cerca de un router, la conexión a internet será mediante Wifi. Concretamente con un adaptador USB 2.0 Ovislink EVO-W541USB que tenía por casa.

¿Y qué pinta el Arduino en esta radio? Pues debido a su facilidad para conectarlo a Pantallas LCD, botones y otras interfaces nos servirá de puente para conectar un display LCD que nos muestre la información de lo que esté sonando, las emisoras, etc. También nos servirá para controlar la radio, ya sea a través de botones o a través de un mando a distancia y un receptor de infrarrojos (lo he usado en un proyecto anterior y responde a la perfección). En cuanto a los displays, la mayoría de ellas son de caracteres, y utilizan en chip HD44780 para su control. Arduino tiene librerías que nos facilitan trabajar con este tipo de pantallas, por lo que no será difícil utilizarlas.

En mi casa tengo varias de estas pantallas de diferentes tamaños y colores. En cuanto a tamaños tengo unas de 16 caracteres y 2 líneas, y otras de 20 caracteres y 4 líneas. Aún no he decidido cuál de ellas voy a usar, aunque me inclino por la grande, ya que me permitiría incluir más información y algún icono adicional para indicar por ejemplo la cobertura del Wifi, el bitrate de la transmisión, etc.

Por último queda saber cómo se conectarán el Arduino y el RPi. En este caso la conexión la haremos emulando un puerto serie a través de USB. Haremos un programa en Python que se encargue de enviar los datos a representar en la pantalla desde el RPi al Arduino y que reciba de éste las pulsaciones de los botones o del mando a distancia y procese las órdenes.

sábado, 14 de abril de 2012

Ejemplo de messageBox en Swing

Con éste código se puede lanzar de manera sencilla un Message Box (Ventana emergente) en Swing. Este tipo de ventanas se utilizan mucho para informar al usuario de una aplicación de posibles errores o avisos importantes.

El código en cuestión es:

JOptionPane.showMessageDialog(mainWindow,
                              "File cannot be saved.",
                              "Save error",
                              JOptionPane.ERROR_MESSAGE);

Donde mainWindow es el contenedor Swing (JPanel, JFrame, JDialog, etc.) desde donde se lanza el MessageBox, de modo que éste aparecerá centrado respecto a dicho contenedor. Lo siguiente es el mensaje que queremos mostrar, seguido del título de la ventana y del tipo de ventana (en este caso he seleccionado JOptionPane.ERROR_MESSAGE, lo que adapta la ventana con un icono de error y un botón de Aceptar.

El resultado de dicho código sería:

Captura

jueves, 29 de diciembre de 2011

Instalar JFreeChart en Netbeans

Para mi PFC necesito mostrar determinados datos mediante gráficas. Java tiene muchas opciones para hacer esto. Al principio pensé en usar simplemente Java2D, pero más tarde barajé la opción de trabajar con alguna biblioteca con un mayor nivel de abstracción.

JFreeChart es una biblioteca que simplifica muchísimo la tarea de mostrar gráficas. El proceso es sencillo: Primero construimos un objeto Dataset, con el que podremos introducir los datos del gráfico, después creamos un objeto ChartFactory, e invocamos al método createXChart() con el que podremos establecer el título de la tabla, el Dataset asociado y otros parámetros (leyenda, ejes, etc.).

Para instalar la librería en NetBeans 7 haremos lo siguiente:

1. Descargamos los archivos necesarios:

Última versión de JFreeChart

Ant (necesario para generar la documentación Javadoc)

NetBeans (Yo utilizo la versión SE)

2. Descomprimimos JFreeChart en un directorio (yo hice una carpeta “Libraries” para guardar todas las librerías).

3. (Opcional) Descomprimimos Ant. En Windows es necesario añadir las variables de entorno ANT_HOME para que apunte al directorio donde esté Ant. También es necesario añadir al PATH de Windows el directorio Bin de Ant y el directorio Bin de JDK. Una vez hecho esto, mediante línea de comandos accedemos a la carpeta donde hemos descomprimido JFreeChart y dentro de esta, a la subcarpeta Ant:

Captura

4. (Opcional) Ejecutamos el comando para generar la documentación Javadoc:

Captura2

Si todo ha ido bien, al cabo de unos segundos (pueden ser bastantes) el sistema mostrará “BUILD SUCCESSFUL”, indicando que la documentación se ha generado correctamente:

Captura3

3. En NetBeans pulsamos en Tools > Libraries para añadir JFreeChart. Para ello pulsamos en el botón “New Library…”

En Library name escribimos el nombre que queremos darle a la librería (en mi caso he optado por JFreeChart-1.0.14).

En Library Type seleccionamos Class Libraries y pulsamos OK.

Ahora nuestra librería aparecerá en la lista izquierda de la ventana. Sólo nos queda añadir las referencias de la misma:

En la pestaña Classpath, pulsamos “Add JAR/Folder…” y seleccionamos los archivos jcommon y jfreechart, que se encuentran en la subcarpeta lib de JFreeChart:

Captura4

Captura5

En la pestaña Sources añadimos la subcarpeta source de JFreeChart:

Captura6

Si hemos seguido los pasos opcionales, tendremos generada la documentación en Javadoc, así que en en la pestaña Javadoc añadimos la subcarpeta Javadoc (no estará si no hemos generado la documentación, pero no es necesaria para el funcionamiento de la librería):

Captura7

Terminamos pulsando en OK, y ya tendremos todo instalado.

Para probar que todo funcione correctamente podemos utilizar el código que escribí para probarlo:

package jfcexample;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.data.general.DefaultPieDataset;

/**
*
* @author Manuel
*/
public class First {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
       
        // Creamos el DataSet
        DefaultPieDataset dataset = new DefaultPieDataset();
       
        // Establecemos unas categorías de ejemplo
        dataset.setValue("Ej1",43.2);
        dataset.setValue("Ej2",27.9);
        dataset.setValue("Ej1",79.5);
       
        // Creamos la tabla
        JFreeChart chart = ChartFactory.createPieChart(
                "Sample Pie Chart",
                dataset,
                true,
                true,
                false
                );
       
        // Mostramos la tabla
        ChartFrame frame = new ChartFrame("Test",chart);
        frame.pack();
        frame.setVisible(true);
    }
}

Si todo está correcto, al ejecutarlo deberíamos obtener lo siguiente:

Captura8

NOTA: Aunque si no seguimos los pasos opcionales no tendremos la documentación en Javadoc, siempre podemos consultarla online en la página oficial.