<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Gzaloprgm</title><link>http://gzaloprgm.com.ar/</link><description>Feed RSS de posts de Gzaloprgm</description><language>es</language><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Gzaloprgm" /><feedburner:info uri="gzaloprgm" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><title>Cámara infrarroja</title><description><![CDATA[<p>Hace un par de años encontré una cámara vieja de video: una JVC GR-C7u. Es una cámara de los años '80, tiene CCD, autofoco, viewfinder blanco y negro y graba en cinta, en formato VHSC. Es un modelo muy parecido a la usada en la película "Volver al futuro" (gr-c1u), con carcasa roja.</p>
<p>La estuve usando un poco como visora de viejas cintas, hasta que un día decidí ver cómo se podía modificar. Es conocido que los sensores CCD (usados en gran parte de las cámaras digitales) por naturaleza detectan un rango de luz que abarca más que la luz visible. Detectan parte del llamado "infrarrojo cercano", que está cerca del color rojo en la tabla de longitudes de onda. Este infrarrojo NO es el tipo de infrarrojo emitido por los cuerpos que tienen temperatura. El infrarrojo "térmico" es el mediano, y es imposible de ver por sensores CCD normales.</p>
<p>Las cámaras tienen por diseño un filtro anti-infrarrojo, que deja pasar solamente el rango de luz que el ojo ve. Esto es necesario ya que de otra forma las imágenes saldrían con un tono rojizo, y los colores no corresponderían a lo que las personas ven. Sacando a este filtro, y cambiándolo por uno paso-infrarrojo, que deje pasar lo infrarrojo y bloquee parte de la luz visible, es posible que la cámara "vea" infrarrojo.</p>
<p>Este filtro por lo general está bien cerca del sensor:</p>
<p><img src="/images/ircam0.jpg" alt="Filtro infrarrojo"/></p>
<p><img src="/images/ircam3.jpg" alt="Ubicación Filtro infrarrojo"/></p>
<p>Luego de varias horas de búsqueda, <a href="http://www.freeservicemanuals.info/en/servicemanuals/">conseguí el manual de service de la cámara en este lugar</a>, tienen muchos manuales gratis y los escanean a pedido. En la imagen marqué con rojo cual es el filtro que hay que cambiar.</p>
<p>Para crear un filtro pasa-infrarrojo, es posible usar la parte interna de los disquettes, o la parte subexpuesta ("negra") de los negativos de fotos:</p>
<p><img src="/images/ircam1.jpg" alt="Filtro pasa-infrarrojo"/></p>
<p>Para mantener la misma altura del filtro, usé un par de vidrios viejos del mismo tamaño, intentando que el grosor total sea lo más parecido al del filtro original. Al variar este alto, la cámara pierde su capacidad de ser parfocal (mantener el foco variando el zoom) y tiene problemas al enfocar en cosas cercanas. para enfocar al infinito puede ser necesario tener que desenroscar el elemento del frente más que lo posible.</p>
<p>Algunas fotos luego de la modificación:</p>
<p>Árboles y plantas "blancas" bajo la luz del sol:<br/><img src="/images/ir0.jpg" 
alt="Arboles bajo luz infrarroja"/></p>
<p>Venas:<br/><img src="/images/ir1.jpg" alt="Venas bajo luz infrarroja"/></p>
<p>Control remoto se ve transparente:<br/><img src="/images/ir2.jpg" alt="Control remoto bajo luz infrarroja"/></p>
<p>Teclado con algunas teclas de otro color (no tengo idea por qué):<br/><img src="/images/ir3.jpg" alt="Teclado bajo luz infrarroja"/></p>
<p>Billete de dos pesos argentinos (se ve "blanco") la tinta refleja la luz infrarroja IR. Los dólares parece que usan otro tipo de tinta y no pasa esto.<br/><img src="/images/ir4.jpg" alt="Billete bajo luz infrarroja"/></p>
<p>Partes del ojo<br/><img src="/images/ir5.jpg" alt="Ojo bajo luz infrarroja"/></p>
<p>Otras cosas: Las bebidas gaseosas se ven transparentes (no saqué una foto todavía). Algunos tipos de telas dejan pasar la luz IR, por lo que se puede ver a través de algunas prendas de ropa. También hay muchas cosas que se ven "sin textura", como algunas maderas, algunas impresiones, entre otras cosas.</p>]]></description><link>http://feedproxy.google.com/~r/Gzaloprgm/~3/Zp0E1ZRcwi4/</link><feedburner:origLink>http://gzaloprgm.com.ar/ircam/</feedburner:origLink></item><item><title>Links a sitios interesantes</title><description><![CDATA[<p>Electrónica para la salud:</p>
<ul>
<li><a href="http://www.swharden.com/blog/2009-01-20-diy-ecg-improvements/">Electrocardiograma (ECG)</a></li>
<li><a href="http://electronicatecnoparque.blogspot.com.ar/2010/07/diseno-e-implementacion-de-un-sistema.html">Electroencefalograma (EEG)</a></li>
<li><a href="http://eegproject.blogspot.com.ar/">Electroencefalograma (EEG)</a></li>
<li><a href="http://people.ece.cornell.edu/land/courses/ece4760/FinalProjects/s2012/cwm55/cwm55_mj294/index.html">Interfaz PC-Cerebro</a></li>
</ul>
<br/><p>Electrónica analógica:</p>
<ul>
<li><a href="http://www.carousel-design.com/SparkGap.html">Protección anti ESD</a></li>
<li><a href="http://talkingelectronics.com/projects/SpotMistakes/SpotMistakesP1.html">Errores comunes en los circuitos (algunos están mal corregidos, CUIDADO)</a></li>
<li><a href="http://www.falstad.com/circuit/e-index.html#mirror">Demostraciones electrónicas online</a></li>
</ul>
<br/><p>Electrónica digital:</p>
<ul>
<li><a href="http://www.bores.com/courses/intro/basics/index.htm">Introducción al procesamiento digital de señales</a></li>
<li><a href="http://www.romanblack.com/one_sec.htm">Algoritmo para hacer timers muy precisos y estables</a></li>
<li><a href="http://www.dattalo.com/technical/software/software.php">Rutinas muy optimizadas para PICs</a></li>
<li><a href="http://www.batsocks.co.uk/readme/art_bcm_1.htm">Alternativa a PWM</a></li>
<li><a href="http://people.ece.cornell.edu/land/courses/ece4760/FinalProjects/">Muchos proyectos</a></li>
<li><a href="http://www.ikalogic.com/migrating-from-8051-to-avr-microcontrollers/">Pasando de 8051/2 a AVR</a></li>
<li><a href="http://cameraculture.media.mit.edu/projects">Modificaciones a cámaras para resolver problemas</a></li>
<li><a href="http://www.telefonica.net/web2/hidlcd/">Conversor USB-paralelo con PIC16F628a (muy optimizado y ajustado al microcontrolador)</a></li>
<li><a href="http://www.avbrand.com/home/">Casa automatizada</a></li>
</ul>
<br/><p>Datasheets:</p>
<ul>
<li><a href="http://www.jimfranklin.info/microchip.html">Notas de aplicación de Microchip</a>
<li><a href="http://www.atmel.com/Images/doc0856.pdf">Set de instrucciones de AVR 8 bits (PDF)</a></li>
<li><a href="http://www.efton.sk/misc/reset.pdf">Circuitos de reset para 8051/2</a></li>
<li><a href="http://www.nxp.com/acrobat_download2/various/80C51_FAM_ARCH_1.pdf">Arquitectura 80C51</a></li>
<li><a href="http://www.lst.inf.ethz.ch/teaching/lectures/ss09/2100/filesystem_lab/fslab.pdf">Estructura del sistema de archivos FAT12/16</a></li>
<li><a href="http://walter.schreppers.com/files/16f628_programming_specs.pdf">Guía de programación ICSP de PIC16f628A</a></li>
<li><a href="http://www.atmel.com/Images/doc1919.pdf">Datasheet AT89S52</a></li>
<li><a href="http://www.freeservicemanuals.info/en/servicemanuals/">Manuales de servicio gratis de cosas, podés pedir y si la tienen te las escanean en 5 días, excelente!</a></li>
</ul>
<br/><p>Sistemas embebidos:</p>
<ul>
<li><a href="http://www.fpga4fun.com/JTAG3.html">Explicación JTAG</a></li>
<li><a href="http://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/">Hola mundo en ARM, con GCC y emulador QEMU</a></li>
<li><a href="http://www.bairesrobotics.com/download/01146B.pdf">Tips para PICs</a></li>
<li><a href="http://manio.skyboo.net/sparklan/">Linux para routers WRT55AGv2</a></li>
</ul>
<br/><p>Radiofrecuencia:</p>
<ul>
<li><a href="http://davehouston.org/RFTipsTricks.htm">Tips para módulos RF</a></li>
<li><a href="http://digilander.libero.it/i2ndt/grabber/grabber-compendium.htm">Receptores de QRSS</a></li>
<li><a href="http://www.websdr.org/">Índice de receptores de radio</a></li>
</ul>
<br/><p>Mecánica y reciclaje:</p>
<ul>
<li><a href="http://en.wikipedia.org/wiki/IP_Code">Grado de protección</a></li>
<li><a href="http://igor.chudov.com/manuals/Servo-Tuning/PID-without-a-PhD.pdf">Control PID sin un PhD</a></li>
<li><a href="http://heli.xbot.es/wp/">Reciclaje electrónico</a></li>
</ul>
<br/><p>Programación:</p>
<ul>
<li><a href="http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=alg_index">Tutoriales de algoritmos</a></li>
<li><a href="http://research.swtch.com/sparse">Usando memoria no inicializada</a></li>
<li><a href="http://www.arachnoid.com/signal_processing/dft.html">Transformada de fourier discreta</a></li>
<li><a href="http://warp.povusers.org/Mandelbrot/">Conjunto de mandelbrot (fractales)</a></li>
<li><a href="http://staffwww.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf">Ruido simplex (como Perlin)</a></li>
<li><a href="http://www.research.scea.com/research/pdfs/RGREENfastermath_GDC02.pdf">Aproximación a funciones matemáticas</a></li>
<li><a href="http://graphics.stanford.edu/~seander/bithacks.html">Hacks con manipulación de bits</a></li>
<li><a href="http://www.losersjuegos.com.ar/_media/referencia/apuntes/debian/debian.pdf">Mini manual de referencia de debian linux</a></li>
<li><a href="http://www.nihilogic.dk/labs/canvas_sheet/HTML5_Canvas_Cheat_Sheet.pdf">Mini manual de canvas (HTML5)</a></li>
<li><a href="http://developer.yahoo.com/performance/rules.html">Acelerando la carga de tu sitio web</a></li>
<li><a href="http://ninite.com/">Instalador rápido de muchos programas</a></li>
<li><a href="http://amath.colorado.edu/documentation/LaTeX/Symbols.pdf">Lista de símbolos matemáticos de LaTex</a></li>
<li><a href="http://en.wikibooks.org/wiki/LaTeX/Mathematics">Matemáticas con LaTex</a></li>
</ul>]]></description><link>http://feedproxy.google.com/~r/Gzaloprgm/~3/6GvlrowSjlg/</link><feedburner:origLink>http://gzaloprgm.com.ar/links/</feedburner:origLink></item><item><title>Compilado de WTFs propios</title><description><![CDATA[<p>Algunos CAPTCHAs un poco violentos:<br/>
<img src="/images/wtf2.png" alt="Captcha want kidnaps"/><br/>
<img src="/images/wtf3.png" alt="Captcha toast 3-year-olds"/></p>

<p>Abusos del traductor de google: un router con autoenvejecimiento... WTF?<br/>
<img src="/images/wtf4.png" alt="Router con autoenvejecimiento"/></p>

<p>En un diagnóstico de física: ¿Cuándo apareció el otro auto?<br/>
<img src="/images/wtf5.png" alt="Auto fantasma"/></p>

<p>Cacho, <a href="http://es.wikipedia.org/wiki/Inyecci%C3%B3n_SQL">el sistema deja de andar cuando alguien pone un apóstrofe</a>... ¿Por qué no le decimos a la gente que no los ponga y listo?<br/>
<img src="/images/wtf1.png" alt="Posible inyección SQL detectada"/></p>

<p>Leve aumento del precio del Sushi (ver 5º promoción)...<br/><img src="/images/wtf6.png" alt="SushiPopWTF"/></p>]]></description><link>http://feedproxy.google.com/~r/Gzaloprgm/~3/o68O0Dq3PJc/</link><feedburner:origLink>http://gzaloprgm.com.ar/wtf/</feedburner:origLink></item><item><title>Placa entrenadora para 8052</title><description><![CDATA[<p>Esta placa permite iniciarse con microcontroladores compatibles con 8051/2 (con programación serial) como por ejemplo el AT89S52 o el AT89S8253.</p>
<p>Una vez hecha la placa, es posible programar al microcontrolador con algún programa que soporte ISP. Por ejemplo: <a href="http://grabador-isp-atmel.blogspot.com.ar/">Grava Atmel (puerto paralelo)</a>, <a href="http://rafaelbf.tripod.com/grava.htm">AtmelWrite (puerto serie)</a> y <a href="http://www.mytutorialcafe.com/Microcontroller%20Project%20Thesis%20Programmer89S%20USB.htm">USBProgrammer (puerto USB</a>.</p>
<p>
<img src="/images/entrena8052sch.png" alt="Placa entrenadora 8052, esquemático"/>
<img src="/images/entrena8052lyt.png" alt="Placa entrenadora 8052, circuito impreso"/>
</p>
<p>
<a href="/descargar/8052training/">Descargar esquemático e impreso editable en proteus</a>
</p>]]></description><link>http://feedproxy.google.com/~r/Gzaloprgm/~3/LnNn7NWV_Cc/</link><feedburner:origLink>http://gzaloprgm.com.ar/entrenadora8052/</feedburner:origLink></item><item><title>Resumen de temas del segundo parcial de IPC - CBC</title><description><![CDATA[<iframe src="http://gzaloprgm.com.ar/descargas/ResumenIPC2.pdf" width="800" height="800" style="border: none;"></iframe>
<p><a href="http://gzaloprgm.com.ar/descargas/ResumenIPC2.pdf">Descargar</a></p>
<p>Si encontrás algún error, dejá un comentario abajo y lo arreglaré a la brevedad.</p>]]></description><link>http://feedproxy.google.com/~r/Gzaloprgm/~3/OG8hJBsW6qk/</link><feedburner:origLink>http://gzaloprgm.com.ar/ipcsegundoparcial/</feedburner:origLink></item><item><title>Calculador de divisor resistivo</title><description><![CDATA[<script type="text/javascript">
//

function roundNumber(num, dec) {
	var result = Math.round( Math.round( num * Math.pow( 10, dec + 1 ) ) / Math.pow( 10, 1 ) ) / Math.pow(10,dec);
	return result;
}
function parse(val, scale){
	var l = parseFloat(val);

	if(scale == "Pico") 	l /= 1000000000000;
	if(scale == "Nano")		l /= 1000000000;
	if(scale == "Micro")	l /= 1000000;
	if(scale == "Mili")		l /= 1000;
	
	if(scale == "Kilo")		l *= 1000;
	if(scale == "Mega")		l *= 1000000;
	if(scale == "Giga")		l *= 1000000000;	
	
	return l;
}
function compute(){
	var r1 = parse($("#r1").val(), $("#r1Scale").val());
	var r2 = parse($("#r2").val(), $("#r2Scale").val());
	
	if((r2+r1) == 0) return false;
	
	var t = (r2 / ( r2 + r1) ) *  $("#vin").val();
		
	$("#vout").val(roundNumber(t,3) + " volts");
	
	if(t<1){
		$("#vout").val(roundNumber(t*1000,3) + " milivolts");
	}
	
	return false;
}
$(document).ready(function () {
	$("input").keyup(compute);
	$("select").change(compute);
	compute();	
});
//
</script>
<p>Dadas dos resistencias y un voltaje de entrada, esta página calcula cual será el voltaje de salida del divisor resistivo.</p>
<form action="">
<p>R1: <input name="r1" value="2.7" id="r1"/><select name="r1Scale" id="r1Scale">
  <option></option>
  <option selected="selected">Kilo</option>
  <option>Mega</option>
</select>Ohms</p>
<p>R2: <input name="r2" value="5.6" id="r2"/><select name="r2Scale" id="r2Scale">
  <option></option>
  <option selected="selected">Kilo</option>
  <option>Mega</option>
</select>Ohms</p>
<p>Vin: <input name="vin" value="5" id="vin"/> Volts</p>
<p>Vout: <input name="vout" disabled="disabled" id="vout"/></p>
</form>
<img src="/images/divisorresistivo.png" alt="Divisor resistivo"/>
<p>Un divisor resistivo (también llamado divisor de tensión o de potencial) es un circuito lineal que produce un voltaje de salida (Vout) que es una fracción del voltaje de entrada (Vin)</p>
<p>El divisor de voltaje más sencillo cuenta con dos resistencias puestas en serie, tomando el nodo del medio como el voltaje de salida. Suele ser usado para crear un voltaje de referencia, o para obtener una señal de bajo voltaje proporcional a un voltaje medido (atenuador de señal).</p>
<p>La carga conectada a la salida produce un efecto carga. Es decir, al conectarla disminuye la tensión de salida. Por esto, conviene que la corriente de entrada sea mucho mayor a la corriente de salida. La desventaja de hacer esto es que la mayor parte de la corriente de entrada se pierde en forma de calor en las resistencias.</p>
<p>La impedancia de salida del divisor resistivo es igual a la resistencia cuando R1 y R2 están en paralelo, es decir Rout = (R1*R2)/(R1+R2).</p>
<p>Palabras clave: calcular tension resistencia, resistencias en series, impedancias en serie</p>]]></description><link>http://feedproxy.google.com/~r/Gzaloprgm/~3/g1ZhaX-6jYo/</link><feedburner:origLink>http://gzaloprgm.com.ar/divisor_resistivo/</feedburner:origLink></item><item><title>Control de motores con puente H</title><description><![CDATA[<p>Hay tres tipos de control de motor de corriente continua:</p>
<ul>
	<li>Apagado/Prendido: El motor se puede apagar y prender</li>
	<li>Apagado/Adelante/Atrás: El motor se puede apagar y hacer girar en ambas direcciones</li>
	<li>Apagado/Adelante/Atrás/Frenado: Además del anterior, el motor se puede "frenar", cortocircuitando sus terminales</li>
</ul>
<p>Además, es posible controlar la velocidad de los motores por modulación de ancho de pulso (PWM), siempre que el sistema lo permita.</p>
<h3>Primer modo: Apagado/Prendido</h3>
<p>Este es el modo más sencillo, se puede realizar tanto con un transistor como con un relé:</p>
<p><img src="/images/ph1.png" alt="Control apagado-prendido de motor con transistor"/>
   <img src="/images/ph1_r.png" alt="Control apagado-prendido de motor con relé"/>
</p>
<p>Como se puede ver en el primer circuito, es un transistor operando como interruptor. El diodo es necesario porque, al ser el motor una carga inductiva, cuando se le corta la tensión retiene parte de la energía y la libera en el sentido inverso, lo que podría quemar los transistores. Los diodos deberían ser del tipo ultrarrápido si la señal de comando usa PWM.</p>
<p>El segundo circuito es similar, con la diferencia que el elemento de control es el relé. Es mucho más sencillo, soporta un motor de mucha más corriente, tiene menos caída de tensión y el motor puede utilizar otra fuente de tensión (es decir, está teóricamente aislado). El problema es que los relé tienen una vida útil limitada, no se puede usar PWM de alta frecuencia, y la bobina del relé agrega un consumo considerable en el caso que se manejen motores de baja corriente.</p>
<h3>Segundo modo: Apagado/Adelante/Atrás</h3>
<p>Este método es interesante porque se puede usar para realizar robots, autos radio controlados, entre muchas otras cosas. Al igual que el anterior, se puede realizar con transistores como con relés:</p>
<p><img src="/images/ph2.png" alt="Control apagado-adelante-atrás con relés"/>
   <img src="/images/ph2_t.png" alt="Control apagado-adelante-atrás con transistores"/>
</p>
<p>En el primer circuito, cada relé controla a qué tensión va conectada cada una de las terminales del motor, por lo que hay 4 combinaciones:</p>
<table>
	<tr><td class="f">Relé izquierdo</td><td class="f">Relé derecho</td><td class="f">Resultado</td></tr>
	<tr><td>Apagado</td><td>Apagado</td><td>Motor frenado</td></tr>
	<tr><td>Apagado</td><td>Prendido</td><td>Motor girando para adelante</td></tr>
	<tr><td>Prendido</td><td>Apagado</td><td>Motor girando para atrás</td></tr>
	<tr><td>Prendido</td><td>Prendido</td><td>Motor frenado</td></tr>
</table>
<p>En el segundo circuito, cada transistor interrumpe o deja pasar corriente al motor, por lo que hay 16 combinaciones:</p>
<table>
	<tr><td class="f">A</td><td class="f">B</td><td class="f">C</td><td class="f">D</td><td class="f">Resultado</td></tr>
	<tr><td>0</td><td>0</td><td>0</td><td>0</td><td>Motor cortocircuitado a +V</td></tr>
	<tr><td>0</td><td>0</td><td>0</td><td>1</td><td><strong>CORTOCIRCUITO</strong></td></tr>
	<tr><td>0</td><td>0</td><td>1</td><td>0</td><td>Motor flotando</td></tr>
	<tr><td>0</td><td>0</td><td>1</td><td>1</td><td>Motor girando para adelante</td></tr>
	<tr><td>0</td><td>1</td><td>0</td><td>0</td><td><strong>CORTOCIRCUITO</strong></td></tr>
	<tr><td>0</td><td>1</td><td>0</td><td>1</td><td><strong>CORTOCIRCUITO</strong></td></tr>
	<tr><td>0</td><td>1</td><td>1</td><td>0</td><td><strong>CORTOCIRCUITO</strong></td></tr>
	<tr><td>0</td><td>1</td><td>1</td><td>1</td><td><strong>CORTOCIRCUITO</strong></td></tr>
	<tr><td>1</td><td>0</td><td>0</td><td>0</td><td>Motor flotando</td></tr>
	<tr><td>1</td><td>0</td><td>0</td><td>1</td><td><strong>CORTOCIRCUITO</strong></td></tr>
	<tr><td>1</td><td>0</td><td>1</td><td>0</td><td>Motor flotando</td></tr>
	<tr><td>1</td><td>0</td><td>1</td><td>1</td><td>Motor flotando</td></tr>
	<tr><td>1</td><td>1</td><td>0</td><td>0</td><td>Motor girando para atrás</td></tr>
	<tr><td>1</td><td>1</td><td>0</td><td>1</td><td><strong>CORTOCIRCUITO</strong></td></tr>
	<tr><td>1</td><td>1</td><td>1</td><td>0</td><td>Motor flotando</td></tr>
	<tr><td>1</td><td>1</td><td>1</td><td>1</td><td>Motor cortocircuitado a masa</td></tr>
</table>
<p>Como se puede ver, este circuito también se lo conoce con el nombre de Puente H "quemable", porque una entrada puede quemar todos los transistores. Por esto se le acopla lógica externa para evitar que esto suceda. Con transistores buenos (poco VCEmin) es posible lograr un rendimiento del orden del 90%, a diferencia de los relés, cuya corriente de bobina reduce el rendimiento. Además, con los transistores es posible regular la velocidad del motor, usando PWM.</p>
<h3>Tercer modo: Híbrido</h3>
<p>Considerando que por lo general en un sistema es poco frecuente el cambio de dirección de un motor, es posible combinar los dos sistemas anteriores y hacer un híbrido, en el que un relé se use para cambiar la dirección, y un transistor para variar la velocidad. Este método está en el medio de los dos:</p>
<ul>
	<li>Corriente extra: consume más que el puente H puro con transistores, pero menos que el hecho todo con relés</li>
	<li>Rendimiento: tiene una caída de tensión media, más que el hecho con relés, pero menos que el hecho con transistores</li>
	<li>Costo: al necesitar solamente dos transistores (solamente uno de potencia) y un relé, es bastante barato</li>
	<li>Control de velocidad: Es posible controlarla usando PWM en el transistor que apaga y prende el motor</li>
	<li>Facilidad de uso: No hay una combinación en la que exploten los transistores</li>
</ul>
<p><img src="/images/ph3.png" alt="Puente H híbrido con transistores y relés"/>
</p>
<p>Estos métodos pueden ser utilizados tanto con motores como con cualquier otra carga a la que sea necesario cambiar su polaridad, como por ejemplo una celda peltier. Sería posible controlar la temperatura via PWM (con un lazo de realimentación) y además invertir su polaridad, para hacer que caliente en vez de enfriar.</p>
<p>Palabras clave: Puente h con relevadores, puente h con relés, puente h, girar motor con transistores, puente h con 2 relevadores, puente h con transistores</p>]]></description><link>http://feedproxy.google.com/~r/Gzaloprgm/~3/DXya4UAuWjs/</link><feedburner:origLink>http://gzaloprgm.com.ar/puenteh/</feedburner:origLink></item><item><title>Juego de cartas de electrónica</title><description><![CDATA[<p>Es un juego que hice de proyecto final de una materia para el colegio. Es un juego de cartas multijugador (anda via LAN e internet). La idea era hacer algo similar al juego de las cartas pokémon, pero con cartas graciosas. 
</p>
<p>El juego usa la librería SDL y SDL_Image para abrir ventanas, manejar eventos y cargar las imágenes del juego. También usa OpenGL para el renderizado gráfico, y los "sockets de Unix" para multiplayer. Para compilarlo es necesario tener instalado mingw o cygwin, ir a la carpeta del cliente y ejecutar make.</p>
<p><img src="/images/tcgort.jpg"/></p>
<p><a href="http://code.google.com/p/electronica-tgc/">Bajar código y ejecutable</a> 
(Licencia: GPL2) </p>]]></description><link>http://feedproxy.google.com/~r/Gzaloprgm/~3/fi_D7FyrQKk/</link><feedburner:origLink>http://gzaloprgm.com.ar/electronica-tcg/</feedburner:origLink></item><item><title>Motor de tiles con HTML5/Canvas</title><description><![CDATA[<p>Es un "motor" de tiles que corre en el navegador, soporta scrolling y cambios dinámicos. No usa Flash, usa HTML5, por lo que seguramente funcione en iPad/iPod. Pueden usarlo para crear RPGs vistos desde arriba, juegos de plataforma, de defensa de torres, entre otras cosas. </p>

<p><a href="/descargar/te/">Descargar código</a> (Licencia: Dominio público salvo el tileset que es de JohnSmith27) </p>
]]></description><link>http://feedproxy.google.com/~r/Gzaloprgm/~3/srbLZ24es88/</link><feedburner:origLink>http://gzaloprgm.com.ar/te/</feedburner:origLink></item><item><title>CMDNotepad - Ejecutá comandos discretamente</title><description><![CDATA[<p>Básicamente es un clon del bloc de notas de windows (Copìé menúes, iconos, interfaz), pero con algunos comandos ocultos que permiten ejecutar comandos como si estuvieras en la línea de comandos (CMD.exe) pero de forma más discreta, haciendo que parezca que estás escribiendo un texto en bloc de notas. </p>

<p>Lo hice en el 2008, usando visual basic 6, en un par de horas. En la descarga pueden encontrar el código fuente, si lo quieren modificar y redistribuir no hay ningún problema (siempre que me nombren)</p>

<p>Por un pequeño bug no funciona si no son administradores, pero lo pueden corregir cambiando c:\temp.txt por temp.txt y recompilando el proyecto.
</p>
<p><a href="/descargar/cmdnotepad/">Descargar fuente + ejecutable</a></p>
]]></description><link>http://feedproxy.google.com/~r/Gzaloprgm/~3/3E32MU5LRTU/</link><feedburner:origLink>http://gzaloprgm.com.ar/cmdnotepad/</feedburner:origLink></item><item><title>Convertir una tensión en un valor digital, sin usar ADC</title><description><![CDATA[<p>Hay veces en las que necesitamos leer desde sensores, potenciómetros u otros dispositivos analógicos, desde un microcontrolador barato sin ADC.</p>
<p>Acoplar un ADC externo hace que necesitemos más patas en el micro (generalmente el valor sampleado se da en un bus de datos de 8 bits, como en el ADC0808), más espacio en el circuito impreso, o más complejidad en el software (por ejemplo, habría que programar rutinas para comunicarse via I2C con el ADC)</p>
<p>Si no nos interesa la resolución, precisión, linealidad, tiempo de sampleo, una solución es usar un circuito RC, usando un estilo de conversión similar al de doble rampa, pero sin integrar, unicamente contando el tiempo que tarda en descargarse el RC</p>
<img src="/images/rc.png" alt="Circuito RC"/>
<p>La resistencia puede ser cambiada por un termistor (PTC o NTC) si se quiere medir temperatura, o un LDR si se quiere medir luminosidad. También es posible usar un sensor capacitivo, manteniendo fija la resistencia en algún valor conocido.</p>
<p>Es necesario tener una pata de E/S en el microcontrolador, que permita poner la pata en estado de alta impedancia</p>
<p>El principio de funcionamiento es el siguiente: </p>
<ul>
	<li>Ponemos la pata en positivo durante 1 ms, para cargar el capacitor</li>
	<li>Ponemos la pata en modo entrada (alta impedancia) y medimos cuanto tarda en descargarse el capacitor</li>
	<li>Repetimos este ciclo cada 50ms</li>
</ul>
<img src="/images/descarga.png" alt="Ciclo carga descarga capacitor"/>
<p>Si no tenemos puertos con posibilidad de setear un modo de entrada/alta impedancia (como en el 8052), podemos usar un par de componentes más, como se muestra en el circuito siguiente:</p>
<img src="/images/rcz.png" alt="ADC sin puertos de alta impedancia"/>
<p>Como se puede ver, el diodo hace que el capacitor solo pueda ser cargado, la resistencia extra evita algún posible cortocircuito en caso de que el potenciómetro esté en 0 ohms (puede ser removido si sabemos que tiene límite el puerto). El transistor y la resistencia de base se usan para sensar cuando la tensión del capacitor es menor a 0.7v</p>
<p>Un problema de este tipo de conversor es que depende de la tensión (por ejemplo si el circuito fuese alimentado a 3.3v, el capacitor tardaría mucho menos en cargarse), la baja resolución (que se puede mejorar usando interrupciones y no midiendo manualmente), y que necesita bastante tiempo de sampleado (pero se puede tunear para cada aplicación)</p>
<p>Cómo usarlo (en C)</p>
<pre><code>
	unsigned short tiempo=0;
	PIN_CARGA = 1; delay1ms(); PIN_CARGA = 0; //Cargar el capacitor	
	while(EJE0_LECTURA == 0) tiempo++; //Esperar descarga
	
</code></pre>
<p>Al valor resultante (16 bits) habría que restarle una constante, y escalarlo para obtener un valor entre 0 y 0xFF.</p>
<p>Palabras clave: sigma delta, doble rampa, rampa, integración, adc pic, adc avr, adc 8052</p>]]></description><link>http://feedproxy.google.com/~r/Gzaloprgm/~3/_x-mHyojLDg/</link><feedburner:origLink>http://gzaloprgm.com.ar/adcsinadc/</feedburner:origLink></item><item><title>Calculadora con 8052</title><description><![CDATA[<p>Hice una pequeña calculadora con un 8052, un lcd alfanumérico y un teclado de 4x4.</p>
<p>El esquemático seguro está incompleto o tiene errores ya que la hice en una placa universal, pero las conexiones se pueden deducir mirando el código. Soporta notación natural (infija), multiplicaciones, sumas, restas, divisiones, potencias, raices, paréntesis. La precisión depende del compilador usado (SDCC tiene unas librerías de float menos precisas que el Keil uVision)</p>
<p>El algoritmo usado es Shunting-Yard (para pasar la expresión a notación postfija) y luego se evalua la pila resultante de forma sencilla. Se usan algunos trucos para aprovechar mejor la memoria (necesita menos de 256 Bytes de RAM!) reusando estructuras.</p>
<p>Para compilar el código fuente, ejecutar el archivo .bat. Debería generarse un .hex listo para programarlo al microcontrolador. Es necesario usar SDCC, aunque el código debería ser compatible (con pequeños cambios) con Keil uVision.</p>
<p><a href="/descargar/calc8052">Descargar esquemático y programación</a></p>
<p><img src="/images/calc.jpg" alt="8052 calculadora"/></p>
<p><img src="/images/calcsch.png" alt="8052 calculadora esquemático"/></p>
<p>Palabras clave: hacer calculadora pic, calculadora avr, calculadora 8052, calculadora con microcontrolador, calculadora electronica, lcd alfanumerico, hacer una calculadora</p>]]></description><link>http://feedproxy.google.com/~r/Gzaloprgm/~3/IuilwACWb48/</link><feedburner:origLink>http://gzaloprgm.com.ar/calc8052/</feedburner:origLink></item><item><title>GonGraphIX</title><description><![CDATA[<p>GonGraphIX es un motor para diseñar juegos, enfocado en tener código sencillo y fácil de entender. Está siendo desarrollado en C++, usando OpenGL 3.0 y GLFW.</p>
<p>Cosas que soporta:
	<ul>
		<li>Iluminación dinámica usando sombreado diferido.</li>
		<li>Luces direccionales, punto, spot</li>
		<li>Shaders: Mapeo de normales, agua, cielo, mapeo reflectivo</li>
		<li>Multiplataforma, soporte multihilo, librería matemática</li>
		<li>OpenGL 3 core profile usando GLFW</li>
		<li>Sistema de audio 3D usando FMOD</li>
		<li>Soporte de cámaras en 1era y 3era persona</li>
		<li>Manejador de eventos con soporte para mouse, teclado, joysticks, joypads</li>
		<li>Juegos en red usando UDP, server multihilo</li>
		<li>Carga de archivos Obj, texturas PNG</li>
		<li>Interfaz con soporte para botones, etiquetas, listas, menúes, barras deslizadoras, cajas de texto</li>
		<li>Sistemas de partículas usando point sprites</li>
	</ul>
</p>
<p><img src="/images/ggfx1.png" alt="Normal mapping"/> <img src="/images/ggfx2.png" alt="Iluminación dinámica"/><br/>
<img src="/images/ggfx3.png" alt="Terreno y cielo"/> <img src="/images/ggfx4.png" alt="Interfaz, carga de modelos"/></p>
<p>En desarrollo junto a <a href="http://twitter.com/#!/JosAtJarvix">Jos Kuijpers</a>. Diseño de ventanas por <a href="http://www.taringa.net/perfil/Roprgm">Rodrigo Belfiore</a></p>
<p>Palabras clave: motor opengl, juegos opengl, juegos glsl, shaders glsl, bump mapping, normal mapping, iluminación deferida, deferred shading, glew, glee, glfw, sdl, fmod</p>]]></description><link>http://feedproxy.google.com/~r/Gzaloprgm/~3/x5H3rYcDvJo/</link><feedburner:origLink>http://gzaloprgm.com.ar/ggfx/</feedburner:origLink></item><item><title>Compilando programas de C o C++ usando GCC/G++</title><description><![CDATA[<p>Los programas de un proyecto suelen estar compuestos de varios archivos de código fuente, con extensión .c o .cpp (en caso de ser C++). Compilar cada uno de estos archivos resulta en archivos .o, llamados código objeto. Estos archivos contienen el código fuente traducido a código máquina.</p>
<p>Luego de tener todos los archivos .o resultantes (y los .a que corresponden a librerías dinámicas), es necesario juntarlos para formar el .exe final, usando un enlazador. Este proceso se encarga de unirlos, haciendo que las referencias entre las distintas partes funcione correctamente. </p>
<p>El proceso completo se puede ver en esta imagen:<br/><img src="/images/com_enlazado.png" alt="Proceso de compilación y enlazado"/></p>
<p>En la implementación de compiladores de GCC (tanto el de Linux como el que se puede instalar en Windows mediante Mingw), el ejecutable principal se llama <code>gcc</code>, y se encarga tanto de la compilación como del enlazado.</p>
<p>Supongamos que quisieramos armar el "Programa.exe" como muestra la imagen. Estos serían los pasos:</p>
<ol>
	<li>Primero necesitamos compilar Archivo1.c para generar Archivo1.o. Esto se puede hacer con el siguiente comando: <code>gcc Archivo1.c -o Archivo1.o</code></li>
	<li>Luego necesitamos compilar Archivo2.c, al igual que el paso anterior. Para eso usamos un comando similar: <code>gcc Archivo2.c -o Archivo2.o</code></li>
	<li>Finalmente, enlazamos las tres cosas (los dos .o y la librería .a), mediante el comando <code>gcc Archivo1.o Archivo2.o Lib1.a -o Programa.exe</code></li>
</ol>
<p>Luego de este último paso, si no hubieron errores, se debería haber creado un ejecutable Programa.exe.</p>
<p>Si estuviésemos compilando archivos de C++, cambiar <code>gcc</code> por <code>g++</code>, y las extensiones por .cpp debería ser suficiente.</p>
<p>El proceso de compilación puede ser automatizado usando un archivo .bat que contenga todas los comandos a ejecutar (en orden, uno por línea). También es posible automatizarlo aún más, utilizando una herramienta llamada <code>make</code>, que permite, entre otras cosas, evitar la recompilación de algúnos códigos fuente que no hayan cambiado.</p>
<p>Palabras clave: compilando con mingw, compilando con dev-cpp, devc++, djgpp, geany, gedit, notepad++, compilación de programas de c++</p>]]></description><link>http://feedproxy.google.com/~r/Gzaloprgm/~3/oAs2DuKurY8/</link><feedburner:origLink>http://gzaloprgm.com.ar/tut_compilando/</feedburner:origLink></item><item><title>Haciendo un editor simple de fuentes pixeladas</title><description><![CDATA[<p>En este pequeño tutorial mostraré como hacer un editor de fuentes píxel de 8x8, útil para diseñar tu propia tipografía. Usaré C++ y SDL (para acceder a la pantalla y eventos). Conocimiento de C/C++ es recomendado.</p>
<p>Primero necesitamos incluir todas los archivos cabecera (headers, extensión .h) de todas las librerías que vayamos a usar en el editor. Estos archivos incluyen prototipos de funciones (dicen como se llaman, la cantidad y tipos de argumentos, el tipo de retorno) y son necesarios para que el compilador pueda escribir correctamente la referencia a lo que necesitemos.</p>
<p><pre><code>#include &lt;SDL/SDL.h&gt;
#include &lt;fstream&gt;
#include &lt;iostream&gt;
using namespace std;
</code></pre>Incluímos la librería principal de SDL, la librería fstream (para trabajar con archivos) y la librería iostream (para trabajar con la consola). Las funciones de estas dos últimas librerías están contenidas en un nombre de espacio llamado <code>std</code>. Para no tener que escribir <code>std::</code> antes de cualquier función (de la stl) que usemos, escribimos <code>using namespace std;</code>.</p>
<p><pre><code>int fuente[8][8];</code></pre>Declaramos un array bidimensional de enteros de 8x8, que contentrá los valores de cada celda (1 si está pintado de negro, 0 si está pintado de blanco). Para mantener las cosas simples, el tamaño de cada glifo será fijo.</p>
<p><pre><code>int main(int argc, char* args[]){
	if(SDL_Init(SDL_INIT_EVERYTHING) != 0){
		cerr << "Error al iniciar SDL" << endl;
		return -1;
	}</code></pre>
Declaramos la función principal del programa. Intentamos inicializar la librería SDL. Si falla (es decir, si la función <code>SDL_Init</code> devuelve algo distinto de cero, imprimimos un error por la consola.</p>

<p>
<pre><code>	SDL_Surface *pantalla = SDL_SetVideoMode( 8*32, 8*32, 32, SDL_SWSURFACE );
	
	if(pantalla == NULL){
		cerr << "Error al crear la superficie de video" << endl;
	}</code></pre>
	Intentamos crear una ventana de 256*256 píxeles, 32 bits de profundidad y no acelerada por hardware (SW vs HW). Si falla, escribimos un mensaje de error.</p>
<p><pre><code>	SDL_WM_SetCaption("Editor de fuentes",NULL);</code></pre>
Cambiamos el título de la ventana.</p>

<p><pre><code>
	bool cerrado=false;	
	int botonApretado = 0;
	</code></pre>Declaramos dos variables, una booleana que indica si el programa se sigue ejecutando (para cerrar el programa hay que ponerla en verdadero) y otra que indica si hay algún boton apretado (0=ninguno, 1=izquierdo, 2=derecho).</p>
<p><pre><code>
	while(!cerrado){
</code></pre>Siempre que no hayan cerrado la ventana, seguimos haciendo el loop principal.</p>	
	<p><pre><code>
		SDL_Event event;
		while(SDL_PollEvent(&event)){ 
		</code></pre>Siempre que haya algún evento, lo procesamos.</p>
			<p><pre><code>
			if(event.type == SDL_QUIT)
				cerrado = true;
			</code></pre>Si se apretó la X de la ventana, establecemos la variable cerrado en verdadero, así en el próximo frame se cierra.</p>
				
			<p><pre><code>
			if(event.type == SDL_MOUSEBUTTONDOWN){
				if(event.button.button == SDL_BUTTON_LEFT)
					botonApretado = 1;
				else if(event.button.button == SDL_BUTTON_RIGHT)
					botonApretado = 2;	
			}
			</code></pre>Si se apretó algún botón, nos fijamos cual fue apretado y establecemos la variable al valor correspondiente.</p>
			
			<p><pre><code>
			if(event.type == SDL_MOUSEBUTTONUP)
				botonApretado = 0;
			</code></pre>Si se soltó algún botón, lo recordamos.</p>
			
			<p><pre><code>
			if(botonApretado != 0){ 
				int posX = event.motion.x; 
				int posY = event.motion.y; 
				</code></pre>Si hay algún botón apretado, almacenamos la posición del mouse.</p>
				<p><pre><code>
				if(posX<32*8 && posY<32*8){
					int celdaX = posX/32;
					int celdaY = posY/32;
					
					if(botonApretado == 1){
						fuente[celdaY][celdaX] = 1;
					}else{
						fuente[celdaY][celdaX] = 0;
					}
				}
				
			}
		}
		</code></pre>Si el mouse está dentro de la ventana, calculamos a qué celda corresponde dividiendo la posición por el tamaño de cada celda (32 píxeles en este caso). Si está apretado el botón izquierdo, establecemos el valor a de la celda correspondiente a 1, caso contrario lo ponemos a 0.</p>
		
		<p><pre><code>
		for(int y=0;y<8;y++){
			for(int x=0;x<8;x++){
			
				SDL_Rect rect;
				rect.x = x*32;
				rect.y = y*32;
				rect.h = 32;
				rect.w = 32;
				</code></pre>Vamos por cada una de las 8x8 celdas y calculamos la posición de cada cuadrado.</p>
				
				<p><pre><code>
				if(fuente[y][x]==0){
					SDL_FillRect(pantalla,&rect,0x00FFFFFF);
				}else{
					SDL_FillRect(pantalla,&rect,0x00000000);
				}
			}
		}
		</code></pre>Si el valor de la celda estaba en 0, llenamos el rectángulo correspondiente de la pantalla con el color blanco, caso contrario negro.</p>
		<p><pre><code>
		SDL_Flip(pantalla);
		SDL_Delay(1);
	}
	</code></pre>Forzamos a que la ventana se redibuje, esperamos un milisegundo para disminuir un poco el consumo de CPU.</p>
	
	<p><pre><code>
	ofstream of("salida.txt");
	for(int y=0;y<8;y++){
		for(int x=0;x<8;x++){
			of << fuente[y][x] << ",";
		}
	}
	of.close();
	</code></pre>Si llegamos a este punto es porque cerraron la aplicación, por lo que abrimos el archivo "salida.txt" como salida, vamos por cada celda e imprimimos el valor correspondiente. Luego cerramos el archivo.</p>

	<p><pre><code>
	SDL_Delay(100);
	system("notepad salida.txt");
	</code></pre>Esperamos un tiempo y abrimos el archivo con el bloc de notas.</p>
<p><pre><code>
	SDL_Quit();
	return 0;
}
</code></pre>Le decimos a SDL que puede devolver toda la memoria que haya usado, y le decimos al sistema operativo que el proceso se terminó correctamente.</p>

<p><a href="/descargar/editorfuentes">Descargar código fuente y ejecutable</a></p>]]></description><link>http://feedproxy.google.com/~r/Gzaloprgm/~3/KbVfSrbWtLg/</link><feedburner:origLink>http://gzaloprgm.com.ar/tut_editorfuentes/</feedburner:origLink></item></channel></rss>
