<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">

<channel>
	<title>Con G de GNU</title>
	
	<link>http://www.congdegnu.es</link>
	<description>aptitude install freedom</description>
	<lastBuildDate>Sat, 28 Jan 2012 19:22:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
	<copyright>2006-2007 </copyright>
	<managingEditor>congdegnu@gmail.com (Con G de GNU)</managingEditor>
	<webMaster>congdegnu@gmail.com (Con G de GNU)</webMaster>
	<image>
		<url>http://www.congdegnu.es/wp-content/plugins/podpress/images/powered_by_podpress.jpg</url>
		<title>Con G de GNU</title>
		<link>http://www.congdegnu.es</link>
		<width>144</width>
		<height>144</height>
	</image>
	<itunes:subtitle />
	<itunes:summary>aptitude install freedom</itunes:summary>
	<itunes:keywords />
	<itunes:category text="Society &amp; Culture" />
	<itunes:author>Con G de GNU</itunes:author>
	<itunes:owner>
		<itunes:name>Con G de GNU</itunes:name>
		<itunes:email>congdegnu@gmail.com</itunes:email>
	</itunes:owner>
	<itunes:block>no</itunes:block>
	<itunes:explicit>no</itunes:explicit>
	<itunes:image href="http://www.congdegnu.es/wp-content/plugins/podpress/images/powered_by_podpress_large.jpg" />
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/ConGDeGnu" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="congdegnu" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>BeagleBone: Primeros pasos</title>
		<link>http://www.congdegnu.es/2012/01/28/beaglebone-primeros-pasos/</link>
		<comments>http://www.congdegnu.es/2012/01/28/beaglebone-primeros-pasos/#comments</comments>
		<pubDate>Sat, 28 Jan 2012 16:35:31 +0000</pubDate>
		<dc:creator>Maxpowel</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Guias y manuales]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[arduino]]></category>
		<category><![CDATA[beagle]]></category>
		<category><![CDATA[beaglebone]]></category>
		<category><![CDATA[cloud9]]></category>

		<guid isPermaLink="false">http://www.congdegnu.es/?p=1362</guid>
		<description><![CDATA[Hola! Os voy a presentar el beagle bone. Seguro que muchos ya lo conocéis así que tras una breve introducción mostraré cómo dar los primeros pasos, que aunque sencillos, a veces te pueden hacer perder mucho tiempo. En resumidas cuentas Beagle Bone es un ordenador en pequeño pero con el que también puedes controlar hardware [...]]]></description>
			<content:encoded><![CDATA[<p>Hola! Os voy a presentar el beagle bone. Seguro que muchos ya lo conocéis así que tras una breve introducción mostraré cómo dar los primeros pasos, que aunque sencillos, a veces te pueden hacer perder mucho tiempo. En resumidas cuentas Beagle Bone es un ordenador en pequeño pero con el que también puedes controlar hardware externo a través de sus pines (como con arduino). Para que te hagas una idea, su procesador es un ARM A8 cortex que funciona a unos 700mhz (este dato  es sólo algo orientativo, otro día veremos cómo &#8220;comparar&#8221; procesadores) y cuenta con 256MB de RAM. Exacto, con todo eso puedes ejecutar un sistema operativo como el que tienes en tu ordenador (siempre y cuando exista para ARM que en el caso de Linux así es <img src='http://www.congdegnu.es/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p><div class="wp-caption alignright" style="width: 410px"><img src="http://www.adafruit.com/images/medium/beaglesticker_MED.jpg" alt="" width="400" height="308" /><p class="wp-caption-text">El logo es un adorable perrito</p></div></p>
<p>Es realmente pequeño, unos 9cm de largo y 5,5 de ancho (un poco más grande que arduino) y cuenta con un lector de trajetas microsd (donde metes el SO y lo que tu quieras), un host USB (para enchufarle camáras, teclados, ratones&#8230;), un conector RJ45 y un micro USB para conetarlo al PC.</p>
<p>Bien, no me enrrollo más. Todo esto que cuento ya lo han contado cientos de veces en otras páginas así que vamos al tema. Qué hacer cuando sacas el beaglebone de su caja.</p>
<p>&nbsp;</p>
<p>Lo primero que se me ocurre es conectarlo al PC por el microUSB y ver que pasa. Tras unos segundos (recuerda que tiene que iniciar el sistema operativo y eso lleva tiempo) el ordenador detectará un dispositivo de almacenamiento masivo mediante el cual podrás acceder a las particiones que tengas excepto la usada por beaglebone. Recuerda que en esa tarjeta de memoria también están los archivos del sistema operativo. Por defecto la tarjeta trae dos particiones, la que he comentado (que es un Angstrom Linux) y una FAT donde trae unos archivos de manual y drivers para windows y mac. En linux no te hará falta instalar nada.</p>
<p>Bien, ya sabemos que el cacharrito funciona, ahora vamos a hacer algo más divertido. Vamos a conectarnos por consola a nuestro beaglebone y a hozar un poco. Por supuesto también podrías enchufarle un monitor y un teclado pero para conectarle un monitor necesitas una shield (que es carilla) o fabricarla tu mismo.</p>
<p><span id="more-1362"></span>Para nuestra siguiente labor, en Linux tenemos que cargar un módulo a mano ya que no reconoce las uuid (he leído que en futuras versiones esto lo cambiarán). No es grave, lo hacemos con este comando</p>
<pre>sudo modprobe ftdi_sio vendor=0x0403 product=0xa6d0</pre>
<p>Sería un rollo poner esto siempre así que creamos un fichero llamado /etc/udev/rules.d/73-beaglebone.rules con el siguiente contenido</p>
<pre>ACTION=="add", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_interface", 
        ATTRS{idVendor}=="0403", ATTRS{idProduct}=="a6d0", 
        DRIVER=="", RUN+="/sbin/modprobe -b ftdi_sio"

ACTION=="add", SUBSYSTEM=="drivers", 
        ENV{DEVPATH}=="/bus/usb-serial/drivers/ftdi_sio", 
        ATTR{new_id}="0403 a6d0"

ACTION=="add", KERNEL=="ttyUSB*", 
	ATTRS{interface}=="BeagleBone", 
        ATTRS{bInterfaceNumber}=="00", 
	SYMLINK+="beaglebone-jtag"

ACTION=="add", KERNEL=="ttyUSB*", 
	ATTRS{interface}=="BeagleBone", 
        ATTRS{bInterfaceNumber}=="01", 
	SYMLINK+="beaglebone-serial"</pre>
<p>Ahora cada vez que enchufemos el beaglebone se detectara sin problema. Esto nos creara una interfaz en /dev/ttyUSBX donde X es un numero que depende de los cacharros que tengas conectados. Ahora ya sólo tenemos que conectarnos, para ello uso el comando screen de esta manera:</p>
<p>screen /dev/ttyUSB1 115200</p>
<p>El número 115200 es la velocidad de transmisión (simula un puerto serie). Si todo va bien, veremos algo como la siguiente imagen.</p>
<p><a href="http://www.congdegnu.es/wp-content/uploads/2012/01/consola1.png"><img class="aligncenter size-full wp-image-1365" src="http://www.congdegnu.es/wp-content/uploads/2012/01/consola1.png" alt="" width="565" height="186" /></a></p>
<p>El login por defecto es root y no tiene contraseña. Una vez dentro puedes manejarlo como un Linux cualquiera!</p>
<p>Ya tenemos control absoluto sobre nuestro aparatito. Sí, podríamos escribir programas en C, compilarlos y ejecutarlos (o pyhton o lo que te de la gana, incluso puedes tener tu servidor apache con php y conectarlo a tu LAN por el RJ45) pero vamos a utilizar una herramienta muy interesante que trae que se llama cloud9. Colud9 es un IDE que se ejecuta en un navegador. Está en el beagle bone y desde nuestro navegador accedemos, compilamos y ejecutamos programas. Todo ello sin instalar ningun software en nuestro ordenador y disponible en cualquier momento. Por defecto programaremos con este IDE como si lo haríamos con javascript (la sintaxis) que para quienes los conozcan se llama Node.js.</p>
<p>Como hemos conectado el beagle bone mediante USB, muchos servicios están desativados e incluso el procesador va a menos ciclos (a 500 en vez de 700). El motivo es que el USB no proporciona la energía necesaría. Para tener funcionando a pleno rendimiento tendríamos que usar la entrada de 5V. Pero queremos algo sencillo y que funcione ya así que crearemos una interfaz ethernet a través de USB. Calma, esto ya viene preparado de serie y es muy sencillo de hacer. Tan sólo tienes que desmontar la unidad de almacenamiento (que se llama BONE nosequé) y automáticamente se iniciará eso del ethernet por usb. Ojo, si te pasa como a mi y no se inicia nada después de desmontar la unidad de almacenamiento ejecuta el comando &#8220;eject&#8221; para forzarlo. En mi caso es &#8220;eject /dev/sdh&#8221;. En algunas distribuciones no hace falta, yo uso debian y me llevó un motón de tiempo averiguar por qué narices no funcionaba. Recuerda, si no va usas el comando eject y listo.</p>
<p>Ahora hacemos ifconfig y veremos una interfaz de red nueva. En mi caso se llama eth1 y tiene la IP 192.168.7.1. Esa es la IP que el beagle bone ve. Es una maravilla porque ello sólo se encarga de configurar todo. Si queremos conectarnos al beagle usaremos la dirección ip 192.168.7.2 desde nuestro PC. Si por lo que sea (nunca se sabe) ha cogido otra IP lo que tenemos que hacer es conectarnos por serie al beaglebone (como expliqué antes) y con ifconfig ver qué IP ha cogido. Con esta IP podemos hacer SSH al beagle o lo que queramos, la verdad es que es muy divertido. Ya sea por ssh o por serie nos conectamos al beaglebone y ejecutamos el comando &#8220;cloud9&#8243;. Tras unos segundos veremos el iconito de la nube con un 9 dentro y debajo pone:</p>
<p>&#8220;Project root is: /var/lib/cloud9<br />
Point your browser to http://localhost:3000&#8243;</p>
<p>Ya está listo. Vamos a nuestro navegador y accedemos a http://192.168.7.2:3000/ Cargará el IDE que además viene con unos ejemplos y en concreto uno llamado blink.js. Con este ejemplo haremos parpadear a un LED. Beagle bone cuenta con un chorro de pines de entrada/salida (Ojo que funcionan a 3.3V no a 5V así que ni se te ocurra conectarlo directamente a un arduino o aparatos que usen 5V. Si estás interesado busca sobre level shifter o pregúntame a mi <img src='http://www.congdegnu.es/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  )</p>
<p>Los bancos de pines se llaman P8 y P9 (está escrito en un lado). Ese ejemplo usa el pin 3 que está en el banco P8 (bone.P8_3). Si te fijas, en las cuatro esquinas de cada banco aparecen unos numeritos (en caso de P8 pone 2,1   46,45). Eso indica el número del pin. Hay un montón de pines diferentes y para usos diferentes y todo eso viene en la documentación oficial. Para encender un LED conectaremos el polo positivo (patita larga) al pin 3 y el negativo al pin 1 o 2 (son de masa, tierra o ground como quieras llamarlo). Ya sólo nos queda darle a &#8220;Run&#8221; y veremos como se enciende y apaga el LED. Si! Es la cosa más sencilla del mundo pero esto es sólo el principio! A partir de ahora puedes aplicar todos tus conocimientos para crear todo tipo de robots y autómatas!</p>
<p><a href="http://www.congdegnu.es/wp-content/uploads/2012/01/IMG_20120128_1713242.jpg"><img class="aligncenter size-full wp-image-1369" src="http://www.congdegnu.es/wp-content/uploads/2012/01/IMG_20120128_1713242.jpg" alt="" /></a></p>
<p>Por cierto, te recomendaría que apagues el beaglebone antes de desenchufarlo. Si estás habituado al arduino igual tienes la costumbre de desconectar directamente pero recuerda que esto es como tu ordenador., hay que es apagarlo correctamente (con el comando halt por ejemplo) antes de desenchufar. De la misma manera que con tu ordenador normal, si lo desconectas directamente podrías crear incogruencias en el sistema de ficheros o cortar un proceso importante del sistema operativo (de acuerdo, nunca pasa nada pero cuando pasa, pasa)</p>
<p>Por último, una foto con el arduino (si es necesario es hace una comparativa o algo entre ambas máquinas) o si necesitas más detalles o ayuda con el beagle bone tal vez pueda ayudarte.</p>
<p><a href="http://www.congdegnu.es/wp-content/uploads/2012/01/IMG_20120128_1715161.jpg"><img class="aligncenter size-full wp-image-1371" src="http://www.congdegnu.es/wp-content/uploads/2012/01/IMG_20120128_1715161.jpg" alt="" /></a></p>
<p>En mi caso ejecutaré OpenCV en mi robocoche y algun algoritmo más pesado de toma de decisiones (o una red neuronal). Ya os iré contando novedades <img src='http://www.congdegnu.es/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Nos vemos!</p>
<p>Edito par añadir un par de enlaces (en inglés).<br />
Documentación oficial: <cite>beagleboard.org/static/BONESRM_latest.pdf</cite></p>
<p>Guía oficial: http://www.beagleboard.org/static/beaglebone/a3/README.htm</p>
<div class="shr-publisher-1362"></div>

<p>Entradas relacionadas.</p>]]></content:encoded>
			<wfw:commentRss>http://www.congdegnu.es/2012/01/28/beaglebone-primeros-pasos/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Haz que tu sistema de ficheros “vuele” montándolo en la RAM</title>
		<link>http://www.congdegnu.es/2011/10/08/haz-que-tu-sistema-de-ficheros-vuele-montandolo-en-la-ram/</link>
		<comments>http://www.congdegnu.es/2011/10/08/haz-que-tu-sistema-de-ficheros-vuele-montandolo-en-la-ram/#comments</comments>
		<pubDate>Sat, 08 Oct 2011 12:07:58 +0000</pubDate>
		<dc:creator>Maxpowel</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[disco]]></category>
		<category><![CDATA[disco duro]]></category>
		<category><![CDATA[memoria]]></category>
		<category><![CDATA[ram]]></category>

		<guid isPermaLink="false">http://www.congdegnu.es/?p=1347</guid>
		<description><![CDATA[Hoy seré breve, o por lo menos lo intentaré. El caso es que necesitaba acceso masivo al disco duro para un procesamiento en lote de archivos de texto bastante grandes (quien me siga en twitter verá que el otro día lo mencioné ). El proble ma no eran los archivos en sí mismos ya que [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy seré breve, o por lo menos lo intentaré. El caso es que necesitaba acceso masivo al disco duro para un procesamiento en lote de archivos de texto bastante grandes (quien me siga en twitter verá que el otro día lo mencioné <img src='http://www.congdegnu.es/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ).</p>
<p><div class="wp-caption alignright" style="width: 168px"><img src="http://brico-garden.com/Hormigonera.jpg" alt="Hormigonera" width="158" height="161" /><p class="wp-caption-text">El ruido del disco duro era semejante al de esta maquina mezclando hormigón</p></div></p>
<p>El proble ma no eran los archivos en sí mismos ya que mediante buffers que gestiona el propios sistema operativo se consigue un rendimiento excelente, sino por la base de datos mysql. En mi caso, hacía currar a la base de datos de tal manera (con updates, inserts y selects constantes) que el disco duro parecía una hormigonera. Después de estimar el tiempo total de procesamiento en 6 horas pensé que eso le iba a hacer mucha pupa al disco duro duro (además del evidente cuello de botella) y que había que hacer algo. Entonces me dije: &#8220;Quiero almacenar los datos en algo que no haga ruido y si es posible que sea rápido&#8221; y eso amigos, es precisamente la memoria RAM. Así que vamos al tema.</p>
<p><span id="more-1347"></span>Lo bueno de usar este método es que no tienes que tocar nada ni de mysql ni de tu programa, ya que para ellos será un dispositivo de almacenamiento estándar. Ahora prepárate un café porque esto va a ser complicado.</p>
<pre>            mount -t tmpfs none /media/ramdisk</pre>
<p>Ya está, ahora tienes en el directorio /media/ramdisk montada tu memoria RAM. Por supuesto, se reserva sólo una parte ya que el sistema necesita disponer de memoria para funcionar.<br />
En mi caso, copié /var/lib/mysql a /media/ramdisk y luego un enlace simbólico para que mysql accediera a ello sin configurar nada.<br />
Si quieres saber exactamente cuanto espacio tienes puedes usar el comando:</p>
<pre>            df -h</pre>
<p>Te mostrará algo como esta línea (junto al resto de sistemas de ficheros montados)</p>
<pre>            none                  1,7G  384M  1,3G  24% /media/ramdisk</pre>
<p>Dispongo de 1,7GigaBytes de almacenamiento en memoria RAM (384 megas usados). Recueda que <strong>es muy importante</strong> guadar luego esos archivos en tu disco duro porque la memoria RAM no es  persistente y todo lo que haya se volatilizará cuando se demonte. En mi caso el tiempo de  ejecución del programa paso de unas 6 horas a poco más de 45 minutos, y  eso que mi memoria es lenta (667mhz) además de no hacer ningún ruido. Para casos o situaciones  concretas este método puede sernos muy útil, incluso he visto casos de  un servidor donde hasta los archivos estáticos (css, js, imagenes&#8230;)  estaban cargados en memoria. Si tenemos en cuenta que en un ordenador <strong>todo</strong> pasa por la memoria y que el disco duro es con diferencia el  dispositivo más lento (y delicado), se pueden obtener tiempos muy buenos  en sistemas críticos (ej. una web con millones de visitas). El problema  está cuando trabajamos con datos (que pueden cambiar, algo bastante común) y que nunca  estarán a salvo hasta que lo volquemos a un disco duro. Para esos casos ya existen las cachés que en el fondo es copiar en memoria aquellas cosas de sólo lectura mientras mientras que los cambios se guardan al momento y posteriormente se actualiza esa caché.</p>
<div class="shr-publisher-1347"></div>

<p>Entradas relacionadas:<ol><li><a href='http://www.congdegnu.es/2009/03/11/borra-tus-ficheros-de-manera-definitiva/' rel='bookmark' title='Permanent Link: Borra tus ficheros de manera definitiva'>Borra tus ficheros de manera definitiva</a> <small>Muchos somos conscientes de que borrar un archivo no implica...</small></li>
<li><a href='http://www.congdegnu.es/2009/02/08/eliminar-espacio-reservado-en-ext/' rel='bookmark' title='Permanent Link: Eliminar espacio reservado en ext'>Eliminar espacio reservado en ext</a> <small>Cuando formateamos una unidad en el sistema de ficheros ext,...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.congdegnu.es/2011/10/08/haz-que-tu-sistema-de-ficheros-vuele-montandolo-en-la-ram/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Juega a tu Nintendo 64 con tu mando de la Wii y arduino</title>
		<link>http://www.congdegnu.es/2011/08/29/juega-a-tu-nintendo-64-wiimote-arduino/</link>
		<comments>http://www.congdegnu.es/2011/08/29/juega-a-tu-nintendo-64-wiimote-arduino/#comments</comments>
		<pubDate>Mon, 29 Aug 2011 15:49:27 +0000</pubDate>
		<dc:creator>Maxpowel</dc:creator>
				<category><![CDATA[Guias y manuales]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[arduino]]></category>
		<category><![CDATA[n64]]></category>
		<category><![CDATA[nintendo]]></category>
		<category><![CDATA[ocarina of time]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[wii]]></category>
		<category><![CDATA[zelda]]></category>

		<guid isPermaLink="false">http://www.congdegnu.es/?p=1312</guid>
		<description><![CDATA[¿Alguna vez has pensado cómo sería jugar a tu juego favorito de tu nintendo 64 con un wiimote? Yo sí, quería dar espadazos con Link en Ocarina of Time y con la ayuda de mi querido arduino he podido cumplirlo!. Se que podría haber usado un emulador pero&#8230; donde queda el romanticismo? Antes de nada, [...]]]></description>
			<content:encoded><![CDATA[<p>¿Alguna vez has pensado cómo sería jugar a tu juego favorito de tu nintendo 64 con un wiimote? Yo sí, quería dar espadazos con Link en Ocarina of Time y con la ayuda de mi querido arduino he podido cumplirlo!. Se que podría haber usado un emulador pero&#8230; donde queda el romanticismo? <img src='http://www.congdegnu.es/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Antes de nada, os pongo un vídeo del resultado.</p>
<p><p><a href="http://www.youtube.com/watch?v=HBf7m3zylcA"><img src="http://img.youtube.com/vi/HBf7m3zylcA/2.jpg"></a></p>
<p><a href="http://www.youtube.com/watch?v=HBf7m3zylcA">Click here</a> to view the video on YouTube.</p>
</p>
<p>&nbsp;</p>
<p>Sí, ese es el menda jugando. ¿Te interesa saber cómo puedes hacerlo? Si es así sigue leyendo, de lo contrario sólo perderás tu tiempo.<span id="more-1312"></span></p>
<p>Lo primero y antes de nada tengo que decir que mi código del arduino es una vil copia del proyecto <a title="Gamecube to N64" href="https://github.com/brownan/Gamecube-N64-Controller">Gamecube-N64-Controller</a>. Ese proyecto permite jugar a la nintendo 64 con un mando de la gamecube. De ahí básicamente saqué el protocolo de comunicación y las funciones para &#8220;dialogar&#8221; con la n64 (que ya es bastante!!).</p>
<p>También tengo que aclarar que jugar con el wiimote es bastante más complicado. El stick del nunchuk es bastante mediocre comparado con el joystick de la nintendo 64 (para mi uno de los mejores que han existido), de ahí mi manqueo a la hora de apuntar a ganondorf con el arco. El segundo motivo es que el juego está preparado para responder a una única pulsación, entonces responderá sólo cuando hayamos terminado el movimiento lo cual implica movimientos &#8220;retardados&#8221;. Es mucho más rápido pulsar un botón que hacer el gesto del movimiento de la espada.</p>
<p>Ahora voy a explicar más o menos como funciona la cosa. Tenemos un mando de la wii con nunchuk y queremos jugar a la nintendo 64. El primer problema que se nos plantea es que el mando de la n64 va por cable mientras que el wiimote es inalámbrico. Mi solución ha sido usar el ordenador como pasarela: el wiimote se conecta al ordenador por bluetooth y luego el ordenador mediante usb al arduino, quien simula ser un mando de n64. Si quieres hacer algo más profesional siempre puedes usar el módulo bluetooth para arduino y desarrollar una biblioteca de comunicación. Llegados a este punto vemos que necesitamos dos programas, uno para el arduino y otro para el ordenador. Vamos a ello.</p>
<h2>Software para arduino</h2>
<p>Nuestro arduino va a ser simplemente un enlace sin ningún tipo de lógica. Nosotros le enviamos los datos y directamente se lo sirve a la consola sin nada de procesamiento (en el proyecto de gamecube que mencioné antes, el arduino realiza las operaciones necesarias para convertir los comandos). El motivo es para que sea más práctico, así sólo es necesario modificar le programa de ordenador si queremos hacer cualquier cambio. La función loop del programa arduino se ha reducido bastante, ya que al recibir los datos preparaditos para enviar no tiene que hacer más que eso (recibir datos del ordenador por el puerto serie y tal cual mandarlos a la consola).</p>
<p>&nbsp;</p>
<h2>Software para ordenador</h2>
<p>Utilizo la biblioteca cwiid desde python y en principio es multiplataforma (aunque sólo lo he probado en Linux). Doy por supuesto que tienes un dispositivo bluetooth funcionando y el software de arduino instalado. Este programa python también es sencillo. Lo que hace es conectarse al mando de la wii (usando cwiid), obtener las pulsaciones de botones y mandarlas al arduino. La verdad es que, sabiendo el protocolo del mando es muy sencillo pero llegar a manejar bien un protocolo cerrado de esos es un infierno. Voy a tratar de explicar (sin detalles técnicos) un poco como funciona.</p>
<h3>Funcionamiento del mando de nintendo 64</h3>
<p>La consola puede mandar 4 tipos de comandos diferentes al mando. Estos son de identificación, de estado, de lectura y de escritura. Los dos últimos, hasta lo que yo se (recordemos que es un protocolo cerrado y vete tu a saber que más cosas hace) es para gestionar el rumble pack (un aparato que hace al mando vibrar). Cuando encendemos la consola, ésta manda el comando de identificación al que los mandos conectados (en nuestro caso el arduino) y éstos deben responder. Si no, la consola nos mostrará un bonito &#8220;NO CONTROLLER&#8221;. Por último, la consola nos manda el comando de estado cuando necesita saber que botones estamos pulsando. Cuando la consola nos pregunte por el estado nosotros respondemos. Al contrario de lo que mucha gente pueda pensar, no es el mando quien manda información todo el rato a la consola, sino que es la consola quién pregunta al mando todo el rato que botones hay pulsados. Nuestra labor va a ser que cuando la consola pregunte por esa información el arduino se la entregue.</p>
<p>Ahora veamos qué información es la que mandamos. El paquete con toda la información sobre el estado del mando (los botones pulsados) son 4 Bytes. De estos 4 Bytes, los dos primeros expresan el estado de los botones y los dos últimos la posición del joystick. Para el caso de los botones es bien sencillo, bit a 1 boton pulstado y bit a 0 boton no pulsado. De esta manera con 2 Bytes podemos representar 16 botones y como la consola tiene 14 pues incluso son sobran 2 bits. El contenido exacto de los bytes es este:</p>
<p>Byte 1: A, B, Z, Start, PadArriba, PadAbajo, PadIzquierda, PadDerecha</p>
<p>Entonces si tenemos pulsado el botón A, el primer byte será: 1 0 0 0 0 0 0 0, si pulsamos A y Z será: 1 0 1 0 0 0 0 0. Sencillo de entender, verdad?<br />
El segundo byte contiene: 0, 0, BotonL, BotonR, C-Arriba, C-Debajo, C-Izquierda, C-derecha<br />
Como dije antes nos sobran dos bits, que son esos dos primero bits que siempre valen 0.</p>
<p>Por último nos quedan los bytes para el joystick, el byte 3 contiene la posición X y el byte 4 la posición Y. Para representarlo se utiliza un byte con signo más o menos desde -80 a 80. Esto es muy importante ya que cuando mandemos la información en binario hay que tener muy claro lo que mandamos para que todo funcione bien y de manera sencilla (por eso en el programa python, al empaquetar los bytes los primero con con <strong>B</strong>, unsigned char, y los dos último son <strong>b</strong>, signed char). Nosotros generaremos ese paquete de 4Bytes y por el puerto serie se lo mandaremos al arduino.</p>
<p>Ya conocemos la teoría así que a programar. Yo he elegido python pero puedes usar el que te de la gana siempre y cuando generes bien esos 4 Bytes. El programa de arduino te servirá igual.</p>
<h2>Obtener el código fuente</h2>
<p>El código fuente lo he subido a github y por supuesto con licencia GPL. Puedes clonarlo usando esta dirección <a title="Video" href="https://github.com/maxpowel/Wii-N64-Controller" target="_blank">https://github.com/maxpowel/Wii-N64-Controller</a><br />
Si ves algun fallo o quieres compartir una configuración de botones (sobretodo es interesante el tema del acelerómetro del wiiomte) te agradecería que me hicieras un pull request <img src='http://www.congdegnu.es/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>&nbsp;</p>
<h2>Montaje</h2>
<p>Material:</p>
<ul>
<li>Arduino (y su cable USB)</li>
<li>2 Cablecitos</li>
<li>Nintendo 64</li>
<li>Ordenador</li>
<li>Bluetooth</li>
</ul>
<p>Supongo que no tendrás problemas para conectar tu arduino y bluetooth a tu PC. El siguiente paso es conectar el cable de tierra de la conexión del mando a un pin de tierra del arduino usando uno de los cablecitos. El otro cable es para unir el pin 8 (puedes usar el pin que quieras, pero en el código uso el 8 ) con el de datos de la consola. El esquema de pines del mando es el siguiente:</p>
<ol>
<li>+3.3V &#8211; Alimentación. No lo usamos ya que el arduino tiene su propia alimentación.</li>
<li>Datos &#8211; Conectado con el pin digital 8</li>
<li>GND &#8211; Conectado a un pin de tierra de arduino</li>
</ol>
<p><strong>Nota:</strong> Recuerda que este es el esquema del <strong>mando</strong> y el de la consola quedará espejado (mirando de frente a la consola se usan los dos pines de la derecha). Espero no haberte líado con esto</p>
<p><img class="alignnone" src="https://github.com/maxpowel/Wii-N64-Controller/raw/master/connections.png" alt="" width="136" height="151" /></p>
<p>Como nota, decir que siempre hay que encender primero el arduino antes que la consola ya que de otra manera no detectará ningún mando. Recuerda lo que dije antes de que la consola cuando se enciende &#8220;pregunta&#8221; a los mandos para ver qué hay conectado.</p>
<p>Para terminar un pequeño vídeo de como tengo montado el tinglao.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><p><a href="http://www.youtube.com/watch?v=1a5wc_V0vO0"><img src="http://img.youtube.com/vi/1a5wc_V0vO0/2.jpg"></a></p>
<p><a href="http://www.youtube.com/watch?v=1a5wc_V0vO0">Click here</a> to view the video on YouTube.</p>
</p>
<div class="shr-publisher-1312"></div>

<p>Entradas relacionadas.</p>]]></content:encoded>
			<wfw:commentRss>http://www.congdegnu.es/2011/08/29/juega-a-tu-nintendo-64-wiimote-arduino/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Spinners en Android, tres formas de poblarlos.</title>
		<link>http://www.congdegnu.es/2011/06/02/spinners-en-android-tres-formas-de-poblarlos/</link>
		<comments>http://www.congdegnu.es/2011/06/02/spinners-en-android-tres-formas-de-poblarlos/#comments</comments>
		<pubDate>Thu, 02 Jun 2011 17:24:42 +0000</pubDate>
		<dc:creator>DiCrEn</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[combobox]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[poo]]></category>
		<category><![CDATA[spinner]]></category>

		<guid isPermaLink="false">http://www.congdegnu.es/?p=1276</guid>
		<description><![CDATA[¿Hola? ¿Hay alguien? Soy yo, DiCrEn, me recordarán por antiguos posts&#8230; de hace 2 años aproximadamente (sin contar con los de GPodcast). Por aquel entonces yo era un alegre jovenzuelo que se creía Dios por programar el snake con C, pero todo eso ha cambiado, ese jovenzuelo ha madurado, ha estudiado y ahora&#8230; se cree [...]]]></description>
			<content:encoded><![CDATA[<p>¿Hola? ¿Hay alguien? Soy yo, DiCrEn, me recordarán por antiguos posts&#8230; de hace 2 años aproximadamente (sin contar con los de GPodcast). Por aquel entonces yo era un alegre jovenzuelo que se creía Dios por programar el <a href="http://www.congdegnu.es/2008/12/02/snake-con-ncurses/">snake con C</a>, pero todo eso ha cambiado, ese jovenzuelo ha madurado, ha estudiado y ahora&#8230; se cree Dios por tener <a href="https://market.android.com/details?id=com.dicren.randomring&amp;feature=search_result">un</a> <a href="https://market.android.com/details?id=com.dicren.munchkinmetro&amp;feature=search_result">par</a> de aplicaciones en el <a href="https://market.android.com/">Android Market</a> <img src='http://www.congdegnu.es/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Me he propuesto volver a tener un poquito de continuidad en el blog, cosa que, por supuesto, no conseguiré, pero bueno&#8230;</p>
<p>Y dicho esto vamos a lo que vamos, los spinners de Android. Vamos a dejarnos de gilipolleces y vamos al tema,  imagino que tendrás instalado el SDK de android, el eclipse, etc, y que hayas hecho algo para el S.O. de google. Si no es así esto te va a interesar más bien poco.<br />
<span id="more-1276"></span></p>
<h1><strong>¿Que son los spinners?</strong></h1>
<p>Los spinners en Android son los combobox de toda la vida. Spinner significa, según el traductor de google, hilandero. ¿Porque google ha decidido llamarlo así y no combobox como se ha hecho toda la vida? Y yo que sé. Voy a suponer, de nuevo, que has programado para Android y que sabes cómo se hacen las activitys y demás. Si no lo sabes busca por internet que manuales para empezar hay a patadas.</p>
<p>Para rellenar los spinners es un poquillo complejo, al final todo se arregla picando código, pero si quieres hacer algo especifico (como me pasó a mí, de hecho hay cosas que aún no he sabido arreglar) pues tiene su miga.</p>
<p>Vamos a lo básico. Para crear los objetos de los views en android se hace con <strong>findViewById.</strong></p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">Spinner prueba <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>Spinner<span style="color: #009900;">&#41;</span> findViewById<span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">id</span>.<span style="color: #006633;">spinner1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Ya tenemos el objeto de nuestro spinner.  Ahora para poblarlo usamos un <strong>ArrayAdapter</strong>. Voy a comentar tres formas de hacerlo, dos de ellas bastante populares por internet, poblarla desde un archivo xml de arrays y desde la base de datos SQLite de Android, y una no tan popular pero bastante útil (y más compleja). Después de esto comentaré como obtener los datos elegidos por el usuario y porque me gusta más el tercer método para según qué cosas.</p>
<h1>Poblando Spinners</h1>
<h2>Desde arrays.xml</h2>
<p>Bien amigos, para esto necesitamos un archivo arrays.xml con los textos que queramos rellenar en el spinner y un par de líneas de código. El archivo arrays.xml, situado en res/values, tiene el siguiente formato.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;utf-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;resources<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;string-array</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;comidas&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Salchichas<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Huevos<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Tomates<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/string-array<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/resources<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Bien, una vez que tengamos esto vamos a nuestro activity en java y utilizamos el siguiente código que explicaré después.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//Creamos el adaptador</span>
ArrayAdapter<span style="color: #339933;">&lt;</span>CharSequence<span style="color: #339933;">&gt;</span> adapter <span style="color: #339933;">=</span> ArrayAdapter.<span style="color: #006633;">createFromResource</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>,R.<span style="color: #006633;">array</span>.<span style="color: #006633;">comidas</span>,android.<span style="color: #006633;">R</span>.<span style="color: #006633;">layout</span>.<span style="color: #006633;">simple_spinner_item</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//Añadimos el layout para el menú</span>
adapter.<span style="color: #006633;">setDropDownViewResource</span><span style="color: #009900;">&#40;</span>android.<span style="color: #006633;">R</span>.<span style="color: #006633;">layout</span>.<span style="color: #006633;">simple_spinner_dropdown_item</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//Le indicamos al spinner el adaptador a usar</span>
prueba.<span style="color: #006633;">setAdapter</span><span style="color: #009900;">&#40;</span>adapter<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Analicemos línea por línea. </p>
<p>En la primera creamos un <strong>ArrayAdapter</strong>. Tenemos que indicar entre <> el tipo de objeto que irá dentro del ArrayAdapter para evitar warnings y mejorar la legibilidad del código, en este caso CharSequence. </p>
<p>Este ArrayAdapter lo creamos pasándole como parámetros el contexto, que lo pasamos directamente con this (en otros casos tendrás que hacer un getApplicationContext() ) la referencia a las cadenas de texto que queremos y el layout genérico que proporciona Android para los Spinners.</p>
<p>Con la siguiente línea indicamos el layout, de nuevo genérico de Android, para crear el menú desplegable.</p>
<p>Por último, le añadimos al objeto del spinner el adaptador.</p>
<p>Una vez hecho esto ya tenemos nuestro precioso Spinner listo para entrar al campo a jugar. Vamos a complicarlo un poco más.</p>
<h2>Desde SQLite</h2>
<p>Android proporciona para nuestro deleite personas una base de datos SQLite. Aquí es posible que tengamos los datos que necesitamos para poblar nuestro Spinner. Vamos a ello.</p>
<p>Me ahorro el explicar cómo crear una base de datos SQLite en android, si necesitáis información sobre cómo manejarla ya sabéis, internet tiene la respuesta, solo diré que está abierta en el objeto baseDatos, que la tabla donde están los datos  se llama comidas y la columna con lo que lo vamos a poblar nombres, además de una id.<br />
Vamos con el código.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//Creamos el cursor</span>
<span style="color: #003399;">Cursor</span> c <span style="color: #339933;">=</span> baseDatos.<span style="color: #006633;">rawQuery</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;select id AS _id, nombre from comidas&quot;</span>, <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//Creamos el adaptador</span>
SimpleCursorAdapter adapter2 <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> SimpleCursorAdapter<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>,android.<span style="color: #006633;">R</span>.<span style="color: #006633;">layout</span>.<span style="color: #006633;">simple_spinner_item</span>,c,<span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#123;</span><span style="color: #0000ff;">&quot;nombre&quot;</span><span style="color: #009900;">&#125;</span>,    <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#123;</span>android.<span style="color: #006633;">R</span>.<span style="color: #006633;">id</span>.<span style="color: #006633;">text1</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
<span style="color: #666666; font-style: italic;">//Añadimos el layout para el menú</span>
adapter2.<span style="color: #006633;">setDropDownViewResource</span><span style="color: #009900;">&#40;</span>android.<span style="color: #006633;">R</span>.<span style="color: #006633;">layout</span>.<span style="color: #006633;">simple_spinner_dropdown_item</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//Le indicamos al spinner el adaptador a usar</span>
prueba.<span style="color: #006633;">setAdapter</span><span style="color: #009900;">&#40;</span>adapter2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Veamos, con el cursor hacemos un Query a la base de datos. Aquí hay un detalle importante, para que esto funcione necesitamos que la columna del identificador se llame _id, pero, no sé por qué, si la llamas así en la base de datos y luego haces un select normal no funciona, cosas de google (¿un bug?). Con AS funciona estupendamente. El segundo parámetro es para parámetros de selección, como no queremos nada pues le ponemos null.</p>
<p>Vayamos con el adaptador, que tiene tela. Creamos el adaptador en base a un cursor. Los parámetros son el contexto y el layout por defecto, como en el caso anterior, el cursor que hemos creado en la línea anterior, un array de String donde le indicamos que columna es la que tiene que tomar para mostrarlo y de nuevo otro layout por defecto que, sinceramente, no sé muy bien que hace.</p>
<p>Las otras dos líneas son iguales que en el caso del arrays.xml. Así de sencillo, ya tenemos un spinner que nos mostrará los registros de nuestra base de datos. Ahora vamos a complicarlo un poquito más.</p>
<h2>Desde un objeto</h2>
<p>En ocasiones necesitamos poblar el Spinner con elementos que no están en SQLite o en un array, como puede ser elementos que nos vengan desde una conexión a una base de datos, creados dinámicamente, o lo que sea.</p>
<p>Veamos los ingredientes; un spinner, que ya tenemos, una clase que genere los objetos que queramos, con su toString sobrescrito, unas cuantas líneas similares a las anteriores y sazonar al gusto.</p>
<p>Vamos con la clase de los objetos, que no tiene mucho misterio, pero bueno.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ObjetosClase<span style="color: #009900;">&#123;</span>
	<span style="color: #000066; font-weight: bold;">int</span> id<span style="color: #339933;">;</span>
	<span style="color: #003399;">String</span> nombre<span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">//Constructor</span>
	<span style="color: #000000; font-weight: bold;">public</span> ObjetosClase<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> id, <span style="color: #003399;">String</span> nombre<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">super</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">id</span> <span style="color: #339933;">=</span> id<span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">nombre</span> <span style="color: #339933;">=</span> nombre<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> toString<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> nombre<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> getId<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> id<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Creo que está claro, no hay que explicarlo. El getId lo usaremos en el siguiente punto, paciencia. Vale, ahora a crear el spinner.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//Creamos la lista</span>
LinkedList<span style="color: #339933;">&lt;</span>ObjetosClase<span style="color: #339933;">&gt;</span> comidas <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> LinkedList<span style="color: #339933;">&lt;</span>ObjetosClase<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//La poblamos con los ejemplos</span>
comidas.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> ObjetosClase<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span>, <span style="color: #0000ff;">&quot;Salchichas&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
comidas.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> ObjetosClase<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2</span>, <span style="color: #0000ff;">&quot;Huevos&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
comidas.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> ObjetosClase<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3</span>, <span style="color: #0000ff;">&quot;Tomate&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//Creamos el adaptador</span>
ArrayAdapter<span style="color: #339933;">&lt;</span>ObjetosClase<span style="color: #339933;">&gt;</span> spinner_adapter <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ArrayAdapter<span style="color: #339933;">&lt;</span>ObjetosClase<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>, android.<span style="color: #006633;">R</span>.<span style="color: #006633;">layout</span>.<span style="color: #006633;">simple_spinner_item</span>, comidas<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//Añadimos el layout para el menú y se lo damos al spinner</span>
spinner_adapter.<span style="color: #006633;">setDropDownViewResource</span><span style="color: #009900;">&#40;</span>android.<span style="color: #006633;">R</span>.<span style="color: #006633;">layout</span>.<span style="color: #006633;">simple_spinner_dropdown_item</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
prueba.<span style="color: #006633;">setAdapter</span><span style="color: #009900;">&#40;</span>spinner_adapter<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Si controlas un poco de java ves que he creado un nuevo LinkedList y he metido ahí los objetos con las 3 comidas que estamos utilizando.</p>
<p>Después he creado el ArrayAdapter como en el primer caso, solo que esta vez lo hemos creado pasándole el LinkedList. Fijaos que en este caso creamos el ArrayAdapter como cualquier objeto, y que en el primer caso utilizábamos el método estático createFromResource.</p>
<p>El resto ya lo conocemos de sobra. Ya tenemos nuestro spinner con nuestros objetos personalizados. Recordad que lo que toma como nombre es lo que está indicado en el toString.</p>
<h1>Obteniendo el dato seleccionado</h1>
<p>Ahora que ya tenemos nuestro spinner lleno de datos necesitamos conocer que dato elije el usuario. Para ello tenemos que crear un oyente. En este caso vamos a construirlo para el tercer modo de creación, para obtener el id, para el resto sería igual pero sustituyendo en la línea 4 el código, obteniendo el item y haciéndole toString directamente.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> MyOnItemSelectedListener <span style="color: #000000; font-weight: bold;">implements</span> OnItemSelectedListener <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> onItemSelected<span style="color: #009900;">&#40;</span>AdapterView<span style="color: #339933;">&lt;?&gt;</span> parent, <span style="color: #003399;">View</span> view, <span style="color: #000066; font-weight: bold;">int</span> pos,<span style="color: #000066; font-weight: bold;">long</span> id<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>parent.<span style="color: #006633;">getId</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> R.<span style="color: #006633;">id</span>.<span style="color: #006633;">spinner1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			alimentoId <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>ObjetosClase<span style="color: #009900;">&#41;</span> parent.<span style="color: #006633;">getItemAtPosition</span><span style="color: #009900;">&#40;</span>pos<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getId</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #666666; font-style: italic;">//Podemos hacer varios ifs o un switchs por si tenemos varios spinners.</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> onNothingSelected<span style="color: #009900;">&#40;</span>AdapterView<span style="color: #339933;">&lt;?&gt;</span> parent<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// Do nothing.</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Perfecto, ahora en cuanto un usuario pulse una opción de nuestro spinner se guardará en la variable alimentoId el id de nuestra comida escogida.</p>
<p>Como podéis ver, utilizando nuestros propios objetos es mucho más sencillo recuperar los datos. Podemos crear objetos relativamente grandes, con varios datos, y obtenerlos y tratarlos como queramos en el oyente. Estoy casi seguro que con el primer método también se podría sacar el id (o lo que queramos) de forma muy similar, pero no lo he conseguido.</p>
<p>Bueno hasta aquí el post. Perdonad el largor o longanismo de este, pero seguro que a más de uno le sirve.</p>
<div class="shr-publisher-1276"></div>

<p>Entradas relacionadas.</p>]]></content:encoded>
			<wfw:commentRss>http://www.congdegnu.es/2011/06/02/spinners-en-android-tres-formas-de-poblarlos/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Conferencia/taller sobre Opensocial en Pallantia</title>
		<link>http://www.congdegnu.es/2011/04/27/conferenciataller-sobre-opensocial-en-pallantia/</link>
		<comments>http://www.congdegnu.es/2011/04/27/conferenciataller-sobre-opensocial-en-pallantia/#comments</comments>
		<pubDate>Wed, 27 Apr 2011 21:46:44 +0000</pubDate>
		<dc:creator>Maxpowel</dc:creator>
				<category><![CDATA[Mundo real]]></category>
		<category><![CDATA[conferencia]]></category>
		<category><![CDATA[opensocial]]></category>
		<category><![CDATA[palencia]]></category>
		<category><![CDATA[pallantia]]></category>
		<category><![CDATA[party]]></category>
		<category><![CDATA[taller]]></category>

		<guid isPermaLink="false">http://www.congdegnu.es/?p=1266</guid>
		<description><![CDATA[Buenas! Simplemente os quería informar de que el próximo sábado imparto una conferencia y posteriomente un taller sobre el estándar de redes sociales Opensocial. El evento se desarrolla dentro de la party Pallantia en red (a la que todavía os podéis apuntar si queréis ) en Palencia. La entrada a la conferencia es libre y [...]]]></description>
			<content:encoded><![CDATA[<p>Buenas!</p>
<p>Simplemente os quería informar de que el próximo sábado imparto una conferencia y posteriomente un taller sobre el estándar de redes sociales Opensocial. El evento se desarrolla dentro de la party <a href="http://www.pallantiaenred.com/">Pallantia en red</a> (a la que todavía os podéis apuntar si queréis <img src='http://www.congdegnu.es/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ) en Palencia. La entrada a la conferencia es libre y también se puede seguir en directo online (desde la web http://www.pallantiaenred.com/).</p>
<p>En el taller se también se hará una demostración de Wixet, un software que soporta gadgets Opensocial desarrollado por el menda lerenda.</p>
<p>La conferencia será para &#8220;todos los públicos&#8221; dónde el único requisito es interés o curiosidad por opensocial. En cambio, el taller es de carácter técnico y sólo sería recomendable para aquellos con nociones de programación (salvo que quieras aburrirte un buen rato). El taller consistirá básicamente en realizar una aplicación opensocial haciendo un uso básico pero completo del API. La intención del taller es simplemente iniciar a los asistentes a desarrollar aplicaciones Opensocial (muchas veces el primer empujón es muy importante).</p>
<p>Un saludo y a ver si todo sale bien!</p>
<div class="shr-publisher-1266"></div>

<p>Entradas relacionadas.</p>]]></content:encoded>
			<wfw:commentRss>http://www.congdegnu.es/2011/04/27/conferenciataller-sobre-opensocial-en-pallantia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

