tag:blogger.com,1999:blog-87567425709575267152024-03-14T10:41:30.489+01:00Wirelearn :: Informática y Electrónica desde el backstageInformática y electrónica desde el backstageUnknownnoreply@blogger.comBlogger17125tag:blogger.com,1999:blog-8756742570957526715.post-44024328271319649782014-12-31T20:40:00.001+01:002014-12-31T20:40:10.927+01:00Problemas con PICKit2 en MPLAB X?<div>
Estas navidades (a parte de retomar las entradas que me faltan de nuestro Wirelearn Robot Shield), se me ha ocurrido una idea y para llevarla a cabo he tenido que desempolvar mi PICKit2. Después de leer un poco acerca del mundillo de los microcontroladores de Microchip para ponerme al día, he descubierto que MPLAB X IDE ya está en su version 2.26. Además, el compilador Hi-Tech C de la misma casa está en desuso, y lo reemplazan la nueva serie de compiladores XC-x. </div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-bBAjFng35H8/VKRP872nfkI/AAAAAAAAAmc/gOcCZIyigsU/s1600/pickit2foto.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-bBAjFng35H8/VKRP872nfkI/AAAAAAAAAmc/gOcCZIyigsU/s1600/pickit2foto.jpg" height="240" width="320" /></a></div>
<div>
<br />
<h4>
Escenario</h4>
<div>
Por lo tanto mi escenario es el siguiente:</div>
<div>
<br /></div>
<div>
- Sistema Operativo Linux Ubuntu - Utopic Unicorn (debería dar lo mismo)</div>
<div>
- <b>MPLAB X IDE v 2.26</b></div>
<div>
- Compilador <b>XC-8</b> debidamente instalado y activado en el IDE.</div>
<div>
- Programa sencillo (yo hice un blink con un LED en el pin RD4)</div>
<div>
<br /></div>
<div>
Me dispongo a compilar (build) y todo va bien, pero a la hora de programar, obtengo un mensaje de error tal que así:</div>
<div>
<br /></div>
<blockquote class="tr_bq">
<i>The programmer could not be started: Could not connect to tool hardware: PICkit2PlatformTool, com.microchip.mplab.mdbcore.pickit2.PICkit2DbgToolManager</i></blockquote>
<br />
<h4>
Solución</h4>
<div>
<ul>
<li>Antes de nada, necesitas un PC con windows (a poder ser la versión 7). Descárgate la aplicación <b>PICKit 2 v2.61</b> <a href="http://ww1.microchip.com/downloads/en/DeviceDoc/PICkit%202%20v2.61.00%20Setup%20A.zip" target="_blank">aquí</a>.</li>
</ul>
<ul>
<li>Instala la aplicación en tu PC con Windows 7 (o si eres un valiente intentalo con Wine y nos cuentas).</li>
</ul>
<ul>
<li>Conecta el PICKit2 y cuando esté reconocido e instalado, abre la aplicación. En la pantalla principal de la aplicación debería mostrar que está conectado.</li>
</ul>
<ul>
<li>Ahora vamos a Tools > Calibrate VDD and set <b>Unit ID</b>. Damos "next" 3 veces hasta saltarnos la historia del VDD que no nos interesa. Entonces nos aparece una pantalla en la que podemos introducir un "Unit ID". Ponemos lo que nos de la gana, (sin caracteres raros) y finalizamos. Hacemos lo que nos dice de esperar a que el USB esté listo.</li>
</ul>
<ul>
<li>Reiniciamos MPLAB X y listo. Con esa ID, ya puedes utilizar tu programador en cualquier PC</li>
</ul>
<div>
<br /></div>
<div>
<br /></div>
<div>
Al parecer es necesario en MPLAB X que el PICKit2 tenga una ID (los dispositivos antiguos no estan serializados y por defecto vienen sin ID).</div>
</div>
<div>
<br /></div>
<div>
Solamente añadir que a mi me aparece el PICKit2 con dos puntitos amarillos en el las propiedades del proyecto para el PIC que utilizo (16F887), y funciona perfectamente con el compilador XC-8, tanto para programar, como para hacer debug.</div>
<div>
<br /></div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8756742570957526715.post-91127137702959440452014-06-27T22:57:00.001+02:002014-06-27T22:57:54.845+02:00Depuración hardware en android (Ubuntu)<div class="separator" style="clear: both; text-align: justify;">
<span style="text-align: start;">Esta entrada es de especial importancia para aquellos que os hayáis agenciado un teléfono/tablet con sistema operativo android, de marca no precisamente conocida.</span></div>
<div>
<span style="text-align: start;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-uuYv90bUJs0/U63ZIeDTkEI/AAAAAAAAAjg/2KPhknCBAYM/s1600/imagen_wire.jpg" imageanchor="1"><img border="0" src="http://2.bp.blogspot.com/-uuYv90bUJs0/U63ZIeDTkEI/AAAAAAAAAjg/2KPhknCBAYM/s1600/imagen_wire.jpg" height="224" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div>
Aquellos que hayáis probado a desarrollar para android pensaréis, igual que el común de los desarrolladores de ésta plataforma, que utilizar dispositivos virtuales, o emuladores, es lento y farragoso. Para ello, el SDK de android nos permite conectar nuestros dispositivos android al PC y utilizarlos como dispositivo de pruebas. Ésto es mucho más rápido y tiene la ventaja de que ves la aplicación funcionando en un terminal de verdad.</div>
<div>
<br /></div>
<div>
Sin embargo no todos los dispositivos se comportan de la misma manera cuando los conectamos a nuestro PC para probar nuestras apps en ellos. En mi caso, hará cosa de un año me compré una tablet china (PiPo Max M1), y cuando la conecto al PC, el <a href="http://developer.android.com/tools/help/adb.html" target="_blank">adb</a> ni se inmuta. He de decir que con mi teléfono (Xperia Ray) no tengo ningún problema. Es detectado automáticamente por mi PC y sale en la lista de dispositivos.</div>
<div>
<br /></div>
<div>
Después de dar muchas vueltas y probar muchas soluciones, he dado con un método para hacer funcionar (al menos) los dispositivos mencionados. En el caso de la tablet, podemos decir que cualquier dispositivo con chipset RockChip 3066, ya que todos tiene el mismo "vendor id". Dicho método <a href="http://www.mediafire.com/download/dthwtksgytd0jf7/adbcreate.tar.gz" target="_blank">os lo proporciono en forma de script</a> de bash, como buen programador y amante de linux.</div>
<div>
<br /></div>
<div>
<b>Notas adicionales:</b></div>
<div>
<ul>
<li>Activad el modo debug en vuestro teléfono.</li>
</ul>
<ul>
<li>Ejecutad el script como super usuario.</li>
</ul>
<ul>
<li>Debeis proporcionar el "<b>vendor id</b>" de vuestro dispositivo al script como único y necesario parámetro. Si no lo conocéis, podéis buscarlo <a href="http://developer.android.com/tools/device.html" target="_blank">aquí</a>.</li>
</ul>
<ul>
<li>Para los dispositivos chinos lo tenéis un poco más complicado pero buscando un poco suele aparecer. Para los que tengáis un dispositivo RockChip 3066, el "vendor id" es <b>0x2207</b></li>
</ul>
<ul>
<li>Conectad vuestro dispositivo en modo de almacenamiento antes de ejecutar el script (no es imprescindible, pero al final de la ejecución se muestra la lista de dispositivos conectados y detectados)</li>
</ul>
<ul>
<li>Es crucial, que si detenéis y arrancais el servidor de adb, lo hagáis como superusuario. De lo contrario el dispositivo podría no aparecer, o como me pasa a mí, poner 20 signos de interrogación y un "no permissions" al listar los dispositivos.</li>
</ul>
<div>
Es posible que al final de la ejecución la lista de dispositivos siga vacía, o invariable. Esperad unos segundos y ejecutad <b>adb devices. </b>Es posible que el comando se ejecute antes de que se detecte el dispositivo.</div>
</div>
<div>
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8756742570957526715.post-25988046108982144022013-09-04T12:53:00.000+02:002013-09-11T15:31:32.848+02:00Motores Paso a paso (steppers)<h2>
¿Qué son los motores paso a paso?</h2>
<div>
Complementando nuestro proyecto <a href="http://wirelearn.blogspot.com.es/2013/09/proyecto-robot-shield-para-seguir-la.html" target="_blank">Wirelearn Robot Shield (WRS)</a> explicamos en detalle el funcionamiento de los motores paso a paso, y qué circuitería es necesaria para ponerlos en marcha. Esperamos que os ayude!</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-pCCxd_xxWQ4/UicmosZ9NkI/AAAAAAAAAPQ/GY_YSsR1kOY/s1600/stepper_img.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="http://4.bp.blogspot.com/-pCCxd_xxWQ4/UicmosZ9NkI/AAAAAAAAAPQ/GY_YSsR1kOY/s400/stepper_img.jpg" width="400" /></a></div>
<div>
<br /></div>
Los motores paso a paso (E.A. steppers) son motores de corriente contínua (DC) que requieren de cierto grado de lógica digital para funcionar, debido a que son accionados por varias bobinas. De este hecho se derivan dos consecuencias:<br />
<div>
<ul>
<li>Los steppers son considerablemente más<b> complejos de utilizar</b> que un motor contínuo común y generalmente son capaces de girar a<b> menos revoluciones por minuto</b>. Además, son <b>mucho más caros</b> debido a los costes de construcción, y a la electrónica externa necesaria.</li>
</ul>
<ul>
<li>Pueden moverse en fracciones de revolución, lo cual los hace <b>muy precisos</b> y a su vez abre la posibilidad de <b>controlar de forma muy exacta la velocidad</b> a la que giran. Además, es posible forzar una posición magnética, de forma que el motor quede "<b>frenado</b>".</li>
</ul>
</div>
<div>
Como podemos observar, los steppers tienen argumentos a su favor, y en su contra. Basándonos en lo visto hasta ahora, no debería ser muy difícil discernir en qué aplicaciones debemos utilizar cada tipo de motor.</div>
<div>
<h2>
Accionamiento</h2>
</div>
<div>
Para ésta explicación utilizaremos nuestro motor unipolar <a href="http://www.mediafire.com/?oo0b70sltl3g6sw" target="_blank">UHD23N01RAZ25 </a>que consta de seis cables. Los cables verdes son comunes. Es decir, que pueden estar conectados a +5 o GND dependiendo del circuito que los acciona. Los demás cables activan cada una de las "4 bobinas" del motor respectivamente. Resumiendo, si conectamos los cables verdes a +V, conectando cada uno de los restantes a masa estaremos cerrando el circuito de su respectiva bobina y con ello orientando el eje del motor en consecuencia. Lo único que hay que hacer para hacerlo girar es activar las bobinas sucesivamente en el orden correcto.<br />
<br />
Llegados a este punto, debemos saber que existen diferentes modos de hacer girar un motor paso a paso, dependiendo de la secuencia de activación de las bobinas. Llamemos a los cables por la inicial de su color para simplificar (R)ojo,(N)egro,(A)marillo,(V)ioleta:<br />
<br />
<ul>
<li>Modo "<b>Wave Drive</b>": (R, A, N, V) El motor gira en cada paso los grados marcados por el datasheet, 7,5º por paso para el motor citado. Por otra parte, al tener una sola bobina activa en cada momento, el par motor (la fuerza que hace) es más débil de lo que debería. Yo solo lo uso para probar circuitos porque es el más simple.</li>
</ul>
<ul>
<li>Modo "<b>Full Step</b>": (RA, AN, NV, VA) El par motor es máximo, aproximadamente el doble que en modo el modo anterior. La resolución o angulo de giro sigue siendo la misma.</li>
</ul>
<ul>
<li>Modo "<b>Half Step</b>" (R, RA, A, AN, N, NV, V, VR) El par motor es aproximadamente el 70% del máximo, pero se multiplica por dos la resolución de giro. Ésto equivale a unos 3,75º por paso.</li>
</ul>
<div>
Evidentemente, nuestro motor rodará en modo<b> half step</b>. He aquí unas imágenes explicativas de ésta secuencia:</div>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-xQnFARmbda4/Uiccpm8W_GI/AAAAAAAAAOk/FrzTKgo7cXA/s1600/Stepper_A.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="201" src="http://3.bp.blogspot.com/-xQnFARmbda4/Uiccpm8W_GI/AAAAAAAAAOk/FrzTKgo7cXA/s320/Stepper_A.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Paso 1: R activado, el eje se orienta frente a R</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-rxJvUC8SuiE/Uiccwmtl-zI/AAAAAAAAAO0/iLWd4UMyiBg/s1600/Stepper_AB.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="201" src="http://3.bp.blogspot.com/-rxJvUC8SuiE/Uiccwmtl-zI/AAAAAAAAAO0/iLWd4UMyiBg/s320/Stepper_AB.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Paso 2: RA activados, el eje se orienta en el punto medio entre las bobinas R y A</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-IWSWhq3KpRs/Uiccu7kzg_I/AAAAAAAAAOs/rereSir2wvw/s1600/Stepper_B.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="201" src="http://1.bp.blogspot.com/-IWSWhq3KpRs/Uiccu7kzg_I/AAAAAAAAAOs/rereSir2wvw/s320/Stepper_B.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Paso 3: A activado, el eje se orienta frente a A</td></tr>
</tbody></table>
<div>
Y así sucesivamente hasta completar la secuencia. :)<br />
<br />
<blockquote class="tr_bq">
<b>Nota</b>: A pesar de que en éste post hablamos de "cuatro bobinas", ésto es solo una simplificación del motor real, que en realidad tiene muchas más. De hecho, nuestro UHD tiene 48. (360º / 7,5º). Lo que sucede es que cuando activamos una de las líneas del motor, en realidad estamos alimentando 12 bobinas distribuidas uniformemente alrededor del eje, pero solo una de ellas está lo suficientemente cerca como para orientarlo. Ésto es una simple aclaración, que no afecta en absoluto la explicación previa ni posterior.</blockquote>
</div>
<h2>
Circuito</h2>
Según la hoja de datos, cada bobina presenta una resistencia <b>30 Ohm</b>. En principio vamos a alimentarlo con <b>5V</b>, por lo que haciendo un cálculo rápido por la ley de ohm, cada rama del motor llevará una intensidad de <b>170 mA</b>. Éste cálculo <b>NO </b>es preciso, porque es un motor y no una resistencia. Lo correcto aquí es hablar de impedancia inductiva. Así que podríamos decir que lo calculado se trata de una "media" de la intensidad real.</div>
<div>
<br /></div>
<div>
Como deberíamos saber, Arduino UNO solo puede suministrar<b> 40 mA</b>, con lo cual, estamos ante el problema más común de la electrónica digital aplicada:<i> ¿Cómo puedo mover intensidades grandes, con circuitos que soportan intensidades pequeñas?</i></div>
<div>
<br /></div>
<div>
Si estás pensando en un relé, no vas mal encaminado, pero te falta mucho camino por andar. Lo correcto aquí es utilizar un transistor. Y la principal ventaja del transistor en éste campo es la velocidad de conmutación. La naturaleza mecánica del relé lo hace miles, o incluso cientos de miles de veces mas lento que un transistor de uso común. Y en nuestro circuito, deberemos alcanzar velocidades de conmutación en torno a los 20 ms.<br />
<br />
Como podemos observar en la imagen, de él salen <b>6 cables</b>. Dos son iguales (verdes), lo cual nos suscita que serán el común, al que aplicaremos <b>GND </b>o <b>+V</b> dependiendo del circuito.<br />
<br />
Para evitar combustiones espontáneas pensando cómo accionar 4 líneas de corriente con un sólo transistor y nada más, os adelanto que no es posible. Pero ésto no quiere decir que tengamos que comprarnos 4 transistores y montar 4 circuitos. La solución óptima es hacerse con un <b>array darlington <a href="http://www.mediafire.com/download/dxkxjum3w4u6dsc/TD62064_darlington-driver.pdf" target="_blank">TD62064AP</a> </b>como éste:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-zKklFjLEs5Q/Uici8IJZg5I/AAAAAAAAAPE/Y5IBXy_PwJ8/s1600/td62064AP.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="226" src="http://4.bp.blogspot.com/-zKklFjLEs5Q/Uici8IJZg5I/AAAAAAAAAPE/Y5IBXy_PwJ8/s400/td62064AP.jpg" width="400" /></a></div>
<br />
Olvidémonos de momento de la circuitería que suele rodear a los transistores, y de bases, colectores y emisores, ya que toda la teoría daría para varias entradas en el blog. De momento nos sirve con saber que éste componente viene en un encapsulado DIP16. En su interior alberga 4 transistores de conmutación, capaces de soportar corrientes de salida de <b>1,5A</b> y tensiones de hasta <b>50V</b>. Las patas <b>4,5,12</b> y <b>13</b> están conectadas entre sí internamente como muestra la imagen anterior, deben conectarse a masa. Por otra parte hay 4 terminales de entrada <b>(I1,I2,I3,I4)</b> y 4 de salida <b>(O1,O2,O3,O4)</b>. Olvidémonos de las patas COM.<br />
<br />
El funcionamiento es tan simple como, un nivel alto (5V) en I1, conecta O1 con masa. De aquí se deduce, que éste integrado es un<b> sumidero de corriente</b>, lo que quiere decir, que por cada salida del integrado, entrará una corriente que será derivada a masa, cuando la entrada asociada reciba un nivel alto.<br />
<br />
Con lo cual, ya sabemos que el común de nuestros motores (recordemos cables verdes) deberán estar conectados <b>al polo positivo de la fuente d</b>e tal manera que la corriente salga de dicho polo, atraviese la bobina del motor, entre en nuestro integrado y ahí "se vaya por el sumidero" a masa. Para que ésto sea posible debemos conectar los cables de cada bobina del motor a cada una de las salidas del integrado.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
Respecto a los pines de entrada, requieren una I máxima de <b>20 mA</b>, suficientemente pequeña para poder conectarlos a cuatro pines digitales de nuestro Arduino sin riesgo, y ponernos a mandar secuencias a lo loco.<br />
<br />
El circuito completo es éste:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-nGhzTDp0Bgc/Uic2zJnqGgI/AAAAAAAAAPw/l_RXJ5ej5cE/s1600/Array_arduino_motor.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://2.bp.blogspot.com/-nGhzTDp0Bgc/Uic2zJnqGgI/AAAAAAAAAPw/l_RXJ5ej5cE/s640/Array_arduino_motor.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
</div>
<h2>
Programa de prueba</h2>
<div>
Una vez tengas preparado el circuito anterior, puedes flashear éste sketch en tu Arduino UNO:<br />
<pre class="brush: js">/* WIRELEARN 2013 - STEPPER TEST4
This sketch is designed to be flashed to an Arduino UNO board,
Digital pins 4,5,6 and 7 of arduino board should be connected
to I1, I2, I3 and I4 pins of TD62064AP DIP16 IC respectively.
See the whole stepper tutorial > wirelearn.blogspot.com
Bugs and suggestions > adm.wirelearn@gmail.com
#MRGZ#
*/
// DIGITAL PINS
int coil_A = 4;
int coil_B = 5;
int coil_C = 6;
int coil_D = 7;
// MASK FOR EACH PIN
int mask_A = B1000;
int mask_B = B0100;
int mask_C = B0010;
int mask_D = B0001;
// SEQUENCE, TRANSFORM IT TO BINARY NUMBERS MAY MAKE IT EASIER TO UNDESTAND
int sequence[8] = { 8, 12, 4, 6, 2, 3, 1, 9};
int pos;
void setup(){
pinMode(coil_A, OUTPUT);
pinMode(coil_B, OUTPUT);
pinMode(coil_C, OUTPUT);
pinMode(coil_D, OUTPUT);
pos = 0;
}
void loop(){
/*We need 4 bits, one bit per TD62064 input
first word in sequence is 8, which equates 1000B
coil_A = 1000 && 1000 >> 3 = 1
coil_B = 1000 && 0100 >> 2 = 0
coil_C = 1000 && 0010 >> 2 = 0
coil_B = 1000 && 0001 = 0
We just split a four bit number, into single parallel bits :)
*/
// Finally, let's output our bits
digitalWrite(coil_A, sequence[pos] && mask_A >> 3);
digitalWrite(coil_B, sequence[pos] && mask_B >> 2);
digitalWrite(coil_C, sequence[pos] && mask_C >> 1);
digitalWrite(coil_D, sequence[pos] && mask_D);
pos = pos > 7 ? 0 : pos+1;
delay(100);
}</pre>
El circuito debería ser similar para cualquier tipo de Stepper unipolar. Muchos de ellos llevan un cableado diferente, con solo dos bobinas y dos cables aparte de los comunes. Ésto solo influiría en la secuencia de activación de los devanados. Pero el principio de funcionamiento y el circuito con array de transistores debería funcionar exactamente igual.<br />
<br />
Por último, cada motor es diferente, por lo que algunos permitirán velocidades muy altas, y otros no tanto. Deberéis jugar con el "delay" al final del código para conocer los límites de vuestro motor.<br />
<br />
Pronto veremos cómo utilizar un registro de desplazamiento para multiplexar las salidas digitales de Arduino y controlar dos steppers con sólo tres IO Pins. :)<br />
<br />
Saludos!<br />
<br />
#MRGZ#</div>
Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-8756742570957526715.post-88869829027642537432013-09-01T22:25:00.000+02:002013-09-04T22:54:33.675+02:00[PROYECTO] Wirelearn Robot Shield (WRS)<div class="separator" style="clear: both; text-align: left;">
Tras un verano llevando a la práctica una serie de proyectos, desde Wirelearn te traemos una sucesión de entradas explicando paso a paso y desde cero, el proceso completo para crear tu propio <b>robot seguidor de líneas</b> (line follower) a partir de una placa Arduino UNO.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://2.bp.blogspot.com/-1XRUwR49hRA/UiOiD6KTZ_I/AAAAAAAAAOM/x2Z5P7QIRaU/s1600/robot_whitewall_h.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="448" src="http://2.bp.blogspot.com/-1XRUwR49hRA/UiOiD6KTZ_I/AAAAAAAAAOM/x2Z5P7QIRaU/s640/robot_whitewall_h.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Sugerencia de presentación, como el atún en lata... XD</td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div>
En las sucesivas entradas veremos cómo afrontar el <b>planteamiento y diseño de la circuitería</b>, la creación de la misma mediante <b>insolado y revelado casero de PCB</b> (printed circuit boards), algunos tips para soldar los componentes, la <b>programación y flasheado del programa</b>, y la <b>construcción del chasis con materiales asequibles</b>.</div>
<div>
<br /></div>
<div>
Nuestros objetivos principales serán los de la mayoría de los aficionados a la electrónica y la robótica. Los factores que más nos preocupan son entre otros el <b>precio</b>, la <b>complejidad</b> y el <b>tiempo</b>. Pero te adelantamos, que si bien ha sido un proyecto duro para nosotros, no lo será tanto para tí, ya que las dificultades propias de cualquier proyecto de este calibre ya han sido tratadas y resueltas.</div>
<div>
<br /></div>
<div>
Como requisitos previos, es recomendable haber trasteado un poco con Arduino y un poco de electrónica no vendría nada mal. Pero la idea es explicarlo todo al máximo y argumentar adecuadamente cada uno de los pasos, para evitar esa sensación que queda a veces de estar haciendo algo <strike>sin tener ni p*ta idea</strike> sin comprender al máximo todos los detalles subyacentes.<br />
<br />
En breve comenzamos con el diseño del circuito, pero para ir adelantando conocimientos, échale un ojete a nuestra entrada sobre<a href="http://wirelearn.blogspot.com.es/2013/09/motores-paso-paso-steppers.html" target="_blank"> Motores paso a paso (steppers)</a> porque incidiremos en ello más adelante.<br />
<br />
Un saludo!<br />
<br />
MRGZ.</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8756742570957526715.post-68114606707427561742013-02-05T18:26:00.000+01:002013-06-14T17:14:27.384+02:00Utilidad para cifrar/descifrar RxBot<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-lKhC7jbzsAY/URE_IA_ruVI/AAAAAAAAAGE/Na4egX3Hzmw/s1600/cript.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="http://2.bp.blogspot.com/-lKhC7jbzsAY/URE_IA_ruVI/AAAAAAAAAGE/Na4egX3Hzmw/s320/cript.png" width="320" /></a></div>
<div>
<br /></div>
<div>
Hace un par de días, un amigo me pidió ayuda para descifrar una cadena de texto, con fines que desconozco. Generalmente no me suelo meter en temas de cifrado y seguridad de contraseñas, porque es algo <strike>que me aborrece enormemente y </strike>sobre lo que no estoy muy al corriente. En éste caso, tras una breve búsqueda en google, fui a parar a un foro en el que un fulano explicaba más o menos la teoría del asunto. Después traté de encontrar una herramienta al uso para solucionar el problema y lo que me encontré un montón de páginas y foros que las proporcionaban, pero requerían registro previo. </div>
<div>
<br /></div>
<div>
Sin entrar en los intereses que puede tener un foro o página por mis datos personales, preferí no registrarme y como el algoritmo es de risa, traté de hacer un pequeño programa en Java. Un consejo, cuando tengáis que operar a nivel de bit, y realizar operaciones de transformación entre bytes, caracteres y cadenas, <b>huid de este lenguaje.</b></div>
<div>
<br /></div>
<div>
Tras conseguir una versión cuasi-funcional en java que no me terminaba de convencer, me di por vencido y abrí DevC++. Fue una hermosa regresión al universo de los punteros y los arrays de caracteres que desembocó en las herramientas que más abajo comparto con vosotros.</div>
<div>
<br /></div>
<b>El algoritmo</b><br />
<br />
<div>
Me da mucha pereza explicar en profundidad el algoritmo. No obstante, y para que no penséis que me dediqué al <i>copy-pasting </i>resumo lo importante:</div>
<div>
<br /></div>
<div>
El algoritmo se basa en una tabla de 256 hexadecimales de 8 bits constante. Es (o debería ser) la misma para todas las cadenas cifradas con éste tipo de cifrado. </div>
<div>
<br /></div>
<div>
Todo lo que hace el algoritmo es coger el primer carácter a cifrar, y hacer un <b>XOR </b>binario con el primer carácter de la tabla maestra, y así sucesivamente. Como todos sabremos, en el sistema de representación de caracteres <b>ASCII </b>a cada letra le corresponde un valor entre 0 y 255, si hablamos de numeración de 8 bits sin signo. A partir del <b>XOR</b> obtenemos ese byte, que representaremos como entero con signo.</div>
<div>
<br /></div>
<div>
De ésta manera, la cadena:</div>
<blockquote class="tr_bq">
<b>Wirelearn Rulz</b></blockquote>
<div style="text-align: left;">
Tras el cifrado queda representada como:</div>
<blockquote class="tr_bq">
<b>{115,69,-120,65,23,-121,-74,35,-13,44,44,-33,66,126,0}</b></blockquote>
<br />
<b>Conclusiones</b><br />
<br />
Lo bueno de utilizar un <b>XOR </b>es que es una operación reversible. Así, si dos personas tienen la misma tabla, la persona A puede escribir y cifrar un mensaje y enviarlo. Y la segunda persona puede descifrarlo de la misma manera. Así si el mensaje es interceptado, al menos llevará un buen rato reventarlo.<br />
<br />
Como podréis imaginaros<b> ESTE SISTEMA NO ES SEGURO </b>ya que para empezar, la tabla es pública. Aún cambiando la tabla maestra por una aleatoria es bastante fácil de resolver con tiempo y una caña. Sin embargo, podría servir para que vuestras conversaciones privadas no fuesen escuchadas a primera vista en caso de que alguien esté escuchando la red.<br />
<br />
<b>Descarga</b><br />
<br />
Sin ir más lejos, aquí tenéis el <a href="http://www.mediafire.com/?y95t53f6u10w36i" target="_blank">paquete descargable para windows</a><br />
<br />
Un saludo.Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-8756742570957526715.post-43829647710437612122013-01-12T18:25:00.000+01:002013-01-12T18:28:03.527+01:00Un poco de estilo (JAVA)<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-YO3deQGocXE/UPGavy2bB9I/AAAAAAAAAF0/LGzYkI_zGl0/s1600/Photo-Dec-07-1-45-23-PM.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="240" src="http://3.bp.blogspot.com/-YO3deQGocXE/UPGavy2bB9I/AAAAAAAAAF0/LGzYkI_zGl0/s320/Photo-Dec-07-1-45-23-PM.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: xx-small;"><i>Imagen tomada de www.xprogramming.com</i></span></td></tr>
</tbody></table>
<br />
Supongamos que tenemos una lista de números enteros, y queremos separarlos en dos grupos:<i> Aquellos que cumplen una condición (C)</i> y<i> otros que no cumplen dicha condición (!C)</i>. Por ejemplo discriminar de entre todos los numeros de nuestra lista, aquellos que <b>son pares.</b> Lo más inmediato y rápido sin duda sería codificar "a fuego" un algoritmo que recorra la lista y compruebe para cada uno si la condición de la que hablamos se cumple. Éso está bien. Al fin y al cabo, funciona, lo hemos probado muchas veces.<br />
<br />
<div class="codigo">
if (numero % 2 == 0)<br />
imprime("El numero " + numero + " es par);<br />
else<br />
imprime("El numero " + numero + " no es par);</div>
<br />
Pero... ¿Qué pasaría si mañana nos vemos en la obligación de cambiar ese filtro? Imaginemos que mañana no nos interesan los pares sino todos <b>los positivos</b>. Efectivamente, nos vemos obligados a <b>acceder a las tripas del algoritmo</b>, y cambiar un par de cosas para adaptar nuestro código a los requerimientos externos. (Bastante sencillo en éste caso, pero<u> podría no serlo</u>).<br />
<br />
Ya de mano, debería preocuparnos el hecho de deshacernos de ése código pero el verdadero problema no está ahí. El supuesto mortal es ¿Y si necesitara filtrar esos números en función de lo que esta pasando?¿Y si necesitara cambiar ese filtro <b>en tiempo de ejecución</b>? A éstas alturas, ya deberíamos saber que es <strike>de todo término</strike> inviable cambiar el código en tiempo de ejecución.<br />
<br />
Además ¿Y si hubiera veinte posibles condiciones?¿Tendríamos veinte bloques IF anidados?¿O un switch enorme? Esa lógica condicional es veneno puro para el mantenimiento y para el rendimiento.<br />
<br />
Es en éste punto concreto donde debería saltarnos una alarma dentro, que nos diga "Estoy borrando algo <b>perfectamente funcional</b>, pero hoy ya <b>no me sirve por requerimientos externos</b>". Estamos tirando horas de trabajo a la basura. Es aquí donde deberíamos pensar en la palabra <b>"Delegación".</b><br />
<b><br /></b>
<b>¿Qué es la delegación?</b><br />
<b><br /></b>
Delegar es dejar cierta "responsabilidad" en manos de "otro". No es inmediato darse cuenta de cómo encaja la delegación en nuestro proyecto pero ahora veremos una manera mucho mas potente de lidiar con ésta clase de temas.<br />
<br />
<b>¿Como encaja eso aquí?</b><br />
<br />
Pongamos algún concepto más avanzado sobre la mesa. ¿Qué tienen en común todos nuestros cambios en el código? Pues que consisten en alterar la condición de filtrado. ¿Que tienen en común todas nuestras condiciones de filtrado? Que evalúan un entero, y que son de carácter booleano. ¿Podríamos decir entonces que una condición en general es algo que tiene un método booleano y un entero de entrada? Pues sí. A eso se le llama <b>TIPO </b>en términos de orientación a objetos, y una de las maneras más potentes de representarlo es mediante <b>Herencia. </b>Pero no cualquier tipo de herencia.<br />
<br />
Crearemos una Interfaz llamada "Condicion", que tendra un método<br />
<br />
<div class="codigo">
public interface Condicion {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>public boolean validar(int numero);<br />
}</div>
<div>
<br /></div>
<div>
Así definimos nuestro tipo <<condicion>>. Y<b> delegamos en sus hijos</b> la decisión de si un numero nos sirve o no¿Que pasa ahora? Una interfaz por si sola no tiene implementación alguna de cómo validar. Pero permite a nuestro código sustituir nuestra condición grabada a fuego:</condicion></div>
<div>
<br /></div>
<div class="codigo">
<div>
for (Integer numero : numeros){</div>
<div>
if (numero % 2 == 0)<br />
imprime("El numero " + numero + " es par);<br />
else<br />
imprime("El numero " + numero + " no es par);</div>
<div>
}</div>
</div>
<div>
<br /></div>
<div>
Por algo como ésto:</div>
<div>
<br /></div>
<div>
<div class="codigo">
Condicion condicion = .........................;
<br />
<br />
<div>
<div>
for (Integer numero : numeros){</div>
<div>
if (condicion.validar(numero))<br />
imprime("El numero " + numero + " es par);<br />
else<br />
imprime("El numero " + numero + " no es par);</div>
<div>
}</div>
</div>
</div>
</div>
<br />
<br />
¿Que?¿No parece haber cambiado mucho no? Además ¿Donde especificamos nuestra condición? Esto es una M...<br />
<br />
Demos el último paso. Para filtrar los números de la lista, <b>crearemos dos implementaciones de nuestra condición abstracta </b>que se llamarán por ejemplo<b> "CondicionPositivo"</b>, y <b>"CondicionPar"</b>:<br />
<br />
<div class="codigo">
public class <b>CondicionPositivo </b>implements <b>Condicion </b>{}</div>
<br />
y<br />
<br />
<div class="codigo">
public class <b>CondicionPar </b>implements <b>Condicion</b> {}</div>
<br />
<br />
En seguida el compilador nos obligará a punta de pistola a implementar nuestro método "public boolean validar(int)" en nuestras recién creadas implementaciones. Ahí pondremos nuestras dos formas de filtrar.<br />
<br />
Volviendo al código anterior, vemos unos puntos suspensivos que parecen <i>"susceptibles de no compilar bien". </i>Ahí es donde debemos crear una <b>instancia </b>de nuestra clase <b>CondicionPositivo</b>.<br />
<br />
<div class="codigo">
Condicion condicion = new CondicionPositivo();</div>
<br />
Nuestro código ya funciona. Ahora, ¿qué tendríamos que hacer si mañana nos interesan los números pares en lugar de los positivos? Simplemente tendremos que cambiar la linea anterior a nuestro antojo. Así, el hecho de sustituir una por otra, no es destructiva, y con el tiempo vamos alimentando nuestros recursos de código. Es decir, nuestro árbol de Condiciones crece, y podría sernos útil más adelante.<br />
<br />
<b>Ésto esta muy bien, pero dónde está el verdadero potencial de lo que acabamos de construir? </b><br />
<br />
Sencillo. En nuestro nuevo código nada nos impide sustituir la condición en tiempo de ejecución. Es más, podríamos dejar que la condición dependiera de las acciones del usuario, y en función de qué tecla pulse, la condición varíe. Además, aún teniendo un alto número de condiciones, nuestro código permanecería impecable. Nada de lógica condicional.<br />
<br />
Dicho todo ésto,<i> </i><br />
<i><br /></i>
<br />
<div style="text-align: center;">
<i>¿Sabrías crear un filtro para múltiplos de un numero dado (p.ej: múltiplos de 3)?</i></div>
<br />
Descargate el proyecto de eclipse <a href="http://www.mediafire.com/download.php?6grt75kuvn59d3r" target="_blank">aquí </a><br />
<br />
Un saludo!<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8756742570957526715.post-53367829369494438902012-09-04T13:00:00.000+02:002012-09-04T16:25:08.872+02:00Problemas al instalar ADT Plugin para EclipseSi os habéis decidido a programar para android en Windows, probablemente habréis optado por utilizar <b>Eclipse</b> para tal fin. También habréis tenido que instalar <b>Android SDK</b> y finalmente el<b> plugin ADT</b> para eclipse. Lo que voy a tratar de resolver a continuación, son los problemas a la hora de instalar éste último plugin...<br />
<br />
<br />
<div style="text-align: center;">
<img border="0" src="http://1.bp.blogspot.com/-Zxo6LcR-Tx4/UEXesmlr47I/AAAAAAAAAE0/gkpTb7ESz68/s320/android_resources.png" /></div>
<br />
<br />
En mi caso, hace unos meses he instalado el paquete entero que os acabo de mencionar sin problema alguno. Pero ayer, volviendo a instalar todo por segunda vez y de la misma manera, eclipse me dice algo parecido a ésto:<br />
<br />
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;">Cannot complete the install because one or more required items could<br /> not be found.<br /> Software currently installed: Shared profile 1.0.0.1316138460759<br /> (SharedProfile_epp.package.java 1.0.0.1316138460759)<br /> Missing requirement: Shared profile 1.0.0.1316138460759<br /> (SharedProfile_epp.package.java 1.0.0.1316138460759) requires<br /> 'org.maven.ide.eclipse [1.0.100.20110804-1717]' but it could not be<br /> found </span></blockquote>
<br />
Tras probar varias soluciones disponibles en la red, me quedo con dos.<br />
<br />
<ul>
<li>En primer lugar, cerrad eclipse y ejecutadlo de nuevo como <b>administrador </b>(<i>botón dcho > ejecutar como administrador</i>). En mi caso, he alojado el directorio de eclipse en<b> "C:\Program Files"</b>. Éste directorio, además de ser famoso por alojar prácticamente todos los programas que instalamos en nuestro PC, lo es también por requerir privilegios elevados para casi todas las operaciones. Una vez ejecutado de ésta manera, no debería poneros ninguna traba a la hora de leer, escribir o ejecutar algo dentro de eclipse.</li>
</ul>
<ul>
<li>Si aún así seguís obteniendo el mismo error, probad a mover las carpetas <b>"eclipse"</b> y<b> "android"</b> de <b>"C\:Program Files"</b> a <b>"C:\"</b>.</li>
</ul>
Os aseguro que en mi caso, fue suficiente con el procedimiento descrito en el primer punto, pero el segundo por lo visto, tiene gran aceptación en la comunidad. Supongo que a alguien le funcionaría...<br />
<br />
Un saludo, Marcos R.<br />
<div>
<br /></div>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8756742570957526715.post-33758351561052916812012-05-30T13:50:00.001+02:002012-05-30T13:56:30.267+02:00Ayuda! Mi arduino se reinicia solo...<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-tQs-i77G4Xw/T8YJYmJIt_I/AAAAAAAAAEU/qhHJ11WvKLc/s1600/desesp.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-tQs-i77G4Xw/T8YJYmJIt_I/AAAAAAAAAEU/qhHJ11WvKLc/s1600/desesp.jpg" /></a></div>
<br />
En éste caso, y ya que la temática actual lo venía exigiendo, vamos a solucionar un pequeño problema con nuestro Arduino, que nos trae de cabeza desde hace unos días. Si observas que tu arduino hace cosas raras como reiniciarse sin previa orden, o parpadeos del led integrado en el pin 13 inesperados, etc, sigue leyendo, porque puede ser que termines tirándote de los pelos...<br />
<div>
<br /></div>
<div>
En primer lugar, para descartar otros errores, guarda el sketch en el que estés trabajando en lugar seguro dentro del PC. Y a continuación crea uno nuevo con el siguiente código y grábalo en tu arduino. Éste código está pensado para ser lo más simple posible, y está comprobado que falla en las circunstancias adecuadas. ;)</div>
<div class="codigo">
<div>
<br /></div>
<div>
<div>
const int led = 13;</div>
<div>
<br /></div>
<div>
void setup(){</div>
<div>
pinMode(led, OUTPUT);</div>
<div>
digitalWrite(led, HIGH);</div>
<div>
}</div>
<div>
<br /></div>
<div>
void loop(){</div>
<div>
<br /></div>
<div>
}</div>
<div>
<div>
<br /></div>
</div>
</div>
</div>
Parece obvio, ¿verdad? Según éste código ponemos el pin 13 (led de la placa) como salida, y a continuación enviamos un nivel alto. Lo que supone que el led se encienda. Observa la placa con atención y si el led parpadea de vez en cuando, comprueba lo siguiente:
<br />
<div>
<br /></div>
<div>
<ul>
<li>Si tu PC es de escritorio, probablemente dejará alimentados los USB tras apagarlo. Prueba a apagar el PC y dejar tu Arduino conectado. Asegúrate de si ahora el funcionamiento es correcto. Así descartaremos un problema de interferencia entre SW.</li>
</ul>
<div>
Si una vez apagado, Arduino funciona bien, estamos ante un caso de interferencia con otro software. Check this:</div>
<ul>
<li>Arranca de nuevo tu PC.</li>
</ul>
<ul>
<li>En primer lugar, si tienes un smartphone, que utilice un programa de sincronización en el equipo, prueba a cerrarlo. En mi caso era el <b>PC-Companion</b> de los XPERIA, pero puede ser cualquier otro.</li>
</ul>
<ul>
<li>Reinicia la placa Arduino con el botón de <i>reset </i>y vuelve a observar.</li>
</ul>
<ul>
<li>Si sigue fallando, abre el administrador de tareas y trata de buscar algún proceso que esté enviando mensajes al USB a modo de "polling". Si encuentras algo sospechoso, ciérralo también y de nuevo el paso anterior.</li>
</ul>
<div>
Si tu aún no se ha solucionado, prueba lo siguiente:</div>
<div>
<ul>
<li>Desinstala el controlador de la placa Arduino y vuelve a instalarlo siguiendo los pasos de la página oficial.</li>
</ul>
</div>
<ul>
<li>Comprobaremos que el usb del PC funciona correctamente, y si es así, probaremos otro cable.</li>
</ul>
<ul>
<li>Si finalmente el problema persiste (y conste que se me están acabando las ideas) hay quien ha tenido problemas con algo llamado "<i>AutoResetOnSerialConnection", </i>pásate por <a href="http://arduino.cc/playground/Main/DisablingAutoResetOnSerialConnection" target="_blank">aquí</a>.</li>
</ul>
<div>
Seguidos éstos pasos, el 99% de los problemas deberían solucionarse. Sin embargo, en ocasiones la informática es caprichosa. También puedes plantearte probar otro Arduino en tu máquina, y así sabremos si se trata de un defecto en la placa.</div>
<div>
<br /></div>
<div>
Espero que os haya servido de ayuda.</div>
<div>
<br /></div>
<div>
Un saludo,</div>
<div>
<br /></div>
<div>
MarcosRgz.</div>
<div>
<br /></div>
</div>Unknownnoreply@blogger.com9tag:blogger.com,1999:blog-8756742570957526715.post-40870321740414210022012-05-20T01:31:00.000+02:002012-05-27T11:51:16.392+02:00Vistazo al proyecto Arduino<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://arduino.cc/en/uploads/Main/arduino_uno_test.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="http://arduino.cc/en/uploads/Main/arduino_uno_test.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Fotografía extraída de la página oficial de arduino</td></tr>
</tbody></table>
<br />
Después de éste largo tiempo fuera del cable, volvemos para hablar de un aparato que lo está petando en el mundillo de la electrónica. Ni mas ni menos que <b>Arduino</b>. Open hardware con denominación italiana. El objetivo de éste maravilloso componente es facilitar en cierto modo el desarollo de aplicaciones electrónicas y digitales. Pero, ¿Como es eso posible? Lean y tomen nota...<br />
<br />
Para hacernos una idea un poco pijamera de lo que tenemos entre manos, se trata de una placa con un microcontrolador similar a un PIC (concretamente uno de la casa Amtel Systems Co.), 28 pines hembra cada uno de ellos con su respectiva función impresa en dicha placa, un micropulsador de reset, unos cuantos condensadores, diodos, resistencias y leds (todo SMC), un conector de alimentación, pines para programación en circuito (ICSP), y un conector USB estándar hembra de tipo B. Un buen batido de componentes.<br />
<br />
En cuanto a software, en la sección de descargas de la <a href="http://arduino.cc/" target="_blank">página oficial del proyecto arduino</a> podemos encontrar un paquete que contiene, desde los drivers del aparato, hasta un IDE propio de la casa,<b> bastante minimalista</b>, pero que cumple su función. Todo ello, claro está, pasando por gran cantidad de ejemplos funcionales para diferentes aplicaciones y las librerías necesarias para llevar a cabo vuestros proyectos.<br />
<br />
Bueno, todo esto no termina de sonar bien del todo. Seguro que muchos conoceréis más o menos el mundo de los PICs y lo complicado que es realizar un proyecto completo. Arduino nos facilita la vida enormemente, poniendo a nuestra disposición numerosas librerías de alto nivel. Para que os termine de quedar claro, pasaros por <a href="http://arduino.cc/en/Guide/Windows#toc6" target="_blank">aquí</a> y echadle un vistazo al ejemplo de la página oficial. Veréis como transcurridos 5 minutos desde que sacásteis vuestro arduino de su envoltorio tenéis una aplicación funcionando, y lo mejor de todo: <b>¡Entendéis hasta el último detalle de la misma!</b><br />
<br />
Finalmente debemos comentar un par de cosas derivadas de la experiencia. En primer lugar arduino es uno de los pocos hardwares libres que existen. Es realmente económico, pero podéis compraros una copia china más barata en eBay. No obstante, la diferencia de precio va a ser menospreciable, y en el primer caso estaréis contribuyendo a uno de los proyectos socio-tecnológicos más interesantes para la comunidad de la que formamos parte.<br />
<br />
En segundo lugar, y en una tónica menos profunda, vuestro arduino vendrá <b>sin cable</b>, probablemente un sábado cuando justamente las tiendas estén cerrando por una festividad extraña que aún no se ha inventado. Asique buscad por casa uno de éstos cables o id a vuestra tienda preferida a por uno. És el tipo de USB cuadrado que suelen utilizar las impresoras modernas.<br />
<br />
Y ésto es todo por el momento.<br />
<br />
<b>Próximamente, megatutorial de conexión arduino-PC mediante USB, e interfacing con mi amado C#. No te lo puedes perder!</b><br />
<br />
Un saludo, MarcosR.<br />
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8756742570957526715.post-71906839856780703932012-02-12T16:54:00.000+01:002012-02-12T17:21:25.015+01:00Reparar el menú contextual de WinRAR<div class="separator" style="clear: both; text-align: center;">
<a href="http://img195.imageshack.us/img195/2286/30348994.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://img195.imageshack.us/img195/2286/30348994.png" width="320" /></a></div>
Buenas.<br />
<br />
Hoy he solucionado un problema que tenía en la lista de pendientes, y que por lo visto, no me afecta únicamente a mi. Desde siempre he utilizado la herramienta <b>WinRAR</b> en mi equipo para comprimir y descomprimir ficheros cuando encontraba la necesidad. A menudo suelo utilizar los menús contextuales "unzip here" y "add to zip" por comodidad. Cuando utilizas mucho éstas acciones, resulta una verdadera pérdida de tiempo tener que abrir el programa.<br />
<br />
El caso es que desde hace unos meses, éstas opciones aparecen en el menú contextual ("click derecho"), pero aparentemente no hacen nada. Cabría pensar en primer lugar que se tratase de un mal funcionamiento por parte del programa. Y lo más rápido y lógico a éste respecto, es optar por la ya clásica solución "desinstalar y volver a instalar". Desgraciadamente, ésto no va a funcionar.<br />
<br />
También se ha dado el caso de usuarios a los que no les aparecían las opciones en el menú contextual. A mi no me ha pasado, pero en las opciones del programa, hay un checkbox para que aparezcan. Es posible que también tengáis que aplicar la siguiente solución.<br />
<br />
Si cometéis el error de buscar en google la solución, iréis a parar irremediablemente a <b>la misma página de siempre</b>, en la cual, un montón de gente que no tiene ni la menor idea de lo que habla, propone para todo las mismas soluciones, que solo retrasarán lo que tengáis entre manos. Internet es un lugar al que acudir en busca de cultura, conocimientos<strike> y pornografía</strike>. Desde aquí hago un llamamiento para que toda aquella gente que no sabe dónde se esta metiendo, utilice la siguiente norma:<b> "SI NO SABE, NO CONTESTE!!".</b><br />
<br />
Bueno, dicho ésto, a lo que nos enfrentamos no es más que el típico problema de permisos de Windows. La solución es ir a "C:\Program Files\WinRar\" si esa es vuestra ruta, e ir a los permisos de "<b>WinRar.exe</b>" desde botón <b>derecho > propiedades</b>. La solución es como matar mosquitos a cañonazos, pero que yo sepa es la única de momento.<br />
<br />
Una vez en las propiedades, vamos a la pestaña <b>seguridad</b>. Donde nos aparecerá la siguiente ventana:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://img215.imageshack.us/img215/206/acl.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://img215.imageshack.us/img215/206/acl.png" width="221" /></a></div>
<br />
Seleccionamos en la lista superior, el usuario que nos interese. A continuación, pinchamos el botón <b>editar</b>.<br />
<br />
Volvemos a seleccionar el usuario en la lista superior, y le marcamos el permiso<b> control total</b>. Aplicamos y aceptamos todas las ventanas.<br />
<br />
Me imagino que los desarrolladores de windows habrán encontrado alguna grieta de seguridad relativa a ésta forma de ejecutar programas. Para evitarlo, habrán sacado un parche tan grande que cubre a todos los programas de ésta índole, como siempre, sin preocuparse de los daños singulares que nos puedan causar a tí o a mi. Lo mejor sería<b> evitar ésta clase de problemas</b>, y para ello hay que desarrollar <b>software robusto.</b> Ésto en UNIX no pasa. Lo que quiere decir, que es posible hacerlo bien. Pero como dice siempre mi abuela, que de informática no sabrá nada pero ya tiene muchos inviernos,<b> "el que mucho abarca, poco aprieta"</b>.<br />
<br />
Lo habitual es que cuando tu usuario se queda corto de permisos para realizar una acción, te salga la típica ventanita para proporcionar privilegios de administrador. Éste normalmente tiene "control total", aunque en la práctica hay cosas que se le prohíben hasta para administrador del sistema. (Es otra cosa que nunca entenderé). En éste caso, el usuario carece de los privilegios necesarios, pero el sistema no pide los privilegios de administrador. Simplemente pasa de tí. En cambio, el programa <b>WinRar.exe</b> sí que tiene marcada la opción de "ejecutar como administrador", y es por eso que desde dentro del programa, podemos descomprimir y comprimir normalmente, aceptando ejecutar como admin. al principio. Cuando utilizamos botón derecho, no proporcionamos los permisos necesarios, porque algún desarrollador (de Microsoft o de <b>WinRar</b>) metió la pata en algún punto.<br />
<br />
Solo me queda añadir, que si bien hay muchos problemas que se pueden solucionar de ésta manera, es una medida <b>extrema </b>que no se debe tomar como costumbre. Aplicar control total a un usuario sobre <b>WinRar</b> en tu PC personal, no debería tener efectos adversos. Hacerlo sobre Norton Comander en un PC al que normalmente acceden varios usuarios, por poner un ejemplo, ya es otro cantar.<br />
<br />
Espero que os haya servido de ayuda!<br />
<br />
Un saludo, Marcos R.<br />
<br />
<br />Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-8756742570957526715.post-8864267976161020992012-02-02T13:41:00.001+01:002012-02-02T20:17:06.600+01:00Comenzando con C<div class="separator" style="clear: both; text-align: center;"><a href="http://img52.imageshack.us/img52/5126/holamundoc.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="http://img52.imageshack.us/img52/5126/holamundoc.png" width="640" /></a></div><div style="margin-bottom: 0cm;"><br />
</div><div style="margin-bottom: 0cm;">Hoy vamos a meternos un poco con el lenguaje C. Ésta entrada tratará de explicar brevemente como funciona éste lenguaje, y nos dará las claves necesarias para empezar a hacer nuestros programillas.</div><div style="margin-bottom: 0cm;">Si te interesan los artículos de PICs colgados anteriormente en Wirelearn, pero el C no acaba de entrarte por los ojos, presta atención a ésta explicación pues te será de gran ayuda.</div><div style="margin-bottom: 0cm;"><br />
</div><div style="margin-bottom: 0cm;">Comencemos.</div><div style="margin-bottom: 0cm;"><br />
</div><div style="margin-bottom: 0cm;">A lo largo de mis ya 4 años de estudios de informática, y otros 5 más al menos por mi cuenta, he visto muchas y diferentes maneras de tratar de enseñar un lenguaje. A mi entender, todas son buenas respecto a la intención, pero la mayoría fallan en cuanto a resultados.</div><div style="margin-bottom: 0cm;"><br />
</div><div style="margin-bottom: 0cm;">Lo primero que debemos preguntarnos es <b>¿qué necesitamos?</b> Hay quien opina que los Entornos de Desarrollo Integrado (EDI o en inglés IDE) son para tontos y gente que no sabe utilizar un PC. Nada más lejos de la realidad. Podría enseñaros a compilar en consola mediante la orden gcc (linux) por ejemplo, pero perdería el tiempo. Señores, dinosaurios del cretácico y seres del caldo primigenio, estamos en el siglo XXI. La consola es extremadamente útil, pero no para programar, y mucho menos para comenzar a hacerlo.</div><div style="margin-bottom: 0cm;"><br />
</div><div style="margin-bottom: 0cm;">Visto ésto os recomiendo utilizar el entorno DEV C++. Libre e intuitivo.</div><div style="margin-bottom: 0cm;">Descárgatelo desde <a href="http://prdownloads.sourceforge.net/dev-cpp/devcpp-4.9.9.2_setup.exe" target="_blank">aquí</a>, o busca el que más te guste por la red.</div><div style="margin-bottom: 0cm;"><br />
</div><div style="margin-bottom: 0cm;">Dejemos claros unos cuantos conceptos antes de ponernos a programar como si no hubiese mañana:</div><div style="margin-bottom: 0cm;"><br />
</div><ul><ul><li><div style="margin-bottom: 0cm;">C es un lenguaje <b>COMPILADO</b>: El procesador no entiende el lenguaje C. Solo entiende</div><div style="margin-bottom: 0cm;">bloques de unos/ceros. Por lo que para probar nuestro programa, deberemos compilarlo antes. Ésto es, traducirlo a lenguaje máquina (entre otras cosas), y de ésto se encargará el compilador, que instalaremos con el IDE que os comenté hace unas líneas.</div><div style="margin-bottom: 0cm;"><br />
</div><div style="margin-bottom: 0cm;"></div></li>
<li><div style="margin-bottom: 0cm;">Acerca de ser un lenguaje compilado, hay un matiz muy importante. Cuando compilamos un programa, lo traducimos al lenguaje de <b>nuestro procesador</b>. Desgraciadamente, no hay un estándar global en cuanto a lenguaje de procesadores, y muy probablemente, si quereis portar vuestro programa a otra máquina, tengais que compilar los fuentes en ella o buscar otras alternativas. Éste es el principal motivo que hizo tan famoso a Java (compilado e interpretado) y que dió lugar a los demás lenguajes interpretados. Pero ahí entraremos en otro momento.</div><div style="margin-bottom: 0cm;"><br />
</div><div style="margin-bottom: 0cm;"></div></li>
<li><div style="margin-bottom: 0cm;">Es un lenguaje <b>CASE SENSITIVE</b>: Distingue mayúsculas y minúsculas, por lo que no</div><div style="margin-bottom: 0cm;">es lo mismo <i><b>miVariable</b></i> que <i><b>mivariable</b></i><span style="text-decoration: none;"> ni </span><i><span style="text-decoration: none;"><b>NombreUsuario</b></span></i><span style="text-decoration: none;"> que </span><i><span style="text-decoration: none;"><b>nombreUsuario</b>.</span></i></div><div style="margin-bottom: 0cm;"><i><span style="text-decoration: none;"><br />
</span></i></div><div style="margin-bottom: 0cm; text-decoration: none;"></div></li>
<li><div style="margin-bottom: 0cm; text-decoration: none;">Éste punto es de mi cosecha. Las llaves que vais a ver más adelante“{}”, no se ponen por casualidad. C a mi entender es un lenguaje muy duro en cuanto a la sintaxis. Hay que acostumbrarse a normas como que todas las instrucciones terminan en punto y coma, hay que respetar correctamente las llaves, etc.</div><div style="margin-bottom: 0cm; text-decoration: none;"><br />
</div><div style="margin-bottom: 0cm; text-decoration: none;"></div></li>
<li><div style="margin-bottom: 0cm;"><span style="text-decoration: none;">Es un lenguaje, en definitiva, de </span><span style="text-decoration: none;"><b>alto rendimiento</b></span><span style="text-decoration: none;">, porque los programas ya están en lenguaje máquina a la hora de ser ejecutados, pero da lugar a programas de </span><span style="text-decoration: none;"><b>baja portabilidad</b></span><span style="text-decoration: none;"> como resultado de ser compilado.</span></div></li>
</ul></ul><div style="margin-bottom: 0cm; text-decoration: none;"><br />
</div><div style="margin-bottom: 0cm;"><span style="text-decoration: none;">Ahora voy a hacer un pequeño comentario acerca de los tipos de ficheros con los que vais a tratar a la hora de progamar en C. Principalmente cabe destacar dos:</span></div><div style="margin-bottom: 0cm; text-decoration: none;"><br />
</div><ul><ul><li><div style="margin-bottom: 0cm;"><span style="text-decoration: none;"><b>Ficheros de código </b></span><span style="text-decoration: none;">ó ficheros </span><span style="text-decoration: none;"><b>.c</b></span><span style="text-decoration: none;">: Aquí estará el codigo principal de vuestros programas. C</span>ódigo que será exclusivo para ellos y que no pretendéis reutilizar.</div><div style="margin-bottom: 0cm; text-decoration: none;"><br />
</div><div style="margin-bottom: 0cm; text-decoration: none;"></div></li>
<li><div style="margin-bottom: 0cm;"><b><span style="text-decoration: none;">Ficheros de cabecera</span></b><span style="text-decoration: none;"> o ficheros </span><b><span style="text-decoration: none;">.h</span></b><span style="text-decoration: none;">: Contienen funciones y procedimientos construidos y listos para ser utilizados, tales como leer pulsaciones de teclado, imprimir por pantalla, o comparar dos cadenas. Si en algún caso observáis que aparece con frecuencia una misma función en vuestros programas, podríais plantearos crear una librería y meter dentro vuestra función, de manera que no tendríais que volver a escribirla. Bastaría con introducir al principio de vuestros .c una directiva </span><i><span style="text-decoration: none;">#include “Ruta/nombreLibrería.h”</span></i><span style="text-decoration: none;"> y estaría lista para ser utilizada.</span></div></li>
</ul></ul><div style="margin-bottom: 0cm; text-decoration: none;"><br />
</div><div style="margin-bottom: 0cm; text-decoration: none;">Una vez expuesto lo más básico acerca del lenguaje C, os recomiendo encarecidamente que le echéis un vistazo a <a href="http://www.mediafire.com/?obmbiajzcj960p7" target="_blank">éste pdf</a>, que no es obra mía como podréis observar en la cabeza de cada página. Explica conceptos necesarios como tipos de dato, declaración de variables, y habla un poco de las librerías estándar que más adelante utilizaréis en casi todos vuestros programas. También podéis echar un vistazo a la página <a href="http://c.conclase.net/">c.conclase.net</a>, donde explican a fondo todos los conceptos que veremos aquí, pero con una perspectiva bastante más técnica.</div><div style="margin-bottom: 0cm; text-decoration: none;"><br />
</div><div style="margin-bottom: 0cm; text-decoration: none;">En posteriores entradas veremos cómo crear un programa con DEV C++ e intriduciremos conceptos como función, parámetro, valor, referencia, etc.</div><div style="margin-bottom: 0cm; text-decoration: none;"><br />
</div><div style="margin-bottom: 0cm; text-decoration: none;">No te lo pierdas!</div><div style="margin-bottom: 0cm; text-decoration: none;"><br />
</div><div style="margin-bottom: 0cm; text-decoration: none;">Un saludo, Marcos R.</div><div style="margin-bottom: 0cm; text-decoration: none;"><br />
</div><div style="margin-bottom: 0cm; text-decoration: none;"><br />
</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8756742570957526715.post-71638916121097448902012-01-18T19:13:00.001+01:002012-01-18T19:20:51.886+01:00HolaMundo en Hitech-C || Parpadeo de un led<div class="MsoNormal"><div class="separator" style="clear: both; text-align: center;"><a href="http://img221.imageshack.us/img221/4192/ledverde.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="280" src="http://img221.imageshack.us/img221/4192/ledverde.jpg" width="400" /></a></div><br />
<br />
</div><div class="MsoNormal">El primer programa que se suele afrontar a la hora de entrar en el mundo de los PIC es hacer parpadear un led. En primer lugar debemos ser conscientes del funcionamiento del Led. En éste caso, partimos de un led que funciona a un voltaje de 1,7V y una intensidad de 10mA.</div><div class="MsoNormal"><br />
</div><div class="MsoNormal">Habitualmente, la salida del PIC es de unos 5V. Eso es casi 3 veces mas de lo que soporta nuestro LED, y de conectarlo directamente, se quemaría enseguida. Para evitar esta catástrofe, haremos uso de la ley de Ohm para calcular la resistencia que debemos utilizar. De ésta manera, nuestra resistencia sera el cociente de V / I, donde V es la tensión óptima en el ánodo del LED, e I la intensidad de la rama en cuestión. </div><div class="MsoNormal"><br />
</div><div class="MsoNormal">Dejándonos de tecnicismos, 3,3V / 10 mA = 330Ω, que pasado a código de colores estándar de las resistencias es Naranja – Naranja – Marrón – tolerancia.<br />
<br />
</div><div class="MsoNormal"><div class="separator" style="clear: both; text-align: center;"><a href="http://img716.imageshack.us/img716/4164/resistz.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://img716.imageshack.us/img716/4164/resistz.jpg" width="200" /></a></div><br />
</div><div class="MsoNormal">Recordad que los LED (Light Emmiting Diode) como su propio nombre indica, son diodos, lo cual denota polaridad. Para que conduzcan, el ánodo ha de ser más positivo que el cátodo.</div><div class="MsoNormal"><br />
<blockquote class="tr_bq"><i>ATENCIÓN: Tanto para éste tutorial como para los demás, se parte de un PIC modelo 16F887 salvo que se especifique lo contrario. Los programas y las conexiones pueden variar entre modelos, por lo que, en caso de utilizar un dispositivo diferente al mencionado, deberéis comprobar que todo esté correcto antes de alimentar el circuito. </i></blockquote><br />
</div><div class="MsoNormal">Conectaremos a la pata 2 (RA0) de nuestro PIC el LED en serie con la resistencia de 330Ω y finalmente a GND.</div><div class="MsoNormal"><br />
</div><div class="MsoNormal">Ya tenemos los conocimientos necesarios sobre el circuito. Ahora vamos con el programa:<br />
<div class="codigo">#include <htc.h><br />
#define _XTAL_FREQ 8000000<br />
<br />
void main(){<br />
<br />
ANSELH = 0;<br />
ANSEL = 0;<br />
TRISA = 0;<br />
PORTA = 0;<br />
<br />
while(1){<br />
RA0 = 1;<br />
__delay_ms(500);<br />
RA0 = 0;<br />
__delay_ms(500);<br />
}<br />
}</div><b><u><br />
</u></b><br />
<div style="text-align: center;"><b><u>Breve explicación del código:</u></b></div><br />
<br />
<ul><li>Si no se establecen los valores de <b>ANSELH </b>y <b>ANSEL</b>, el programa no funciona, ya que si un PIN está seleccionado como analógico, automáticamente pasa a estar configurado como entrada. Por tanto, una modificación por software sobre <b>PORTA </b>en este caso, no tendría ningún efecto. Ésto pasa en éste modelo de PIC, al menos. He trabajado con su antecesor, el 16F877 y carece de éstos dos registros. No obstante, éstas configuraciones pueden comprobarse en el Datasheet, en el apartado de "I/O Ports".</li>
</ul><ul><li>Acerca de la librería <b><htc.h></b><htc.h>, es la que define los nombres de registros, los nombres de los pines y algunas de las funciones estándar de hitech-c que se utilizan comúnmente como<b> __delay_ms()</b>. Por eso es necesario incluirla SIEMPRE.</htc.h></li>
</ul><ul><li>La directiva <b>#define _XTAL_FREQ hertzs</b> es necesaria para la utilización de los delays, ya que lo que éstos hacen es generar instrucciones en función de la frecuencia a la que funciona el PIC. Tendréis que convivir con ella.</li>
</ul><ul><li>La función <b>__delay_ms()</b> lleva dos barras bajas al principio. Aún no me he molestado en indagar por que utilizan nombres tan feos para algunas cosas. Simplemente realiza una espera activa de los milisegundos pasados por parámetro.</li>
</ul><br />
Y dicho todo esto, ahora podemos simular nuestro proyecto con <b>MPLAB SIM</b> observando el valor del registro <b>PORTA </b>con un punto de debug en las instrucciones <b>RA0 = 1</b> y <b>RA0 = 0</b>. Si todo está correcto, el bit menos significativo del puerto A debería alternar entre 0 y 1.</div><div class="MsoNormal"><br />
</div><div class="MsoNormal">Probablemente algunos habréis pensado en simular con animación. Cuando utilicéis en vuestros programas la función __delay_ms o __delay_us, descartad inmediatamente ésta opción. La explicación es sencilla:</div><div class="MsoNormal"><br />
</div><div class="MsoNormal">Cada paso del simulador es una instrucción. Cada instrucción dura medio microsegundo real (recordad: 8Mhz y 4 ciclos por instrucción). Si echamos cuentas, un delay de 500 milisegundos equivaldría a <b>¡un millón de instrucciones!</b> Si ahora suponemos que vuestro simulador avanza una instrucción cada medio segundo, tendríamos que esperar la bonita cifra de<b> 5,78 días</b> para ver que nuestro LED cambia de apagado a encendido, y otro tanto para volver a apagarse.</div><div class="MsoNormal"><br />
</div><div class="MsoNormal">Es por eso, que vale mas prevenir, y poner un STOP en esas dos líneas, y darle al play normal.</div><div class="MsoNormal"><br />
</div><div class="MsoNormal">En caso de duda, comentad.</div><div class="MsoNormal"><br />
</div><div class="MsoNormal">Saludos – MarcosR. @IAmRutiger</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8756742570957526715.post-65754438081163310412012-01-06T17:10:00.005+01:002012-01-07T17:19:29.681+01:00La función printf en PIC<div class="separator" style="clear: both; text-align: center;"><a href="http://img710.imageshack.us/img710/5030/wirelearn2012lcd.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="http://img710.imageshack.us/img710/5030/wirelearn2012lcd.jpg" width="320" /></a></div><br />
Aquí va un corto pero interesante artículo acerca de cómo utilizar la función printf de C para escribir en un LCD utilizando el compilador HITECH-C Lite. No tengo intención ahora mismo de explicar el procedimiento para escribir en un LCD dado que necesitaría una entrada enorme. Por éso ésta entrada está orientada a todos aquellos programadores de PICs que al igual que yo se han topado con los problemas de escribir, por ejemplo, un numero decimal en un display LCD, 8 segmentos, puerto serie, etc.<br />
<br />
En el C "de toda la vida", para imprimir algo en la salida estándar, la manera más común es echar mano de la librería stdio.h. Entre otras muchas funciones que define ésta librería se encuentra la función printf.<br />
<br />
Un pequeño ejemplo:<br />
<br />
<div class = "codigo">#include <stdio.h><br />
<br />
void main(){<br />
<br />
<div class="tab">int miEdad = 22;<br />
<br />
printf("Mi edad es %d", miEdad);<br />
<br />
getchar();<span class="Apple-tab-span" style="white-space: pre;"> </span> // Paramos la ejecución hasta que se pulse una tecla</div>}</div><br />
<br />
Lo que nos interesa de éste pequeño código es la línea 4. Es decir, la línea en la que aparece el printf de marras. El resultado de éste programa mostraría por pantalla el texto "Mi edad es 22".<br />
Para refrescar la memoria de aquellos que no se acuerden del uso exacto de ésta función, como primer parámetro se envía la cadena con los tokens %, y los demás parámetros son los valores o variables que deseamos que aparezcan en lugar de cada token respectivamente. Así %d es substituido por el valor de la variable miEdad en nuestro programilla.<br />
<br />
Una vez entendido ésto, si lo pasamos a PIC C (a partir de ahora haremos referencia de ésta manera al lenguaje utilizado para el compilador HITECH C) nos encontramos con que al compilar se muestra un error que nos viene a explicar que falta la función "putch".<br />
<br />
Por lo que he podido deducir de mis escasas experiencias, la función printf() se encarga de construir la cadena, realizando los cálculos necesarios en los valores pasados como parámetro, y posteriormente los sustituye. Digamos que crea una cadena con el formato que queremos. A continuación, llama a la función putch() una vez por cada carácter de la cadena en cuestión. Y simplemente, la función putch() envía el carácter recibido a la salida estándar.<br />
<br />
Aquí viene el meollo de la cuestión. En C normal, la salida estándar viene predefinida como la consola de dos, bash...etc. Generalmente es lo más común a la hora de probar los programas. Digamos que ya viene así montado, y si quieres que esa información se envíe a otro sitio tienes que modificar la salida.<br />
<br />
En cambio, en PIC C, la función putch() viene definida como vacía. No tiene código. De ésta manera somos nosotros quienes al crear nuestro programa, decidimos a dónde van a parar nuestros datos.<br />
<br />
Se deduce entonces de la información anterior, que para escribir (por ejemplo) en el puerto B, solo hay que hacer 3 cosas:<br />
<br />
<br />
<ol><li>Incluir la libreria stdio.h.</li>
<li>Definir la función void putch(char c)</li>
<li>Llamar a printf() de la forma normal.</li>
</ol><br />
<br />
Para terminar de aclarar todo ésto, un ejemplo:<br />
<div class = "codigo">/* LA IDEA ES IMPRIMIR LA CADENA "Mi edad es 22" MEDIANTE LA FUNCIÓN PRINTF EN UN LCD, Y UTILIZANDO EL FORMATO DE CADENAS TÍPICO DE C (%d) /*<br />
<br />
#include <htc.h><br />
#include <stdio.h><br />
<br />
#define _XTAL_FREQ 8000000<br />
#include "C:\users\Marcos\Electronica\lib\lcd.h"<br />
<br />
void putch(char c){<span class="Apple-tab-span" style="white-space: pre;"> </span>// DEFINIMOS LA FUNCIÓN PUTCH<br />
<div style="margin-left: 30px;"><span class="Apple-tab-span" style="white-space: pre;"> </span>lcd_putc(c);<span class="Apple-tab-span" style="white-space: pre;"> </span>// ENVIAMOS EL CHAR AL LCD<br />
</div>}<br />
<br />
void main(void){<br />
<div style="margin-left: 30px;"><span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>int miEdad = 22;<span class="Apple-tab-span" style="white-space: pre;"> </span>// DECLARAMOS UNA VARIABLE<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>printf("Mi edad es %d", miEdad); // IMPRIMIMOS<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>while(1);<span class="Apple-tab-span" style="white-space: pre;"> </span>// NO HACER NADA<br />
</div>}</div>Cuando utilicéis la función printf tened en cuenta que el uso de memoria se va a disparar. Sobre todo cuando<br />
utilicéis impresión de datos en coma flotante (%f). Si teneis alguna pregunta no dudéis en <strike>guardar silencio</strike> comentar aquí abajo.<br />
<br />
Un saludo!!<br />
<br />
Marcos R. - @IAmRutiguer<br />
<div><br />
</div>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-8756742570957526715.post-37758172614202933192011-10-30T13:57:00.002+01:002012-05-10T22:52:41.216+02:00Introducción a los Microcontroladores PIC<div class="separator" style="clear: both; text-align: center;">
<a href="http://img842.imageshack.us/img842/9800/pic16f877a.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="http://img842.imageshack.us/img842/9800/pic16f877a.jpg" width="320" /></a></div>
<div>
<br /></div>
Es el momento de dedicar una entrada a todos aquellos usuarios amantes de la electrónica. He de confesar, que mis conocimientos en éste campo son realmente escasos. Pero no por ello nulos. Con lo cual voy a contaros un par de cosas acerca de Microchip, y unos componentes muy interesantes y de coste reducido que están dando que hablar los últimos años. Los microcontroladoes PIC.<br />
<div>
<br /></div>
<div>
<b>¿Qué demonios es un PIC?</b></div>
<div>
<br /></div>
<div>
Según este fragmento sacado de la wikipedia <strike>española:</strike><br />
<blockquote class="tr_bq">
<span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: x-small;">Los PIC son una familia de <a href="http://es.wikipedia.org/wiki/Microcontrolador">microcontroladores</a> tipo <a href="http://es.wikipedia.org/wiki/RISC">RISC</a> fabricados por <a href="http://es.wikipedia.org/wiki/Microchip_Technology_Inc.">Microchip Technology Inc.</a> y derivados del PIC1650, originalmente desarrollado por la división de <a href="http://es.wikipedia.org/wiki/Microelectr%C3%B3nica">microelectrónica</a> de <a href="http://es.wikipedia.org/w/index.php?title=General_Instrument&action=edit&redlink=1">General Instrument</a>.<br />
El nombre actual no es un <a href="http://es.wikipedia.org/wiki/Acr%C3%B3nimo">acrónimo</a>. En realidad, el nombre completo es PICmicro, aunque generalmente se utiliza como Peripheral InterfaceController (controlador de interfaz periférico).</span></blockquote>
Para los seres humanos, en apariencia un PIC es un circuito integrado (objeto rectangular negro, con letras blanquecinas ilegibles y bastantes patas). Hay muchos componentes que responden a esta descripción y no necesariamente tienen que ser ni PIC's ni microcontroladoes. Asique no vayamos a meter la pata cuando veamos cualquier cosa que se le parezca.</div>
<br />
Los PIC como se cita ahi arriba, son un producto de la multinacional Microchip. Hay otras casas que fabrican microcontroladores, como Motorola, Atmel, Dallas Semiconductor, Intel, Philips, Siemens, Temic, etc. Sin embargo no tengo ninguna experiencia con otras marcas.<br />
<br />
<b>¿Para que sirve un microcontrolador?</b><br />
<br />
La respuesta es sencilla. Sirve para "todo". Un microcontrolador es muy parecido al procesador de tu ordenador. Parte de la arquitectura Harvard. Tiene una unidad de control, una ALU, memoria de código y de datos separadas, un sistema bastante interesante de E/S, etc. Es decir, puede recibir señales de sensores u otros periféricos, y actuar en consecuencia.<br />
<br />
Un ejemplo práctico de todo ésto que <strike>se hace en prácticas de Tecnología de Computadores</strike> se me ocurre ahora mismo es un termostato. Tenemos repartidos por casa unos sensores de temperatura y una caldera calefactora. La idea es que al pasar por debajo de 15ºC, la calefacción comience a calentar la casa. Pero para evitar escenas como la del final del señor de los anillos, también nos interesa que al llegar a 21ºC el sistema se detenga. Ésto es precisamente lo que hizo famosos a los microcontroladores. Con unos conocimientos no muy amplios de electrónica digital y un escaso presupuesto, podemos hacer desde unas luces de navidad, hasta<a href="http://www.youtube.com/watch?feature=player_embedded&v=AKrrSbD_wxY"> una nevera que nos dispare una cerveza directa al sofá</a>. Bueno, no os voy a engañar. Todos los comienzos son duros, y hay que tener una buena base de electrónica y ensamblador para hacer algo decente.<br />
<br />
Como siempre me gusta hacer, os voy a poner un ejemplo de la relacción conocimientos-resultados. Con 16 años, la ley de ohm, y un <a href="http://ww1.microchip.com/downloads/en/devicedoc/35007b.pdf">datasheet del PIC 16F84</a>, (y la siempre incuantificable ayuda de mi padre) me hice un juego de luces al estilo kit, el coche fantástico. No parece gran cosa, pero Albert Einstein tuvo que aprender a sumar antes de ponerse a hablar de la relatividad.<br />
<br />
Ahora voy a explicaros un poco (muy poco) como se afronta un proyecto con microcontroladores PIC.<br />
<br />
<ul>
<li>Lo primero es pensar bien, qué quieres hacer y qué necesitas. Y hacerte con todo ello. Cables, herramienta para pelar cables, fuente de alimentación estabilizada de mínimo 5 voltios, un PC, un programador compatible con el PIC, un PIC, y recomiendo MUY encarecidamente, una placa como <a href="http://www.ikkaro.com/files/u1/placa-pruebas-ariston.jpg">ésta</a>, y los sensores, motores, etc.</li>
</ul>
<ul>
<li>Lo segundo es obtener un IDE (Integrated Developement Enviroment) como <a href="http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en019469&part=SW007002">MPLAB</a>. Con éste sowftware escribiréis y suimularéis el programa que va a ejecutar vuestro PIC. Necesitaréis conocimientos de lenguaje ensamblador, y tener el datasheet a mano. En él, además de toda la información electrónica y física del aparato, viene el <b>juego de instrucciones</b> que maneja. En microchip.com podéis descargaros cualquier datasheet de sus productos gratuitamente y sin registro.</li>
</ul>
<br />
<b><u>Consideraciones:</u></b><br />
<br />
<b>El programado</b>r<br />
Recomiendo PicKit 2 en ebay. Cualquier versión china sirve. Pero tendrá lo bueno y lo malo de ser chino.<br />
Será una copia del original que fabrica microchip, pero mucho más barato. Si dispones de amplio margen presupuestario, cómprate el original. Viene con garantía. Pero no nos precipitemos. Antes de comprar nada, hay muchos términos que debéis conocer. Como por ejemplo, lo que es "debug en circuito". Es algo que explicaré en el futuro.<br />
<br />
<b>El proyecto</b><br />
<b><span class="Apple-style-span" style="font-weight: normal;">Comenzad con un proyecto sencillo. Hacer parpadear un led, hacer un juego de luces con varios led, etc.</span></b><br />
<b><br />
</b><br />
<b>El PIC</b><br />
Una vez que tenemos claro lo que queremos hacer, hay que elegir el pic. Para empezar yo utilizaría el PIC 16F84A. Es el que os comente antes. Y para cosas sencillas teneis para una temporada. No lo mencioné porque no quiero alargar mucho el post. Pero veremos que los PIC tienen una memoria Flash que permite reprogramarlos muchas veces con distintos programas. Y el programa es un fichero hexadecimal que podemos guardar en nuestro PC. De manera que el trabajo que hayamos hecho, nos puede servir en el futuro.<br />
<br />
<b>La información</b><br />
La información más técnica y concreta sacadla de microchip.com si vuestro nivel de inglés lo permite. No suelen equivocarse. Sino recurrid a la comunidad en vuestro motor de búsqueda preferido. Hay mucha información y tutoriales.<br />
<br />
Para terminar, os comento que hace tiempo que alguien se dió cuenta de lo tedioso que es programar en ensamblador y lo difícil que resulta hacer código reutilizable. Por eso, existe la opción de programar los PIC en lenguaje C. Es una adaptación del C tracidional. Pero los que tengáis conocimientos de C, no encontraréis problema alguno. Lo malo es que el compilador CCS es de pago, y muy caro.<br />
<br />
Creo que para introducirnos en el mundo, por hoy es suficiente.<br />
<br />
Un saludo.<br />
<br />
<i>MarcosR. </i>Unknownnoreply@blogger.com0FR-1, 33750 El Franco, España43.518618011457143 -6.837830543518066443.515739511457141 -6.8427660435180666 43.521496511457144 -6.8328950435180662tag:blogger.com,1999:blog-8756742570957526715.post-77659957543067224922011-10-29T22:49:00.003+02:002011-11-02T19:56:36.146+01:00Flasheo de impresora Samsung ML-1660<div class="separator" style="clear: both; text-align: center;"><a href="http://desmond.imageshack.us/Himg824/scaled.php?server=824&filename=ml1660.jpg&res=medium" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://desmond.imageshack.us/Himg824/scaled.php?server=824&filename=ml1660.jpg&res=medium" /></a></div><div><br />
</div><div><br />
</div>Hace aproximadamente un año, decidí invertir la mitad de mi fortuna en una impresora que a primera vista me pareció una opción rentable para imprimir mis apuntes de la facultad. Por algo menos de 50€ me compré una Samsung ML-1660. Es una impresora Láser monocromo. Es una buena opción si quieres imprimir un gran volumen de páginas y no te importa mucho la calidad. Estaba muy contento con ella hasta que un triste día, después de estar un par de semanas sin utilizarla me encuentro con que se ha agotado el toner.<br />
<div><br />
<div><div>Ésto que os voy a contar es algo que sucede muy a menudo en las impresoras modernas. Para aquellos que no lo sepan, os diré que la mayoría de las impresoras actuales cuentan con una solución trollware (un circuitín) que avisa a la impresora de que se ha agotado la tinta/toner. Lo llamo trollware porque la mayoría de las veces, el chip avisa de que no queda tinta, pero ésto no es verdad (comprobado). De ésta manera, muchas veces tiramos cartuchos a media carga, porque no hay manera de obligar a la impresora a que imprima de todas maneras. Entonces un servidor se tiene que gastar la otra mitad de su fortuna en un tóner nuevo.</div><div><br />
</div><div>Ésto no es todo. Existe en el mercado una opción alternativa a comprar cartuchos nuevos. Se puede comprar la tinta, o el polvo de toner muy barato en ebay. Pero con el <strike>jodido</strike> chip <strike>de las pelotas</strike> que os comentaba, aunque recargues el toner, la impresora cree que esta agotado. </div><div><br />
</div><div>Rebuscando <strike>cinco minutos</strike> por la red he encontrado una solución<b> solo para ésta impresora</b>. Existe un software que en cuestión de 3 segundos inhibe este sistema. Solo hay que seguir unos sencillos pasos. Antes de nada, quiero advertiros que cuando yo lo hice, no tenia el controlador de la impresora instalado en el PC, estaba utilizando W7 32bits y por supuesto, ya había "terminado" el toner. También quiero deciros, que si bien yo no tuve ningún problema, todo flasheo conlleva ciertos riesgos. Es importante no desenchufar ni apagar la impresora hasta que el proceso termine. Y con todo ésto, no me hago responsable de cualquier inconveniente.</div><div><br />
</div><div>Ahora veamos el proceso a seguir:</div><div><ul><li><b>Antes </b>de conectar la impresora al PC y a la corriente, sacar el toner y tapar el circuito alojado en la parte derecha del mismo con un trocito de celo, cinta aislante o similar. No hagáis una bola de celo ahí, sed curiosos, y no utilicéis ninguna cinta rara que pueda conducir la electricidad (no seríais los primeros). El aspecto del chip asesino es una plaquita verde con cuatro pistas de cobre a modo de conexión. No tiene perdida. Después volved a colocar el toner bien en su sitio. Ahora la impresora debería estar exactamente igual que antes, pero con el chip del toner tapado. Ed. sin conexión.</li>
</ul><ul><li>Extraed los ficheros que os descargaréis haciendo <a href="http://www.mediafire.com/?17rr45x77du1ac9">click aquí</a>. Dentro deberían aparecer 2 carpetas. Y las instrucciones que yo seguí. Si queréis podéis echarle un vistazo. Abrid la carpeta "V30" y dentro veréis 1 fichero con extensión .fls y un ejecutable.</li>
</ul><ul><li>Conectad la impresora a la red, encendedla y conectadla al PC.</li>
</ul><ul><li>Cuando este reconocida por el mismo, arrastrad 1665-30.fls sobre el ejecutable.</li>
</ul><ul><li>Ahora la impresora debería comenzar a parpadear, luego el led se pondrá naranja y acto seguido verde. Voilá. Vuestra impresora esta flasheada y podréis rellenar vuestro tóner las veces que queráis.</li>
</ul>Si algo falla, hay varias opciones.</div><div><br />
</div><div>La primera es que seáis tan despistados como yo, y el led esté en rojo avisándonos de que no queda papel en la bandeja. Poned un par de hojas y esperad a ver si cambia a verde. Según he leido, cuando el flasheo no funciona, el led indicador se queda parpadeando. Dejadla 5 minutos. Si entonces no ha dejado de funcionar, apagadla y seguid leyendo.</div><div><br />
</div><div>La segunda opción es que hayáis hecho mal algo de lo anterior. Volved a hacerlo todo de nuevo comprobando que el chip esté bien tapado y no haya conexión.</div><div><br />
</div><div>La tercera opción es que la impresora sea de una versión posterior a la fecha en la que se hizo el programa de flasheo o el firmware v30. Para intentar solucionarlo, probad a repetir todos los pasos pero con el otro firmware. Es decir, en lugar de hacer utilizar el contenido de la carpeta V30, probad con el de la carpeta V82.</div><div><br />
</div><div>Si tras haber hecho todo lo anterior no funciona, siento deciros que tendréis que pagar por un nuevo toner, o seguir buscando en la red. </div></div></div><div><br />
</div><div>Para los que os haya funcionado, deciros que enhorabuena, y que como véis, compartir es la clave ;)</div><div><br />
</div><div>Un saludo.</div><div><br />
</div><div><i>MarcosR.</i></div>Unknownnoreply@blogger.com1FR-1, 33750 El Franco, España43.518306809754804 -6.838045120239257843.506792309754807 -6.8577861202392576 43.5298213097548 -6.818304120239258tag:blogger.com,1999:blog-8756742570957526715.post-61712620614373135002011-06-17T18:11:00.001+02:002011-11-02T19:57:41.735+01:00El sistema operativo<div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/-6McphQUT-y8/Tft8bkVsNbI/AAAAAAAAAAQ/x5fn5v207pY/s1600/Pantallazo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://4.bp.blogspot.com/-6McphQUT-y8/Tft8bkVsNbI/AAAAAAAAAAQ/x5fn5v207pY/s320/Pantallazo.png" width="320" /></a></div><div><br />
</div>A raíz de las la cantidad de preguntas que recibo respecto a éste tema, he decidido hacer una pequeña recopilación de sistemas operativos, hablando brevemente de ellos.<br />
<div><br />
</div><div>Empecemos por el principio. <b>¿Qué es un sistema operativo?</b> Según wikipedia, "Un sistema operativo (SO) es el programa o conjunto de programas que efectúan la gestión de los procesos básicos de un sistema informático, y permite la normal ejecución del resto de las operaciones.".</div><div><br />
</div><div>Bien. En el momento en que pulsamos el botón de encender de nuestro nuevo ordenador último modelo recién adquirido, ocurren una serie de eventos de carácter informático. Uno de ellos es la carga y puesta en funcionamiento del susodicho "sistema operativo". Éste sistema nos proporciona una interfaz entre la máquina y nosotros y se encarga de miles de cosas que un usuario convencional da por hechas. Como por ejemplo el hecho de mover nuestro ratón y que ese movimiento se vea reflejado en la pantalla, o guardar una foto en nuestro disco duro, y posteriormente facilitarnos la forma de acceder a la misma de manera mas o menos sencilla. Todo ello sin que nosotros nos tengamos que preocupar de nada.</div><div><br />
</div><div>En el mercado existe una amplia gama de SO's. Nos vamos a ceñir a los sistemas operativos de interfaz gráfica. Personalmente me gusta dividirlos en primer lugar por su carácter económico, como:</div><div><ul><li>Sistemas operativos privativos o de pago.</li>
<li>Sistemas operativos libres o de distribución gratuita.</li>
</ul><div><b>Sistemas operativos de pago</b></div><div><br />
</div>Los sistemas operativos de pago mas famosos son Windows en todas sus versiones, y MacOS.</div><div><br />
</div><div>El primero es de la compañía Microsoft. Fue uno de los primeros sistemas operativos gráficos del mercado. Actualmente se encuentra en su versión "Seven" o "siete" o "7". Está basado en el sistema operativo DOS (Disk Operating System) y es el sistema mas extendido en el mundo actualmente. Ésto es debido a su fuerte monopolio en años pasados, y su sencillez.</div><div><br />
</div><div>En cuanto a MacOS, es un sistema desarrollado por la compañía Apple y basado en el sistema UNIX. Orientado principalmente a los PC's de la marca Apple. Su última verisión por estas fechas es "OS X" o "OS diez" o "OS 10".</div><div><br />
</div><div>La mayoría de las aplicaciones de ambos es de pago. </div><div><br />
</div><div><b>Sistemas Operativos Libres</b></div><div><br />
</div><div>La alternativa a ésta clase de SO's son los sistemas libres. Principalmente Linux en cualquiera de sus distribuciones. Algunas de las mas famosas: "Ubuntu, Kubuntu, Suse, Arch, Fedora, Red Hat...". </div><div><br />
</div><div><b>Gratis...Gratis?</b></div><div><br />
</div><div><b></b>Si, totalmente. Si deseas adquirir un sistema operativo de los anteriores no tienes mas que "googlear" e ir a la página principal de la distribución. En algún lugar encontraras la opción de descarga. En el caso de ubuntu, te descargas una ISO. Cuando termina la descarga, solo tienes que grabarla en un CD-R y listo para arrancar el ordenador con él. Además te da la opcion de probarlo sin modificar el equipo. Para hacerse una idea de lo que acabas de descargar. </div><div><br />
</div><div>Yo personalmente utilizo dos sistemas operativos. Windows 7 y Ubuntu Linux. Ambos alojados en el mismo disco duro, y con una partición de datos compartida. Algunos os preguntaréis por que utilizar Linux. Bueno este tema tiene bastante controversia. El principal motivo es su seguridad. Con Linux, el riesgo de perder datos por causa de virus es practicamente nulo. Además, entre nosotros, adquirir programas en sistemas operativos de pago es un dolor de bolsillo, o un delito. :P En cambio todas las aplicaciones para linux son gratuitas y te permite descargarlas de forma sencilla mediante un "centro de software".</div><div><br />
</div><div><b>¿Si linux es tan maravilloso, por que utilizas windows también?¿intentas timarme?</b></div><div><br />
</div><div><b></b>Al margen de las posibilidades de unos y otros sistemas operativos, un desarrollador de software tiene que estar familiarizado con todas las plataformas posibles. Un programa generalmente se desarrolla de manera distinta, para windows que para linux (exceptuando el desarrollo en Java y demás código interpretado). Además en linux no son todo maravillas y aún hay controladores y periféricos que no funcionan del todo bien. También hay programas de uso muy específico que no se pueden encontrar para Linux, o bien que la alternativa libre no cumple con las necesidades del usuario.</div><div><br />
</div><div><b>La gran desventaja de linux</b></div><div><b><br />
</b></div><div>Para un usuario normal, con conocimientos básicos de informática, las tareas de configuracion del equipo pueden resultar muy complicadas. Cuando comencé a utilizar Ubuntu, no estaba acostumbrado a manejar la consola de comandos, ni a editar ficheros de configuracion. Gran parte de la configuración de linux se basa en modificar un fichero de texto almacenado en una ruta concreta del disco duro. No es algo que solo puedan hacer los iluminados y los ciborgs, pero es algo poco común hasta el momento.</div><div><br />
</div><div><br />
</div><div>En resúmen:</div><div><ul><li>Si tienes un Mac, lo mas razonable es MacOS.</li>
<li>Si tus conocimientos de informática son básicos, utiliza Windows.</li>
<li>Si eres un usuario con conocimientos amplios de informática y no conoces linux, te animo a que lo pruebes. No te dejará indiferente.</li>
</ul><div>En futuras publicaciones os enseñaré la forma de instalar un Sistema Operativo.</div></div><div><br />
</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8756742570957526715.post-25604476446684434902011-06-17T16:45:00.000+02:002011-06-17T16:45:26.813+02:00Probando...<div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/-C-q7gE-0_eg/TftoHfe5rtI/AAAAAAAAAAM/y_GoloOCpP4/s1600/P291209_00.24.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="http://4.bp.blogspot.com/-C-q7gE-0_eg/TftoHfe5rtI/AAAAAAAAAAM/y_GoloOCpP4/s320/P291209_00.24.jpg" width="320" /></a></div><br />
<br />
En fin. Sin mas mediaciones les presentamos el blog definitivo en lo que se refiere al mundo de la informática y las telecomunicaciones.<br />
<br />
Mi nombre es Marcos Rodríguez. Técnico Superior en desarrollo de aplicaciones informáticas, y Graduado en Ingeniería del Software en trámites. De nacionalidad Española, y sobre todo Asturiana. Mi intención es transmitir mis conocimientos a todos los amantes de la informática y la electrónica. A menudo dispongo de poco tiempo para estos menesteres. Pero uno de mis principales objetivos es encontrar una dinámica de contenidos constante en el tiempo que me permita sobrevivir sin quedarme calvo de extress, y sin que la mayoría de vosotros, amados lectores, me mandéis a hacer puñetas por vago.<br />
<br />
Se hablará aquí de temas como la programación en Java, C++, CSharp, VB, Assembler, algo de html, css, desarrollo web en general... Todo lo que nos encontramos cada día tras pulsar el botón de encendido de nuestra PC.<br />
<br />
Por el momento, nada más. Se aceptan todo tipo de sugerencias y críticas constructivas. Las amenazas, que sean por correo convencional...<br />
<br />
Un saludo, M.RGZ.Unknownnoreply@blogger.com0