<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>Obsoletos &#187; Nuestros hacks</title>
	<atom:link href="http://www.obsoletos.org/category/hacks/nuestroshacks/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.obsoletos.org</link>
	<description>¿Seguro que necesitas ese nuevo gadget?</description>
	<lastBuildDate>Thu, 02 Feb 2012 12:44:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
<image>
  <link>http://www.obsoletos.org</link>
  <url>http://obsoletos.org/favicon.ico</url>
  <title>Obsoletos</title>
</image>
		<item>
		<title>Detector de movimiento sobre un ATMega88</title>
		<link>http://www.obsoletos.org/2010/03/detector-de-movimiento-sobre-un-atmega88/</link>
		<comments>http://www.obsoletos.org/2010/03/detector-de-movimiento-sobre-un-atmega88/#comments</comments>
		<pubDate>Tue, 09 Mar 2010 16:31:46 +0000</pubDate>
		<dc:creator>cogollo</dc:creator>
				<category><![CDATA[Hackeos e ideas]]></category>
		<category><![CDATA[Nuestros hacks]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[ATMega88]]></category>
		<category><![CDATA[microcontroladores]]></category>
		<category><![CDATA[PIR]]></category>
		<category><![CDATA[programación]]></category>

		<guid isPermaLink="false">http://www.obsoletos.org/?p=2882</guid>
		<description><![CDATA[Como mi último post se alargó más de la cuenta, dejé pendiente la implementación del sensor de presencia mediante nuestra nueva plataforma de desarrollo. Bueno, pues ya va tocando. Por si ya lo has olvidado, vamos a montar un sistema que detecta la presencia de gente mediante un PIR. Si hay alguien presente enciende unas [...]]]></description>
			<content:encoded><![CDATA[<p>Como <a href="http://www.obsoletos.org/2010/01/plataforma-de-desarrollo-practica-y-barata-para-microcontroladores/">mi último post</a> se alargó más de la cuenta, dejé pendiente la implementación del sensor de presencia mediante nuestra nueva plataforma de desarrollo. Bueno, pues ya va tocando.</p>
<p>Por si ya lo has olvidado, vamos a montar un <strong>sistema que detecta la presencia de gente</strong> mediante un <a href="http://en.wikipedia.org/wiki/Passive_infrared_sensor">PIR</a>. Si hay alguien presente enciende unas luces paulatinamente hasta llegar a su máximo de intensidad y después, tras un cierto tiempo sin que se detecte a nadie, las apaga también paulatinamente. Aquí tienes el vídeo otra vez:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="300" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=7417051&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="400" height="300" src="http://vimeo.com/moogaloop.swf?clip_id=7417051&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Para completar este magnífico artefacto necesitarás montar unos pocos &#8220;periféricos&#8221; además de la placa con el micro. Veámoslos uno por uno después del salto.</p>
<p><span id="more-2882"></span></p>
<p><strong>Selector de tiempo</strong></p>
<ul>
<li>Un <a href="http://es.wikipedia.org/wiki/Potenci%C3%B3metro">potenciómetro</a> (entre 10KΩ y 1MΩ todo vale).</li>
<li>Cable plano de 3 conductores (de nuevo, los viejos cables IDE vienen muy bien para esto).</li>
<li>Una tira de pines macho.</li>
</ul>
<p>Lo que queremos hacer con esto es conectar las dos patas exteriores del potenciómetro a 0 y 5 V respectivamente. De esta manera el voltaje que obtengamos en la pata central (que está conectada electricamente al cursor del potenciómetro) será proporcional al ángulo que tenga e l cursor en es momento. Esto es, si giramos el cursor todo a la izquierda tendremos 0V en la pata central. Si lo giramos todo a la derecha tendremos 5V. Y en las posiciones intermedias tendremos un valor proporcional al de su posición.</p>
<p>Luego, conectaremos este selector al puerto de sensores y nuestro software se encargará de leer periódicamente el valor del voltaje para determinar cuanto tiempo tiene que esperar sin detectar a nadie antes de ponerse a apagar las luces. De este modo podremos ajustar dicho tiempo en directo como quien cambia el volumen de la tele.</p>
<p>El esquema del circuito es este:</p>
<p><a href="http://www.obsoletos.org/wp-content/uploads/2010/02/potSensor.png"><img class="aligncenter size-medium wp-image-3035" title="Conexión potenciometro" src="http://www.obsoletos.org/wp-content/uploads/2010/02/potSensor-235x176.png" alt="" width="235" height="176" /></a></p>
<p>Y este es el aspecto del sensor una vez terminado. Nada espectacular.</p>
<p><a href="http://www.obsoletos.org/wp-content/uploads/2009/11/P1090335.JPG"><img class="aligncenter size-large wp-image-2692" title="Potenciometro con conector" src="http://www.obsoletos.org/wp-content/uploads/2009/11/P1090335-500x375.jpg" alt="Potenciometro con conector" width="500" height="375" /></a></p>
<p>Fijate que he quitado el pin que va entre GND y 5V para que el hueco coincida con el agujero que hay &#8220;tupido&#8221; en el puerto de sensores. En este caso usé pines acodados, pero he descubierto que es más cómodo si usas pines rectos normales.</p>
<p><strong>Sensor de presencia</strong></p>
<ul>
<li>Un sensor PIR (Los hay de muchos tipos, nosotros estamos usando <a href="http://www.rapidonline.com/Electronic-Components/Sensors/PIR-Sensors/Passive-infrared-motion-sensors/32112/kw/sensor+PIr">éstos</a>).</li>
<li>Una resistencia de 100KΩ.</li>
<li>Cable plano de 3 conductores.</li>
<li>Tira de pines macho.</li>
</ul>
<p>Para que nos entendamos, los sensores PIR son una especie de cámara de muy baja resolución que sólo puede ver el infrarrojo. Como las personas (y los seres vivos en general) están más calientes que su entorno &#8220;brillan&#8221; (en el infrarrojo) más que el fondo. Cuando un PIR detecta ese cambio en el brillo en alguna zona de su campo de visión asume que tiene a alguien delante.</p>
<p>El alcance y el ángulo de visión de un PIR varían mucho según  el modelo. Lo normal es que el alcance esté entre los 2&#8217;5 y los 10 metros, y que el ángulo se encuentre entre los 30º y los 100º.</p>
<p>Los modelos que estoy usando tienen tres pines. Uno va a tierra (GND), otro a 5V para la alimentación (Vdd) y el tercero nos da la salida del sensor (OUT). El voltaje que midamos en este pin será 5 V cuando no hay nadie presente y 0V cuando se detecte a alguien (ojo, ya ves que la salida esta invertida).<a href="http://www.obsoletos.org/wp-content/uploads/2010/01/PIRPinout.jpg"><img class="aligncenter size-full wp-image-2884" title="PIRPinout" src="http://www.obsoletos.org/wp-content/uploads/2010/01/PIRPinout.jpg" alt="PIRPinout" width="400" height="300" /></a>Por último, aunque no lo pone en la hoja de datos de estos PIRs, parece que es necesario utilizar una resistencia pull-down de 100KΩ entre la salida y tierra para que la señal sea lo bastante limpia.</p>
<p>Dicho lo cual, aquí tienes el esquema del circuito y una fotico con el resultado:</p>
<p style="text-align: left;"><a href="http://www.obsoletos.org/wp-content/uploads/2010/02/PIRSensor.png"><img class="size-medium wp-image-3033 alignleft" title="Conexión sensor PIR" src="http://www.obsoletos.org/wp-content/uploads/2010/02/PIRSensor-235x176.png" alt="" width="235" height="176" /></a><a href="http://www.obsoletos.org/wp-content/uploads/2009/11/P1090334.JPG"><img class="aligncenter size-medium wp-image-2691" title="Sensor PIR con conector" src="http://www.obsoletos.org/wp-content/uploads/2009/11/P1090334-235x176.jpg" alt="" width="235" height="176" /></a></p>
<p><strong>Cable de comunicaciones</strong></p>
<ul>
<li> Cable plano de 10 hilos.</li>
<li>Dos conectores hembra de cable plano de 10 hilos</li>
</ul>
<p>Este es el tipo de cable que necesitaremos, en general, para conectar nuestros periféricos a la &#8220;placa base&#8221;. Solo tienes que ponerle los conectores en los extremos. Normalmente la gente usa herramientas especiales para cerrar bien los conectores, pero yo lo he estado haciendo golpeándolos con un mazo de goma y sale bastante bien. Lo único es que tienes que ir poco a poco, por que si un lado del conector se encaja más rápidamente que el otro se pueden partir las pestañas que hacen que se mantenga todo unido. También he ocluido los agujeros que corresponderian a los pines que faltan en los puertos de entrada/salida para que no se pueda colocar el cable incorrectamente.</p>
<p><a href="http://www.obsoletos.org/wp-content/uploads/2009/11/P1090333.JPG"><img class="aligncenter size-medium wp-image-2690" title="Cable conexion plano 9 pines" src="http://www.obsoletos.org/wp-content/uploads/2009/11/P1090333-235x176.jpg" alt="Cable conexion plano 9 pines" width="235" height="176" /></a></p>
<p><strong>Distribuidor</strong></p>
<ul>
<li>Pines machos dobles.</li>
<li>Pines hembra acodados.</li>
</ul>
<p>Pues sí, tener 4 pines de entrada/salida agrupados en un solo conector está muy bien cuando vas a necesitarlos todos a la vez, cuando quieres &#8220;hablar&#8221; <a href="http://www.iearobotics.com/proyectos/cuadernos/ct1/ct1.html">en serie</a> con un dispositivo o controlar un pequeño motor. Pero, ¿qué pasa si solo quieres encender una luz? O mejor: dos luces, separadas entre sí, y controladas cada una por un pin distito del microcontrolador. En estos casos, necesitamos una plaquita que nos permita separar las señales y dirigir cada una a su destino final.</p>
<p>Estas placas presenta en un lado un conector donde enchufaremos el extremo final del cable de comunicaciones y en los otros lados entre 1 y 4 conectores más pequeños hasta donde llevan las 4 señales de datos individuales y el voltaje de alimentación.</p>
<p>En este proyecto vamos a usar solamente una señal, pero aquí tienes tambien el esquema del distribuidor para dos señales que seguro que viene bien en el futuro.</p>
<p><a href="http://www.obsoletos.org/wp-content/uploads/2010/02/distribuidor.png"><img class="aligncenter size-large wp-image-3036" title="Esquema distribuidor" src="http://www.obsoletos.org/wp-content/uploads/2010/02/distribuidor-500x375.png" alt="" width="500" height="375" /></a></p>
<p>Para que quede un poco más claro puedes ver las fotos de ambos circuitos completados. (Pero no hagas caso del jumper que se ve en el centro del distribuidor de dos señales, resultó que no era muy buena idea).</p>
<p><a href="http://www.obsoletos.org/wp-content/uploads/2009/11/P1090337.JPG"><img class="size-medium wp-image-2694 alignleft" title="Conectores intermedios 1 y 2 pines - frente" src="http://www.obsoletos.org/wp-content/uploads/2009/11/P1090337-235x176.jpg" alt="Conectores intermedios 1 y 2 pines - frente" width="235" height="176" /></a><a href="http://www.obsoletos.org/wp-content/uploads/2009/11/P1090338.JPG"><img class="size-medium wp-image-2695 alignnone" title="Conectores intermedios 1 y 2 pines - traseras" src="http://www.obsoletos.org/wp-content/uploads/2009/11/P1090338-235x176.jpg" alt="Conectores intermedios 1 y 2 pines - traseras" width="235" height="176" /></a></p>
<p><strong>Amplificador</strong></p>
<ul>
<li>Un transistor <a href="http://es.wikipedia.org/wiki/MOSFET">MOSFET tipo n</a>. (Te cuento los detalles más abajo).</li>
<li>Una resistencia de 200 Ω.</li>
<li>Pines acodados machos y hembras.</li>
<li>Dos <a href="http://catalog.weidmueller.com/procat/Group.jsp;jsessionid=9FF641E1F8AE02E301D0334158A28877?groupId=%28%22group21988543685230%22%29&amp;page=Group">bornes de conexión para circuito impreso</a>.</li>
</ul>
<p><a href="http://www.obsoletos.org/wp-content/uploads/2009/11/P1090339.JPG"><img class="aligncenter size-large wp-image-2696" title="Transistor - frente" src="http://www.obsoletos.org/wp-content/uploads/2009/11/P1090339-500x375.jpg" alt="Transistor - frente" width="500" height="375" /></a></p>
<p>Queremos encender luces, y queremos que sean unas luces que marquen alguna diferencia entre &#8220;oscuro&#8221; y &#8220;luminoso&#8221;, pero los puertos de datos de nuestro controlador sólo pueden proporcionar unos 40 mA de corriente por cada pin. Está bien para encender un led, pero no te harán llegar muy lejos en la noche. Además, dan una tensión de salida de 5V y las bombillas que queremos usar son de 12V (como las de los coches).</p>
<p>Necesitamos una manera de amplificar las señales que manda el controlador hasta que sean lo bastante potentes como para encender esas bombillas. Para ello usamos un transistor MOSFET <a href="http://es.wikipedia.org/wiki/MOSFET">tipo n</a> a modo de interruptor. Los MOSFETs tienen tres patas, drenador (<em>drain</em>), fuente (<em>source</em>) y puerta (<em>gate</em>). La corriente principal (la que encenderá nuestra bombilla) entra por el drenador y sale por la fuente. Cuando la puerta se encuentra conectada a tierra (0V) se dice que el transistor está <em>en corte</em> y no permite pasar corriente entre drenador y fuente. Cuando el voltaje de la puerta supera cierto <em>voltaje umbral </em>(positivo para los tipo n y negativo para los tipo p) el transistor está <em>en saturación</em> y permite que pase gran cantidad de corriente entre drenador y fuente.</p>
<p>Las características más importantes para este tipo de transistores son 3: el voltaje fuente-drenador máximo (VDSs), que es la diferencia de potencial máxima que podemos poner entre fuente y drenador sin que pete todo; la intensidad de drenador máxima (ID), que es la intensidad máxima que puede aceptar el drenador sin quemarse; y el voltaje umbral ( VGS(th)) que, simplificando, sería el voltaje que hay que aplicarle a la puerta para que el transistor comience a conducir.</p>
<p>Queremos encender dos bombillas de 12V y 6 Watios cada una. Eso supone que van a consumir un Amperio entre las 2. Además, queremos controlar el encendido con un pulso de 5 V. Total, que necesitaremos un MOSFET con: VDSs&gt;12V, ID&gt;1A y VGS(th)&lt;5V.</p>
<p>En cualquier tienda de electrónica puedes encontrar cientos, si no miles, de transistores que cumplan estos requisitos por menos de un lerele, pero también puedes encontrarlos entre la chatarra electrónica que tengas por casa. Para esta placa yo he usado un <a href="http://www.datasheetcatalog.org/datasheet2/5/0w0q8j6f44wahlhq1g811lpkd5py.pdf">STW13NK80Z </a>que encontré en una fuente de alimentación rota. Con VDSs=800V y ID=12A es como matar moscas a cañonazos, sí, pero al menos el cañón nos salió gratis. Busca componentes que tengan <a href="http://www.directindustry.com/prod/fairchild-semiconductor/power-mosfet-33535-192568.html">este aspecto</a> y estén atornillados a un disipador. Casi seguro que serán algún tipo de transistor. Solo tienes que googlear el numero de serie que llevan impreso para saber de qué se trata exactamente.</p>
<p>Ahora que ya tienes transistor vamos a montar el circuito. Tanto la señal, como la alimentación llegan por el conector macho y se &#8220;reenvían&#8221; al conector hembra. De este modo se pueden encadenar varios de estos amplificadores si fuera necesario.</p>
<p><a href="http://www.obsoletos.org/wp-content/uploads/2010/02/MosFet.png"></a><a href="http://www.obsoletos.org/wp-content/uploads/2010/02/MosFet1.png"><img class="aligncenter size-large wp-image-3038" title="Conexiones transistor" src="http://www.obsoletos.org/wp-content/uploads/2010/02/MosFet1-500x375.png" alt="" width="500" height="375" /></a></p>
<p>El módulo terminado, con la bombilla al lado tiene este aspecto:</p>
<p><a href="http://www.obsoletos.org/wp-content/uploads/2009/11/P1090340.JPG"><img class="size-medium wp-image-2697 alignleft" title="Amplificador- frente" src="http://www.obsoletos.org/wp-content/uploads/2009/11/P1090340-235x176.jpg" alt="Amplificador- frente" width="235" height="176" /></a><a href="http://www.obsoletos.org/wp-content/uploads/2009/11/P1090341.JPG"></a><a href="http://www.obsoletos.org/wp-content/uploads/2009/11/P1090341.JPG"><img class="size-medium wp-image-2698 alignleft" title="transistor - trasera" src="http://www.obsoletos.org/wp-content/uploads/2009/11/P1090341-235x176.jpg" alt="transistor - trasera" width="235" height="176" /></a></p>
<p style="clear: both;">
<p style="clear: both;">
<p><strong>Firmware</strong></p>
<p style="clear: both;">Contra todo pronóstico ésta era la última pieza que quedaba por montar. Lo siguiente es hacer un programa que se encargue de &#8220;leer&#8221; el PIR  y el potenciómetro y de controlar la luz. Puedes copiar el mío de aquí abajo Como ves es muy sencillito y está comentado hasta aburrir. Ya hablamos hace meses de cómo <a href="http://www.obsoletos.org/2009/06/lo-que-aprendimos-en-el-taller-de-microcontroladores/">compilarlo y grabarlo en el microcontrolador</a>.</p>
<pre class="c">/*
 * Firmware detector de presencia para ATMega88. Lee la salida de un sensor PIR y
 * de un potenciómetro en el puerto C (PC0 y PC3 respectivamente).
 * Enciende una luz conectada a PD5 cuando el PIR detecta movimiento (salida &gt; 128)
*/

// Frecuencia de funcionamiento (para las rutinas de delay).
#define F_CPU 1000000
#define TMULT

#include
#include 

//Funciones para inicializar y leer desde las unidades conversoras analógico-digitales
void initialiceADC(void);
unsigned char readADC(unsigned char channel);

//Funciones para inicializar y emplear PWM
void initialicePWM(void);
void analogOut(char port,unsigned char value);

int main(void)
{
	//Aquí se guarda el estado actual del programa
	unsigned char state=0;
	//El valor guardado en 'out' es el que se usará como salida mediante PWM
	unsigned char out = 0;
	unsigned char ant;
	//Aquí llevaremos una cuenta del tiempo transcurrido desde la última detección
	int timer = 0;

	//Configuramos los pines del puerto D como salida
	DDRD=0xff;

	//Inicializamos PWM y ADC
	initialicePWM();
	initialiceADC();

	//Bucle principal.
	while(1)
	{
		switch(state)
		{
			//Estado 0: Apagado, esperando a detectar algo
			case 0:
				//Cuando se detecta a alguien pasamos a estado 1.
				// La salida para a 10 (muy poco brillo)
				if(readADC(0)&gt;128)
				{
					out=10;
					state = 1;
				}
				else out=0;
				break;
			//Estado 1: Aumentando el brillo
			case 1:
				//Aumentamos el en cada iteración. Como la percepción del
				//brillo es logarítmica tenemos que aumentarlo exponencialmente
				//para que se perciba como un aumento lineal. En concreto
				//multiplicamos el brillo anterior por 1.125
				ant = out;
				out+= out&gt;&gt;3;
				//Si el brillo anterior es mayor que el actual -&gt; overflow
				//Fijamos el brillo en 255 y pasamos al estado 2
				if(ant&gt;out)
				{
					out = 255;
					state = 2;
				}
				break;
			//Estado 2: Brillo máximo hasta que pase un cierto tiempo desde la última detección
			case 2:
				//Si se detecta movimiento reseteamos el temporizador
				if(readADC(0)&gt;128)
					timer =0;
				//si no lo aumentamos
				else
					timer++;

				//El tiempo que debe pasar depende de la posición del cursor de potenciómetro
				//será un valor entre 0 y 255 multiplicado por TMULT (para TMULT = 4 abarca entre
				// 0 y 90 segundos aprox).
				//Cuando timer supera ese valor lo ponemos a 0 y pasamos al estado 3.
				if(timer&gt;(readADC(3)*TMULT))
				{
					timer = 0;
					state = 3;
				}
				break;
			//Estado 3: Disminuyendo el brillo
			case 3:
				//Reducimos el brillo igual que lo aumentamos antes. En lugar de
				//multiplicarlo por 1.125 ahora lo hacemos por 0.875
				if(readADC(0)&gt;128)
					state = 1;
				else
				{
					ant = out;
					out-= out&gt;&gt;3;
					//Si ant=out es que out ya era tan pequeño que al redondear tras la
					//división se queda igual. Fijamos out a 0 y volvemos a la espera
					//en el estado 0
					if(ant&lt;=out)
					{
						out = 0;
						state = 0;
					}
				}
				break;

		}
		//En cada iteración actualizamos el valor de la salida a 'out'
		analogOut(0,out);
		//y esperamos un poco antes del siguiente paso
		_delay_ms(100);
	}
}

void initialiceADC(void)
{
	DIDR0=0x3F; //Deshabilita la entrada digital a traves de los pines de ADC

	//REFS(0,1) pone Vcc como voltaje de referencia
	//y ADLAR(1) justifica el valor leido a la izquierda para que solo tengamos que leer ADCH
	ADMUX= _BV(REFS0)|_BV(ADLAR);
	//ADEN habilita el uso de ADC y ADPS(0,1,1) pone el preescale del temporizador ADC a 8
	ADCSRA = _BV(ADEN)|_BV(ADPS1)|_BV(ADPS0);

}

unsigned char readADC(unsigned char channel)
{
	ADMUX= (ADMUX &amp; 0xF0) | channel;
	//Poniendo ADSC a 1 comienza la conversión
	ADCSRA|=_BV(ADSC);
	//Sabemos que ha teminado cuando ADSC vuelve a valer 0
	while(ADCSRA &amp; _BV(ADSC));
	//El resultado está en ADCH
	return ADCH;
}

void initialicePWM()
{
	//Configuramos PD5 y PD6 como salidas
	DDRD |= _BV(PD5)| _BV(PD6);
  	//WGM0(0,1,1) selecciona el modo 'fast PWM'. COM0A(1,0) y COM2B(1,0)
  	//proporciona PWM no invertido para las salidas A y B
       TCCR0A = _BV(WGM01)|_BV(WGM00) | _BV(COM0A1)|_BV(COM0B1);
       //CS0(0,1,0)configura el preescaler de timer0 a 8
       TCCR0B = _BV(CS01);
}

void analogOut(char port, unsigned char value)
{
	//Si 'port' es 1 usamos la salida B. Si es 0 la A
	if(port &amp; 1)
		OCR0B = value;
	else
		OCR0A = value;
}</pre>
<p>Y dicho lo cual solo queda ensamblarlo todo. Si ha ido todo bien no deberías poder conectar nada incorrectamente, pero asegúrate antes de enchufarlo todo a la corriente por primera vez. Aquí tienes un par de fotos para que puedas fijarte en donde va conectada cada cosa.</p>
<p><a href="http://www.obsoletos.org/wp-content/uploads/2009/11/P1090345.JPG"><img class="aligncenter size-large wp-image-2700" title="Luz regulable y detector de movimiento. Detalle conexiones." src="http://www.obsoletos.org/wp-content/uploads/2009/11/P1090345-500x375.jpg" alt="" width="500" height="375" /></a></p>
<p><a href="http://www.obsoletos.org/wp-content/uploads/2009/11/P1090342.JPG"><img class="aligncenter size-large wp-image-2699" title="Luz regulable y detector de movimiento. Visión global" src="http://www.obsoletos.org/wp-content/uploads/2009/11/P1090342-500x375.jpg" alt="" width="500" height="375" /></a></p>
<p>Bueno, pues ya tienes tu propio detector de movimiento. Pero tendrás que quedarte muy muy quieto para ver cómo se apaga la luz.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.obsoletos.org/2010/03/detector-de-movimiento-sobre-un-atmega88/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Plataforma de desarrollo (práctica y barata) para microcontroladores</title>
		<link>http://www.obsoletos.org/2010/01/plataforma-de-desarrollo-practica-y-barata-para-microcontroladores/</link>
		<comments>http://www.obsoletos.org/2010/01/plataforma-de-desarrollo-practica-y-barata-para-microcontroladores/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 16:11:50 +0000</pubDate>
		<dc:creator>cogollo</dc:creator>
				<category><![CDATA[Hackeos e ideas]]></category>
		<category><![CDATA[Nuestros hacks]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[ATMega88]]></category>
		<category><![CDATA[microcontroladores]]></category>
		<category><![CDATA[prototipado]]></category>

		<guid isPermaLink="false">http://www.obsoletos.org/?p=2701</guid>
		<description><![CDATA[Lo bonito de hacer talleres y demás mandangas (bueno, una de las cosas bonitas) es que conoces gente. Una de las personas a las que hemos conocido últimamente es Ignacio, un joven escultor cuyas obras suelen incluir algún elemento móvil y/o luminoso. Como es un joven inquieto, Ignacio vino al taller de microcontroladores que montamos [...]]]></description>
			<content:encoded><![CDATA[

Lo bonito de hacer talleres y demás mandangas (bueno, una de las cosas bonitas) es que conoces gente. Una de las personas a las que hemos conocido últimamente es <a href="http://www.canalesaracil.com/Default.aspx">Ignacio</a>, un joven escultor cuyas obras suelen incluir algún elemento <a href="http://www.canalesaracil.com/Seccion-Obra.aspx?Seccion=Sculptures&amp;Obra=Hang-around">móvil</a> y/o <a href="http://www.canalesaracil.com/Seccion-Obra.aspx?Seccion=Sculptures&amp;Obra=The-Light-Pianola">luminoso</a>.

Como es un joven inquieto, Ignacio vino al <a href="http://www.obsoletos.org/2009/06/lo-que-aprendimos-en-el-taller-de-microcontroladores/">taller de microcontroladores</a> que montamos en <a href="http://medialab-prado.es/">Medialab</a> para averiguar como esos cacharritos podrían ayudarle a dotar sus esculturas de una cierta interactividad. Como es un escultor inquieto (léase ocupado), no tiene la base de conocimientos en electrónica necesarios para acometer ese tipo de proyectos, ni el tiempo necesario para adquirir ese conocimiento (tampoco es que haga falta tanto tiempo, pero ya sabes como son los artistas).

Total, que nos ha pedido que le echemos una mano (remunerada, que somos hippies pero no tanto). Como primer proyecto quiere utilizar un <a href="http://en.wikipedia.org/wiki/Passive_infrared_sensor">sensor de movimiento PIR</a> para detectar cuando llega alguien a ver la escultura y que las luces se enciendan gradualmente. Cuando la gente se va, las luces deben apagarse. Gradualmente también, claro.

Así pues necesitamos algún tipo de microcontrolador que lea periódicamente (varias veces por segundo) el estado del sensor, lleve la cuenta del tiempo que ha pasado desde la última detección y se encargue de controlar las luces, aumentando y disminuyendo su intensidad poco a poco, según corresponda.

Con esas consideraciones (y alguna otra más), y tras unas semanas de pruebas y más pruebas he llegado a esto:

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="500" height="375" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=7417051&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="500" height="375" src="http://vimeo.com/moogaloop.swf?clip_id=7417051&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"> </embed></object>

Como ves cumple perfectamente con las especificaciones, pero es capaz de mucho más. Te cuento qué, cómo y porqué  a continuación.
<span id="more-2701"></span>
<h4>¿Qué?</h4>
Bueno, ¿que tenemos aquí entonces? Como ya he dicho, nuestro aparato no solo sirve para encender y apagar luces. <a href="http://frikotaku.wordpress.com/2006/08/12/el-cerebro-de-la-bestia/">El cerebro de la bestia</a> es, en este caso, un microcontrolador <a href="http://www.atmel.com/dyn/resources/prod_documents/doc2545.pdf">ATMega88</a>, funcionando a 1 MHz, totalmente programable y con acceso a 12 pines de entrada/salida (4 de ellos con <a href="http://es.wikipedia.org/wiki/Conversor_anal%C3%B3gico-digital">conversores analógico/digital</a> para poder leer valores arbitrarios de voltaje). Todo ello por entre 7 y 10 euros en materiales.

<div id="attachment_2688" class="wp-caption aligncenter" style="width: 510px"><a href="http://www.obsoletos.org/wp-content/uploads/2009/11/P1090330.jpg"><img class="size-large wp-image-2688" title="Placa desarrollo AVR- frente" src="http://www.obsoletos.org/wp-content/uploads/2009/11/P1090330-500x375.jpg" alt="Placa desarrollo AVR- frente" width="500" height="375" /></a><p class="wp-caption-text">No le he puesto nombre aún</p></div>
<p style="text-align: center;"></p>
El resultado final no es pues una solución para el problema especifico EncenderUnaLuzCuandoAlguienMira, sino una plataforma genérica de prototipado que, espero, permita el desarrollo de proyectos con microcontroladores de una manera rápida, sencilla y barata. Algo parecido a un <a href="http://es.wikipedia.org/wiki/Arduino">Arduino</a>, vaya.
<h4>¿Por qué esto?</h4>
Entonces, ¿por qué no usar un Arduino después de todo? O mejor, ¿por qué diseñar un sistema genérico para resolver un problema tan concreto? ¿No estoy complicando y encareciendo artificialmente el producto? ¿No es esto el equivalente electrónico al <em>tour</em> que les dan a los turistas cuando cogen un taxi en el aeropuerto?

Bueno, supongo que lo sería si uno cobrara dinero con ello. La cosa es que diseñar un circuito electrónico para una aplicación profesional lleva bastante tiempo. Terminas el primer prototipo sólo para descubrir que esta lleno de fallos, inconveniencias y complicaciones innecesarias, así que haces un segundo prototipo, que resuelve la mayoría de esos problemas, pero que plantea algunos nuevos y probablemente mucho más interesantes. Así que haces un tercer prototipo y&#8230; bueno, ya sabes por donde voy.

Luego está el software. Alguien tiene que programar ese micro (véase yo) y la depuración del programa no es precisamente trivial (no es fácil saber qué está pasando ahí dentro, después de todo uno no tiene una flamante pantalla que le muestre los mensajes de error que puedan ir apareciendo). Total que entras en un ciclo parecido al del diseño del circuito, sólo que haces muchos más cambios (aunque al menos no tienes que soldar en cada iteración).

O sea, que este tipo de cosas cuestan bastante trabajo. Más teniendo en cuenta que uno no es un profesional del ramo. Y claro, no es plan de currar gratis. Tampoco me parecía bien cobrarle a Ignacio por un trabajo que probablemente no tenga una <em>calidad profesional</em> de esas (que es la primera vez que hago esto), y que probablemente hubiera llevado mucho más tiempo del necesario por culpa de mi ineptitud.

¿Qué hacemos entonces? Bueno, lo primero es liberar el diseño del circuito y el código fuente, para que cualquiera pueda hacer uso (consideralo una pequeña retribución a la comunidad hacker y DIY que hace viable este blog). Lo segundo, publicarlo en Obsoletos. Así me saco un par de posts, que ya me va tocando.

Ignacio ya no tiene que pagarme el diseño, porque ya no es su único beneficiario, así que puedo hacerlo un poco más complejo sin que eso le perjudique. Tarde o temprano yo iba a tener que diseñar algo que me permitiera trabajar con los micros de una manera mínimamente cómoda. Y ya puestos, una plataforma genérica será mucho más útil para quien quiera que esté ahí fuera.

Total, que Ignacio y cualquiera que lea esto es libre de usar todo el material de este post como más le convenga, pero si te parece demasiado complicado y quieres que te lo suelde yo, te cobro la mano de obra. Fair enough <img src='http://www.obsoletos.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> 

Pues muy bien, muy bonito todo, ¿pero que tiene de malo el Arduino? Es lo bastante genérico, ya viene montado y trae un entorno de desarrollo relativamente cómodo y sencillo. Bueno, no me malinterpretes, Arduino es una gran plataforma de iniciación, y simplifica mucho las primeras etapas de un proyecto, pero tiene sus pegas.

<div id="attachment_2786" class="wp-caption aligncenter" style="width: 409px"><a href="http://es.wikipedia.org/wiki/Arduino"><img class="size-full wp-image-2786" title="Arduinodiecimila400" src="http://www.obsoletos.org/wp-content/uploads/2010/01/Arduinodiecimila400.jpg" alt="Arduinodiecimila400" width="399" height="306" /></a><p class="wp-caption-text">Arduino Diecimila</p></div>

Para empezar está la programación, efectivamente el lenguaje que usa es sencillo y puedes encontrar montones de librerías de funciones ya hechas que te facilitan aún más la vida, pero esa sencillez precisamente hace que sea terriblemente ineficaz. <a href="http://hackaday.com/2010/01/06/arduino-io-speed-breakdown/">Cambiar el estado de un pin es 50 veces más lento si lo programas con el lenguaje de Arduino que si lo programas en C</a>. Además, quieras que no soy yo el que va a escribir el código y después de media vida usándolo me siento mucho más cómodo con C.

Por otro lado Arduino no funciona bien en un objeto acabado. Los conectores están bien para meterles un cablecico y llevarlo hasta una <a href="http://es.wikipedia.org/wiki/Placa_de_pruebas">protoboard</a> donde tienes montado el resto del circuito, pero los cables se salen con facilidad cuando los mueves, solo hay un par de puntos donde acceder a la alimentación o a la tierra del Arduino, y para colmo la separación entre el pin 7 y el 8 no es estándar así que no puedes simplemente hacer tu circuito en una placa perforada estándar y pincharlo encima. Tienes que comprar un <a href="http://www.arduino.cc/en/Main/ArduinoShields"><em>shield</em></a> especifico o <a href="http://es.wikipedia.org/wiki/Circuito_impreso#Manufactura">imprimir tus propias placas de circuitos</a>. Ambas cosas bastante caras.

Y luego está el precio, claro. La última vez que miré, un Arduino costaba 40 pavos. No está mal si vas a tener uno para practicar, pero si vas a meter uno en cada objeto que produzcas la cosa cambia. En mi diseño he tratado de emplear el mínimo número de partes posible (9 en total), que todas sean fáciles de conseguir y que el conjunto sea fácil de montar. El resultado es que cualquiera puede conseguir los materiales al por menor por unos de 8 leuros y que se puede montar en algo menos de hora y media con lo que puedo <em>vender</em> el chisme montado y preparado por 20 (incluyendo el coste del material).
<h4>¿Por qué así?</h4>
Así que basicamente tenemos un ATMega88 rodeado por un puñado de conectores. Veamos para que sirven:
<ol>
	<li>El puerto de programación: Nos permite conectar la placa al ordenador, a través del puerto paralelo, para programarlo e intercambiar datos.

<div id="attachment_2812" class="wp-caption aligncenter" style="width: 162px"><img class="size-full wp-image-2812" title="ATMega Puerto programacion" src="http://www.obsoletos.org/wp-content/uploads/2010/01/AtMega-Puerto-programacion.png" alt="Puerto de programación" width="152" height="213" /><p class="wp-caption-text">Puerto de programación</p></div></li>
	<li>El conector de alimentación: Se trata de <a href="http://es.rs-online.com/web/2868741.html">un conector hembra estándar de 2&#8217;5 mm</a>. Es un conector muy común entre los transformadores domésticos (nosotros hemos encontrado muchos en las fuentes de alimentación de los modems y routers) y como la placa lleva su propio <a href="http://www.datasheetcatalog.org/datasheets/228/390068_DS.pdf">7805</a> nos permite usar casi cualquier fuente de tensión de entre 7 y 18 V.

<div id="attachment_2811" class="wp-caption aligncenter" style="width: 240px"><img class="size-full wp-image-2811" title="ATMega Alimentacion" src="http://www.obsoletos.org/wp-content/uploads/2010/01/ATMega-Alimentacion.jpg" alt="Conector alimentación" width="230" height="200" /><p class="wp-caption-text">Conector de alimentación</p></div></li>
	<li>Puerto de sensores: Porque todo robot asesino que se precie necesita una buena batería de sensores para localizar a sus víctimas. Este puerto ofrece conexiones a los pines 0 a 3 del puerto C del microcontrolador (los que tienen el conversor analógico/digital) para poder medir el estado de sensores tanto analógicos como digitales. Como además los sensores suelen estar separados entre sí y suelen necesitar alimentación cada columna del puerto incluye, además del pin de entrada, un contacto a tierra y otro a 5 V. De este modo, con un único cable (con 3 conductores) entre la placa y el sensor podemos transmitir tanto la energía necesaria para que funcione el sensor como los datos proporcionados por éste.

<div id="attachment_2809" class="wp-caption aligncenter" style="width: 210px"><img class="size-full wp-image-2809" title="ATMega puerto de Sensores" src="http://www.obsoletos.org/wp-content/uploads/2010/01/ATMega-Sensores.jpg" alt="ATMega puerto de Sensores" width="200" height="180" /><p class="wp-caption-text">Puerto de sensores</p></div></li>
	<li>Puertos de entrada y salida digital: Así que necesitas comunicarte con algún periférico. Para que tu controlador pueda hablar con un chip de memoria o un display LCD necesitarás usar varios pines a la vez. Estos dos puertos están hechos con 2 filas de 5 pines colocados de tal manera que puedes enchufar un <a href="http://www.micropik.com/pag_conect_cableplano.htm">conector de cable plano de 10 hilos</a> en cada uno o un conector de 26 hilos en los dos a la vez. Entre los dos dan acceso a los pines del puerto D (uno a los pines 0 a 3, el otro a los pines 4 a 7). Así puedes acceder a todo el puerto D a la vez con un conector y un cable de 26 hilos (aunque se &#8220;desperdician&#8221; algunos cables) o conectar dos perifericos independientes que solo necesiten 4 pines. Cada uno de estos puertos ofrece además dos pines conectados a tierra, dos pines conectados directamente a la fuente de tensión (para poder alimentar directamente un motor o una luz, por ejemplo) y otro pin conectado a la tensión regulada de 5 V (que es el voltaje de alimentación típico de la mayoría de los componentes electrónicos).

<div id="attachment_2810" class="wp-caption aligncenter" style="width: 402px"><img class="size-full wp-image-2810" title="AtMega Puerto Digital" src="http://www.obsoletos.org/wp-content/uploads/2010/01/AtMega-Puerto-Digital.png" alt="Puerto I/O digital" width="392" height="109" /><p class="wp-caption-text">Puerto I/O digital</p></div></li>
</ol>
Por lo demás todos los puertos tienen algún pin cortado u ocluido para que sus respectivos conectores sólo encajen de una manera (la correcta).
<h4>Cómo</h4>
Bueno, para llegar a contruir uno de éstos tú mismo necesitaras los siguientes materiales:
<ol>
	<li>Un trozo de placa perforada (perfboard).</li>
	<li>Un ATMega88 (Los ATMega48 y ATmega168 también valen y sólo se diferencian en la cantidad de memoria de que disponen).</li>
	<li>Un zócalo de 2&#215;14 patas (para sujetar el microcontrolador).</li>
	<li>Un 7805 (proporciona la tensión regulada de 5V.</li>
	<li>Dos condensadores de 10 nF (uno es para &#8220;suavizar&#8221; un poco la tensión de alimentación y efiltrar otro para filtrar ruidos en las entradas de los conversores analógico/digitales).</li>
	<li>Un conector de alimentación de 2.5mm.</li>
	<li>Una pareja de tiras de pines dobles (macho y hembra).</li>
	<li>Una tira de pines acodados hembra.</li>
	<li>Algunos trozos de cable rígido.</li>
</ol>
Aparte de soldador y estaño necesitarás un taladro o una Dremel con una broca fina, porque las patas del conector de alimentación son demasiado gruesas para los agujeros de la placa perforada.

Por lo demás, ningún material en esa lista es muy caro y ninguno es especialmente difícil de encontrar. En algunas tiendas de electrónica igual no tienen los ATMegas pero puedes encargarlos y te los traen en un par de días (cuestan entre 2 y 3 euros cada uno).

Ahora que tienes todos los materiales necesitas el esquema del circuito. Aquí lo tienes, en toda su gloria electrónica:

<div id="attachment_2817" class="wp-caption aligncenter" style="width: 510px"><a href="http://www.obsoletos.org/wp-content/uploads/2010/01/testingGrounds.png"><img class="size-large wp-image-2817" title="TestingGrounds" src="http://www.obsoletos.org/wp-content/uploads/2010/01/testingGrounds-500x375.png" alt="Esquema eléctrico" width="500" height="375" /></a><p class="wp-caption-text">Esquema eléctrico</p></div>

No hay mucho que decir, simplemente se trata de conectar cada pin del micro al pitorro que le corresponda. A la hora de pasar esto a la placa perforada puede que te ayude echarle un vistazo antes a mi placa, así que aquí tienes una foto de la parte de abajo.

<div id="attachment_2688" class="wp-caption alignleft" style="width: 245px"><a href="http://www.obsoletos.org/wp-content/uploads/2009/11/P1090330.JPG"><img class="size-medium wp-image-2688" title="Placa desarrollo AVR- frente" src="http://www.obsoletos.org/wp-content/uploads/2009/11/P1090330-235x176.jpg" alt="Placa desarrollo AVR- frente" width="235" height="176" /></a><p class="wp-caption-text">Cara A</p></div>

<div id="attachment_2689" class="wp-caption alignleft" style="width: 245px"><a href="http://www.obsoletos.org/wp-content/uploads/2009/11/P1090332.JPG"><img class="size-medium wp-image-2689" title="Placa desarrollo AVR - trasera" src="http://www.obsoletos.org/wp-content/uploads/2009/11/P1090332-235x176.jpg" alt="Placa desarrollo AVR - trasera" width="235" height="176" /></a><p class="wp-caption-text">Cara B</p></div>
<p style="clear: both;">Antes de ponerte a soldar recuerda que tienes que agrandar los agujeros para el conector de alimentación. Mejor ahora que no puedes dañar nada en el proceso. Empieza a soldar por los componentes que menos sobresalgan sobre la placa. Los cables, luego el zócalo y el puerto de programación, el resto de los puertos, los condensadores, el 7805 y, por último, el conector de alimentación.</p>
No conectes todo entre sí hasta que todos los componentes estén sujetos. Luego puedes crear las pistas directamente con estaño sobre la placa. Cuando termines (antes de poner el micro en el zócalo) usa un polímetro para comprobar que no haya cortocircuitos.

Si todo esta bien puedes pasar a conectar cualquier transformador de esos que usa el router o el cargador de pilas. Sólo necesitas que suministre un voltaje de entre 7 y 18 Voltios.
<h4>El cable</h4>
Para programar a este pequeñín necesitaras un cablecico que lo conecte con tu ordenador. Por suerte es muy fácil construir uno. Éste es el programador más barato que hay y sirve para todo tipo de microcontroladores de AVR. Necesitaras:
<ul>
	<li>Un trocito de placa perforada.</li>
	<li>Un conector de puerto paralelo macho (<a href="http://es.wikipedia.org/wiki/D-sub">DB-25</a>).</li>
	<li>5 resistencias (entre 100 Ω y 1KΩ).</li>
	<li>Cable plano de 5 conductores (yo uso el <a href="http://commons.wikimedia.org/wiki/File:Cable_ide.jpg">cable de los discos duros IDE</a> y de las disqueteras, partiéndolo en tiras de la anchura que me interesa).</li>
	<li>Una tira de pines acodados macho.</li>
</ul>
5 de los pines del puerto paralelo se van a usar para la comunicación entre el ordenador y el microcontrolador. La siguiente tabla muestra las equivalencias:
<table border="4">
<tbody>
<tr>
<td><strong>Puerto paralelo</strong></td>
<td>Señal en el programador</td>
</tr>
<tr>
<td>Pin 7</td>
<td>RESET</td>
</tr>
<tr>
<td>Pin 8</td>
<td>SCK</td>
</tr>
<tr>
<td>Pin 9</td>
<td>MOSI</td>
</tr>
<tr>
<td>Pin 10</td>
<td>MISO</td>
</tr>
<tr>
<td>Pin 18</td>
<td>Ground</td>
</tr>
</tbody>
</table>
Tomando el cable plano, tenemos que soldar cada conductor de uno de sus extremos a uno de esos pines del conector DB-25. El otro extremo del cable lo soldamos a la plaquita preforada, y en serie con las resistencias y la tira de pines como en la siguiente foto:
<p style="text-align: center;"><a href="http://www.obsoletos.org/wp-content/uploads/2010/01/IMG_0139.JPG"><img class="size-large wp-image-2859 aligncenter" title="Programador AVR Pinout" src="http://www.obsoletos.org/wp-content/uploads/2010/01/IMG_0139-500x375.jpg" alt="Programador AVR Pinout" width="500" height="375" /></a></p>
El cable terminado encaja en el conector de programación de nuestra placa así:

<a href="http://www.obsoletos.org/wp-content/uploads/2010/01/IMG_0143.JPG"><img class="aligncenter size-large wp-image-2860" title="Programador AVR conectado" src="http://www.obsoletos.org/wp-content/uploads/2010/01/IMG_0143-500x375.jpg" alt="Programador AVR conectado" width="500" height="375" /></a>

Bueno, con esto ya puedes montar y programar tu propia plataforma de desarrollo para microcontroladores. En cuanto a la parte del ordenador, en <a href="http://www.obsoletos.org/2009/06/lo-que-aprendimos-en-el-taller-de-microcontroladores">este post</a> puedes encontrar los paquetes necesarios para compilar y un par de programas de ejemplo.
<h4>Disclamer</h4>
Tras un par de meses de pruebas el chisme funciona bien y es bastante fiable, pero ten en cuenta que yo acabo de empezar en esto, como quien dice, y que probablemente el diseño aún tenga mucho margen para mejorar. Sugerencias y consejos son bienvenidos. De momento, necesitamos un nombre para el producto.

Ah, bueno, al final no he contado cómo hacer el detector de presencia del video. En fin, ya tenemos bastante información por hoy. <a href="http://www.obsoletos.org/2010/03/detector-de-movimiento-sobre-un-atmega88/">En el proximo post</a> te doy todos los detalles. Y para compensar por la espera, te comentaré un par de proyectos sencillos más. Mientras tanto, puedes ir calentando el soldador.]]></content:encoded>
			<wfw:commentRss>http://www.obsoletos.org/2010/01/plataforma-de-desarrollo-practica-y-barata-para-microcontroladores/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Sobre entrada de datos y circuitos eléctricos (Puerto paralelo II)</title>
		<link>http://www.obsoletos.org/2009/09/sobre-entrada-de-datos-y-circuitos-electricos-puerto-paralelo-ii/</link>
		<comments>http://www.obsoletos.org/2009/09/sobre-entrada-de-datos-y-circuitos-electricos-puerto-paralelo-ii/#comments</comments>
		<pubDate>Tue, 08 Sep 2009 07:30:32 +0000</pubDate>
		<dc:creator>cogollo</dc:creator>
				<category><![CDATA[Hackeos e ideas]]></category>
		<category><![CDATA[Nuestros hacks]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[electrónica digital]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[Puerto paralelo]]></category>

		<guid isPermaLink="false">http://www.obsoletos.org/?p=2467</guid>
		<description><![CDATA[Hace unos meses ya hablamos de la salida de datos a través del puerto paralelo, pero dejé para más tarde hablar de la entrada. Bien, supongo que ya es lo bastante tarde. Para que quede claro, veremos qué hay que hacer para poder leer datos digitales a través del puerto paralelo del PC, mediante un [...]]]></description>
			<content:encoded><![CDATA[Hace unos meses ya <a href="http://www.obsoletos.org/2009/02/accediendo-al-mundo-real-el-puerto-paralelo/">hablamos de la salida de datos a través del puerto paralelo</a>, pero dejé para más tarde hablar de la entrada. Bien, supongo que ya es lo bastante tarde.

Para que quede claro, veremos <strong>qué hay que hacer para poder leer datos digitales a través del puerto paralelo del PC</strong>, mediante un programa en C y en un entorno Linux (aunque los circuitos que usaremos son validos para cualquier entorno).

Recapitulemos: el conector del puerto paralelo tiene 25 pines, que se corresponden con tres lineas de datos diferentes (Data, Control y Status) según este esquema:
<p style="text-align: left;"></p>


<div id="attachment_882" class="wp-caption aligncenter" style="width: 510px"><a href="http://www.obsoletos.org/wp-content/uploads/2009/02/esquemapuertoparalelo.gif"><img class="size-large wp-image-882" title="Esquema puerto paralelo" src="http://www.obsoletos.org/wp-content/uploads/2009/02/esquemapuertoparalelo-500x95.gif" alt="Valor de los pines del puerto. Extraido de CodeProject" width="500" height="95" /></a><p class="wp-caption-text">Valor de los pines del puerto. Extraido de CodeProject</p></div>
<p style="text-align: left;">Además tenemos que Data es de entrada/salida, Control es sólo de salida y Status sólo de entrada. Y que en un determinado pin 0V representan un 0 lógico y 5V un 1 lógico, salvo en los pines que están invertidos (Y este puede ser un buen momento para repasar <a href="http://www.obsoletos.org/2009/02/accediendo-al-mundo-real-el-puerto-paralelo/">el primer artículo</a>).</p>
<p style="text-align: left;">Vimos también que para sacar un byte a través de un puerto hay que usar la función:</p>

<pre style="font-family: monospace; text-align: center;">outb<span style="color: #009900;">(</span>Byte<span style="color: #339933;">,</span>Puerto<span style="color: #009900;">)</span><span style="color: #339933;">;</span></pre>
<p style="text-align: left;">donde <em>Byte</em> es el byte de datos que queremos mostrar y <em>Puerto</em> es el numero del puerto que queremos usar y que en la mayoría de los casos es 0&#215;378 para el puerto de datos, 0&#215;379 para el puerto de status y 0&#215;380 para el puerto de control.</p>
<p style="text-align: left;">Pues bien, para la entrada de datos tenemos una función similar:</p>

<pre style="font-family: monospace; text-align: center;">inb<span style="color: #009900;">(</span>Puerto<span style="color: #009900;">)</span><span style="color: #339933;">;
</span></pre>
<p style="text-align: left;">que devuelve un byte de datos leidos a traves de <em>Puerto</em>. Por ejemplo, para leer desde el puerto de status y guardarlo en la variable <em>input</em> pondríamos:</p>

<pre style="font-family: monospace; text-align: center;"><strong>short int</strong> input = inb<span style="color: #009900;">(0x379</span><span style="color: #009900;">)</span><span style="color: #339933;">;
</span></pre>
<p style="text-align: left;">Y eso es todo amigos, pero antes de ponernos con un programa de ejemplo deja que aclare una cosilla sobre circuitos eléctricos.</p>
<p style="text-align: left;"><span id="more-2467"></span></p>

<h4 style="text-align: left;">Breve anotación sobre los circuitos eléctricos</h4>
<p style="text-align: left;">En un circuito eléctrico, <strong>un cable que no está conectado a nada no está a 0V</strong>. Vale, puede que para ti esto sea una perogrullada, pero si no estas familiarizado con la electricidad, lo más inmediato es pensar que un cable que no esta conectado, por el que no pasa electricidad, no tiene un voltaje, o sea que está a 0V.</p>
<p style="text-align: left;">Pero no es tan sencillo. Y por lo que he podido comprobar mucha gente tiene esa creencia, que por otra parte causa muchos problemas a la hora de intentar leer datos digitales.</p>
<p style="text-align: left;">Te pondré un ejemplo: fíjate en el esquema de aquí abajo a la izquierda. Uno podría pensar en usar un montaje como éste para detectar la pulsación de un boton. Si <em>Entrada</em> es uno de los pines del puerto de estatus podemos usar <em>inb(0&#215;379)</em> para ver el estado de ese pin.</p>
<p style="text-align: left;"><img class="aligncenter size-large wp-image-2463" title="switch simple" src="http://www.obsoletos.org/wp-content/uploads/2009/08/switch-simple-500x194.jpg" alt="switch simple" width="500" height="194" /></p>
<p style="text-align: left;">Cuando pulsamos en interruptor el circuito se cierra,el pin de entrada está a 5V y leemos un 1 en ese bit. Cuando se suelta el interruptor el circuito se abre de nuevo y el pin de entrada queda &#8220;al aire&#8221;, con lo que debe de estar a 0V y leemos un 0 en su bit, ¿no? Pues más bien no.</p>
<p style="text-align: left;">En primer lugar desconocemos cómo es el circuito detrás de ese pin. Dentro de tu ordenador el mismo circuito que se encarga de la lectura del pin podría estar induciendo ahí un cierto voltaje desconocido para nosotros. Podría ser 0, podría ser 5, podría ser cualquier valor entre 0 y 5. <em>You never know</em>.</p>
<p style="text-align: left;">Eso ya es bastante malo. Pero es que además la configuración del circuito podría hacer que éste actuase como un diminuto condensador y cualquier carga igualmente diminuta que quede atrapada en él produciría también un voltaje desconocido para nosotros. Incluso puede darse el caso de que el cable que estemos usando para la entrada actúe como una antena de radio y nuestra entrada se vea afectada por todo tipo de interferencias.</p>
<p style="text-align: left;">Para que nos entendamos, y reformulando la primera sentencia para un caso más concreto: Un pin de entrada que no está conectado a nada no está a 0V, tendrá un voltaje arbitrario y desconocido para nosotros.</p>
<p style="text-align: left;">¿Y cómo salimos de ésta pues? No te dejes los pines al aire. Por ejemplo: En lugar del interruptor simple de antes podemos usar un selector como el del siguiente esquema:</p>
<p style="text-align: left;"><img class="aligncenter size-large wp-image-2460" title="Switch doble" src="http://www.obsoletos.org/wp-content/uploads/2009/08/Switch-doble-500x220.jpg" alt="Switch doble" width="500" height="220" />En este caso, cuando el selector está arriba tenemos la entrada conectada a los 5V (1 lógico) y cuando está abajo la entrada pasa inmediatamente a estar a 0V (0 lógico). Aquí cada estado del selector está asociado inequívocamente a un valor del bit leído. Puedes encontrar este tipo de selectores bajo los botones del ratón de tu ordenador. De los tres pines que tienen, el que se encuentra bajo el pulsador está normalmente conectado al del otro extremo y cuando se presiona el pulsador pasa a estar conectado al del centro.</p>


<div id="attachment_2464" class="wp-caption aligncenter" style="width: 510px"><img class="size-large wp-image-2464" title="switch doble breadboard" src="http://www.obsoletos.org/wp-content/uploads/2009/08/P1090064-500x375.jpg" alt="switch doble breadboard" width="500" height="375" /><p class="wp-caption-text">Ejemplo de conexión de un selector. En esta imagen y en las siguientes el cable azul está conectado a tierra (0V) y el naranja a 5V.</p></div>
<p style="text-align: left;">Otra forma de mantener la entrada siempre a un voltaje conocido es usar una resistencia <em>pull-up</em> o <em>pull-down</em>. A continuación tienes el esquema del montaje de una resistencia<em> pull-down</em>:</p>
<p style="text-align: left;"><img class="aligncenter size-large wp-image-2461" title="switch pulldown" src="http://www.obsoletos.org/wp-content/uploads/2009/08/switch-pulldown-500x248.jpg" alt="switch pulldown" width="500" height="248" /></p>
<p style="text-align: left;">Se emplea una resistencia de valor intermedio. Lo más habitual es que sea de 1 o 10 KΩ. Cuando el interruptor está cerrado, la resistencia que ofrece la rama del circuito que va a los 5 V es mucho menor que la que va hasta los 0V así que el voltaje en el nodo donde confluyen las tres ramas del circuito es prácticamente 5V. Lo bueno es que aquí, cuando el interruptor se abre, el pin de entrada no queda aislado, sino que sigue conectado a tierra a través de la resistencia. Cualquier carga que hubiera quedado atrapada en el circuito se descarga rápidamente a través de la resistencia y la entrada se pone a 0V.</p>
<p style="text-align: left;">Una resistencia <em>pull-up</em> funciona igual, pero se conecta a los 5V como en este esquema:</p>
<p style="text-align: left;"><img class="aligncenter size-large wp-image-2462" title="switch pullup" src="http://www.obsoletos.org/wp-content/uploads/2009/08/switch-pullup-500x220.jpg" alt="switch pullup" width="500" height="220" /></p>
<p style="text-align: left;">En este caso con interruptor cerrado la rama de tierra tiene mucha menos resistencia que la de 5V y el voltaje en el nodo es de (prácticamente) 0V. Al abrirse el interruptor, la resistencia mantiene la entrada conectada a los 5V y el voltaje de entrada sube hasta ese valor.</p>
<p style="text-align: left;">Aquí abajo puedes ver como sería la entrada con una resistencia <em>pull-dow</em> (izquierda)  y otra <em>pull-up</em> (derecha).</p>
<p style="text-align: left;"><a href="../wp-content/uploads/2009/08/P1090067.jpg"><img class="size-medium wp-image-2465 alignleft" title="switch pulldown breadboard" src="http://www.obsoletos.org/wp-content/uploads/2009/08/P1090065-235x176.jpg" alt="switch pulldown breadboard" width="235" height="176" /><img title="switch pullup breadboard" src="../wp-content/uploads/2009/08/P1090067-235x176.jpg" alt="switch pullup breadboard" width="235" height="176" /></a></p>

<h4 style="text-align: left;">De vuelta al software</h4>
Bien, ahora que ya sabes como conectar tus sensores al puerto paralelo veamos un programita que lea el valor de esos sensores. Este ejemplo lee el valor de dos interruptores conectados a los pines 3 y 4 del puerto de estatus. Los interruptores usan resistencias <em>pull-up</em> por lo que la lectura de un 0 lógico en uno de esos pines representa una pulsación en su interruptor asociado. Un mensaje en pantalla dice qué interruptor se está pulsando.


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//Este programa monitoriza el valor estado de 2 pulsadores conectados</span>
<span style="color: #666666; font-style: italic;">//a las lineas de STATUS y muestra por pantalla si se ha pulsado alguno de ellos</span>
&nbsp;
<span style="color: #339933;">#include</span>
<span style="color: #339933;">#include </span>
&nbsp;
<span style="color: #666666; font-style: italic;">//sys/io.h es donde estan definidas las funciones ioperm() y inb()</span>
<span style="color: #339933;">#include </span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Esta es la direccion mas frecuente para el puerto paralelo</span>
<span style="color: #339933;">#define DATAPORT 0x378</span>
<span style="color: #666666; font-style: italic;">//Y esta es la direccion de las lineas de Status</span>
<span style="color: #339933;">#define STATUSPORT DATAPORT+1</span>
&nbsp;
<span style="color: #339933;">#define TIEMPOCONPULSACION 300000</span>
<span style="color: #339933;">#define TIEMPOSINPULSACION 10000</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Mascaras para los pines 3 y 4 del puerto de Status</span>
<span style="color: #339933;">#define BOTON1 8</span>
<span style="color: #339933;">#define BOTON2 16</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #666666; font-style: italic;">//Obtenemos permiso de acceso para la direccion de DATAPORT y</span>
  <span style="color: #666666; font-style: italic;">//las 2 siguientes</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ioperm<span style="color: #009900;">&#40;</span>DATAPORT<span style="color: #339933;">,</span> <span style="color: #0000dd;">3</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>perror<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;ioperm&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">//Entramos en el bucle principal del programa</span>
  <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">//input va a guardar el valor leido desde el puerto</span>
    <span style="color: #993333;">short</span> <span style="color: #993333;">int</span> input<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">//pulsacion nos va a decir que boton se ha pulsado</span>
    <span style="color: #993333;">short</span> <span style="color: #993333;">int</span> pulsacion <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
 	<span style="color: #666666; font-style: italic;">//Leemos el byte de las lineas de Status y lo guardamos en input</span>
 	input<span style="color: #339933;">=</span>inb<span style="color: #009900;">&#40;</span>STATUSPORT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
 	<span style="color: #666666; font-style: italic;">//Si input tiene el bit BOTON1 a cero es que se ha pulsado el boton correspondiente</span>
 	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>input <span style="color: #339933;">&amp;</span> BOTON1<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
 		<span style="color: #666666; font-style: italic;">//Ponemos pulsacion a 1 para indicarlo y sacamos un mensaje por pantalla</span>
 		pulsacion<span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
 	<span style="color: #666666; font-style: italic;">//Si tiene a cero el bit BOTON2 es que se ha pulsado el otro boton</span>
 	<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>input <span style="color: #339933;">&amp;</span> BOTON2<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
 		pulsacion<span style="color: #339933;">=</span><span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//Si pulsacion !=0 es que se ha pulsado algun boton.</span>
	<span style="color: #666666; font-style: italic;">//Esperamos TIEMPOCONPULSACION microsegundos para no inundar la pantalla de texto</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>pulsacion<span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Pulsando boton %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>pulsacion<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 		fflush<span style="color: #009900;">&#40;</span>stdout<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		usleep<span style="color: #009900;">&#40;</span>TIEMPOCONPULSACION<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;">//En caso contrario solo esperamos TIEMPOSINPULSACION microsegundos</span>
	<span style="color: #b1b100;">else</span> usleep<span style="color: #009900;">&#40;</span>TIEMPOSINPULSACION<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #666666; font-style: italic;">//Antes de terminar el programa dejamos los permisos de acceso</span>
  <span style="color: #666666; font-style: italic;">//a los puertos como estaban</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ioperm<span style="color: #009900;">&#40;</span>DATAPORT<span style="color: #339933;">,</span> <span style="color: #0000dd;">3</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>perror<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;ioperm&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">//El programa termina sin errores</span>
  <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>



Esto debería dejar más o menos claro cómo leer datos en las líneas de estatus, pero ¿qué pasa con las líneas de datos? ¿No habíamos quedado que son de entrada y salida? Bueno sí, lo son. Al menos en cualquier ordenador razonablemente moderno, pero en sus primeras versiones el puerto de datos era sólo de salida.

Suponiendo que tu ordenador tenga menos de 15 años puedes configurar las líneas de datos para entrada poniendo a 1 el bit 5 del puerto de control (este bit no se corresponde con ningún pin &#8220;físico&#8221; de puerto de control, sólo está ahi para seleccionar el modo del puerto de datos). Es decir:
<pre style="font-family: monospace; text-align: center;">outb<span style="color: #009900;">(</span>0x10<span style="color: #339933;">,</span>0x380<span style="color: #009900;">)</span><span style="color: #339933;">;</span></pre>
Después de eso ya puedes leer la entrada como hicimos antes, solo tienes que cambiar la dirección del puerto.
<pre style="font-family: monospace; text-align: center;"><strong>short int</strong> input = inb(0x378);<span style="color: #009900;"> </span><span style="color: #009900;"> </span><span style="color: #339933;"> </span></pre>
<h4>Otra vuelta de tuerca</h4>
Para terminar te propongo un programíta que usa tanto entrada como salida de datos por el puerto paralelo. Este programa detecta la pulsación de dos botones como el ejemplo anterior, pero ya no dice por pantalla qué botón se ha pulsado. Ahora tenemos 8 LEDs conectados a las 8 líneas de datos y uno de ellos está encendido. Lo que hace el programa es cambiar el LED que se enciende una posición a la derecha cuando se pulsa el botón derecho y una posición a la izquierda cuando se pulsa el botón izquierdo. Aunque mejor mira el vídeo que tenemos a continuación, que no deja lugar a dudas.

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="300" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=6444414&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="400" height="300" src="http://vimeo.com/moogaloop.swf?clip_id=6444414&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object>

Bueno, pues el programa que hace eso en realidad es muy similar al primero. Aquí lo tienes:


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//Este programa monitoriza el valor estado de 2 pulsadores conectados</span>
<span style="color: #666666; font-style: italic;">//a las lineas de STATUS y cambia la posicion del led que esta iluminado</span>
&nbsp;
<span style="color: #339933;">#include</span>
<span style="color: #339933;">#include </span>
&nbsp;
<span style="color: #339933;">#include </span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Direccion del puerto paralelo</span>
<span style="color: #339933;">#define DATAPORT 0x378</span>
<span style="color: #339933;">#define STATUSPORT DATAPORT+1</span>
&nbsp;
<span style="color: #339933;">#define TIEMPOCONPULSACION 300000</span>
<span style="color: #339933;">#define TIEMPOSINPULSACION 10000</span>
&nbsp;
<span style="color: #339933;">#define BOTON1 8</span>
<span style="color: #339933;">#define BOTON2 16</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #666666; font-style: italic;">//Obtenemos permiso de acceso para DATAPORT</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ioperm<span style="color: #009900;">&#40;</span>DATAPORT<span style="color: #339933;">,</span> <span style="color: #0000dd;">3</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>perror<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;ioperm&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">//light va  aguardar el estado de la salida del puerto.</span>
  <span style="color: #666666; font-style: italic;">//Lo hacemos igual a 00000001 en binario</span>
  <span style="color: #993333;">unsigned</span> <span style="color: #993333;">short</span> <span style="color: #993333;">int</span> light<span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
  <span style="color: #666666; font-style: italic;">//y lo sacamos por el puerto paralelo para que se encienda el primer led</span>
  outb<span style="color: #009900;">&#40;</span>light<span style="color: #339933;">,</span> DATAPORT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">//Bucle principal</span>
  <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">short</span> <span style="color: #993333;">int</span> input<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">short</span> <span style="color: #993333;">int</span> pulsacion <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
 	input<span style="color: #339933;">=</span>inb<span style="color: #009900;">&#40;</span>STATUSPORT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
 	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>input <span style="color: #339933;">&amp;</span> BOTON1<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
 		<span style="color: #666666; font-style: italic;">//Se ha pulsado el boton 1</span>
 		pulsacion<span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
 	<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>input <span style="color: #339933;">&amp;</span> BOTON2<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
 		<span style="color: #666666; font-style: italic;">//Se ha pulsado el boton 2</span>
 		pulsacion<span style="color: #339933;">=</span><span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>pulsacion<span style="color: #339933;">==</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">//Si light es (00000001)b lo convertimos en (10000000)b</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>light<span style="color: #339933;">==</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
			light<span style="color: #339933;">=</span><span style="color: #0000dd;">128</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">//Si no, desplazamos el 1 un lugar a la derecha</span>
		<span style="color: #b1b100;">else</span>
			light<span style="color: #339933;">&gt;&gt;=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">//Sacamos el nuevo valor por el puerto</span>
		outb<span style="color: #009900;">&#40;</span>light<span style="color: #339933;">,</span> DATAPORT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		usleep<span style="color: #009900;">&#40;</span>TIEMPOCONPULSACION<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>pulsacion<span style="color: #339933;">==</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">//Si light es (10000000)b lo convertimos en (00000001)b</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>light<span style="color: #339933;">==</span><span style="color: #0000dd;">128</span><span style="color: #009900;">&#41;</span>
			light<span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">//Si no, desplazamos el 1 un lugar a la izquierda</span>
		<span style="color: #b1b100;">else</span>
			light<span style="color: #339933;">&lt;&lt;=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">//Sacamos el nuevo valor por el puerto</span>
		outb<span style="color: #009900;">&#40;</span>light<span style="color: #339933;">,</span> DATAPORT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		usleep<span style="color: #009900;">&#40;</span>TIEMPOCONPULSACION<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">else</span> usleep<span style="color: #009900;">&#40;</span>TIEMPOSINPULSACION<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">//Restauramos los permisos de acceso al puerto</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ioperm<span style="color: #009900;">&#40;</span>DATAPORT<span style="color: #339933;">,</span> <span style="color: #0000dd;">3</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>perror<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;ioperm&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">//El programa termina sin errores</span>
  <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>



Ale, pues ya está, con esto terminamos la &#8220;parte teórica&#8221; del puerto paralelo. En el futuro intentaré hablar de cómo interactuar con cosas concretas (motores, pantallas LCD, disqueteras&#8230;), pero ésa es otra historia y debe ser contada en otro momento.]]></content:encoded>
			<wfw:commentRss>http://www.obsoletos.org/2009/09/sobre-entrada-de-datos-y-circuitos-electricos-puerto-paralelo-ii/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Más bonito, más robusto, mejor. (Osciloscopio laser III)</title>
		<link>http://www.obsoletos.org/2009/08/mas-bonito-mas-robusto-mejor-osciloscopio-laser-iii/</link>
		<comments>http://www.obsoletos.org/2009/08/mas-bonito-mas-robusto-mejor-osciloscopio-laser-iii/#comments</comments>
		<pubDate>Sat, 15 Aug 2009 07:00:09 +0000</pubDate>
		<dc:creator>cogollo</dc:creator>
				<category><![CDATA[Hackeos e ideas]]></category>
		<category><![CDATA[Nuestros hacks]]></category>
		<category><![CDATA[amplificador]]></category>
		<category><![CDATA[disco duro]]></category>
		<category><![CDATA[electrónica analógica]]></category>
		<category><![CDATA[osciloscopio laser]]></category>

		<guid isPermaLink="false">http://www.obsoletos.org/?p=2405</guid>
		<description><![CDATA[Hoy traigo un hack de refritos, y no me da ninguna vergüenza admitirlo, que para eso estamos en verano. ¿Recuerdas el osciloscopio láser que hicimos hace tiempo? ¿No? Pues vete echándole un vistazo a esto y a esto. El caso es que el trasto mola, pero la verdad que estaba un poco desmadejado. Así que [...]]]></description>
			<content:encoded><![CDATA[Hoy traigo un hack de refritos, y no me da ninguna vergüenza admitirlo, que para eso estamos en verano. ¿Recuerdas el osciloscopio láser que hicimos hace tiempo? ¿No? Pues vete echándole un vistazo a <a href="http://www.obsoletos.org/2008/07/osciloscopio-laser/">esto</a> y a <a href="http://www.obsoletos.org/2008/09/osciloscopio-laser-ii-figuras-de-lissajous/">esto</a>.

El caso es que el trasto mola, pero la verdad que estaba un poco desmadejado. Así que he pensado rehacerlo un poco más portable y un poco más bonito. Aquí lo tienes:

<img class="aligncenter size-large wp-image-2404" title="Osciloscopio - Completo abierto" src="http://www.obsoletos.org/wp-content/uploads/2009/08/P1080634-500x375.jpg" alt="Osciloscopio - Completo abierto" width="500" height="375" />

Y aquí tienes un vídeo del cacharro en acción. Como suele pasar con estas cosas el resultado es un poco oscuro para poder grabarlo como Dios manda, pero creo que llegará para que te hagas una idea.

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="500" height="380" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=6100875&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="500" height="380" src="http://vimeo.com/moogaloop.swf?clip_id=6100875&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object>

Como ves, básicamente lo he metido todo en una caja. Además le he añadido su propio amplificador y he incrustado todos los controles y conectores necesarios en las paredes de la caja.

Empezaré hablando de la parte electrónica ya que está hecha íntegramente con elementos que ya hemos construido en otras películas. El esquema general es éste:

<div id="attachment_2389" class="wp-caption aligncenter" style="width: 510px"><a href="http://www.obsoletos.org/wp-content/uploads/2009/08/Esquema-Osciloscopio.jpg"><img class="size-large wp-image-2389" title="Esquema Osciloscopio" src="http://www.obsoletos.org/wp-content/uploads/2009/08/Esquema-Osciloscopio-500x248.jpg" alt="Esquema Osciloscopio" width="500" height="248" /></a><p class="wp-caption-text">Pincha para ampliar</p></div>

Por un lado tenemos un amplificador de audio que coge las dos señales de entrada (canales izquierdo y derecho), las amplifica y se las pasa a los dos discos duros que actúan a modo de osciladores. Por otro lado tenemos una fuente/regulador de tensión que le proporciona al láser la corriente necesaria para que brille sin quemarse. Y ambos circuitos se alimentan a través de una clavija de transformador estandard.

<span id="more-2405"></span>
<h4>Los osciladores (discos duros)</h4>
Hay que preparar los discos duros tal como contábamos aquí, pero no los pegues entre sí todavía, ya los sujetaremos directamente a la caja. Además necesitaremos un amplificador de audio que coja la señal de entrada y la haga lo bastante potente como para mover los cabezales de los discos.

El amplificador es como el que ya hicimos <a href="http://www.obsoletos.org/2008/06/mi-pequeno-ampli/">aquí</a>, salvo por dos detalles: Le he puesto bornes de conexión tanto para la entrada y salida de señal como para la alimentación (me resulta más elegante que soldar directamente los cables); y también he sacado los potenciómetros que controlan el volumen de la placa.
<p style="text-align: center;"><a href="http://www.obsoletos.org/wp-content/uploads/2009/08/P1080619.jpg"><img class="size-medium wp-image-2393 alignleft" title="Osciloscopio - Amplificador vista 1" src="http://www.obsoletos.org/wp-content/uploads/2009/08/P1080619-235x176.jpg" alt="Osciloscopio - Amplificador vista 1" width="235" height="176" /></a><a href="http://www.obsoletos.org/wp-content/uploads/2009/08/P1080620.jpg"><img class="aligncenter size-medium wp-image-2394" title="Osciloscopio - Amplificador vista 2" src="http://www.obsoletos.org/wp-content/uploads/2009/08/P1080620-235x176.jpg" alt="Osciloscopio - Amplificador vista 2" width="235" height="176" /></a></p>

En el lugar de cada potenciómetro he puesto un grupo de tres pines. De esta manera luego podré conectar ahí, mediante un cablecillo, los potenciómetros que irán atornillados a la caja .

<div id="attachment_2399" class="wp-caption aligncenter" style="width: 510px"><img class="size-large wp-image-2399" title="Osciloscopio - Potenciometro volumen" src="http://www.obsoletos.org/wp-content/uploads/2009/08/P1080626-500x375.jpg" alt="Osciloscopio - Potenciometro volumen" width="500" height="375" /><p class="wp-caption-text">Potenciometro listo para su colocación con su cable y su conector de 3 pines hembra</p></div>
<p style="text-align: left;"></p>

<h4 style="text-align: left;">El láser</h4>
<p style="text-align: left;">La fuente de alimentación del láser también <a href="http://www.obsoletos.org/2008/09/mini-fuente-de-tension-en-tres-patadas/">la tenemos hecha de antes</a>. Aunque también en este caso he cambiado alguna cosilla. Como solo vamos a usar uno de los canales le he quitado uno de los potenciómetros y le he puesto solo dos bornes de salida (en lugar de los tres que tiene la original). Una vez tienes la fuente, lo habitual en este tipo de punteros de baratillo es que tengas que conectar el polo positivo a la carcasa del puntero y el negativo el muelle que llevan en el compartimento de las pilas. Si no alcanzas bien ese muelle puedes hacer como yo y serrar el puntero para dejarlo a la vista.</p>
<p style="text-align: left;"><img class="size-medium wp-image-2397 alignleft" title="Osciloscopio - Regulador laser" src="http://www.obsoletos.org/wp-content/uploads/2009/08/P1080624-235x176.jpg" alt="Osciloscopio - Regulador laser" width="235" height="176" /><img class="aligncenter size-medium wp-image-2398" title="Osciloscopio - Regulador laser reverso" src="http://www.obsoletos.org/wp-content/uploads/2009/08/P1080625-235x176.jpg" alt="Osciloscopio - Regulador laser reverso" width="235" height="176" /></p>
<p style="text-align: left;">Y como ves, después de conectarlo todo he pegado directamente el láser a la fuente para ahorrar espacio.</p>

<h4 style="text-align: left;">La caja</h4>
Bueno, ya tenemos lo más enjundioso, ahora toca meterlo todo en una caja. Asegúrate de que los discos caben en la caja, si el disco vertical cabe con la caja cerrada, pero sobresale un poco cuando está abierta, mejor. Así te evitas tener que hacer un agujero para que salga el rayo del láser. Esta caja en concreto la encontramos en la basura, pero me consta que las hay parecidas en el todo a 100.

Para empezar haz los agujeros para el conector de la alimentación y el interruptor en un costado. Luego hay que hacer dos agujeros para los potenciómetros de control del volumen y otros dos para los conectores de entrada de señal de audio.

<img class="size-medium wp-image-2390 alignleft" title="Osciloscopio-Agujero alimentación" src="http://www.obsoletos.org/wp-content/uploads/2009/08/P1080616-235x176.jpg" alt="Osciloscopio-Agujero alimentación" width="235" height="176" /><img class="aligncenter size-medium wp-image-2391" title="Osciloscopio - Agujeros entrada de audio" src="http://www.obsoletos.org/wp-content/uploads/2009/08/P1080617-235x176.jpg" alt="Osciloscopio - Agujeros entrada de audio" width="235" height="176" />

Ahora mete los discos. Uno en horizontal y otro en vertical, como en el osciloscopio original. Pégalos al fondo y la pared de la caja con cola termoplástica para que no se muevan, pero asegúrate antes de que los espejos están correctamente alineados.

El siguiente paso es sujetar el láser. Enciéndelo y busca la posición en la que el rayo se refleja en ambos espejos y luego sale por encima del borde de la caja. Yo, para que se mantuviera en su sitio le hice un poyete de arcilla. (Al principio lo hice de plastilina, pero descubrí que la plastilina es ligeramente conductora y al conectar el láser empezó a quemarse y chisporrotear. Nada bonito).

En tercer lugar ponemos el ampli. Este lo sujeto con tres pegotes de termoplástico sobre uno de los discos, donde no moleste. Atornilla dos <a href="http://es.wikipedia.org/wiki/Conector_RCA">conectores RCA</a> en los agujeros que hiciste en la caja y conéctalos a las entradas de audio del ampli.

<img class="aligncenter size-large wp-image-2396" title="Osciloscopio - Amplificador reverso" src="http://www.obsoletos.org/wp-content/uploads/2009/08/P1080622-500x375.jpg" alt="Osciloscopio - Amplificador reverso" width="500" height="375" />

Atornilla también los potenciómetros y conéctalos con los tres pines del ampli como comentamos antes. Por último pon el conector de alimentación y el interruptor y conecta los cables de alimentación tanto al regulador de tensión del láser como al ampli.

<div id="attachment_2402" class="wp-caption aligncenter" style="width: 510px"><img class="size-large wp-image-2402" title="Osciloscopio - Vista interior 3" src="http://www.obsoletos.org/wp-content/uploads/2009/08/P1080629-500x375.jpg" alt="Osciloscopio - Vista interior 3" width="500" height="375" /><p class="wp-caption-text">Al final te quedan todos estos cables</p></div>
<p style="text-align: left;">Afortunadamente, desde fuera queda mucho mejor. Si quieres, este es el momento de recortar los palotes de los potenciómetros, que sobresalen demasiado.</p>
<p style="text-align: left;"><img class="aligncenter size-large wp-image-2403" title="Osciloscopio -  Completo cerrado" src="http://www.obsoletos.org/wp-content/uploads/2009/08/P1080633-500x375.jpg" alt="Osciloscopio -  Completo cerrado" width="500" height="375" /></p>
<p style="text-align: left;">Ya solo tienes que conectarlo al típico transformador universal y podrás ver tu música favorita. Y ahora, además, puedes hacerlo en cualquier parte.</p>]]></content:encoded>
			<wfw:commentRss>http://www.obsoletos.org/2009/08/mas-bonito-mas-robusto-mejor-osciloscopio-laser-iii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Los teclitos</title>
		<link>http://www.obsoletos.org/2009/07/los-teclitos/</link>
		<comments>http://www.obsoletos.org/2009/07/los-teclitos/#comments</comments>
		<pubDate>Thu, 23 Jul 2009 15:10:35 +0000</pubDate>
		<dc:creator>paaq</dc:creator>
				<category><![CDATA[Low-fi y artesanía]]></category>
		<category><![CDATA[Nuestros hacks]]></category>
		<category><![CDATA[teclas]]></category>
		<category><![CDATA[teclitos]]></category>

		<guid isPermaLink="false">http://www.obsoletos.org/?p=2334</guid>
		<description><![CDATA[Manu hizo estos muñecos para explicar a sus compañeros de piso qué es la pareidolia. Son los teclitos, entrañables seres compuestos por un cable eléctrico y una tecla. De la tecla depende la personalidad de cada teclito, ¿qué nombre le pondríais a estos tres? Para los primeros, que Manu confeccionó en Caracas, se usó cable [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_2335" class="wp-caption aligncenter" style="width: 510px"><a href="http://www.obsoletos.org/wp-content/uploads/2009/07/teclitos.jpg"><img class="size-large wp-image-2335" title="teclitos" src="http://www.obsoletos.org/wp-content/uploads/2009/07/teclitos-500x313.jpg" alt="Los tres teclitos" width="500" height="313" /></a><p class="wp-caption-text">Los tres teclitos</p></div>

Manu hizo estos muñecos para explicar a sus compañeros de piso qué es la <a href="http://www.xeduced.com/2008/01/28/10-imagenes-de-parecidos-razonables-pareidolia/">pareidolia</a>. Son los teclitos, entrañables seres compuestos por un cable eléctrico y una tecla. De la tecla depende la personalidad de cada teclito, <strong>¿qué nombre le pondríais a estos tres?</strong>

<div id="attachment_2336" class="wp-caption aligncenter" style="width: 510px"><a href="http://www.obsoletos.org/wp-content/uploads/2009/07/teclitos2.jpg"><img class="size-large wp-image-2336" title="teclitos2" src="http://www.obsoletos.org/wp-content/uploads/2009/07/teclitos2-500x299.jpg" alt="Un teclito diseccionado" width="500" height="299" /></a><p class="wp-caption-text">Un teclito diseccionado</p></div>

Para los primeros, que Manu confeccionó en Caracas, se usó cable de red, dotándoles así de más tentáculos y por tanto mayor poder destructivo. Pero los teclitos no nos harán nada malo si no les ofendemos. Nos vamos a bailar en su honor a las <a href="http://www.fiestasdetudela.com/">fiestas de Tudela</a>, volvemos la semana que viene.]]></content:encoded>
			<wfw:commentRss>http://www.obsoletos.org/2009/07/los-teclitos/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PXE y un cable de red bastan para arrancar tu ordenador sin disquetera, CD ni USB</title>
		<link>http://www.obsoletos.org/2009/06/pxe-y-un-cable-de-red-bastan-para-arrancar-tu-ordenador-sin-disquetera-cd-ni-usb/</link>
		<comments>http://www.obsoletos.org/2009/06/pxe-y-un-cable-de-red-bastan-para-arrancar-tu-ordenador-sin-disquetera-cd-ni-usb/#comments</comments>
		<pubDate>Wed, 10 Jun 2009 07:00:25 +0000</pubDate>
		<dc:creator>skotperez</dc:creator>
				<category><![CDATA[Nuestros hacks]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[DHCP]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[PXE]]></category>
		<category><![CDATA[TFTP]]></category>

		<guid isPermaLink="false">http://www.obsoletos.org/?p=2094</guid>
		<description><![CDATA[En esto del reciclaje tecnológico hay veces que cae en tus manos un ordenador que es como un niño sordo y ciego con el que te tienes que comunicar, un ordenador sin lector de CD y sin disquetera en el que quieres arrancar un sistema operativo e incluso instalárselo. Por otro lado, hay veces que [...]]]></description>
			<content:encoded><![CDATA[En esto del reciclaje tecnológico hay veces que cae en tus manos un ordenador que es como un niño sordo y ciego con el que te tienes que comunicar, un ordenador sin lector de CD y sin disquetera en el que quieres arrancar un sistema operativo e incluso instalárselo. Por otro lado, hay veces que necesitas instalar el mismo sistema operativo masivamente por la razón que sea, en nuestro caso para preparar los equipos con los que damos los talleres. En este caso, aunque los equipos tengan lector de CD, el método tradicional se revela lento e incómodo: preparar tantas copias del instalador en CD como equipos quieras instalar, copias que al cabo de unos meses se quedan desactualizadas por lo que son, prácticamente, de un solo uso.

Si te enfrentas a uno de estos dos casos puedes intentar comunicarte con el ordenador vía <acronym title="Local Area Network">LAN</acronym>, desde otro equipo de la red local, independientemente del sistema operativo que tenga instalado o de que no tenga ninguno. <strong>Mediante la red local puedes iniciar un ordenador e instalar un sistema operativo completo después.</strong> Para ello necesitamos un equipo que actúe como servidor <acronym title="Pre-boot eXecution Enviroment">PXE</acronym>, al que se conectará el cliente cuando lo encendamos y del que obtendrá los archivos necesarios para arrancar e instalar el sistema operativo completo.

<div id="attachment_2122" class="wp-caption alignnone" style="width: 563px"><img class="size-full wp-image-2122" title="pxe booting" src="http://www.obsoletos.org/wp-content/uploads/2009/06/pxe_booting.jpg" alt="¿Está claro, no?" width="553" height="700" /><p class="wp-caption-text">¿Está claro, no?</p></div>

Bueno, si el gráfico no ha sido suficiente para ti, sigue leyendo, que en realidad es más fácil de lo que parece.<span id="more-2094"></span>
<h2>Cuestiones previas</h2>
<ul>
	<li>En este caso, asumiremos que el servidor está corriendo sobre un <a title="Debian" href="http://debian.org">Debian GNU/Linux</a> o <a title="Categoría:Distribuciones basadas en Debian GNU/Linux -- Wikipedia" href="http://es.wikipedia.org/wiki/Categor%C3%ADa:Distribuciones_basadas_en_Debian_GNU/Linux">una distribución basada en Debian</a>, y que en los clientes queremos instalar <a title="Debian “lenny” Release Information -- Debian" href="http://www.debian.org/releases/lenny/">Debian Lenny</a>.</li>
	<li>Asumiremos también que estamos trabajando con una red local del tipo 192.168.1.0, que son la mayoría de ellas.</li>
	<li>Por último decir, que la instalación, configuración y demás operaciones las haremos desde una consola con permisos de usuario administrador. En las líneas de este pequeño manual indicamos esto con la notación <code>root@server:~#</code>, antes de cada orden que hay que ejecutar como administrador o root.</li>
</ul>
<h2>Requisitos y configuración del equipo cliente</h2>
Para poder realizar este tipo de instalación el cliente deberá disponer de la opción de arranque mediante LAN en la <a title="BIOS -- Wikipedia" href="http://es.wikipedia.org/wiki/BIOS">BIOS</a> (Basic Input/Output System), y tenerla activada. La BIOS es un software que viene instalado en la placa base de cualquier ordenador y que controla el arranque y detecta todo el hardware de la máquina. Normalmente se accede a él nada más encender el ordenador pulsando la tecla adecuada, &#8220;Supr&#8221; en casi todos los casos. En la <a title="Secuencia de arranque -- Wikipedia" href="http://es.wikipedia.org/wiki/Arranque_(inform%C3%A1tica)">secuencia de arranque</a> (Boot sequence) de la BIOS se listan en orden de prioridad los dispositivos desde los que se puede iniciar un sistema operativo: unidades de CD, disquetes, discos duros&#8230; Además, algunas BIOS dan la posibilidad de iniciar el ordenador desde un dispositivo alojado en otro ordenador, a través de una red local. Esta opción es la que activaremos y vamos a usar para arrancar nuestro equipo cliente.
<h2>Requisitos y configuración del equipo servidor</h2>
Este equipo le proporcionará al ciente una dirección en la red local, y posteriormente los archivos necesarios para arrancar. Estos archivos pueden ser un programa para instalar un sistema operativo completo, o directamente un sistema operativo tipo live. Para proporcionar estos dos servicios nuestro servidor tendrá que tener instalado un Pre-boot eXecution Enviroment (PXE) que se compone de un servidor DHCP, para integrar en la red local al cliente, respondiendo a su solicitud dándole una dirección IP; y un servidor TFTP, que pone a disposición de los clientes un sistema mínimo de arranque, un kernel para descargar en definitiva.

Para poner en funcionamiento ambos servicios, DHCP y TFTP los pasos a seguir son tres: instalar los paquetes necesarios, configurar el servicio e iniciarlo.
<h4>Servidor DHCP</h4>
Hay varios paquetes para que un ordenador actúe como servidor DHCP. Nosotros utilizaremos <strong><a title="Dnsmasq -- A DNS forwarder for NAT firewalls" href="http://www.thekelleys.org.uk/dnsmasq/doc.html">dnsmasq</a></strong>.

<strong>Instalación</strong>.
<blockquote><code>root@server:~# apt-get install dnsmasq</code></blockquote>
<strong>Configuración</strong>. El archivo de configuración (/etc/dnsmasq.conf) trae toda la documentación incrustada en forma de comentarios antes de cada orden. Por defecto todas las órdenes vienen comentadas también, para activarlas borraremos la almohadilla de principio de línea. Las líneas que deben estar activas son las siguientes:
<blockquote><code>dhcp-range=192.168.1.223,192.168.1.254,12h
dhcp-no-override
dhcp-boot=pxelinux.0
enable-tftp
tftp-root=/var/lib/tftpboot</code></blockquote>
<code>dhcp-range</code> indica a dnsmasq el rango de IPs que podrán ser asignadas a clientes por nuestro servidor DHCP, y el tiempo que estas direcciones tardan en renovarse. A la hora de elegir un rango hay que tener en cuenta cuántos equipos van a obtener una dirección del servidor, para que no se acaben, y que el máximo es de 1 a 254.
<code>dhcp-no-override</code> es una medida de seguridad para el PXE. Para los curiosos, hay más información en la <a title="How to configure dnsmasq for gPXE: A potential problem and a fix -- etherboot" href="http://www.etherboot.org/wiki/dnsmasq#a_potential_problem_and_a_fix">wiki de etherboot</a>.
<code>dhcp-boot</code> indica el archivo que contendrá la información de arranque. Por convenio se suele llamar simepre <code>pxelinux.0</code>.
<code>enable-tftp</code> le dice a dnsmasq que active sus funciones relacionadas con el servidor TFTP.
<code>tftp-root</code> por último establece la ubicación accesible para los clientes vía TFTP. Por tanto, es aquí donde tendremos que alojar los archivos que necesiten los clientes para arrancar o iniciar un sistema operativo. Podemos designar cualquier ruta, pero de nuevo por convenio se suele indicar <code>/var/lib/tftpboot</code>.

<strong>Puesta en marcha</strong>.
<blockquote><code>root@server:~# </code><code>/etc/init.d/dnsmasq restart</code></blockquote>
<h4>Servidor TFTP</h4>
<strong>Instalación</strong>.
<blockquote><code>root@server:~# </code><code>apt-get install tftpd-hpa</code></blockquote>
<strong>Configuración</strong>. El fichero de configuración (/etc/default/tftpd-hpa) sólo tiene dos líneas:
<blockquote><code>RUN_DAEMON="yes"
OPTIONS="-l -s /var/lib/tftpboot"</code></blockquote>
<code>RUN_DAEMON</code> viene con la opción &#8220;no&#8221;, por defecto; la cambiamos a &#8220;yes&#8221;. En <code>OPTIONS</code> tenemos que asegurarnos que la ruta que figura sea la misma que en el archivo de configuración de dnsmasq.

<strong>Puesta en marcha</strong>.
<blockquote><code>root@server:~# </code><code>/etc/init.d/tftp-hpa start</code></blockquote>
<h4>Servidor PXE</h4>
Pues ya deberías tener listo un servidor PXE para tu red local. Ahora solo te queda descargarte un instalador de la distribución que prefieras, en su versión net-install y colocarla en la ubicación del servidor que hemos definido como accesible a los clientes. En nuestro caso, Debian Lenny. Debian ofrece una versión para instalar por red completamente preparada en un archivo comprimido, así que lo único que hay que hacer es descargarla y descomprimirla:
<blockquote><code>root@server:~# cd /var/lib/tftpboot
root@server:/var/lib/tftpboot# wget http://ftp.es.debian.org/debian/dists/lenny/main/installer-i386/current/images/netboot/netboot.tar.gz
root@server:</code><code>/var/lib/tftpboot#</code><code> tar -zxvf netboot.tar.gz</code></blockquote>
Ya está. Si ahora encendemos nuestro ordenador cliente, tras hacer el recuento de memoria y las demás comprobaciones de hardware, se conectará al servidor PXE e iniciará el instalador de Debian Lenny.
<h2>Más sobre el tema</h2>
<strong><a title="Setting up a server for PXE network booting -- Debian Administrator" href="http://www.debian-administration.org/articles/478">Setting up a server for PXE network booting</a></strong>, en <a title="Debian Administrator -- System Administration Tips and Resources" href="http://www.debian-administration.org"><em>Debian Administrator</em></a>.
Manual para configurar un servidor PXE, muy completo. Explica la organización que tienen que tener los archivos del servidor a trasferir mediante TFTP, y un resumen de la sintaxis para generar menús para mostrar opciones en el arranque.

<a title="Dnsmasq Setup -- thekelleys.org.uk" href="http://thekelleys.org.uk/dnsmasq/docs/setup.html"><strong>Dnsmasq Setup</strong></a>, en la <a title="Dnsmasq" href="http://thekelleys.org.uk/dnsmasq/doc.html"><em>Página oficial de dnsmasq</em></a>.
Aquí se puede encontrar la manera de configurar dnsmasq no sólo como servidor DHCP, también como servidor DNS.
Ejemplo de archivo de configuración de dnsmasq (/etc/dnsmasq.conf): http://edoceo.com/liber/network-dhcp

<a title="PXELINUX -- Syslinux" href="http://syslinux.zytor.com/wiki/index.php/PXELINUX"><strong>PXELinux</strong></a>, en <a title="The Syslinux Project" href="http://syslinux.zytor.com/wiki/index.php/The_Syslinux_Project"><em>The Syslinux Project</em></a>. Información exhaustiva para configurar un PXE, incluyendo la puesta en marcha de un servidor DHCP y TFTP.

<small>Imagen: <a title="Classical Internet Applications (CIA) -- os3" href="https://www.os3.nl/2008-2009/students/wouter_van_dongen/classical_internet_applications_cia">os3. System and networking engineering</a>.</small>]]></content:encoded>
			<wfw:commentRss>http://www.obsoletos.org/2009/06/pxe-y-un-cable-de-red-bastan-para-arrancar-tu-ordenador-sin-disquetera-cd-ni-usb/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Otra mini-fuente</title>
		<link>http://www.obsoletos.org/2009/05/otra-mini-fuente/</link>
		<comments>http://www.obsoletos.org/2009/05/otra-mini-fuente/#comments</comments>
		<pubDate>Mon, 11 May 2009 12:19:01 +0000</pubDate>
		<dc:creator>cogollo</dc:creator>
				<category><![CDATA[Hackeos e ideas]]></category>
		<category><![CDATA[Nuestros hacks]]></category>
		<category><![CDATA[electrónica]]></category>
		<category><![CDATA[fuente de tensión]]></category>

		<guid isPermaLink="false">http://www.obsoletos.org/?p=1838</guid>
		<description><![CDATA[Necesitábamos fuentes de tensión pequeñas y fiables para los talleres de Medialab, así que un servidor se tuvo que pasar la mañana del jueves soldando diez pequeños artilugios como éste: No son gran cosa, pero ya que están hechos, he pensado en rentabilizar un poco más mi trabajo publicando los planos. Espero que le vengan [...]]]></description>
			<content:encoded><![CDATA[Necesitábamos fuentes de tensión pequeñas y fiables para los <a title="Circuitos rescatados: talleres de reutilización creativa de residuos informáticos -- Obsoletos" href="http://www.obsoletos.org/2009/05/circuitos-rescatados-talleres-de-reutilizacion-creativa-de-residuos-informaticos/">talleres de Medialab</a>, así que un servidor se tuvo que pasar la mañana del jueves soldando diez pequeños artilugios como éste:

<img class="aligncenter size-large wp-image-1848" title="FuenteSola" src="http://www.obsoletos.org/wp-content/uploads/2009/05/p1060621-500x281.jpg" alt="FuenteSola" width="500" height="281" />

No son gran cosa, pero ya que están hechos, he pensado en rentabilizar un poco más mi trabajo publicando los planos. Espero que le vengan bien a alguien.

<img class="aligncenter size-large wp-image-1845" title="MontonDeFuentes" src="http://www.obsoletos.org/wp-content/uploads/2009/05/p1060618-500x281.jpg" alt="MontonDeFuentes" width="500" height="281" />

Pero antes de meternos en harina, un par de aclaraciones. Primero: a diferencia de <a href="http://www.obsoletos.org/2008/09/mini-fuente-de-tension-en-tres-patadas/">las fuentes que hicimos hace unos meses</a>, éstas no son regulables (suministran siempre 5V), pero a cambio son capaces de proporcionar corrientes mucho mayores (1 A frente a los 20 mA de las otras).

Segundo: ¿Por qué 5V? Pues porque es el voltaje estándar en electrónica. Casi todos los circuitos integrados que pululan por el mundo se alimentan a 5V. Y a la hora de transmitir/recibir señales digitales, se usan 0 y 5 V para representar los 0 y 1 de la señal.

De hecho, el uso de 5V es tan común en la electrónica que muchos fabricantes de circuitos integrados tienen a la venta pequeños reguladores bajo la referencia genérica de <a href="http://www.datasheetcatalog.org/datasheets/228/390068_DS.pdf">7805</a>.

<img class="aligncenter size-large wp-image-1839" title="7805" src="http://www.obsoletos.org/wp-content/uploads/2009/05/7805-300x500.jpg" alt="7805" width="300" height="500" />Si pones un 7805 como en la foto de arriba, la pata de la izquierda sería la entrada, que admite cualquier voltaje entre 7 y 35 V, la de la derecha sería la salida, que suministra los famosos 5V siempre que el voltaje de la entrada se mantenga dentro del rango operativo. Por último, la pata de en medio se conecta a tierra.

Como ves, ya sólo con el 7805 tenemos la fuente de 5V que necesitamos. Lo único que he hecho yo ha sido añadir un portapilas para la entrada, un interruptor para poder apagarla cuando no esté en uso,  un led para saber si está apagada o encendida y un par de pines para poder pincharla en la <a href="http://es.wikipedia.org/wiki/Breadboard">protoboard</a>.
<h4>Materiales</h4>
<ul>
	<li>Un recorte de placa perforada sobre la que soldar los componentes.</li>
	<li>Un <a href="http://www.datasheetcatalog.org/datasheets/228/390068_DS.pdf">7805</a>.</li>
	<li>Un interruptor.</li>
	<li>Un led.</li>
	<li>Una resistencia de 480 Ohmnios.</li>
	<li>Un portapilas para pilas de 9V.</li>
	<li>Dos pines.</li>
</ul>
<h4>Construcción</h4>
Aquí tienes el esquema del circuito. Como puedes ver es muy sencillo.

<img class="aligncenter size-large wp-image-1837" title="EsquemaFuente5V" src="http://www.obsoletos.org/wp-content/uploads/2009/05/fuente-5v-500x270.jpg" alt="EsquemaFuente5V" width="500" height="270" />

Igual es tontería decirlo, pero como queremos los pines para poder pinchar la fuente en nuestra protoboard, los tenemos que soldar por la cara de abajo. Son un poco incómodos de soldar así, pero desde luego puede hacerse (yo lo he tenido que hacer 10 veces y no ha sido tan trágico).

<img class="aligncenter size-large wp-image-1849" title="DetalleDeLosPines" src="http://www.obsoletos.org/wp-content/uploads/2009/05/p1060622-500x375.jpg" alt="DetalleDeLosPines" width="500" height="375" />

Otra cosa que puede dar guerra (a mí me la dio) es que muchos interruptores tienen las patas más gordas que los agujeros de una placa perforada normal. La solución en este caso es agrandar los agujeros de tu placa con un taladro o una drémel.
<p style="text-align: center;"><img class="size-large wp-image-1850 aligncenter" title="AgujerosParaInterruptor" src="http://www.obsoletos.org/wp-content/uploads/2009/05/p1060623-500x375.jpg" alt="AgujerosParaInterruptor" width="500" height="375" /></p>

A parte de eso no se me ocurre qué más complicaciones pueden surgir, la verdad. En 20 minutos lo tienes listo. Que cunda.]]></content:encoded>
			<wfw:commentRss>http://www.obsoletos.org/2009/05/otra-mini-fuente/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Iniciando sesión remota</title>
		<link>http://www.obsoletos.org/2009/04/iniciando-sesion-remota/</link>
		<comments>http://www.obsoletos.org/2009/04/iniciando-sesion-remota/#comments</comments>
		<pubDate>Thu, 09 Apr 2009 09:45:25 +0000</pubDate>
		<dc:creator>cogollo</dc:creator>
				<category><![CDATA[Nuestros hacks]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[NX]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.obsoletos.org/?p=1486</guid>
		<description><![CDATA[Estas tres últimas semanas han sido poco menos que un infierno. Hace unos días estuvimos aprendiendo a usar el puerto paralelo, e igual estoy adelantando acontecimientos, pero después de conseguir encender luces, no ha sido nada difícil controlar también un par de motores (ya veras cómo en el próximo post). Y después de poder controlar [...]]]></description>
			<content:encoded><![CDATA[Estas tres últimas semanas han sido poco menos que un infierno.<a href="http://www.obsoletos.org/2009/02/accediendo-al-mundo-real-el-puerto-paralelo/"> Hace unos días estuvimos aprendiendo a usar el puerto paralelo</a>, e igual estoy adelantando acontecimientos, pero después de conseguir encender luces, no ha sido nada difícil controlar también un par de motores (ya veras cómo en el próximo post). Y después de poder controlar motores, tampoco ha sido muy difícil ponerles ruedas a esos motores.

Total que ahora<strong> se me ha metido en la cabeza ponerle ruedas a un portátil y hacer que se mueva él solito</strong>. Porque claro, tenemos una red wifi que cubre toda nuestra casa, así que, teóricamente, podríamos acceder a ese portátil, y pilotarlo remotamente desde cualquier lugar del mundo (a través de internet en primera instancia y luego a través de nuestra red local).

Y fijate que no es tan difícil, oye. Tenemos a nuestra disposición herramientas como <a href="http://es.wikipedia.org/wiki/Telnet">telnet</a> o <a href="http://es.wikipedia.org/wiki/OpenSSH">SSH</a> que permiten iniciar sesión en un equipo remoto como si se estuviera ejecutando en nuestro equipo local. Podemos pues pasarle comandos por red a nuestro portátil usando otro ordenador como mando a distancia. El problema con estos sistemas es que sólo permiten iniciar sesion en modo texto. Y si bien no es muy problemático para pasarle información al cochecillo (después de todo sólo queremos que reaccione a la pulsación de ciertas teclas), sí que lo es para que el vehículo nos pase información a nosotros. Porque la información que puede transmitir una consola de texto es bastante limitada, y si estás intentando conducir un cochecillo que está en Madrid desde Cuenca necesitas que te den alguna pista.

Lo primero que se me ocurre para evitarnos este problema es añadirle una <strong>webcam</strong> al invento. Ahora, si iniciamos una sesión gráfica en ese ordenador podemos usar cualquier programilla que nos muestre las imágenes que está captando la webcam, como <a href="http://camorama.fixedgear.org/about.php">camorana</a>. Ergo, si iniciamos una sesión gráfica remota podremos ver lo que está viendo la webcam remotamente.

Parece fácil, ¿verdad? Y es que, además, disponemos de varias formas de hacer esto en linux. Está <a href="http://es.wikipedia.org/wiki/XDMCP">XDMCP</a>, que vendría a ser el protocolo que usa linux por defecto para estos menesteres, y que casi seguro que ya tienes instalado. Y está <a href="http://es.wikipedia.org/wiki/VNC">VNC</a>, que casi seguro que también tienes instalado (prueba a escribir &#8220;vinagre&#8221; en la consola) y que permite iniciar sesiones no sólo en otro ordenador con linux, sino en un ordenador con cualquier sistema operativo (suponiendo que le hayas instalado un servidor de VNC, claro).

Bueno, pues no es tan fácil. El problema con estos dos sistemas es que <strong>consumen muchísimo ancho de banda</strong>. Date cuenta que tienen que enviar la información que tiene que mostrar la pantalla en cada instante.  Pueden funcionar en una red local, pero cuando tienes que mandar ese chorro de datos por internet el sistema se satura y se vuelve inmanejable. Incluso dentro de la red local, en cuanto arrancas la webcam todo se vuelve leeeento y la imagen se mueve a saltos.

Afortunadamente el mundo es grande e internet es pequeño, y una empresa Italiana llamada <a href="http://www.nomachine.com/">Nomachine</a> ya se ha encargado de sacarnos las castañas del fuego. En concreto, esta compañía creo hace un par de años la <a href="http://es.wikipedia.org/wiki/Tecnolog%C3%ADa_NX">tecnología <strong>NX</strong></a>, que para que nos entendamos te permite ejecutar un escritorio virtual igual que con XDMCP o VNC, pero que, entre otras cosas,  cuenta con un potente algoritmo de <strong>compresión de datos</strong>.

En teoría la tecnología NX permite trabajar remotamente incluso con una conexión de modem. Yo no diría tanto. Pero sí es verdad que con velocidades de DSL permite ver las captura de la webcam con una tasa de refresco aceptable. Y en red local, con la conexión wifi de casa va suficientemente fluido como para poder jugar al <a href="http://">MAME</a>.

Entonces ¿cómo le mete uno el NX ese al ordenador? En primer lugar, NX canaliza todas sus comunicaciones a través de <strong>SSH</strong>, así que necesitaras instalar <a href="http://www.openssh.com/">OpenSSH</a> para que todo funcione (en Debian o Ubuntu esto es tan fácil como poner &#8220;apt-get install ssh&#8221; en una consola con permisos de administrador). Despues de eso sólo tienes que<a href="http://www.nomachine.com/select-package.php?os=linux&amp;id=1"> descargarte los tres paquetes de NX de la página de NoMachine</a>. En la máquina que vaya a funcionar como servidor (la máquina a la que te vas a conectar) tienes que instalar los tres paquetes (<em>nxclient</em>, <em>nxnode</em> y <em>nxserver</em>). En el cliente (el ordenador que vas a estar manoseando) sólo hace falta instalar el paquete nxclient.

Y ya estamos listos. &#8220;NX Client for Linux&#8221; debería haber aparecido en el menu de tu escritorio. Si lo pulsas aparecerá una ventana como ésta para que introduzcas los datos de la nueva conexión:
<p style="text-align: center;"><img class="aligncenter size-full wp-image-1594" title="NXclient" src="http://www.obsoletos.org/wp-content/uploads/2009/04/nxclient.jpg" alt="NXclient" width="380" height="450" /></p>
<p style="text-align: left;">Como ves, nada del otro mundo. Sólo tienes que introducir la dirección del servidor al que quieres conectarte (el puerto por defecto es el 22), el tipo de sistema al que vas a conectarte, la velocidad de la conexión y el tamaño que quieres que tenga tu escritorio remoto. Bastante fácil.</p>
<p style="text-align: left;">Por cierto, el NX de NoMachine para linux es gratuito, pero si te va la marcha existe una versión totalmente libre llamada <strong><a href="http://freenx.berlios.de/download.php">FreeNX</a></strong>, aunque resulta algo más complicada de instalar.</p>
<p style="text-align: left;">Y eso es todo. Nada demasiado expectacular, pero creo que este programa puede suponer una muy buena herramienta contra la obsolescencia ya que nos permite rescatar las máquinas más limitadas para usarlas como terminales de conexión a nuestro nuevo y gordo servidor, tal como apuntó hace tiempo <em>erseco</em> <a href="http://www.obsoletos.org/2009/01/el-portatil-de-ocho-euros-hace-amiguitos/#comment-655">en uno de sus comentarios</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.obsoletos.org/2009/04/iniciando-sesion-remota/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cubiluz, el cubo luminoso</title>
		<link>http://www.obsoletos.org/2009/03/cubiluz-el-cubo-luminoso/</link>
		<comments>http://www.obsoletos.org/2009/03/cubiluz-el-cubo-luminoso/#comments</comments>
		<pubDate>Thu, 05 Mar 2009 13:05:36 +0000</pubDate>
		<dc:creator>cogollo</dc:creator>
				<category><![CDATA[Hackeos e ideas]]></category>
		<category><![CDATA[Nuestros hacks]]></category>
		<category><![CDATA[led]]></category>
		<category><![CDATA[origami]]></category>
		<category><![CDATA[sensores]]></category>

		<guid isPermaLink="false">http://www.obsoletos.org/?p=1280</guid>
		<description><![CDATA[Se me ocurre que despues del tocho que tuvimos con el puerto paralelo va a venir bien un hack rápido y bonito que guste a niños y mayores. Había pensado, también, que molaría hacer algo con el sensor de inclinación de 5 centavos del que hablamos hace algún tiempo. Con estas dos cosas en mente [...]]]></description>
			<content:encoded><![CDATA[Se me ocurre que despues del <a href="http://www.obsoletos.org/2009/02/accediendo-al-mundo-real-el-puerto-paralelo/">tocho que tuvimos con el puerto paralelo</a> va a venir bien un hack rápido y bonito que guste a niños y mayores. Había pensado, también, que molaría hacer algo con el <a href="http://hackaday.com/2009/01/28/5-cent-tilt-censor/">sensor de inclinación de 5 centavos</a> <a href="http://www.obsoletos.org/2009/02/sensor-de-inclinacion-de-5-centavos/">del que hablamos hace algún tiempo</a>.

Con estas dos cosas en mente he construido lo que, a falta de un nombre mejor, llamo <strong>Cubiluz: el cubo luminoso que cambia de color cuando lo vuelcas</strong>. La denominación, aunque descriptiva, no le hace justicia al invento, así que aquí tienes el vídeo:
<p style="text-align: center;"><object width="500" height="385" data="http://vimeo.com/moogaloop.swf?clip_id=3421670&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=3421670&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /></object>
<a href="http://vimeo.com/3421670">Cubo luminoso</a>.
<p style="text-align: left;">Como ves, se trata de un cubo hecho con papel. Papel vegetal, en concreto. En cada una de sus seis posiciones el cubo se ilumina con un color distinto (salvo en una de ellas, en la que el cubo se apaga). Por cierto, la luz que se ve rosa/naranja en el vídeo, en realidad es amarilla. Curioso efecto de la cámara.</p>
<p style="text-align: left;">Este simpático elemento decorativo consta de 2 sensores de inclinación y seis leds, y se puede construir en un par de horas. Todo lo que necesitas (aparte de una cierta determinación) es un poco de cable unifilar (<a href="http://en.wikipedia.org/wiki/Wire#Types_of_wire">solid</a>), otro poco de cable de cobre multifilar (<a href="http://en.wikipedia.org/wiki/Wire#Types_of_wire">stranded</a>), una hoja A-2 de papel vegetal,  dos monedas de diez céntimos de euro y seis <a href="http://www.evacolor.com/index2.php?k=3&amp;u=99&amp;p=270">mecheros con luz</a> de los del todo a cien (dos blancos y los otros, uno de cada color).<span id="more-1280"></span></p>
<p style="text-align: left;">Los mecheros los queremos por sus leds y por sus baterías. También puedes comprar este material en una tienda de electrónica, pero un led ultrabrillante, un portapilas y tres pilas de botón probablemente te cuesten más de los 90 céntimos que cuesta el mechero. Y no te permiten encender fuego.</p>
<p style="text-align: left;">Las monedas las vamos a usar como interruptor (ya veras cómo).  Puedes usar cualquier moneda, que yo sepa, pero entonces tendras usar tus propias medidas. Un consejo: En general, cuanto más pesada sea la moneda mejor funcionará el asunto.</p>
<p style="text-align: left;">El circuito  a usar es muy simple. Imagina el típico circuito con un interruptor y una luz, como éste:</p>
<p style="text-align: left;"><img class="aligncenter size-full wp-image-1319" title="Circuito bateria y led" src="http://www.obsoletos.org/wp-content/uploads/2009/03/ledswitch.jpg" alt="Circuito bateria y led" width="369" height="229" /></p>
<p style="text-align: left;"></p>
<p style="text-align: left;">Lo que vamos a hacer, como hemos dicho antes, es usar la moneda a modo de interruptor ¿Cómo? Fácil. Como la moneda es metálica (y por ende conductora de la electricidad) la vamos a colocar de manera que cierre el circuito cuando está en determinada posición. Algo tal que así:</p>
<p style="text-align: left;"><img class="aligncenter size-full wp-image-1318" title="Ejemplo de moneda como interruptor" src="http://www.obsoletos.org/wp-content/uploads/2009/03/ledcoin.jpg" alt="Ejemplo de moneda como interruptor" width="450" height="268" /></p>
<p style="text-align: left;"></p>
<p style="text-align: left;">Bueno, esta es la base, pero así solo podemos encender o apagar una luz. Ahora tenemos que añadir otras dos ramas al circuito para poder controlar tres leds. Además así podemos aprovechar los contactos extra para mantener a la moneda &#8220;enjaulada&#8221;. El circuito final nos queda así:</p>
<p style="text-align: left;"><img class="aligncenter size-full wp-image-1316" title="Esquema sensor inclinación con 3 leds" src="http://www.obsoletos.org/wp-content/uploads/2009/03/3ledscoin.jpg" alt="Esquema sensor inclinación con 3 leds" width="480" height="401" /></p>
<p style="text-align: left;"></p>
<p style="text-align: left;">Y el comportamiento, según hacia donde lo inclinemos sería parecido a esto:</p>
<p style="text-align: left;"><img class="aligncenter size-full wp-image-1317" title="Comportamiento sensor inclinación" src="http://www.obsoletos.org/wp-content/uploads/2009/03/3ledscoinorientations.jpg" alt="Comportamiento sensor inclinación" width="500" height="480" /></p>
<p style="text-align: left;">Y dicho esto pongámonos manos a la obra. Empecemos formando la &#8220;jaula&#8221; para la moneda. Parte ocho trozos como de 1 cm de largo de cable unifilar y pélalos. Estos van a hacer de barrotes. Ahora suéldalos a un trozo de placa perforada como en la foto:</p>


<div id="attachment_1266" class="wp-caption aligncenter" style="width: 510px"><img class="size-large wp-image-1266" title="Soldando la jaula" src="http://www.obsoletos.org/wp-content/uploads/2009/03/p1050987-500x375.jpg" alt="Soldando la jaula" width="500" height="375" /><p class="wp-caption-text">Deja 5 agujeros libres entre barrotes de un mismo lado (1 en diagonal entre barrotes en lados perpendiculares).</p></div>

Ahora coge el cable multifilar, pela un trozo de cable también de 1 cm y enrolla los hilos de cobre sobre sí mismos formando una pelotilla. Cuando esté convenientemente pelotizado córtalo a la altura del aislante. Repite este asunto 6 veces.

<div id="attachment_1272" class="wp-caption aligncenter" style="width: 510px"><img class="size-large wp-image-1272" title="Rulo de cobre y seis rulitos" src="http://www.obsoletos.org/wp-content/uploads/2009/03/rulo2-500x187.jpg" alt="Rulo de cobre y seis rulitos" width="500" height="187" /><p class="wp-caption-text">Detalle de un rulillo de cobre antes de separarlo del resto del cable y los seis rulillos ya preparados.</p></div>
<p style="text-align: center;"></p>
<p style="text-align: left;">Vamos a usar las pelotillas de cobre para dos cosas:  Como separadores, para apoyar la pieza que hará de techo de la jaula y que quede suficiente espacio para que la moneda se mueva libremente; como contactos, los vamos a soldar alrededor de los barrotes para que hagan de puntos de contacto de la moneda. De esta manera aumentamos la superficie y la elasticidad de los contactos, lo que hará que el circuito responda mucho mejor a pequeñas sacudidas y vibraciones.</p>
<p style="text-align: left;">Así que, venga: pincha cada ovillo de cobre en un barrote y aplícale una gotica de estaño. Ah, sí, hay que dejar los dos barrotes de uno de los lados libres. Estos serán los que correspondan a la posición de apagado.</p>


<div id="attachment_1267" class="wp-caption aligncenter" style="width: 510px"><img class="size-large wp-image-1267" title="Jaula con moneda y topes" src="http://www.obsoletos.org/wp-content/uploads/2009/03/p1050990-500x375.jpg" alt="Jaula con moneda y topes" width="500" height="375" /><p class="wp-caption-text">La moneda y los topes en su sitio, antes de poner la tapa.</p></div>
<p style="text-align: left;">Como ves ya puedes meter la moneda, pero antes hay que limpiarla bien. La mugre y el óxido que haya podido acumular en su deambular de mano en mano van a impedir que haga buen contacto. Te recomiendo lijar bien el canto y limpiarlo con un poco de alcohol. Cuando tengas la moneda limpia y en su sitio pon la tapa (que será simplemente otro trozo de placa perforada) y suéldala.</p>


<div id="attachment_1268" class="wp-caption aligncenter" style="width: 510px"><img class="size-large wp-image-1268" title="Jaula cerrada" src="http://www.obsoletos.org/wp-content/uploads/2009/03/p1050991-500x375.jpg" alt="Jaula cerrada" width="500" height="375" /><p class="wp-caption-text">Suelda la tapa con la metalización hacia afuera</p></div>
<p style="text-align: left;">Llegados a este punto la moneda debería poder moverse libremente dentro de la jaula.  Sin salirse, claro. Si todo ha ido bien, ya puedes ponerte con el resto del circuito. Simplemente sigue el esquema que te puse más arriba. Solo una cosa: Asegurate de que el led conectado al pin 3 sea uno de los blancos. Los otros leds que sean de colores distintos.</p>
<p style="text-align: left;">Si compraste los mecheros tienes los leds y los portapilas necerarios ahí dentro. Para sacarlos desatornilla el culo de los mecheros y presiona el boton de encendido mientras tiras del led. Deberias encontrarte con algo así:</p>


<div id="attachment_1264" class="wp-caption aligncenter" style="width: 510px"><img class="size-large wp-image-1264" title="Mechero luminoso desmontado" src="http://www.obsoletos.org/wp-content/uploads/2009/03/p1050982-500x281.jpg" alt="Mechero luminoso desmontado" width="500" height="281" /><p class="wp-caption-text">Esto es lo que te dan por 90 céntimos.</p></div>
<p style="text-align: left;">Ahora corta el alambre que sujeta el led al portapilas como a 3 mm de la base del led. Con esto ya puedes usar el led en el circuito (pero ojo con la polaridad). Para usar el portapilas primero tendrás que soldar un cable a su contacto plano.</p>


<div id="attachment_1265" class="wp-caption aligncenter" style="width: 510px"><img class="size-large wp-image-1265" title="Led y portapilas" src="http://www.obsoletos.org/wp-content/uploads/2009/03/p1050983-500x281.jpg" alt="Led y portapilas" width="500" height="281" /><p class="wp-caption-text">Vamos a usar led y portapilas por separado.</p></div>
<p style="text-align: left;">Bueno, ahora deberías tener un bonito sensor de inclinación de 4 posiciones entre las manos. Debería encenderse un led distinto según sobre qué canto lo apoyes (salvo en uno, que es la posición de apagado). Tambien deberían apagarse todos los leds si lo dejas plano sobre la mesa.</p>
<p style="text-align: left;">¿Funciona? No fue tan difícil, ¿verdad? Pues hay que hacer otro. Igual que este. Lo mismito, pero con leds de otros colores (salvo el blanco que se repite, y en la misma posición).</p>
<p style="text-align: left;"><img class="aligncenter size-large wp-image-1269" title="Los dos sensores terminados" src="http://www.obsoletos.org/wp-content/uploads/2009/03/p1050992-500x375.jpg" alt="Los dos sensores terminados" width="500" height="375" /></p>
<p style="text-align: left;">Con esto terminamos con el soldador. Sólo te queda hacer un poco de papiroflexia. Vamos a usar unos módulos de Sonobe para hacer el cubo. Los <a href="http://sospechosos-habituales.blogspot.com/2005/12/origami-ii.html">módulos de Sonobe</a> son unas construcciones de papel con forma de paralelepípedo que, combinados en distintas cantidades permiten hacer todo tipo de figuras geométricas. Desde <a href="http://www.flickr.com/photos/niwatori/185793186/">tetraedros</a>, con 3 módulos a <a href="http://www.flickr.com/photos/niwatori/185795439/">locuras de 120 módulos</a>.</p>
<p style="text-align: left;">Por suerte nosotros vamos a hacer un cubo, así que solo necesitaremos hacer seis módulos. Para ello puedes leer las instrucciones <a href="http://www.wikihow.com/Make-a-Sonobe-Unit">aquí</a> o puedes ver el siguiente video (recuerda que tienes que usar papel vegetal):</p>

<p style="text-align: center;"><object width="500" height="385" data="http://www.youtube.com/v/7E1UR3Mt72g&amp;hl=es&amp;fs=1" type="application/x-shockwave-flash"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/7E1UR3Mt72g&amp;hl=es&amp;fs=1" /><param name="allowfullscreen" value="true" /></object>
<p style="text-align: left;">Antes de ensamblar los módulos para formar el cubo coge dos de ellos y pégale un sensor a cada uno en la parte de atrás (la que es lisa)  con un poco de cinta de doble cara. Uno de los sensores pégalo con el portapilas apuntando hacia una de las &#8220;puntas&#8221; del módulo y el otro girado 90 grados.</p>


<div id="attachment_1271" class="wp-caption aligncenter" style="width: 510px"><img class="size-large wp-image-1271" title="Sensor y dos modulos de Sonobe" src="http://www.obsoletos.org/wp-content/uploads/2009/03/p1050994-500x375.jpg" alt="Sensor y dos modulos de Sonobe" width="500" height="375" /><p class="wp-caption-text">El segundo sensor no está puesto todavía  pero debería quedar con el portapilas a la derecha.</p></div>
<p style="text-align: left;">Y ya sólo te queda montar el cubo. Puedes ver cómo hacerlo <a href="http://roberttgasperson.com/articleblog/2007/08/20/how-to-fold-origami-how-to-make-the-sonobe-cube/">aquí</a>. Como pequeña complicación tienes que conseguir que los sensores queden uno al lado del otro. Los dos con los portapilas apuntando hacia &#8220;abajo&#8221; como en la foto. Fijate tambien que hemos metido un trozo de papel en la diagonal del cubo que separa ambos sensores. Este papel sirve para difundir la luz que sale de los leds y que el cubo se ilumine más uniformemente.</p>


<div id="attachment_1270" class="wp-caption aligncenter" style="width: 510px"><img class="size-large wp-image-1270" title="Los dos sensores dentro del cubo" src="http://www.obsoletos.org/wp-content/uploads/2009/03/p1050993-500x375.jpg" alt="Los dos sensores dentro del cubo" width="500" height="375" /><p class="wp-caption-text">Una vez montado todo debería tener esta pinta.</p></div>
<p style="text-align: left;">Y hasta aquí. Pon el último módulo y sorprende a los colegas. Y recuerda que, aúnque acabas de construir un objeto terriblemente chachi en si mismo, lo mejor de todo esto es que de paso ya sabes como construir sensores de inclinación para tu ejército de robocs.</p>
<p style="text-align: left;"></p>]]></content:encoded>
			<wfw:commentRss>http://www.obsoletos.org/2009/03/cubiluz-el-cubo-luminoso/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Accediendo al mundo real: El puerto paralelo</title>
		<link>http://www.obsoletos.org/2009/02/accediendo-al-mundo-real-el-puerto-paralelo/</link>
		<comments>http://www.obsoletos.org/2009/02/accediendo-al-mundo-real-el-puerto-paralelo/#comments</comments>
		<pubDate>Mon, 16 Feb 2009 10:54:14 +0000</pubDate>
		<dc:creator>cogollo</dc:creator>
				<category><![CDATA[Hackeos e ideas]]></category>
		<category><![CDATA[Nuestros hacks]]></category>
		<category><![CDATA[electrónica digital]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[Puerto paralelo]]></category>

		<guid isPermaLink="false">http://www.obsoletos.org/?p=819</guid>
		<description><![CDATA[Si hay una tecnología que se está extinguiendo ahora mismo, que se va desechando lenta pero inexorablemente, esa es la del puerto paralelo. Y es una lástima. No sólo porque este conector ya estuviera presente en el primer PC que fabricó IBM en 1981, también porque el puerto paralelo ha sido uno de los mayores [...]]]></description>
			<content:encoded><![CDATA[Si hay una tecnología que se está extinguiendo ahora mismo, que se va desechando lenta pero inexorablemente, esa es la del puerto paralelo. Y es una lástima. No sólo porque este conector <a href="http://www.globu.net/pp/PP/historia.htm">ya estuviera presente en el primer PC que fabricó IBM en 1981</a>, también porque el puerto paralelo ha sido uno de los mayores aliados del hacking. Con sus 25 pines, no es precisamente el conector más discreto que puedes encontrar en un ordenador . Ni el más rápido. Pero tiene una cosa que lo hace muy atractivo para el aficionado: Es muy fácil de usar. Casi trivial.

<div id="attachment_878" class="wp-caption aligncenter" style="width: 245px"><img class="size-medium wp-image-878" title="Puerto paralelo de cerca" src="http://www.obsoletos.org/wp-content/uploads/2009/02/parallel_computer_printer_port-235x176.jpg" alt="El puerto paralelo según Wikipedia" width="235" height="176" /><p class="wp-caption-text">El puerto paralelo según Wikipedia</p></div>

Básicamente, lo que podemos hacer con estos pines es ponerlos a 0 o 5 voltios. A voluntad. Puede que esto no parezca gran cosa, pero es suficiente para activar un relé que, a su vez, active una radio, una bombilla, una lavadora, etc. Así que  va a permitir, de una manera muy directa, que nuestro ordenador manipule el mundo exterior.

O sea, lo mismo que un microcontrolador como <a href="http://www.arduino.cc/es/">Arduino</a>. Sólo que, claro, no tienes que gastarte 30 pavos en el dichoso Arduino y la potencia y la memoria del PortatilQueTeRegalóTuTíoPorqueEstáViejoYDeTodasFormasIbaATirarlo siguen siendo cientos de veces mayores que las de cualquier micro que puedas comprar con dinero. Cierto que un Arduino cabe en la palma de la mano, pero para &#8220;aplicaciones estáticas&#8221; (esto es, para chismes que no tengan que ir <a href="http://emelece.blogspot.com/2007/10/arduino-lilypad-un-cerebro-para-tu-ropa.html">cosidos a la ropa</a> o <a href="http://hackaday.com/2008/11/15/spoke-o-dometer-bicycle-pov-speed-display/">bajo el sillín de una bici</a>) yo diría que usar directamente el puerto paralelo es bastante más práctico.
<p style="text-align: left;">Pero empecemos por el principio. Para ir cogiéndole el tranquillo a esto te propongo empezar con unos sencillos juegos de luces como estos:</p>

<p style="text-align: center;"><object width="400" height="300" data="http://vimeo.com/moogaloop.swf?clip_id=3163420&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=3163420&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /></object>
<a href="http://vimeo.com/3163420">Controlando 8 leds con el puerto paralelo</a> on <a href="http://vimeo.com">Vimeo</a>.

Aprenderemos para qué sirven los distintos pines del puerto paralelo y cómo sacar datos a traves de ellos (leer datos es ligeramente más complicado y lo dejaremos para futuras entregas) . Todo ello en un estupendo entorno linux, pero si tienes Windows puedes ver cómo hacer esto mismo <a href="http://www.codeproject.com/KB/cs/csppleds.aspx">aquí</a>. Si tienes un Mac&#8230;  Bueno, no creo que los Mac sigan montando de éstos. No son lo bastante bonitos, supongo.
<h4><span id="more-819"></span></h4>
<h4>Los Puertos</h4>
Como ya hemos dicho, el conector del puerto paralelo consta de 25 pines. Lo que no hemos dicho aún es que esos pines pertenecen en realidad a tres puertos distintos.

<div id="attachment_882" class="wp-caption aligncenter" style="width: 510px"><a href="http://www.codeproject.com/KB/cs/csppleds.aspx?display=PrintAll&amp;fid=21021&amp;df=90&amp;mpp=25&amp;noise=3&amp;sort=Position&amp;view=Quick&amp;fr=301"><img class="size-large wp-image-882" title="Esquema puerto paralelo" src="http://www.obsoletos.org/wp-content/uploads/2009/02/esquemapuertoparalelo-500x95.gif" alt="Valor de los pines del puerto. Extraido de CodeProject" width="500" height="95" /></a><p class="wp-caption-text">Valor de los pines del puerto. Extraído de CodeProject</p></div>

El puerto de datos (DATA), permite transmitir un byte (8 bits) de datos. Cada uno de los bits se corresponde con uno de los pines D0 a D7. Por tanto, en conjunto, se pueden transmitir valores entre 0 y 255 en formato binario. Por ejemplo, para transmitir el 139, 10001011 en binario, se pondrán a 5Voltios los pines D7, D3, D1 y D0. Este puerto puede configurarse para servir tanto de entrada como de salida de datos.
<p style="text-align: left;">El puerto de control (CONTROL)   es sólo de salida y se corresponde con los pines C0 a C3, con lo que en principio nos permite trasmitir valores entre 0 y 16. En un principio este puerto se utilizaba para pasarle comandos inmediatos a la impresora como el salto de línea o el reset y  los pines conservan los nombres que se les dieron en esa época. Y por razones históricas tambien, C0, C1 y C3 están invertidos, lo que quiere decir que invierten la salida y, al contrario que los pines normales, representan el 0 con 5 voltios y el 1 con 0 voltios. Por ejemplo, el 6 es 0110 en binario, pero como los bits 0, 1 y 3 están invertidos tendríamos C3, C2 y C0 a 5 voltios y C1 a 0.</p>
<p style="text-align: left;">Por último tenemos el puerto de estado (STATUS). Se usaba originalmente para recibir el estado de la impresora, también ha heredado los nombres de los pines de aquella época y también presenta algún pin invertido. Es un puerto sólo de entrada, así que no lo vamos a usar por el momento. Pero vete familiarizándote con él.</p>
<p style="text-align: left;">¿Me sigues, no? ¿No? bueno, es un poco confuso así contado,  pero espero que esta tabla te aclare un poco las cosas.</p>

<p style="text-align: center;">
<table style="text-align: left; height: 222px;" border="1" width="226">
<tbody>
<tr>
<td style="text-align: left;" width="33%"><strong>Signal</strong></td>
<td width="12%"><strong>BIT</strong></td>
<td width="19%"><strong>Modo</strong></td>
<td width="36%"><strong>Direction</strong></td>
</tr>
<tr>
<td>-Strobe</td>
<td>C0</td>
<td>Invertido</td>
<td>Salida</td>
</tr>
<tr>
<td>-Auto Feed</td>
<td>C1</td>
<td>Invertido</td>
<td>Salida</td>
</tr>
<tr>
<td>-Initialize</td>
<td>C2</td>
<td>Normal</td>
<td>Salida</td>
</tr>
<tr>
<td>-Select</td>
<td>C3</td>
<td>Invertido</td>
<td>Salida</td>
</tr>
<tr>
<td>-Error</td>
<td>S3</td>
<td>Normal</td>
<td>Entrada</td>
</tr>
<tr>
<td>+Select In</td>
<td>S4</td>
<td>Normal</td>
<td>Entrada</td>
</tr>
<tr>
<td>+Paper End</td>
<td>S5</td>
<td>Normal</td>
<td>Entrada</td>
</tr>
<tr>
<td>-Acknowledge</td>
<td>S6</td>
<td>Normal</td>
<td>Entrada</td>
</tr>
<tr>
<td>+Busy</td>
<td>S7</td>
<td>Invertido</td>
<td>Entrada</td>
</tr>
</tbody></table>
<p style="text-align: left;"></p>
<p style="text-align: left;">¿Y el resto de los pines? ¿Los que están en verde en el esquema? Pues están conectados a tierra y nos van a dar el voltaje de referencia de 0 voltios</p>

<h4 style="text-align: left;">Enchufando cosas.</h4>
<p style="text-align: left;">Bueno, ya sabemos lo que puede hacer cada agujerete, pero ¿cómo enchufamos ahí nuestros inventos?</p>
<p style="text-align: left;">De momento, y como todavía estamos hablando de aprender a manejar todo esto y de experimentar, te recomiendo que construyas un adaptador para <a href="http://es.wikipedia.org/wiki/Placa_de_pruebas">placa de pruebas</a> (protoboard) como éste:</p>
<p style="text-align: left;"><img class="aligncenter size-large wp-image-984" title="Adaptador puerto paralelo" src="http://www.obsoletos.org/wp-content/uploads/2009/02/img_0042-500x375.jpg" alt="Adaptador puerto paralelo" width="500" height="375" /></p>
<p style="text-align: left;"></p>
<p style="text-align: left;">Sólo tienes que pinchar el adaptador a la placa de pruebas para poder acceder a los pines del puerto paralelo directamente desde tus prototipos, lo que va a facilitar muchísimo la experimentación. Y aparte del <a href="http://es.wikipedia.org/wiki/Cable_paralelo">cable paralelo</a> (que seguro que tienes por ahí de alguna antigua impresora), sólo necesitas un trozo de <a href="http://en.wikipedia.org/wiki/Perfboard">placa perforada</a>, un <a href="http://es.wikipedia.org/wiki/DB-25">conector DB-25</a> macho y cable unifilar de varios colores (el de pinchar en la protoboard).</p>
<a href="http://www.obsoletos.org/wp-content/uploads/2009/02/p1050981.jpg"><img class="aligncenter size-large wp-image-977" title="Adaptador pp por delante (conector)" src="http://www.obsoletos.org/wp-content/uploads/2009/02/p1050981-500x281.jpg" alt="Adaptador pp por delante (conector)" width="500" height="281" /></a></p>
<p style="text-align: left;">Lo que vamos a hacer es sacar un cable de cada pin (salvo de los pines conectados a tierra) y ordenar los extremos en línea, usando un color en cada tipo de puerto para distinguirlos fácilmente.</p>


<div id="attachment_975" class="wp-caption aligncenter" style="width: 510px"><a href="http://www.obsoletos.org/wp-content/uploads/2009/02/p1050979.jpg"><img class="size-large wp-image-975" title="Adaptador pp por delante (cableado)" src="http://www.obsoletos.org/wp-content/uploads/2009/02/p1050979-500x281.jpg" alt="Adaptador pp por delante (cableado)" width="500" height="281" /></a><p class="wp-caption-text">En rojo el puerto de control, en amarillo el de datos y en verde el de estado. Tambíen se ven, en negro, los dos cables conectados a tierra.</p></div>
<p style="text-align: left;">Tienes que dejar como medio cm de cable pelado en dicho extremo antes de soldarlo para que sobresalga por debajo de la placa y se pueda pinchar fácilmente en la protoboard (Posiblemente tendrás que enderezar las puntas un poco para que encajen bien).</p>


<div id="attachment_974" class="wp-caption aligncenter" style="width: 510px"><a href="http://www.obsoletos.org/wp-content/uploads/2009/02/p1050976.jpg"><img class="size-large wp-image-974" title="Adaptador pp por detras (detalle de los pines)" src="http://www.obsoletos.org/wp-content/uploads/2009/02/p1050976-500x281.jpg" alt="Adaptador pp por detras (detalle de los pines)" width="500" height="281" /></a><p class="wp-caption-text">Detalle de los extremos de los cables por debajo de la placa.</p></div>
<p style="text-align: left;">Un último consejo: Suelda todos lo pines conectados a tierra entre sí y a la placa perforada. Luego conéctales un par de cables, pero no pongas los extremos a la misma altura que los otros. Déjalos más cerca del conector, de manera que cuando pinches el adaptador a tu protoboard los cables de tierra se conecten a las tiras largas verticales mientras el resto de los cables se conecta a las cortas horizontales.</p>


<div id="attachment_973" class="wp-caption aligncenter" style="width: 510px"><a href="http://www.obsoletos.org/wp-content/uploads/2009/02/p1050975.jpg"><img class="size-large wp-image-973" title="Adaptador pp por detras (general)" src="http://www.obsoletos.org/wp-content/uploads/2009/02/p1050975-500x281.jpg" alt="Adaptador pp por detras (general)" width="500" height="281" /></a><p class="wp-caption-text">Los pines de tierra estan soldados a los dos cables que sobresalen cerca del centro de la placa. (Haz click en la imagen para verla ampliada).</p></div>
<h4 style="text-align: left;">Nuestro primer experimento.</h4>
Para nuestro primer contacto con el puerto paralelo simplemente vamos a conectar 8 leds cada uno a un pin de datos. De este modo tendremos feddback visual inmediato de lo que está pasando en cada momento. Para realizar la conexión puedes seguir este esquema:

<div id="attachment_987" class="wp-caption aligncenter" style="width: 510px"><img class="size-large wp-image-987" title="esquema-conexion-leds-puerto-paralelo" src="http://www.obsoletos.org/wp-content/uploads/2009/02/esquema-conexion-leds-puerto-paralelo-500x394.gif" alt="esquema-conexion-leds-puerto-paralelo" width="500" height="394" /><p class="wp-caption-text">Los cuadrados con el 470 escrito representan resistencias de 470 ohmnios. Extraído de CodeProject.</p></div>
<p style="text-align: center;"></p>
<p style="text-align: left;">Las resistencias que aparecen en el esquema sirven para limitar la corriente que pasará por cada led. Aunque en general son imprescindibles porque, si no, se queman los leds, resulta que cada pin del puerto paralelo sólo puede suministrar 40mA como máximo. Una corriente suficientemente baja para que la aguanten la mayoría de los leds.</p>
<p style="text-align: left;">Si has usado el adaptador que hicimos antes y has pasado de las resistencias en montaje debería tener esta pinta:</p>


<div id="attachment_983" class="wp-caption aligncenter" style="width: 510px"><img class="size-large wp-image-983" title="Conexión de los leds" src="http://www.obsoletos.org/wp-content/uploads/2009/02/img_0033-500x375.jpg" alt="Conexión de los leds" width="500" height="375" /><p class="wp-caption-text">El cable negro largo conecta los leds a tierra cerrando el circuito.</p></div>
<p style="text-align: left;">Con esto ya podemos ponernos a programar. Hasta aquí todo lo que te he contado es válido para cualquier sistema operativo. A partir de este momento nos centraremos en Linux, pero te recuerdo que puedes ver cómo hacer esto mismo en un  ordenador con Windows<a href="http://www.codeproject.com/KB/cs/csppleds.aspx"> aquí</a>.</p>
<p style="text-align: left;">En concreto vamos a programar en C. ¿Por qué C? Porque es el lenguaje de programación estandar en Linux y digamos que está muy integrado con el sistema operativo. Nuestro primer programa va a ser muy sencillo, simplemente nos irá pidiendo números por consola y los mostrará en binario a través de los leds. Pero vete echándole un vistazo al código ya que estamos:</p>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;unistd.h&gt;</span>
<span style="color: #666666; font-style: italic;">//asm/io.h es donde están definidas las funciones ioperm() y outb()</span>
<span style="color: #339933;">#include &lt;asm/io.h&gt;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* Esta es la direccion más frecuente para el puerto paralelo*/</span>
<span style="color: #339933;">#define DATAPORT 0x378</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #666666; font-style: italic;">//Obtenemos permiso de acceso para la direccion de DATAPORT y</span>
  <span style="color: #666666; font-style: italic;">//las 2 siguientes</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ioperm<span style="color: #009900;">&#40;</span>DATAPORT<span style="color: #339933;">,</span> <span style="color: #0000dd;">3</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>perror<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;ioperm&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">//Entramos en un bucle infinito</span>
  <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> input<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//Le pedimos al usuario que introduzca un número</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Introduce un número entre 0 y 255 (-1 para salir)<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">//Leemos el valor introducido y lo guardamos en &quot;input&quot;</span>
    scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>input<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">//Si &quot;input&quot; vale &quot;-1&quot; salimos del bucle</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>input<span style="color: #339933;">==-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">//Si &quot;input&quot; no está entre &quot;0&quot; y &quot;255&quot; (y no era &quot;-1&quot; no nos</span>
    <span style="color: #666666; font-style: italic;">//interesa, así que volvemos directamente al comienzo del bucle</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>input <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">0</span> <span style="color: #339933;">||</span> input <span style="color: #339933;">&gt;</span> <span style="color: #0000dd;">255</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">continue</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//Si hemos llegado hasta aqui es que &quot;input&quot; vale entre &quot;0&quot; y</span>
    <span style="color: #666666; font-style: italic;">//&quot;255&quot; y podemos sacarlo por el puerto paralelo</span>
    outb<span style="color: #009900;">&#40;</span>input<span style="color: #339933;">,</span> DATAPORT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">//Antes de terminar el programa dejamos los permisos de acceso</span>
  <span style="color: #666666; font-style: italic;">//a los puertos como estaban</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ioperm<span style="color: #009900;">&#40;</span>DATAPORT<span style="color: #339933;">,</span> <span style="color: #0000dd;">3</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>perror<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;ioperm&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">//El programa termina sin errores</span>
  <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>



<p style="text-align: left;">Para compilar un programa en C como éste, guárdalo en un archivo de texto cuyo nombre termine en &#8220;.c&#8221; como &#8220;parporttest.c&#8221; y compílalo mediante gcc (gcc es el compilador de C que viene por defecto con casi todas las distros de Linux, probablemente ya lo tengas instalado aunque no lo sepas) escribiendo &#8220;gcc Wall parporttest.c -o parportest&#8221; en la consola. Esto generará un fichero ejecutable que se llama &#8220;parportest&#8221; y que podrás ejecutar cuando quieras desde consola escribiendo &#8220;./parportest&#8221;.</p>
<p style="text-align: left;">Pero volvamos al código. Nos interesan dos funciones, sobre todo:</p>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">ioperm<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>





<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">outb<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>



<p style="text-align: left;">La primera función  modifica los permisos de acceso de los puertos. Recibe tres enteros. El primero le indica la dirección del primer puerto cuyos permisos queremos modificar, el segundo es el número de puertos y el tercero debe ser &#8220;1&#8243; para conceder el permiso y &#8220;0&#8243; para quitarlo. De esta manera, para tener permiso de acceso al puerto de datos y a los dos siguientes (que son STATUS y CONTROL) ponemos:</p>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">ioperm<span style="color: #009900;">&#40;</span>DATAPORT<span style="color: #339933;">,</span> <span style="color: #0000dd;">3</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>



<p style="text-align: left;">y, al contrario,  para dejarlo todo como estaba al final del programa (quitando los permisos) ponemos:</p>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">ioperm<span style="color: #009900;">&#40;</span>DATAPORT<span style="color: #339933;">,</span> <span style="color: #0000dd;">3</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>



La segunda función es la que hace la magia. Se encarga de mandar un byte de datos a un determinado puerto. Recibe dos enteros, el primero es el byte que se quiere enviar (debe estar entre 0 y 255) y el segundo es la dirección del puerto. La dirección del puerto de datos, en la gran mayoría de los ordenadores es &#8220;0&#215;378&#8243;, por eso al principio del programa hemos puesto:


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define DATAPORT 0x378</span></pre></div></div>



Ahora, para enviar el contenido de la variable &#8220;input&#8221; al puerto de datos (cuya dirección está en &#8220;DATAPORT&#8221;) usamos:


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">outb<span style="color: #009900;">&#40;</span>input<span style="color: #339933;">,</span> DATAPORT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>



Si queremos sacar el dato por el puerto de control, cuya dirección es igual a la dirección del puerto de datos más dos, tenemos que poner:


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">outb<span style="color: #009900;">&#40;</span>input<span style="color: #339933;">,</span> DATAPORT<span style="color: #339933;">+</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>



Fácil ¿verdad? Pues ejecuta el programa a ver qué pasa. Por cierto. Importante. Hace falta tener privilegios de root para que &#8220;ioperm&#8221; funcione correctamente, así que acuerdate de ejecutar el programa desde una cuenta de administrador.

<div id="attachment_986" class="wp-caption aligncenter" style="width: 510px"><img class="size-full wp-image-986" title="salida-puerto-datos" src="http://www.obsoletos.org/wp-content/uploads/2009/02/salida-puerto-datos.jpg" alt="salida-puerto-datos" width="500" height="187" /><p class="wp-caption-text">Salida del puerto de datos para 13 (00001101 en binario) y 167 (10100111 en binario)</p></div>
<p style="text-align: left;">Prueba unos cuantos números y observa el comportamiento de los leds. Cuando te canses puedes intentar modificar el programa y las conexiones para usar el puerto de control  en lugar de el de datos. No debería ser muy difícil con lo que ya sabes, y así practicas.</p>


<div id="attachment_985" class="wp-caption aligncenter" style="width: 510px"><img class="size-full wp-image-985" title="salida-puerto-control" src="http://www.obsoletos.org/wp-content/uploads/2009/02/salida-puerto-control.jpg" alt="salida-puerto-control" width="500" height="187" /><p class="wp-caption-text">Salida del puerto de control para 0 (0000 en binario) y 13 (1101 en binario). </p></div>
<p style="text-align: left;">¿Ves lo que te decía de los pines invertidos?</p>

<h4>Deberes</h4>
<p style="text-align: left;">Y para terminar (que ya va tocando) aquí te dejo el código del programa con el que hice el video del principio. Tampoco debería darte muchos problemas a estas alturas.</p>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;unistd.h&gt;</span>
<span style="color: #339933;">#include &lt;asm/io.h&gt;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Esta es la direccion más frecuente para el puerto paralelo</span>
<span style="color: #339933;">#define DATAPORT 0x378 /* lpt1 */</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Duración de cada paso en microsegundos</span>
<span style="color: #339933;">#define DELAY 150000</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Numero de veces que se repite cada secuencia</span>
<span style="color: #339933;">#define REPEAT 4</span>
&nbsp;
<span style="color: #993333;">void</span> Blink<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> Alternate<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> ZigZag<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #666666; font-style: italic;">//Obtenemos permiso de acceso para la direccion de DATAPORT y</span>
  <span style="color: #666666; font-style: italic;">//las 2 siguientes</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ioperm<span style="color: #009900;">&#40;</span>DATAPORT<span style="color: #339933;">,</span> <span style="color: #0000dd;">3</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>perror<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;ioperm&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">//mode indique que secuencia es la que se esta ejecutando</span>
  <span style="color: #993333;">int</span> mode<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span> <span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> REPEAT<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
      <span style="color: #993333;">int</span> reset<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
      <span style="color: #666666; font-style: italic;">//Comprueba el valor de mode</span>
      <span style="color: #b1b100;">switch</span> <span style="color: #009900;">&#40;</span>mode<span style="color: #009900;">&#41;</span>
      <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">//Si vale 0 toca parpadeo</span>
        <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">:</span>
          Blink<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">//Si vale 1 toca alternar pares e impares</span>
        <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">:</span>
          Alternate<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">//Si vale 2 toca hacer un ZigZag</span>
        <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">:</span>
          ZigZag<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">//Si vale otra cosa, vovemos a empezar. Para ello</span>
        <span style="color: #666666; font-style: italic;">// ponemos mode a -1</span>
        <span style="color: #b1b100;">default</span><span style="color: #339933;">:</span>
          mode<span style="color: #339933;">=-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #666666; font-style: italic;">//Despues de repetir REPEAT veces una secuencia pasamos </span>
    <span style="color: #666666; font-style: italic;">//a la siguiente sumandole 1 a mode</span>
    mode<span style="color: #339933;">++;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">//Volvemos a cerrar los puertos</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ioperm<span style="color: #009900;">&#40;</span>DATAPORT<span style="color: #339933;">,</span> <span style="color: #0000dd;">3</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>perror<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;ioperm&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Esta función hace parpadear los leds.</span>
<span style="color: #993333;">void</span> Blink<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #666666; font-style: italic;">//Ponemos todos los led a 1</span>
  outb<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">255</span><span style="color: #339933;">,</span>DATAPORT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #666666; font-style: italic;">//Y esperamos 2*DELAY microsegundos</span>
  usleep<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">2</span><span style="color: #339933;">*</span>DELAY<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">//Luego ponemos todos los leds a 0</span>
  outb<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span>DATAPORT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #666666; font-style: italic;">//Y volvemos a esperar</span>
  usleep<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">2</span><span style="color: #339933;">*</span>DELAY<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #666666; font-style: italic;">//Esta función enciende alternativamente los leds pares y los impares</span>
<span style="color: #993333;">void</span> Alternate<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
  <span style="color: #666666; font-style: italic;">//repetimos cuatro veces</span>
  <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>i<span style="color: #339933;">&lt;</span><span style="color: #0000dd;">4</span><span style="color: #339933;">;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> output <span style="color: #339933;">=</span> <span style="color: #0000dd;">85</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//Primero ponemos 85 que es 01010101 en binario,</span>
    <span style="color: #666666; font-style: italic;">//con lo que se iluminan los leds impares, y esperamos 2*DELAY</span>
    outb<span style="color: #009900;">&#40;</span>output<span style="color: #339933;">,</span>DATAPORT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    usleep<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">2</span><span style="color: #339933;">*</span>DELAY<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//Desplazamos los bits de output un lugar a la izquierda,</span>
    <span style="color: #666666; font-style: italic;">//con lo que nos queda &quot;10101010&quot;</span>
    output <span style="color: #339933;">=</span> output <span style="color: #339933;">&lt;&lt;</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//Al pasarlo al puerto paralelo se iluminan los leds pares</span>
    outb<span style="color: #009900;">&#40;</span>output<span style="color: #339933;">,</span>DATAPORT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    usleep<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">2</span><span style="color: #339933;">*</span>DELAY<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Esta función enciende ulas luces al estilo del coche fantastico</span>
<span style="color: #993333;">void</span> ZigZag<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #666666; font-style: italic;">//output solo tiene el último bit distinto de 0</span>
  <span style="color: #993333;">int</span> output <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
  <span style="color: #666666; font-style: italic;">//direction indica el sentido de movimiento de la luz: 1 izquierda,</span>
  <span style="color: #666666; font-style: italic;">// 0 derecha. Empezamos hacia la derecha</span>
  <span style="color: #993333;">int</span> direction <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>output <span style="color: #339933;">!=</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">//Sacamos output por el puerto</span>
    outb<span style="color: #009900;">&#40;</span>output<span style="color: #339933;">,</span> DATAPORT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    usleep<span style="color: #009900;">&#40;</span>DELAY<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//Si dirección es distinto de cero</span>
    <span style="color: #666666; font-style: italic;">//movemos los bits de output hacia la izquierda</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>direction<span style="color: #009900;">&#41;</span>
      output <span style="color: #339933;">=</span> output <span style="color: #339933;">&lt;&lt;</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">//Si no, los movemos hacia la derecha</span>
    <span style="color: #b1b100;">else</span>
      output <span style="color: #339933;">=</span> output <span style="color: #339933;">&gt;&gt;</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//Si output vale 256 es que se nos ha salido</span>
    <span style="color: #666666; font-style: italic;">//la luz por la izquierda así que cambiamos la dirección</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>output<span style="color: #339933;">==</span><span style="color: #0000dd;">256</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
      output <span style="color: #339933;">=</span> output <span style="color: #339933;">&gt;&gt;</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
      direction <span style="color: #339933;">=</span> <span style="color: #339933;">!</span>direction<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>



Fíjate en que cada patrón de movimiento de las luces está definido en una función distinta: Blink(), Alternate() y ZigZag(). Si te ves con fuerzas te propongo que modifiques alguna de esas funciones para crear tu propia coreografía.

Y si mola, nos la pegas en los comentarios.]]></content:encoded>
			<wfw:commentRss>http://www.obsoletos.org/2009/02/accediendo-al-mundo-real-el-puerto-paralelo/feed/</wfw:commentRss>
		<slash:comments>35</slash:comments>
		</item>
		<item>
		<title>Feliz año nuevo</title>
		<link>http://www.obsoletos.org/2009/01/feliz-ano-nuevo/</link>
		<comments>http://www.obsoletos.org/2009/01/feliz-ano-nuevo/#comments</comments>
		<pubDate>Sun, 04 Jan 2009 07:35:18 +0000</pubDate>
		<dc:creator>cogollo</dc:creator>
				<category><![CDATA[Nuestros hacks]]></category>
		<category><![CDATA[impresora]]></category>

		<guid isPermaLink="false">http://www.obsoletos.org/?p=474</guid>
		<description><![CDATA[Un poco tarde, pero aquí tienes. De parte de todos los que hacemos Obsoletos y de la pantalla de una vieja impresora.]]></description>
			<content:encoded><![CDATA[<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="500" height="375" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=2706926&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="500" height="375" src="http://vimeo.com/moogaloop.swf?clip_id=2706926&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object>

Un poco tarde, pero aquí tienes. De parte de todos los que hacemos Obsoletos y de la pantalla de una vieja impresora.]]></content:encoded>
			<wfw:commentRss>http://www.obsoletos.org/2009/01/feliz-ano-nuevo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Devolviendole la vida a la Wii</title>
		<link>http://www.obsoletos.org/2008/12/devolviendole-la-vida-a-la-wii/</link>
		<comments>http://www.obsoletos.org/2008/12/devolviendole-la-vida-a-la-wii/#comments</comments>
		<pubDate>Fri, 26 Dec 2008 07:00:55 +0000</pubDate>
		<dc:creator>cogollo</dc:creator>
				<category><![CDATA[Hackeos e ideas]]></category>
		<category><![CDATA[Nuestros hacks]]></category>
		<category><![CDATA[fuente de tensión]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[wii]]></category>

		<guid isPermaLink="false">http://www.obsoletos.org/?p=457</guid>
		<description><![CDATA[Mira tú por donde ahora que llegan las vacaciones y tengo algo de tiempo libre, va y se me estropea la Wii. Nada,  que no se enciende. Por suerte, después de trastear un poco con el polímetro he descubierto que el fallo está en la fuente de alimentación. Me está dando 0 voltios, 0. Probablemente [...]]]></description>
			<content:encoded><![CDATA[Mira tú por donde ahora que llegan las vacaciones y tengo algo de tiempo libre, va y se me estropea la <a href="http://es.wikipedia.org/wiki/Wii">Wii</a>. Nada,  que no se enciende.

Por suerte, después de trastear un poco con el polímetro he descubierto que el fallo está en la fuente de alimentación. Me está dando 0 voltios, 0. Probablemente se haya fundido un fusible, algo que cuesta 20 céntimos y que se cambia en 2 minutos, pero resulta que Nintendo usa unos tornillos bastante raritos en sus productos y hace falta un <a href="http://www.mod-center.com/b2c/index.php?page=pp_producto.php&amp;md=0&amp;codp=609">destornillador especial</a> para abrir la fuente. Ole por Nintendo.

Si te pasa esto mismo y tienes paciencia y 15 euros siempre puedes <a href="http://todoelectronica.com/transformador-original-p-6879.html">encargar una fuente nueva en todoelectronica</a>, por ejemplo. Si, como un servidor, no tienes paciencia, pero tienes una fuente de ordenador por casa puedes hacer un apaño poco elegante, pero ciertamente funcional.

Debajo de la fuente de alimentación original de la Wii puedes encontrar una pegatina con sus características. Nos interesa la primera sección, justo encima de donde pone CE en gordo. Según eso, esta fuente suministraba un máximo de 3.7 Amperios a 12 Voltios. También nos indica la polaridad con el dibujico que hay al lado. Ahí se ve que el polo negativo del conector es el que está más cerca de la esquina &#8220;achaflanada&#8221; y el positivo el otro.

<a href="http://www.flickr.com/photos/26532266@N06/3127963163/sizes/o/"><img src="http://farm4.static.flickr.com/3090/3127963163_16f62c0fe5.jpg" alt="" width="375" height="500" /></a>

Resulta que 12 Voltios es una tensión estandar en el mundo de la electrónica, que todas las fuentes de ordenador tienen líneas de 12 Voltios y que son capaces de suministrar esos 3.7 Amperios sin problemas. Solo necesitarás un par de cablecillos como de un palmo de largo para hacer la conexión.

Coge la fuente de ordenador. Verás que hay varios conectores a los que llegan 4 cables. El cable rojo es el de +5 Voltios, el amarillo +12 Voltios y los dos negros son conexiones a tierra (0 Voltios), así que tenemos que conectar uno de nuestros cablecillos con el cable amarillo y el otro con cualquiera de los dos negros.

<img src="http://farm4.static.flickr.com/3266/3128790922_898378a2e0.jpg" alt="" width="500" height="375" />

Ahora, dobla los otros extremos de los cablecillos en forma de dos pequeños ganchos.

<img src="http://farm4.static.flickr.com/3284/3127962997_f1bf721447.jpg" alt="" width="500" height="375" />

Y mételos en el conector de alimentación de la Wii de forma que los ganchos queden rodeando los dos pines. Eso sí, asegúrate bien de respetar la polaridad. (Es posible que si inviertes la polaridad la Wii simplemente no se encienda, pero también es posible que quede dañada permanentemente, así que mejor no te la juegues).

<img src="http://farm4.static.flickr.com/3096/3127962293_3b3b790e45.jpg" alt="" width="500" height="375" />

Fíjate en la forma del conector y en cuál de los dos pines es el positivo y cuál el negativo. En la foto,  el de arriba es el positivo, luego hay que conectarlo con el cable amarillo de la fuente, y el de abajo (el que está junto a la esquina &#8220;recortada&#8221; del conector, como vimos en la pegatina) el negativo, y hay que conectarlo con el cable negro en la fuente.

Y ya está. Enciende la fuente y verás como tu Wii vuelve a la vida. No es el montaje más elegante del mundo y como estas fuentes necesitan ventilación añade un poco de ruido al conjunto, pero al menos podrás seguir jugando hasta que llegue ese envío con los repuestos originales de Nintendo.]]></content:encoded>
			<wfw:commentRss>http://www.obsoletos.org/2008/12/devolviendole-la-vida-a-la-wii/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Talleres en Ciudad Real: un final feliz</title>
		<link>http://www.obsoletos.org/2008/12/talleres-en-ciudad-real-un-final-feliz/</link>
		<comments>http://www.obsoletos.org/2008/12/talleres-en-ciudad-real-un-final-feliz/#comments</comments>
		<pubDate>Tue, 02 Dec 2008 08:00:53 +0000</pubDate>
		<dc:creator>skotperez</dc:creator>
				<category><![CDATA[Nuestros hacks]]></category>
		<category><![CDATA[Talleres]]></category>
		<category><![CDATA[chapas]]></category>
		<category><![CDATA[pin]]></category>
		<category><![CDATA[Taller en Ciudad Real]]></category>
		<category><![CDATA[teclado]]></category>

		<guid isPermaLink="false">http://www.obsoletos.org/?p=406</guid>
		<description><![CDATA[Nunca imaginé que la tecla Insert despertase tantas asociaciones sexuales, aunque así descontextualizada sea más evidente. Qué cosas aprende uno en unos talleres de reutilización con universitarios. Foto: Pablo Rey El último día de taller en Ciudad Real, en la universidad, aparecieron por la puerta dos chicas preguntando si era allí donde podían hacerse una [...]]]></description>
			<content:encoded><![CDATA[<img class="alignnone size-medium wp-image-412" title="Taller de Ciudad Real -- Chapa de teclado" src="http://www.obsoletos.org/wp-content/uploads/2008/12/mini-00397.jpg" alt="Taller de Ciudad Real -- Chapa de teclado" width="500" height="333" />
<small>Nunca imaginé que la tecla <em>Insert</em> despertase tantas asociaciones sexuales, aunque así descontextualizada sea más evidente. Qué cosas aprende uno en unos talleres de reutilización con universitarios. Foto: Pablo Rey</small>

El último día de taller en Ciudad Real, en la universidad, aparecieron por la puerta dos chicas preguntando si era allí donde podían hacerse una chapa de teclado, que se la habían visto a Paz la conserje, que cuando subió a empezar a recoger no pudo resistirse a los encantos de la obsolescencia. Paz y su ayudante estuvieron un rato revolviendo el bolsón de teclas y tras elegir una y confeccionar su chapa se fueron cargando con la primera mesa. Las chicas, de la limpieza, aprovecharon su descanso para trastear con la pistola termoplástica y rebuscar la tecla que querían: <em>Le vamos a regalar la de Av Pág a nuestra compañera, que lleva una mala racha y ya le toca pasar página.</em> Hasta el secretario de la Escuela de Industriales, Pedro Nuñez (gracias por todo el apoyo logístico), que se pasó para ver si necesitábamos algo de última hora, estuvo rebuscando las iniciales de sus hijos y haciendo una chapa para cada uno. Tras ver a los <a title="Obsoletos en la escuela -- obsoletos.org" href="http://www.obsoletos.org/2008/11/obsoletos-en-la-escuela/">chiquillos en el colegio de Chema</a> y a la gente en la universidad confeccionarse su chapa no sabría decir quiénes tenían más cara de niños.

<img class="alignnone size-medium wp-image-413" title="Las chicas de la limpeza" src="http://www.obsoletos.org/wp-content/uploads/2008/12/mini-00401.jpg" alt="Las chicas de la limpeza" width="500" height="333" />
<small>No sé que les diría Pablo a las chicas de la limpieza para arrancarles esas carcajadas&#8230; Foto: Pablo Rey</small>

Diremos que a partir del segundo día de taller se apuntaron otras cuatro personas, así que en total fueron siete. Entre los siete sacaron adelante una máquina de bailar, tres cuartos de pompero (ánimo con el otro cuarto, Carlos) y un ordenador metido en una papelera. Y todo esto después de tenerles un día distraídos con Linux, y unas cuantas horas más escuchando el monólogo estilo club de la comedia de paaq sobre obsolesncecia planificada; lo de monólogo no lo digo yo, fueron ellos los que descubrieron la faceta oculta de paaq.]]></content:encoded>
			<wfw:commentRss>http://www.obsoletos.org/2008/12/talleres-en-ciudad-real-un-final-feliz/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Linuxin: CPU compacta, portátil y perfumada</title>
		<link>http://www.obsoletos.org/2008/10/linuxin-cpu-compata-portatil-y-perfumada/</link>
		<comments>http://www.obsoletos.org/2008/10/linuxin-cpu-compata-portatil-y-perfumada/#comments</comments>
		<pubDate>Tue, 28 Oct 2008 08:00:39 +0000</pubDate>
		<dc:creator>skotperez</dc:creator>
				<category><![CDATA[Nuestros hacks]]></category>
		<category><![CDATA[CPU portatil]]></category>
		<category><![CDATA[hardware]]></category>

		<guid isPermaLink="false">http://www.obsoletos.org/?p=284</guid>
		<description><![CDATA[Conserva tus archivos limpios y perfumados con Linuxin, el último hack de obsoletos. Llevo guardando la caja de la foto cerca de seis meses y todavía huele como el primer día. Foto: Pablo Rey Desde obsoletos.org te ofrecemos la posibilidad de fabricarte tu propia CPU compacta y portátil por lo que te cueste el detergente [...]]]></description>
			<content:encoded><![CDATA[<img class="alignnone size-full wp-image-285" title="obsoletos -- wash machine" src="http://www.obsoletos.org/wp-content/uploads/2008/10/washmachine.png" alt="obsoletos -- wash machine" width="500" height="667" />
<small>Conserva tus archivos limpios y perfumados con Linuxin, el último hack de obsoletos. Llevo guardando la caja de la foto cerca de seis meses y todavía huele como el primer día. Foto: Pablo Rey</small>

Desde <a title="Hackeamos tus recuerdos" href="http://obsoletos.org">obsoletos.org</a> te ofrecemos la posibilidad de fabricarte tu propia <strong>CPU compacta y portátil</strong> por lo que te cueste el detergente y un par de tornillos con sus respectivas tuercas. La caja de detergente es bastante adecuada, ya que trae asa incorporada. El peso rondará los 2 kilos, en función de los dispositivos de almacenamiento y la fuente de alimentación que le metas. En nuestro caso hemos usado una fuente algo más ligera y pequeña de lo normal y solo le hemos puesto un disco duro, sin unidad de CDROM, con la idea de tener un ordenador que se pueda conectar a Internet en cualquier sitio. ¿No te parece barato? ¿Te parece demasiado pesado?

<img class="alignleft size-full wp-image-299" title="Alberto y su linuxin" src="http://www.obsoletos.org/wp-content/uploads/2008/10/mini-img_2334.jpg" alt="Alberto y su linuxin" width="188" height="250" /><img class="alignright size-medium wp-image-300" title="Juan y su linuxin" src="http://www.obsoletos.org/wp-content/uploads/2008/10/mini-img_2338.jpg" alt="Juan y su linuxin" width="188" height="250" />
<small>A Juan y a Alberto les ha cambiado la vida su Linuxin.</small>

<span id="more-284"></span>

Aunque la <a title="Epson HX-20 -- Wikipedia" href="http://es.wikipedia.org/wiki/Epson_HX-20">computadora portatil más antigua</a> data de 1981, la revolución de los portátiles no se produjo hasta unos años más tarde. Mientras tanto las casas de ordenadores punteras del momento gastaban altas partidas de su presupuesto para reducir el tamaño y el peso de sus equipos, y así aumentar proporcionalemente la portabilidad. Al principio diseñar una carcasa considerablemente resistente y colocarle un asa, era lo más. En febrero de 1981 <a title="IBM" href="http://www.ibm.com/">IBM</a> lanzaba su <a title="IBM 5120 -- oldcomputers.net" href="http://oldcomputers.net/ibm5120.html">Portable PC 5120</a>, y en noviembre del año siguiente <a title="Compaq" href="http://www.compaq.com">Compaq</a>, tras algunos problemas por no poder replicar la BIOS de IBM (ya empezaban a tirarse los trastos a la cabeza por aquel entonces), su <a title="Compaq Portable I -- oldcomputers.net" href="http://www.obsoletos.org/wp-admin/rs.net/compaqi.html">Compaq Portable</a>, a secas. El 5120 de IBM costaba en su momento 9.340 dólares, eso sí, con impresora; Compaq consiguió bajar el precio con su modelo hasta 3.590 dólares e incluir en la oferta y en la CPU compacta dos lectores floppy de 5¼.

<img class="alignnone size-full wp-image-286" title="compaq portable computer, 1982" src="http://www.obsoletos.org/wp-content/uploads/2008/10/compaqportablei.jpg" alt="compaq portable computer" width="500" height="241" />
<small><em>More than a mere IBM clone, the Compaq Portable is something different, it&#8217;s transportable, designed so it can easily be taken aboard an airliner as carry-on luggage.</em> Así enunciaba las virtudes de la nueva máquina la publicidad de Compaq, de la que podemos deducir el pique con IBM. Foto: <a title="Obsolete Tehnology Website" href="http://oldcomputers.net/">Obsolete Technology Website</a></small>

<img class="alignnone size-full wp-image-287" title="compaq ibm cases" src="http://www.obsoletos.org/wp-content/uploads/2008/10/compaqibmcases.jpg" alt="compaq ibm cases" width="455" height="251" />
<small>De izquierda a derecha los dos modelos Portable de Compaq, de 1982 y 1986, y el IBM Portable PC 5155. Los tres compactos están a la misma escala.  Foto: <a title="Obsolete Tehnology Website" href="http://oldcomputers.net/">Obsolete Technology Website</a></small>

Las siguientes versiones de ambos fabricantes no consiguieron bajar el precio, o no lo consideraron oportuno; en cambio, por el mismo peso y algo menos de volumen te ofrecían un procesador más potente y algo más de RAM; la nueva máquina de Compaq, el <a title="Compaq Portable II -- Obsolete Technology Website" href="http://oldcomputers.net/compaqii.html">Portable II</a>, incluía un revolucionario disco duro de 10MB. Según el modelo estamos hablando de un mamotreto de entre 26 y 53 libras (13 y 26 kilos).

Los detalles de montaje del Linuxin son bastante triviales y dependerán mucho de los componentes que quieras meter dentro de la caja de detergente. La placa base la tendrás que apoyar en una de las paredes interiores y sujetarla con un par de tornillos; como la placa viene preparada con unos cuantos agujeros es bastante sencillo. Luego sólo queda calcular el lugar exacto donde tendrás que hacer los cortes en el cartón para poder conectar todos los periféricos; el agujero que hemos practicado cerca de la base de la caja solo sirve para poder sujetar la tuerca con unos alicates y atornillar.

<img class="alignnone size-full wp-image-301" title="Linuxin, interior" src="http://www.obsoletos.org/wp-content/uploads/2008/10/mini-img_2326.jpg" alt="Linuxin, interior" width="500" height="375" />

<img class="alignnone size-full wp-image-302" title="Linuxin, conexiones" src="http://www.obsoletos.org/wp-content/uploads/2008/10/caja_2.jpg" alt="Linuxin, conexiones" width="500" height="667" />]]></content:encoded>
			<wfw:commentRss>http://www.obsoletos.org/2008/10/linuxin-cpu-compata-portatil-y-perfumada/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>¿Y las cajas de los ordenas&#8230; para qué?</title>
		<link>http://www.obsoletos.org/2008/10/%c2%bfy-las-cajas-de-los-ordenas-para-que/</link>
		<comments>http://www.obsoletos.org/2008/10/%c2%bfy-las-cajas-de-los-ordenas-para-que/#comments</comments>
		<pubDate>Thu, 09 Oct 2008 07:00:37 +0000</pubDate>
		<dc:creator>skotperez</dc:creator>
				<category><![CDATA[Hackeos e ideas]]></category>
		<category><![CDATA[Nuestros hacks]]></category>
		<category><![CDATA[barbacoa]]></category>
		<category><![CDATA[caja ordenador]]></category>
		<category><![CDATA[estanteria]]></category>
		<category><![CDATA[mobiliario]]></category>

		<guid isPermaLink="false">http://www.obsoletos.org/?p=216</guid>
		<description><![CDATA[Descuartizar un ordenador es como hacer la matanza: cualquier parte se puede aprovechar. Que si con un disco duro que no funciona me hago un altavoz, que si con la lectora de CDs que ya no lee bien me hago un pompero; y claro, con las piezas que funcionan y alguna más me monto un [...]]]></description>
			<content:encoded><![CDATA[Descuartizar un ordenador es como hacer la matanza: cualquier parte se puede aprovechar. Que si con un disco duro que no funciona me hago <a title="El canto del cisne: convierte tu disco duro en un altavoz -- obsoletos.org" href="http://www.obsoletos.org/2008/05/el-canto-del-cisne-convierte-tu-disco-duro-en-un-altavoz/">un altavoz</a>, que si con la lectora de CDs que ya no lee bien me hago <a title="Porom-pompero 2.0 -- obsoletos.org" href="http://www.obsoletos.org/2008/06/porom-pompero-20/">un pompero</a>; y claro, con las piezas que funcionan y alguna más me monto un ordena y lo meto en <a title="Pink Jailbox -- obsoletos.org" href="http://www.obsoletos.org/2008/05/pink-jailbox/">algún recipiente al que le pueda coger más cariño que la insulsa caja gris</a>.

¿Y con la caja qué? Pues, sinceramente lo mejor que puedes hacer es bajarla a la calle el día de la recogida de voluminosos para que se la lleven los gitanos y la vendan al peso. En serio, aunque también puedes intentar darle otro uso, si tienes el día inspirado. Todas las soluciones que hemos podido experimentar en obsoletos o hemos visto por Internet son de una inmediatez apabullante y, al menos en mí, todas acaban produciendo una sonrisa.

Mi preferida es la <strong>caja parrilla</strong>, un clásico que lleva circulando por Internet <a title="Acances en informática aplicada -- Microsiervos" href="http://www.microsiervos.com/archivo/microciervadas-varias/avances-informatica-aplicada.html">desde hace un tiempo</a>.

<img class="aligncenter size-full wp-image-246" title="obsoletos.org -- Barbacoa con caja ATX" src="http://www.obsoletos.org/wp-content/uploads/2008/10/obsoletos-cajaparrilla.jpg" alt="obsoletos.org -- Barbacoa con caja ATX" width="400" height="300" />
<small>Creo que esto pelea duramente con el <a title="Random 1.0, generador de números aleatorios -- obsoletos.org" href="http://www.obsoletos.org/2008/10/random-10-generador-de-numeros-aleatorios/">generador de números aleatorios</a> de paaq por el primer puesto en el ranking de hacks menos tecnológicos.</small>

En nuestro estudio hemos experimentado con la capacidad portante de las cajas, las hemos convertido en estanterías, vamos. Parece que están hechas a propósito para colgarse, igual es así y todo. Basta con quitarle las tapas laterales y aprovechar la estructura de la caja para que apoye sobre los tornillos o las alcayatas.

<img class="alignnone size-full wp-image-247" title="obsoletos.org -- estanteria caja pc: detalle" src="http://www.obsoletos.org/wp-content/uploads/2008/10/obsoletos-estanteriacajapc-detalle.jpg" alt="obsoletos.org -- estanteria caja pc: detalle" width="500" height="175" />

<img class="alignnone size-full wp-image-249" title="obsoletos.org -- estanteria caja pc" src="http://www.obsoletos.org/wp-content/uploads/2008/10/obsoletos-estanteriacajapc.jpg" alt="obsoletos.org -- estanteria caja pc" width="500" height="667" />

Luego hay veces que durante el proceso aparecen soluciones inesperadas que acaban siendo a las que más valor le concedes, quizás únicamente por la sorpresa. Mientras estábamos montando las estanterías en el estudio manu, que tiene el cepillo de dientes en el estudio, se sacó de la manga un sujetacepillos con el soporte de la disquetera.

<img class="alignnone size-full wp-image-250" title="obsoletos.org -- cepillero de dientes" src="http://www.obsoletos.org/wp-content/uploads/2008/10/obsoletos-cepillero.jpg" alt="obsoletos.org -- cepillero de dientes" width="500" height="667" />
<small>Uno de estos es el cepillo de dientes del manu, de los demás no conocemos propietario.</small>

Pero ten cuidado que luego encuentras una solución, como la de las estanterías, tienes cuatro cajas de ordenador ocupando espacio y se te va la mano&#8230;

<img class="alignnone size-full wp-image-251" title="obsoletos -- pared con estanterias caja de ordenador" src="http://www.obsoletos.org/wp-content/uploads/2008/10/obsoletos-paredestanterias.jpg" alt="obsoletos -- pared con estanterias caja de ordenador" width="500" height="375" />
<small>La estantería del centro contiene nuestro servidor de archivos Debian.</small>]]></content:encoded>
			<wfw:commentRss>http://www.obsoletos.org/2008/10/%c2%bfy-las-cajas-de-los-ordenas-para-que/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

