martes, 30 de agosto de 2016

El bloc de Wemento. Capítulo 5 - Holg


Hola a todos. Vuelvo tras cierto tiempo sin publicar nada para traer un nuevo episodio de mi serie «El bloc de Wemento», concretamente el quinto.

Esta vez os traigo un dibujo friki: un personaje de mi saga fantástica «Nik». Como sabréis los lectores habituales, se trata de una saga que estoy desarrollando a través de un cómic, un videojuego y (¡atención!) próximamente un libro. Además de numerosas ilustraciones con desarrollo textual para recoger cada uno de los detalles de "La Región", el universo fantástico que engloba a esta saga.

Para este dibujo he empleado un portaminas de 0'3mm de mina dura 2H para el boceto inicial. Una vez definidas las líneas base empleé un portaminas de 0'5mm así como un lápiz, ambos de mina blanda 2B. De esta forma queda definida la figura principal sin borrarse al usar las acuarelas.

Acto seguido, toca dar color por medio de las acuarelas Van Gogh. Concretamente he empleado los colores "gris de Payne" para el cuerpo, "verde esmeralda" para los pantalones, "tierra sombra tostada" para la cuerda y "amarillo azo medio" para los ojos. He prescindido de utilizar colores mezclados por dos sencillas razones: la primera, que los colores típicos de este personaje son aproximadamente los que empleo en el vídeo (razón por la cual elegí hacer al Holg); y la segunda, que así puedo reducir el tiempo de dibujado y no conseguir un vídeo tan largo (aunque a velocidad 8x apenas se notaría la diferencia).

Tras el coloreado, vuelvo a repasar las líneas con los mismos lápices para que recuperen la fuerza que perdieron con el agua de las acuarelas. Decido emplear siempre esta técnica porque posteriormente plasmo el dibujo sobre una hoja de pergamino. De esta forma se obtiene un aspecto más "antiguo" que si empleara tinta, aunque tampoco intento reproducir fielmente las técnicas medievales de pictorización, sino más bien encontrar un nuevo estilo propio.

Y bueno, creo que no tengo nada más que decir. Espero que os guste el vídeo. Desgraciadamente olvidé firmar el dibujo, pero de todos modos tenéis el resultado final en mi perfil de DeviantArt, donde podréis ver que efectivamente lleva mi firma, aunque la hiciera "off air" :).

Eso es todo.

Salu2.



miércoles, 6 de abril de 2016

Fabricando un adaptador para jugar a la N64


Hola, buenas a todos.

Hoy vengo con otra entrada electrónica. Esta vez un proyecto más avanzado, que comparto con vosotros por si os sirviera.

¿Quién no ha jugado alguna vez a la Nintendo 64 y ha sufrido con ese mando tan anti-anatómico? O simplemente, ¿quién no ha perdido los nervios con ese joystick tan malo? Existen múltiples soluciones: jugar a la N64 en un emulador, comprar un joystick "estilo Gamecube" o, la más creativa de todas, construirnos un adaptador para poder jugar a nuestra N64 con los mandos de GC.

Empecemos...

Necesitaremos los siguientes componentes:

  • Un microcontrolador PIC16F84A, de Microchip. Se trata de un microcontrolador muy común, de la gama media, que trabaja en 8 bits.
  • Un cristal de 20MHz.
  • Dos condensadores cerámicos de 22 pF.
  • Un condensador electrolítico de 0'1 µF.
  • Una resistencia de 1K.
  • Cables.
  • Extensores de cable de Nintendo64 y Gamecube. *
  • Programador de PICs. *
(Los elementos marcados con * son opcionales, aunque simplifican el trabajo y dan mejor resultado).

Dicho esto, vamos a detallar el proceso.


PASO 1: Programar el PIC.

Lo primero que debemos hacer es programar nuestro PIC de modo que podamos traducir el protocolo típico de Gamecube al de Nintendo 64, buscando una cierta equivalencia entre los botones (el A deberá ser el A, el B deberá ser el B, el joystick C deberá poder emular los botones C, etc.).

Para ello se ha programado esta traducción en lenguaje ensamblador. Una vez compilado el fichero con el programa, nos brinda el archivo .hex que necesitamos. Tan sólo hay que transferirlo al microcontrolador.

Para ello existen varias posibilidades: utilizar un programador de PICs (opción que aconsejo) o construirnos uno sobre la marcha. Hablaré sobre la primera opción, que os será de mayor utilidad a muchos. De la segunda poco puedo deciros, pero buscad en la red pues las fuentes son muy numerosas (podemos construir un programador de PICs empleando Arduino, construyendo nosotros mismos la placa programadora, o utilizando simplemente cables con el circuito adecuado).

Vamos con la opción del programador comercial. En mi caso adquirí un programador «K150» de "marca blanca" por así decirlo. Es una opción muy económica además de práctica. Aquí os dejo una review del programador.

Instalamos primero los drivers del programador. Conectamos el microcontrolador y le transferimos el fichero .hex (aconsejo ver el vídeo pues también tiene parte de tutorial). Y listo, con esto ya estará hecho este primer paso.




PASO 2: Construir el circuito

Una vez programado el micro, vamos a construir el circuito que podemos ver en la siguiente figura:


El condensador C3 que vemos es el condensador electrolítico, empleado para reducir los picos en la alimentación. Ni que decir que el terminal negativo es el que irá conectado a tierra, ¿no?...

Bueno y algunos comentarios sobre el circuito:
  • Corta en dos los extensores de mando y quédate con la mitad que tenga el conector macho (en el caso de la N64) y el hembra (en el caso de la GC). Pela el otro extremo de modo que puedas acceder a los cables que hay dentro. No respondo ante los colores que puedan tener esos cables, pues en función del fabricante pueden tener una forma u otra. Os recomiendo que comprobéis con el multímetro a qué número de pin corresponde cada cable (según la numeración del esquemático que os he dado).
  • El pin #1 de Gamecube puede ser alimentado a 5V (se necesitará una fuente externa) para poder contar con vibración. Todos aquellos juegos que usaran el Rumble Pack, emularán la vibración del mismo en nuestro mando de GC. Yo personalmente no lo he conectado, usando sólamente los 3'3V de alimentación que nos da el propio cable de N64.
  • Al pelar el cable de Gamecube veréis que únicamente aparecen 5 cablecitos. No os preocupéis, no se os ha ido la mano. Es que el pin #5, como podéis ver, no va conectado a nada.
  • Como dije, no necesitáis alimentar de manera externa con 3'3V vuestro circuito. De esto se encarga el pin #1 de N64, que nos dará 3'3V extraídos desde la propia consola (¡los mandos no tienen baterías, ¿de dónde sino iba a salir esa alimentación?!).
Y con esto estará ya todo listo. Nos queda el último paso...


PASO 3: Probarlo

Conectamos nuestro mando de Gamecube al conector hembra y nuestro conector macho a la consola N64. Asegurad antes que no se cortocircuite nada, pues cualquier corto podría dañar vuestra consola, que ya de por sí es una joyita.

Y ya está. Probad un juego y veréis cómo funciona. Si tenéis algún problema con un botón (por ejemplo, que no os guste la traducción empleada), podéis seguir el siguiente proceso:
  1. Con el juego encendido, presionamos los botones L y R sin llegar al fin del recorrido (al máximo que podamos sin oír el «click»). Los mantendremos pulsados hasta que os diga.
  2. Sin dejar de pulsarlos, presionamos START.
  3. A continuación pulsamos el botón cuya función deseamos transferir.
  4. Y por último, presionamos el botón que deseamos que reciba la función del anterior.
  5. Soltamos L y R.
Esta configuración se quedará guardada en el micro aunque apaguemos la consola.

Si haciendo esto nos equivocamos o nos quedamos sin botones disponibles, hay vuelta atrás. Para volver a la configuración inicial, usamos el siguiente proceso:
  1. Con el juego encendido, mantenemos presionados los botones L y R sin llegar hasta el «click».
  2. Presionamos Z.
  3. Soltamos L y R.
En ambos casos (tanto para intercambiar funciones como para reiniciar configuración), nuestro mando vibrará ligeramente si hemos conectado el motor, pin #1, a 5V. Es una confirmación de que ha recibido el comando, no os asustéis.


Y nada más. Si sois lo suficientemente TOP os recomiendo diseñar una PCB para dejar el montaje fijo. Yo personalmente lo he hecho, aquí tenéis el resultado.



Y nada más, como siempre gracias por vuestro tiempo.

Salu2

viernes, 18 de marzo de 2016

Comunicación inalámbrica Bluetooth usando el chip HC-05


Buenas a todos.

Os traigo otro tutorial para Arduino. En este caso vamos a conectar dos módulos inalámbricos Bluetooth. Se trata de los chips HC-05 (muy parecidos a los HC-06 aunque con diferente configuración de pines). Se pueden comprar por algo menos de 3€/módulo y vienen dotados de un microcontrolador que facilita en gran medida la interacción con este chip (poniendo por medio cierto nivel de abstracción).

Buscando por internet he visto que no existe mucha bibliografía acerca de cómo comunicar dos módulos. La mayoría de las fuentes indican cómo conectar HC-05 con un móvil Android o con el PC. De modo que aquí vamos a profundizar un poco más.

Así que venga,  vamos a entrar en detalle.

Para probar la conexión vamos a emplear los siguientes elementos:

  • Dos placas Arduino. En este caso se empleará un Arduino UNO y un MEGA 2560.
  • Dos módulos HC-05.
  • Una resistencia de 10K y otra de 120 ohmios.
  • Un LED.
  • Un pulsador.
  • Cables (tanto macho-macho como macho-hembra).

Vamos a trabajar con un ejemplo simple. Uno de los dos Arduinos se conectará al módulo HC-05 configurado como maestro, mientras que el otro lo hará al esclavo. Al presionar el pulsador conectado al Arduino que porta al maestro, se encenderá el LED conectado al Arduino que porta al esclavo. De esta forma, estaremos activando un LED de forma inalámbrica. Este sencillo ejemplo será la base para efectuar cualquier comunicación Bluetooth que deseemos, ya sea tanto para enviar cadenas de texto simple como para enviar imágenes.


1. Configuración del HC-05 mediante comandos AT

En primer lugar se debe configurar el módulo Bluetooth. Para ello haremos uso de los comandos AT. En la siguiente figura podemos ver el pinout del HC-05. Para aquellos que empleéis el HC-06, simplemente tened en cuenta que no dispondréis de los pines STATE y EN como podéis ver. Yo recomiendo emplear el HC-05, pues aporta más información y permite disponer del modo de configuración de una forma más cómoda.


En este tutorial usaremos el módulo HC-05. Como podemos ver, cuenta con un botón que en el HC-06 no existe. Esto es lo que nos permitirá acceder al modo de comandos AT.

Ahora ten cuidado. Pues aunque veas tu módulo HC-05 idéntico al de la fotografía, puede no serlo. Me explico: el firmware del microcontrolador depende del fabricante y existe una gran variabilidad entre ellos. Por lo que los pasos que se siguen en este tutorial pueden no valer al pie de la letra. Pero teniendo cuidado con estas variaciones, podremos conectar sin problemas nuestros módulos HC-05.

No obstante, yo intentaré aportar mi experiencia personal, para resolver el mayor número de casos posibles.

Bueno, seguimos por donde íbamos. Es hora de conectar nuestros módulos HC-05 a Arduino para darles alimentación. El esquema a seguir es el siguiente:


Conectaremos en primer lugar un módulo Bluetooth y posteriormente lo desconectaremos y conectaremos el otro. Así no nos complicamos conectando los dos Arduinos.

Bueno, aquí viene el quebradero de cabeza. En los HC-05 "oficiales" debemos conectar todos los pines a excepción de VCC. Una vez hecho esto, mantenemos presionado el pulsador de nuestro módulo y conectamos el cable rojo, de modo que al arrancar el microcontrolador con el botón presionado, entraremos en el modo de comandos AT. Este estado se reconoce porque el LED del HC-05 parpadea a un ritmo más lento.

Puede darse el caso, como me sucedió a mí, que no se tenga que seguir este protocolo para entrar en el modo comandos. En mi caso concreto, conecto el módulo HC al completo tal cual (sin presionar el botón). Y una vez parpadea frenéticamente (el parpadeo que indica búsqueda de dispositivos) presiono el botón, apenas un segundo. No obtengo respuesta visual alguna por parte del hardware, pero al introducir comandos, éstos comienzan a actuar.

Sea como sea, se ha desarrollado el siguiente código, que podemos emplear tanto para un caso como para otro:

#include <SoftwareSerial.h> //Librería para comunicación con HC
SoftwareSerial BTserial(10,11); // 10: RX | 11: TX

char c = ' '; //Caracter empleado para la comunicación serie
              //entre Arduino y HC
 
void setup() {
    Serial.begin(9600); //Puerto serie para interactuar
    Serial.println("Arduino - OK!");
    BTserial.begin(9600); //Puerto serie emulado para HC
    Serial.println("BTserial - OK!"); 
}
 
void loop(){

  //Si existe algún dato disponible en el módulo HC para
  //pasarlo a Arduino...
    if (BTserial.available()){
        c = BTserial.read(); //Lee ese dato
        Serial.write(c); //Y lo escribe para verlo en el monitor
    }

    //Si existe algún dato disponible escrito por el usuario...
    if (Serial.available()){
        c =  Serial.read(); //Se lee el dato
        Serial.write(c); //Se escribe en el monitor (feedback)
        BTserial.write(c); //Y se envía al HC
    }
}


Tras cargar este programa en Arduino y teniendo en cuenta la forma que tenga nuestro módulo de darnos acceso a su modo comando, podremos escribir en la consola los comandos necesarios.

Si pincháis aquí tendréis acceso a una lista de todos los comandos AT en PDF, con sus posibles valores y las respuestas esperadas. Recomiendo que le echéis un vistazo. De todos modos, nosotros vamos a describir brevemente los comandos que deberemos usar.

Para introducir todos los comandos usaremos el monitor serie del Arduino que esté ejecutando el código. Para ello deberemos seleccionar la opción «Ambos NL & CR» como indica la figura. NOTA: podemos probar que realmente estamos en el modo comando escribiendo en la consola el comando "AT" (sin las comillas). De esta forma el HC-05 nos devolverá la señal "OK" como verificación.



Haremos la configuración en el siguiente orden: el primer HC-05 conectado será el esclavo, mientras que el segundo será el maestro:
  • Para el caso del esclavo realizaremos los siguientes ajustes:
  1. Introduciremos el comando AT+NAME=ESCLAVO y presionaremos la tecla INTRO. Con esto fijaremos el nombre a "ESCLAVO". Podemos comprobar esto simplemente escribiendo AT+NAME? en el monitor serial. En el caso de algunos módulos HC-05, no se obtiene respuesta para este último comando. Si es vuestro caso, no os preocupéis.
  2. Introduciremos el comando AT+ROLE? para asegurarnos de que nuestro módulo actúa en modo esclavo. Deberá devolvernos el valor 0.
  3. Introduciremos el comando AT+ADDR? para obtener la dirección MAC del esclavo. Es importante que anotemos esta dirección, ya que la usaremos posteriormente.


  • Para el caso del maestro realizaremos los siguientes ajustes:
  1. Introduciremos el comando AT+NAME=MAESTRO.
  2. Introduciremos el comando AT+ROLE=1 para que actúe como maestro.
  3. Introduciremos el comando AT+CMODE=0 para que se nos permita conectarnos a una MAC específica, en lugar de buscar. Podemos comprobar que se ha escrito introduciendo AT+CMODE?.
  4. Introducimos el comando AT+BIND=, donde será la MAC que anotamos del esclavo, empleando las comas como separador y las mayúsculas. Por ejemplo, si obtuvimos la MAC 2016:1:64e5a, introduciremos el comando AT+BIND=2016,1,64E5A en el monitor serial.


Una vez ajustados ambos módulos procedemos a su desconexión.



2. Conexión entre ambos módulos HC-05

A continuación vamos a proceder a montar el circuito definitivo. Seguiremos el esquema de la siguiente figura:


Y cargaremos los siguientes códigos en el Arduino MEGA (con el HC-05 maestro) y el Arduino UNO (con el HC-05 esclavo):

Código para el maestro:
#include <SoftwareSerial.h>

// Se conecta un pulsador al PIN 3. El MAESTRO envía el estado del botón al ESCLAVO.

SoftwareSerial BTSerial(10,11); //RX, TX

char estadoPulsador = '0';

void setup() {
  Serial.begin(9600);
  BTSerial.begin(9600); //Se inicializa comunicación BT a 9600

  pinMode(3,INPUT);
}



void loop() {
  estadoPulsador = (digitalRead(3)==HIGH) ? '1': '0';

  BTSerial.write(estadoPulsador);

  delay(100);

}

Código para el esclavo:
#include <SoftwareSerial.h>
#define PINLED 13

// Se conecta un LED al PIN 13. El ESCLAVO recibe el estado del botón del MAESTRO y enciende/apaga el LED

SoftwareSerial BTSerial(10,11); //RX,TX

char estadoLED = '0';

void setup() {
  pinMode(PINLED, OUTPUT);
  digitalWrite(PINLED, LOW);
  Serial.begin(9600);
  BTSerial.begin(9600);
}

void loop() {
  if(BTSerial.available() > 0)
    estadoLED = BTSerial.read();

  if(estadoLED == '0')
    digitalWrite(PINLED, LOW);
  else
    digitalWrite(PINLED,HIGH);

}

Una vez hecho esto, al iniciar ambos programas veremos cómo el LED de ambos HC-05 deja de parpadear frenéticamente para emitir un parpadeo más lento, estando los dos prácticamente sincronizados en el tiempo. Esto quiere decir que nuestros dispositivos están ahora conectados. Si presionamos el botón podremos ver cómo el LED se enciende mientras lo mantengamos.

Como os decía, ésta es la base para comunicar dos dispositivos por medio de Bluetooth. Estamos jugando con un caracter que se envía y, en función de su valor, determinará si nuestro Arduino UNO debe encender o no el LED. Igualmente podremos enviar otro tipo de caracteres, como podrían ser los caracteres de una cadena para intercambiar mensajes, los bytes de una imagen para reconstruirla en el Arduino receptor, etc.

Espero que os haya servido el tutorial. Y espero no haber pasado nada por alto. Si es así, editaré la entrada hasta que consiga reunir toda la información posible. Cualquier duda me podéis preguntar por comentarios o a través de wemento@gmail.com.

Gracias por vuestro tiempo.

Salu2


domingo, 31 de enero de 2016

Conociéndome a mí mismo


Buenas a todos. He estado desconectado estos días, por temas de fin de estudios y demás, así que no he podido felicitaros ni la navidad ni el año nuevo, pero bueno, os lo puedo felicitar ahora (más vale tarde que nunca).

He estado buscando trabajo desde entonces así que ahora mismo, mientras encuentro algo o no, estaré totalmente libre para dedicar tiempo a mis cosas. Y de eso mismo quería hablar hoy. He dedicado tiempo a dibujar, escribir, continuar con mis proyectos, etc. Pero lo que realmente quiero compartir en este post es una pequeña reflexión (¿o es un informe de mi estado actual?).

Como mencionaba, he tenido tiempo para dedicar a lo que me apeteciera. Y lo he dedicado a dar un poco de rienda suelta a la parte creativa de mi cerebro. Me he propuesto nuevos proyectos, entre ellos el desarrollo completo de mi saga «Nik», definiendo cada detalle del mundo que yo mismo creara hace unos años, para dar algo más de “chicha” a la serie; también he continuado con el juego, del que espero tengáis noticias nuevas muy pronto (aunque esta vez sí que no prometo nada, porque avanzar avanzaré, lo que dudo es si realmente querré publicar algo o, de lo contrario, esperar a más adelante); he llevado a cabo algunos proyectos de electrónica, de los que también me gustaría publicar algo; y he entrenado un poco al Smash (me confieso adicto).

Pero, además de provechoso, este tiempo ha sido revelador para mí. Me ha ayudado en gran medida a conocerme a mí mismo, como sucedía en ocasiones cuando me metía grandes periodos de “encerramiento” entre pecho y espalda durante la época de exámenes. Aunque, a diferencia del tiempo de estudio, he conocido a otra versión de mi propio yo, una que no había tenido el gusto de conocer hasta ahora. Concretamente he descubierto lo poderosa que puede llegar a ser esa faceta creativa que tengo encerrada dentro de mí, bajo la llave del deber y la obligación. Una faceta que, en el fondo, puede definirse como infantil, en el sentido de que lo que fueran dos o tres dibujos aislados al mes, se convirtieron en una sucesión de ideas, una tras otra, empujándose en mi cabeza, deseosas de nacer; tal como sucedía cuando no era más que un niño, y el propio tiempo libre y la ausencia de preocupaciones fueran los que permitieran  que la maquinaria funcionara a toda castaña. Pero no sólo es lo asombroso del cómo se dispara mi mente con estos dos ingredientes, sino también el cuán sorprendente es mi inmunidad al aburrimiento. Esto parece una reflexión muy simple, pero en las líneas que vienen voy a profundizar un poco en ella, palabra

Vuelvo al tema de los convencionalismos sociales y el Sistema (sólo para basar un concepto, prometo no volver a ponerme pesado con esto). Más de uno conocerá la idea del aburrimiento. Pero no el aburrimiento banal que todos conocemos, sino el hecho de no sentirse realizado durante un periodo de desempleo. Todos tendremos a mano algún conocido que se ha tomado un año sabático alguna vez, o que conoce a alguien que sí lo ha hecho. Y todas esas personas coinciden en algo: «qué necesario es el trabajo», ¿verdad? No digo en absoluto que mientan, ni mucho menos. Pero yo he experimentado todo lo contrario a esta famosa sensación. No he terminado por aburrirme al cabo de cierto tiempo, sino más bien todo lo contrario. Habitualmente se cree que no es posible vivir sin el trabajo, que llegado a cierto punto, todo lo que antes era diversión se transforma en un tremendo sopor inaguantable. Y, en conclusión se deduce que no es posible vivir sin el trabajo, que necesitamos compaginarlo con nuestro tiempo libre para acabar encontrando un agradable equilibrio. Como os decía, tras mi periodo de descubrimiento (que ha sido de algo más de un mes) yo he descubierto que podría vivir toda una vida sin tener que trabajar y no acabaría cayendo en el aburrimiento.

¿Qué ocurre entonces? ¿Yo estoy por encima de los demás? ¿Soy el nuevo superhombre, fruto de millones de años de evolución, que puede vivir sin tener que estar pringando para el jefe? Pues no, claro que no. Buscando una respuesta para esta supuesta aptitud mía, llegué a la que yo considero que es la verdad del asunto, aunque no es más que una teoría. El génesis de este aburrimiento no es la falta de empleo, sino más bien la desocupación. Y con esto me vengo a referir al no contar con un quehacer que le haga a uno mismo sentirse realizado. Me explico. En mi caso he encontrado el arte como forma de realización. Doy rienda suelta a mi imaginación y creo cosas de la nada. No es que yo sea un pintor de órdago, pero es el hecho de poder crear algo lo que me hace estar entretenido. Si hubiera dedicado todo este tiempo exclusivamente a jugar a videojuegos o a salir por ahí, probablemente hubiera terminado cayendo. Pero dosificar estas dos cosas, repartiéndolas junto con el arte, la electrónica o la programación; es lo que me ha permitido estar entretenido. Con lo cual considero que es muy importante tener tiempo que dedicar a nosotros mismos, a dejar salir las ideas de nuestras cabezas. Sacad adelante algún proyecto personal, aunque no sea algo que podáis vender, entregar o compartir. Algo que os satisfaga por el mero hecho de hacerlo, y que a su vez sea algo que disfrutéis haciendo.

Por tanto, el mensaje de mi reflexión es: «conócete a ti mismo». Dedícate este tiempo. Terminarás descubriendo que verdaderamente podrías vivir sin problema toda una vida haciendo estas cosas. Y no me refiero a que dejéis el trabajo y os dediquéis a hacer esto, no. Obviamente es necesario trabajar, el dinero no nace de los árboles (por desgracia); pero por lo menos probadlo por el mero hecho de poder deciros a vosotros mismos con orgullo: «podría vivir así toda la vida».

Yo personalmente me alegro mucho de haberme conocido a mí mismo estos días. He llegado a un punto en el que estoy cruzando los dedos por no encontrar trabajo, ¡qué horror! Pero bueno, llegado el momento tendré que ser fuerte y elegir la supervivencia, ¿no?

Y saliendo un poco de esta reflexión aprovecho para hablaros un poco del artwork de mi saga «Nik». Como he comentado, me he propuesto desarrollar todos los aspectos de este mundo imaginario que yo mismo creé. Y todo con un toque artístico. Con lo cual he creado una serie de carpetas en mi cuenta en DeviantArt, en las cuales guardaré los dibujos según la categoría correspondiente. De modo que, a partir de ahora, todo el desarrollo podréis verlo en mi perfil de DA. Espero que os guste. Y espero poder seguir adelante con todas estas ideas que me rondan la cabeza. Es bastante divertido.


Salu2.


martes, 1 de septiembre de 2015

Monta tu propio Arduino en una protoboard


Hola, buenas a todos. Entramos en el segundo capítulo de mi nueva sección.

Hoy vamos a ver cómo podemos montar nuestro propio Arduino en una placa de prototipos (protoboard) siguiendo unos sencillos pasos. Este capítulo tiene la particularidad de que lo estoy escribiendo a medida que yo mismo realizo el proceso. De esta forma puedo entrar más en detalle en cada paso y no me voy dejando nada por el camino.

En primer lugar, además de vuestro Arduino (en este caso Arduino UNO), necesitaréis:
  • 2 condensadores de 22 pF.
  • 1 cristal de 16 MHz.
  • 1 condensador de 100 µF.
  • 1 resistencia de 10K.
  • Cables.
  • 1 microcontrolador ATMega 328P (también puede hacerse con otros modelos).
  • USB/Regulador de tensión/Transformador para la alimentación autónoma.
El proceso se divide en dos grandes partes: en primer lugar se carga el bootloader dentro del microcontrolador que queremos convertir en un Arduino y en segundo lugar, cargaremos el programa deseado a nuestro nuevo Arduino.

Para los que a estas alturas no entienden aún en qué consiste esto, resumo un poco lo que vamos a hacer: vamos a programar un ATMega 328P como el de la figura de forma que funcione de manera autónoma sin necesidad de estar integrado en una placa Arduino. De esta forma podremos hacer montajes más compactos y sobretodo más baratos (nos bastará con comprarnos el micro, que tan sólo vale unos euros, en lugar de comprar la placa Arduino que puede acabar siendo más costosa). A esto lo hemos llamado “montar nuestro propio Arduino”, pero tranquilos, no vamos a montarnos una placa Arduino entera, vamos a lo mínimo para que el micro pueda funcionar de manera autónoma.

ATMega328P

Vamos con los diferentes pasos del proceso.
  1. Programar Arduino UNO como ISP. En primer lugar hay que programar nuestro viejo Arduino UNO para que él mismo sea capaz de programar el ATMega 328. Para ello, en el entorno de desarrollo Arduino haremos click en Archivo > Ejemplos > ArduinoISP. De esta forma se nos abrirá automáticamente el código para lograr que Arduino funcione como un ISP (programador integrado, del inglés in-System Program).

    image

    Una vez contemos con el código, le damos a cargar y programamos nuestro Arduino UNO con el ISP.

  2. Montamos el circuito para la carga del bootloader. Desconectamos nuestro Arduino UNO del PC  y montamos el circuito necesario para poder cargar el bootloader. Aquí os dejo el esquema de cómo debe quedar la protoboard:

    Bootloader_circuito

    La resistencia es la de 10K y los condensadores de 22 pF.

    Si nos fijamos en el código que habíamos cargado, en los comentarios del principio aparecían las instrucciones para el cableado, no obstante os he facilitado esta imagen para simplificar el montaje. En la figura aparece un ATMega 168, pero no temáis, tienen la misma disposición de pines y el circuito que se debe montar es el mismo.

    También es posible conectar al pin 7 del Arduino UNO un LED (antecedido por una resistencia de entre 330Ω y 1 K) y de esta forma podemos seguir de forma visual cómo va la programación. Pero bueno, esto es totalmente opcional y por eso no está incluido en el dibujo.

  3. Cargamos el bootloader. Una vez montado podemos conectar de nuevo nuestro Arduino UNO al PC. Ahora iremos de nuevo al entorno Arduino y haremos click en Herramientas > Programador > Arduino as ISP.

    image

    Y una vez hecho esto le daremos a Herramientas > Grabar Secuencia de Inicio. Y tocará esperar un minuto (el entorno nos lo indica en la barrita aguamarina de la parte inferior). También es posible, si usáis las versiones nuevas de Arduino IDE, que este último paso aparezca como Herramientas > Quemar Bootloader.

    Si os aparece un error de firma, seguid los pasos que se indican en el primer mensaje de este tema.

    Cuando concluya el proceso aparecerá el mensaje “Quemador de bootloader completado”, indicando que el bootloader ya ha sido cargado en el ATMega. Con esto habremos realizado la primera mitad del proceso, vamos ahora con la segunda mitad, consistente en cargar el propio programa en sí para que se quede instalado en nuestro ATMega.
       
  4. Programar el ATMega328P. Con el bootloader listo, desconectaremos nuestro Arduino UNO del PC y procederemos a extraer el ATMega328P que lleva dentro para sustituirlo por el nuestro. Esto sólo se podrá hacer en caso de que nuestro Arduino emplee este tipo de encapsulado en lugar del SMD. En la siguiente figura podemos ver la diferencia entre ambos encapsulados.

    SMDvsDIP

    Ya sé que esto resulta bastante obvio para la mayoría de los que llegáis a este post, pero intento hacer un tutorial lo más completo posible para aquellos que no han tenido tanto contacto con la electrónica. Bueno, seguimos…

    Tras insertar el micro, cargamos el nuevo código en la placa abriéndolo desde el propio IDE y subiéndolo a nuestro Arduino (vamos, como hemos hecho siempre para cargar programas). Yo he empleado un código que enciende y apaga atenuadamente un LED conectado al pin 9 (os dejo el código al final del post). Verificamos que el programa funcione y extraemos el micro desconectando previamente Arduino del PC. Con esto el chip ya se quedará programado. Podemos volver a insertar nuestro antiguo chip en el Arduino, no lo necesitaremos más.
       
  5. Realizar el montaje autónomo. Por último, sólo hay que preparar una protoboard (o breadboard) con los requisitos mínimos que necesita el micro para mantener su funcionamiento. El esquema mínimo a realizar se recoge en la siguiente figura:

    Montaje Basico ATMega


    Como vemos, sólo hay que mantener el cristal entre las patillas 9 y 10, la resistencia de pull-up para el RESET en el pin 1 y alimentarlo de forma externa. Existen numerosas formas de alimentarlo, quizás la más elegante en términos de montaje sea una batería (pila de 9V, por ejemplo), seguida de un regulador de tensión para bajar la tensión a 5V. Yo en mi caso, aunque cuento con reguladores LM317, voy a emplear un método más cutre pero más eficaz (no requiere estar cambiando pilas): un cargador USB como el de los smartphones, que pelado nos permite extraer 5V y tierra. Todo depende ya del uso que vayáis a darle a vuestro nuevo Arduino “autónomo”.

    Se emplee el método que se emplee se debe insertar un condensador de 100µF entre alimentación y tierra, lo más cerca posible del microcontrolador. De esta forma suavizaremos el voltaje continuo de entrada, evitando posibles picos que nos quemen el micro.

    Es opcional, sin embargo, mantener los condensadores de 22pF que instalamos previamente en la etapa de carga del bootloader. Se recomienda mantenerlos, aunque no habrá problema si deseamos eliminarlos del montaje.
       
  6. Realizar el montaje para nuestro circuito. Ahora hay que trabajar sobre el montaje anterior, añadiendo las partes de nuestro circuito. En mi caso, cuando mi programa corría sobre Arduino, debía conectar un LED en el pin 9 para lograr su intermitencia, por tanto eso es todo lo que hay que añadir al circuito previo. Pero MUY IMPORTANTE: El pin 9 de Arduino UNO no es equivalente al pin 9 en el ATMega 328P-PU. Para saber a qué pin del micro le corresponde el pin 9 de Arduino, tendremos que hacer una búsqueda en internet. De allí extraemos una figura como la que vemos a continuación:

    ATmega328_pinout

    Como podemos ver, el pin digital 9 de Arduino equivale a la patilla número 15 de nuestro micro. Será por tanto a la patilla 15 donde deberemos conectar nuestro LED, quedando el circuito mínimo de la siguiente forma:

    Montaje Completo ATMega

    Realizando este montaje es posible ver cómo nuestro nuevo Arduino casero mantiene su funcionamiento de manera autónoma.
Bueno, hasta aquí este tutorial. Os dejo también a continuación el código que empleé. Es algo simple puesto que va destinado a la iluminación de una maqueta, pero también podéis realizar montajes más complejos y comprobar que efectivamente también funcionan. Espero que esto os haya servido de ayuda y también espero no haberme dejado nada por el camino.

Código:

#define PINLED 9   //Pin donde estara el LED a atenuar
#define TIEMPO 9500000  //Tiempo de atenuacion en microseg.

//Funcion que implementa la atenuacion, ya sea creciente o decreciente
//t: tiempo de atenuacion en us, creciente = true -> de apagado a encendido, pin: numero de pin donde producir la atenuacion PWM
void atenuacion(double t, bool creciente, int pin){
 if (creciente){
  for (int j = 0; j <= 255; j++){
   analogWrite(pin, j);
   delayMicroseconds(t / 255);
  }
 }

 else{
  for (int j = 255; j >= 0; j--){
   analogWrite(pin, j);
   delayMicroseconds(t / 255);
  }
 }
}

void setup()
{
 pinMode(PINLED, OUTPUT);

}

void loop()
{
 atenuacion(TIEMPO, true, PINLED);
 delay(700);
 atenuacion(TIEMPO, false, PINLED);
 delay(3000);

}



Os dejo también este vídeo, que junto con la web de Arduino y el foro son las fuentes bibliográficas que he consultado:


Y nada más.

Salu2.

sábado, 15 de agosto de 2015

Reproducción de melodía con buzzer pasivo


Hola de nuevo. Después de tanto tiempo he vuelto a tener la osadía de asomar la cabeza por el blog, como prometí en su momento en la cuenta de twitter.

Todos estos días he estado ocupado –distraído, mejor dicho– con temas de universidad, trabajo, etcétera etcétera. Pero me complace mucho volver con la noticia de que estreno nueva sección. Como anuncié en su momento, adquirí por internet un pack de “aprendizaje” con la placa Arduino UNO. Pues bien, ha llovido desde entonces. Lo que parecía un caprichito pasajero se ha convertido en una inmersión total en el mundo de electrónica. Condensadores, resistencias, integrados, transistores, diodos, etc. Todo eso y más son las cosas que he comprado, víctima de mi nueva enfermedad: la adicción a la electrónica.

Prometí una serie de sketches de Arduino bastante simples, que en su momento pensaba que eran… ¿como decirlo? ¿Currados? No sé.

El caso es que desde aquel post he realizado gran cantidad de proyectos diferentes y de distintas magnitudes, por supuesto no tan simples como estos primeros. Es más, no únicamente he trabajado con Arduino. También trabajé con las placas MSP430 de Texas Instruments, Intel Galileo, Waspmote de Libelium, etc. Así que obviamente no publicaré los proyectos simples. Aunque de esa primera partida inicial sí que hay un proyecto que me gustaría compartir con vosotros. No sé si es por que estoy orgulloso de ello o porque al estar íntimamente relacionado con mi infancia Nintendero-gamer me despierta gran simpatía. El caso es que este podría decirse que fue, de los primeros, el proyecto más completo que hice. Todo en un único fichero .ino, pero empleando funciones y con una estructura plenamente desarrollada por mí. Y con un trabajillo de investigación detrás.

Os hablo de la reproducción de una melodía con un buzzer pasivo. La melodía en concreto es la de Pueblo Paleta de las versiones Amarillo, Rojo y Azul de Pokémon. Qué nostalgia.

Como muchos de vosotros sabréis, el buzzer pasivo consiste literalmente en un zumbador que, al recibir cierto nivel de tensión, emite un pitido. En este caso funciona bajo 5V, como la mayoría de accesorios que se conectan a Arduino. Pero, ¿cómo emitir melodías si este zumbador únicamente emite un pitido? La respuesta es sencilla: con simplemente producir el pitido a una frecuencia determinada es posible emitir una nota u otra.

Aquí entra el trabajo de investigación.

En primer lugar se investigan las diferentes notas existentes en la escala musical (se va a trabajar en clave de sol). Googleando un poco, se encuentran tablas como la que se muestra a continuación.

notasyfrecsbg

Basta con recordar el valor de frecuencia que corresponde a cada nota para poder reproducir la melodía.

Junto con esto, se busca una partitura con la melodía de Pallet Town, en este caso, para poder conocer todas las notas que la componen. Además se deberán tener en cuenta los silencios entre cada una de las notas.

Un error de novato que tuve al realizar el código fue emplear PWM para modular las notas. Mi intención era variar el ciclo de trabajo para lograr la diferente escala. Pero cuál fue mi sorpresa al probar el código y ver que lo único que variaba era la intensidad de las notas. IMPORTANTE: PWM varía el ciclo de trabajo, es decir, el porcentaje de tiempo de un determinado tiempo fijo que la señal se mantiene en alto. En ningún momento varía la frecuencia. De los errores se aprende, y esto mismo aprendí yo al intentar hacerlo de este modo.

Una vez solucionado esto, se puede ver que se hace necesaria la creación de una función encargada de generar la “vibración”. Para ello se ha diseñado la función reproducirNotas que podéis ver en el código a continuación. Esta función implementa el proceso de vibración. Únicamente se ha de especificar la nota a reproducir (mediante un índice), la duración de la misma y la duración del silencio que la sigue (que de no existir puede ser 0 perfectamente). De esta forma, el formato de la partitura ahora se adapta a un formato de conjuntos nota+silencio que se van sucediendo en el tiempo. Alternando de la forma adecuada es posible lograr con exactitud la melodía que se indica en la partitura.

Y bueno, no tengo mucho más que añadir. Aquí a continuación os dejo el código comentado. Podéis probar con la melodía que os guste, simplemente tenéis que extraer de la partitura la secuencia de pares nota/silencio. Espero que os resulte interesante. Me parece que llegó a ser mi tercer proyecto con Arduino, con lo cual no está nada mal. Aunque hay que dar parte del mérito a Mr.Sandman, que ayudó en el proceso de búsqueda de información y estuvo ahí para supervisar el proceso mecánico de la traducción. Pasaos por su blog, también tiene algunas cosillas muy interesantes.

Código:

int frecuencias[] = {   262,277,294,311,330,349,370,392,415,440,466,494,523,554,587,   622,659,698,740,784,831,880,932,988}; //Array de frecuencias equivalentes a las notas://DO,#DO,RE,#RE,MI,FA,#FA,SOL,#SOL,LA,#LA,SI,DO2,#DO2,RE2,#RE2,//MI2,FA2,#FA2,SOL2,#SOL2,LA2,#LA2,SI2  void setup() {   pinMode(4, OUTPUT); //Determinación del pin 4 como salida (autor del sonido en sí)}   void reproducirNotas(int i,float figura,float silencio){  //i: indice del array de frecuencias; figura: factor a multiplicar según la figura (negra, blanca, corchea...) //silencio: factor a multiplicar según el silencio long j = 0; //indice no entero long semiperiodo = 1000000/(frecuencias[i])/2; //obtención del semiperiodo (en microsegundos, de ahi el 1000000) como mitad del periodo (1/frec) long numCiclos = frecuencias[i]*(500*figura)/1000; //obtencion del numero de ciclos (500 es el tiempo al que se le aplica el factor de figura) while(j<numCiclos){    digitalWrite(4,HIGH); //ciclo en alto durante primer semiperiodo   delayMicroseconds(semiperiodo);    digitalWrite(4,LOW); //ciclo en alto durante segundo semiperiodo   delayMicroseconds(semiperiodo);    j++;  }  silencio=silencio*500; //500 tiempo al que se le aplica el factor de silencio if(silencio>0){ //si existe silencio, aplicarlo   delay(silencio);  } }   void loop() {   //secuencia obtenida para PalletTown  reproducirNotas(14,0.25,0.25);   reproducirNotas(12,0.25,0.25);   reproducirNotas(11,0.25,0.25);   reproducirNotas(9,0.25,0.25);   reproducirNotas(19,0.25,0.25);   reproducirNotas(16,0.25,0.25);   reproducirNotas(18,0.25,0.25);   reproducirNotas(16,0.25,0.25);   reproducirNotas(14,1.25,0.5);   reproducirNotas(11,0.25,0.25);   reproducirNotas(7,0.25,0.25);   reproducirNotas(7,0.25,0.25);   reproducirNotas(9,0.25,0.25);   reproducirNotas(11,0.25,0.25);   reproducirNotas(12,1.75,0.75);   reproducirNotas(6,0.25,0.25);   reproducirNotas(7,0.25,0.25);   reproducirNotas(9,0.25,0.25);   reproducirNotas(11,1.25,0.25);   reproducirNotas(12,0.25,0);   reproducirNotas(11,0.25,0);   reproducirNotas(9,1.75,0.25);   reproducirNotas(14,0.25,0.25);   reproducirNotas(12,0.25,0.25);   reproducirNotas(11,0.25,0.25);   reproducirNotas(14,0.25,0.25);   reproducirNotas(19,0.25,0.25);   reproducirNotas(18,0.25,0.25);   reproducirNotas(17,0.25,0.25);   reproducirNotas(19,0.25,0.25);   reproducirNotas(16,1.25,0.25);   reproducirNotas(14,2.25,0.25);   reproducirNotas(12,0.25,0.25);   reproducirNotas(11,0.25,0.25);   reproducirNotas(9,0.25,0.25);   reproducirNotas(7,0.25,0.25);   reproducirNotas(14,0.25,0.25);   reproducirNotas(12,0.25,0.25);   reproducirNotas(11,0.25,0.25);   reproducirNotas(9,0.25,0.25);   reproducirNotas(7,1.75,0.75);   reproducirNotas(7,0.25,0.25);   reproducirNotas(9,0.25,0.25);   reproducirNotas(11,0.25,0.25);   reproducirNotas(12,1.75,0.25);   reproducirNotas(14,1.25,0.25);   reproducirNotas(12,0.25,0.25);   reproducirNotas(11,1.75,0.75);   reproducirNotas(7,0.25,0.25);   reproducirNotas(9,0.25,0.25);   reproducirNotas(11,0.25,0.25);   reproducirNotas(12,0.75,0.25);   reproducirNotas(12,0.75,0.25);   reproducirNotas(14,1.25,0.25);   reproducirNotas(12,0.25,0);   reproducirNotas(14,0.25,0);   reproducirNotas(11,1.75,0.75);   reproducirNotas(11,0.25,0.25);   reproducirNotas(9,0.25,0.25);   reproducirNotas(7,0.25,0.25);   reproducirNotas(9,1.75,0.25);   reproducirNotas(4,0.75,0.25);   reproducirNotas(11,0.75,0.25);   reproducirNotas(9,1.75,0.25);   reproducirNotas(7,0.75,0.25);   reproducirNotas(4,0.75,0.25);   reproducirNotas(6,1.75,0.25);   reproducirNotas(7,0.75,0.25);   reproducirNotas(11,0.75,0.25);   reproducirNotas(11,1.75,0.25);   reproducirNotas(9,1.75,0.25);   delay(250); //250 ms entre reproducciones}
Y bueno, os paso también una imagen de cómo realizar el conexionado para que el código os funcione a la primera. Aunque en este caso no sea de una complejidad elevada, pero bueno… Nunca está de más documentar un poco.

PalletTownBuzzer_bb

La verdad es que tengo que reconocer que me encanta formar parte de esta comunidad opensource de Arduino. Y me complace mucho compartir este código (y los otros muchos que espero publicar) con vosotros, porque igualmente agradezco mucho que exista gran cantidad de código abierto publicado en internet que a mí me puede servir de gran utilidad. Ojalá todas las compañías emplearan esta estrategia porque es la mejor forma, con diferencia, de crear conocimiento colectivo en esta red tan masiva que es internet.

Pero bueno, sermones a parte, me encanta haber compartido esto con vosotros por si os sirve de ayuda. Siento no haber comentado mucho el código en el post, pero el propio código cuenta con mis comentarios, que creo que son suficientes. De todas formas, si tuvierais alguna duda más sobre el tema me la podéis hacer llegar a wemento@gmail.com, a la cuenta de Twitter o escribirlo en este mismo post en un comentario. Intentaré responder con la mayor brevedad y precisión posibles.

Espero que os guste. Yo, personalmente, estoy encantado de comenzar esta nueva sección del blog.

Salu2.

miércoles, 8 de octubre de 2014

Diario de un apocalipsis zombie–Miércoles, 21 de diciembre de 2011


No sé si se trataría del frío característico de esta época del año o simplemente del pesar que roba toda clase de calor a mi ya curtido corazón, pero esa mañana un escalofrío recorrió toda mi médula de punta a punta y me estremecí entre las sábanas angustiado. Es como si supiera, curiosamente, antes de empezar el día lo que me iba a suceder en el transcurso del mismo. No soy un vidente con un tercer ojo y la asombrosa facultad de ver los días venideros, pero, ¿quién no ha tenido corazonadas que luego resultaban acertadas?

Una vez terminé de abrir los ojos y logré despegarme de las garras de mi cálido catre salté con millones de pensamientos rondando mi cabeza. Esa noche apenas pude dormir con el peso de cincuenta mil almas que habían perdido para siempre su función de toma de decisiones. Y así era. La culpa no recaía directamente en mí ya que yo simplemente acepté formar parte del proyecto, pero igualmente cincuenta mil personas pesan mucho en los hombros aún repartiendo el peso entre unos cuantos.

Con unas marcadas ojeras más típicas del bueno de Jacobo que de cualquier otra persona que pueble la faz de la Tierra, me dirigí a mi puesto de trabajo un día más, con la cabeza igual de baja que todos los días que antecedieron a este. Allí mismo el propio Jacobo, con su camisa perenne y una camiseta que apenas pude leer, me aguardaba para cederme el turno. Había dejado todo recogido y tenía las llaves de su coche en la mano izquierda y una chaqueta descansando sobre el antebrazo derecho. Su cara al verme fue de asombro, imagino que porque me estaría reconociendo como uno de los suyos. Un espantapájaros holgazán del planeta de las ojeras.

- Pareces cansado, ¿una noche larga? – me espetó en un tono que pretendía ser amistoso aunque fuertemente caracterizado por su habitual dejadez.

- No, para nada. He estado toda la noche en mi casa intentando dormir pero me ha sido imposible – le respondí – no he conseguido dormir nada en absoluto. ¿Tú ahora consigues dormir de corrido al llegar a tu casa?

- No suelo dormir mucho – dijo, aunque yo creo que esa información era tan obvia que podría habérsela ahorrado – pero a decir verdad lo poco que duermo lo hago como un niño pequeño. ¿No duermes de lujo sabiendo la cantidad de pasta que nos dan estos tipejos?

Este último comentario me caló un poco hondo. ¿Y la moral de Jacobo? ¿En qué profundo agujero se había escondido? Pensaba que por lo menos alguien más compartiría mi cargo de conciencia, pero parece ser que el dinero es como una venda que te cierra los ojos ante lo que te rodea e igualmente sigues corriendo como si de un caballo asustado se tratara.
Miré a Jacobo unos segundos más a los ojos esperando que se tratara de una broma, pero no resultó ser así. Finalmente lo despaché con un seco «buenos días, Jacobo» y me senté en mi silla a la espera de que otro día sombrío transcurriera sin llamar mucho la atención.

Pero ese día iba a ser bien distinto. Tras una aburrida mañana de control y evaluación de los potentes equipos de Odigos algo nuevo irrumpió en mi monótona rutina. Tres golpes de nudillo en mi puerta de cristal. Sorprendido ante este desconocido evento, ya que para mí era completamente nuevo en todo el tiempo que llevaba allí que alguien golpeara la puerta, giré la cabeza para ver de quién se podía tratar. Acostumbrado a estar toda la jornada en una total y silenciosamente fantasmagórica soledad lo único que podía esperar es que se tratara de Jacobo volviendo a por algún objeto que se hubiera olvidado. Pero no era así.

Se trataba de Alejandra, una doctora que trabajaba en la producción de la vacuna. De unos 40 años, con apenas pocas arrugas de expresión y una cara de profesional que se la pisaba. En ese momento desconocía cualquier tipo de información más acerca de ella, pero allí estaba, con su pelo castaño oscuro recogido en una simpática coleta y sus ojos color azabache, muy seria ella, mirándome con una mueca algo torcida. Quién sabe, a lo mejor abriendo esa puerta la propia Alejandra me brindaría algo más de información sobre ella. Sabiendo que no tenía nada que perder y sin vacilar un sólo momento me levanté raudo de la silla dispuesto a abrirle la puerta a esa quebrada mirada para descifrar qué ocultaba.

- Hola, ¿qué hay? – me soltó nada más abrir la puerta.

- Muy buenas, ¿qué deseas?

- Acompáñame, vamos a un sitio a tomar algo mientras tratamos un asunto – me respondió directamente. Respuesta que me hizo girar la cabeza para echar un vistazo general al equipo con la intención de comprobar si en ese momento podía permitirme el lujo de abandonarlo a su suerte durante unas horas. Efectivamente sí era así, todo estaba en orden. Giré la cabeza de nuevo y cogiendo mi identificador y mi tarjeta magnética de la mesa que yacía justo a mi lado, indiqué a la misteriosa doctora con un gesto de mi cabeza que fuéramos saliendo.

Una vez abandonamos el edificio quise averiguar cuál eran las intenciones de esta mujer. Quería saber de qué clase de cosas teníamos que hablar ella y yo.

- Si no te importa te lo diré una vez lleguemos. No es buena idea hablar al aire libre de esto – me contestó sin ni mirarme tan siquiera. Su mirada seguía fija en la dirección hacia la que avanzábamos.

Inquieto caminé a su lado un largo trecho en un sepulcral silencio. No me atreví a volver a dirigirle la palabra. Atravesamos varias calles. No podía evitar mirar a todos lados para intentar observar si nos seguía alguien o no. A decir verdad, era difícil determinarlo ya que cualquier persona que anduviera por nuestras cercanías nos podría estar siguiendo pero realmente no aparentaban estar haciéndolo.

Finalmente, pasada la plaza de la Merced, unas calles más hacia el norte y en un callejón que se extendía hacia el este unos pocos metros, encontramos un bar. Bastante escondido, la verdad. Se trataba de un bar típico de Málaga de gambitas y cerveza. No era en absoluto un bar de copas exclusivamente. Accedimos a su interior y nada más entrar el cuello del camarero, como un firme resorte, se estiró rápidamente dirigiéndonos una fría y controladora mirada a ambos. La doctora se acercó a la barra y tuvo una conversación con el oído del mozo. Apenas tuvo que susurrar ya que el sonido de un partido de fútbol sobrecargaba el ambiente haciendo que para una simple conversación a escasos centímetros hubiera que volcar toda la atención posible y desgastarse el tímpano con tal de poder seguirle el hilo. Los hombres sentados en la barra alrededor del camarero y de ella, obviamente no escucharon nada. Tras un corto diálogo, el camarero estiró el brazo y agarró una llave que tenía a un lado colgando de una alcayata en la pared. Salió de la barra y se dirigió a una espesa puerta de cristal que había al fondo del bar. Se trataba de una zona VIP que, a saber cómo, mi colega la doctora había conseguido para nosotros solos.

Una vez dentro tomamos asiento en la única mesa que habitaba el reservado. Ambos nos sentamos de espaldas a la cristalera a petición expresa de Alejandra y el camarero rápidamente nos tomó nota.

- ¿Qué van a tomar?

- Yo tomaré una copa de ginebra con limón, pero no me lo cargues más de tres dedos que ya sabes que tengo que trabajar – comentó ella, a lo que acto seguido acompañó una sonrisa de complicidad compartida por el camarero. Esto ya me hizo sospechar algo. – y mi amigo tomará…

- Yo un whisky con hielo – me aventuré. Sabía que esto no era como las reuniones con Fede, aquí no tenía ningún miedo por hablar más de la cuenta, ya que ambos estábamos metidos en el ajo.

Tras el protocolo, el camarero abandonó la cristalera asegurándose de que la puerta estuviera bien cerrada. Pensé en quitarme la chaqueta y la bufanda pero aún dentro del local, el frío calaba hondo en mis huesos así que retuve mi gesto y volví a sentarme bien. Asombrado por el aislamiento que ofrecía aquella habitación miré a la doctora a los ojos esperando a que de una vez por todas me diera una explicación. Y parece que lo conseguí.

- El camarero está metido también en todo esto, no tienes de qué preocuparte. De hecho, esta habitación la mandó hacer para nuestra gente.

- Ah, está bien saberlo. Y, ¿para qué me has traído aquí? – le pregunté, algo asustado ante lo que pudiera salir de sus labios en forma de respuesta.

- Verás, sé que únicamente conocemos nuestros nombres y no sabemos nada más el uno del otro, pero al igual que tú, no conozco a nadie más del edificio. Supongo que para ellos, cuanto menos relación tengamos entre nosotros mejor, pero yo necesitaba hablar esto con alguien.

- No tienes de que preocuparte. Me alegro de estar manteniendo esta conversación contigo. Y bien, ¿de qué se trata? – le insistí. Parecía que iba a tener que sacarle la información con un sacacorchos.

- Pues, verás, es difícil decirlo. Soy bióloga y mi misión en Odigos es producir las mezclas para las vacunas. Imagino que para ti también todo esto será igual de macabro que para mí – me dijo, cosa que me alegró tras haber oído esa misma mañana la opinión de la moral de Jacobo sobre todo esto – Sin duda lo es. Pero además de la cuestionable moral del asunto, tengo una preocupación añadida con todo esto. He estado estudiando la composición de la dichosa vacuna.

- Escalofriante, me imagino.

- Pues sí, un invento del mismo demonio. Es muy triste, ¿no? – me respondió. Acto seguido entró el camarero con los encargos y los colocó en la mesa sin articular palabra – Ah, gracias – le dijo ella – en fin, analizando la vacuna he “visto” un posible efecto secundario que me atemoriza – terminó una vez hubiera abandonado el camarero la mesa.

- ¿De qué se trata?

- Pues verás, es probable que la vacuna no sólo inhiba la capacidad de tomar decisiones de las personas que portan el virus, sino que puede ser que el mismo virus tome control absoluto del centro neuronal del sujeto, dejándolo a su merced absoluta y eliminando cualquier rastro de humanidad. No sé si me entiendes.

- Creo que sí – respondí totalmente atemorizado por lo que acababa de oír. ¿Un virus que puede llegar a destruir a una persona convirtiéndola en un cuerpo desalmado que no actúa por sí mismo? Eso ya sin duda era demasiado.

- Pues estoy asustada, como imaginarás. La vacuna puede matar psicológicamente a una persona. Aquellos que sufrieran estos efectos secundarios morirían cerebralmente dejando de tener cualquier control sobre ellos mismos y careciendo de conciencia. El cuerpo lo acabaría domando el virus y bueno, ya conocemos la naturaleza. Con tal de sobrevivir quién sabe  a qué podría recurrir el virus. Intentaría reproducirse para perpetuarse en el tiempo – argumentó, con un tembloroso labio cortado por el frío. Frío como el que recorría cada milímetro cuadrado de mi piel a cada palabra que escuchaba. Todo esto era espeluznante.

- Y, ¿qué piensas hacer? Eso podría ser muy peligroso.

- Pues, creo que ya es demasiado tarde para hacer nada. Este virus de diseño ya existe y está ahí fuera, implantado en al menos cincuenta mil personas. Hoy otras cincuenta mil estarán cayendo.

- Deberíamos hablar con algún superior y advertirle de todo esto antes de que vaya a peor.

- Créeme, lo he intentado. Pero han sido palabras necias para oídos sordos. El virus ya está ahí fuera. Sólo nos queda rezar porque todo esto que digo no se cumpla, que esté equivocada en algo o que, si tengo razón, que al menos los dichosos efectos secundarios no se manifiesten, porque sino mucha gente inocente morirá cerebralmente.

Bajé la cabeza, hundiéndola entre mis hombros. Ahogué la vista en el fondo de mi vaso de whiskey y me quedé absorto en una sarta de puntiagudos pensamientos. Me invadía el miedo. Miedo ante una posible horda de asesinatos que también pesarían en mis hombros. Sinceramente, eso ya es lo que me faltaba, haberme convertido en un maldito genocida con tal de tener pan que llevarme a la boca. Una vez me aprendí de memoria cada una de las partículas de mi copa volví a clavar la mirada en ella, que no había dejado de mirarme en ningún momento.

- ¿Qué piensas de todo esto? – quiso saber, presa de la angustia que flotaba en el ambiente.

- Que es una jodida mierda – respondí de forma seca – esto ya me está afectando demasiado. Debe haber algo que podamos hacer.

- Lo siento mucho, de verdad. Pero ya te he dicho que no es posible hacer nada, llegamos tarde. Es culpa mía, debí darme cuenta antes.

- No, no te culpes – le contesté, con intención de animarla ante su pesar – por mucho que hubieras descubierto, ¿crees que algo les hubiera parado?

- Ya, tienes razón – dijo, escasamente aliviada – voy a hacer una cosa, si no te importa. Voy a enviarte la composición de la vacuna por si quieres echarle un vistazo.

A mí más que un ofrecimiento para compartir información científica me pareció más bien un intento desesperado por buscar una segunda opinión que demostrara que ella erraba en su deducción. Un desesperado intento que curaría en salud su alma, seriamente agraviada por toda la cruel y sádica moral que envolvía a este proyecto.

- Déjame tu correo del trabajo, si no te importa. Voy a anotarlo – me dijo, inclinándose hacia uno de los lados para explorar el interior de su bolso en busca de algo.

Acepté el facilitarle el correo, por supuesto, ya que sabía que no había ninguna clase de trampa en todo esto. Ella era de fiar y además sabía que estaba metida en todo esto.
Metí mi mano en el bolsillo extrayendo un trozo de papel que sabía con certeza que conservaba allí y rápidamente extraje un bolígrafo de mi chaqueta y anoté mi dirección de correo electrónico en el papelito, con la intención de que no tuviera que molestarse ella en encontrar papel y bolígrafo en su bolso. Todos sabemos como es el bolso de una mujer y no quería hacer que perdiera un valioso tiempo en encontrarlo ahí dentro. Pero este gesto mío no pareció agradarle.

- ¡No! ¿Qué haces? ¡No deberías hacer eso! – me gritó alterada, empujando mi mano contra la mesa y con ella el papel, de manera que no pudiera leerse.

- ¿Qué… qué he hecho? – respondí confuso.

- No debes escribir tu dirección en un papel. ¿Y si alguien nos estuviera espiando? Es un asunto gubernamental, ¿quién sabe qué clase de personajillos manejados por peces gordos de otras naciones pueden estar oliéndose algo raro? ¿No recuerdas que estamos aislados del mundo únicamente por un cristal insonorizado? La única forma segura de compartir esta valiosa información es mediante la voz. Además, por algo nos encontramos de espaldas al cristal, ¡ni tan siquiera queremos que se nos puedan leer los labios! Toda precaución es poca, debes tener más cuidado.

- Perdón, no tenía ni idea. Ha sido un despiste. Disculpa.

- No pasa nada, pero ten cuidado, debes andar con pies de plomo. Recuerda que, como todos, juraste confidencialidad. Debes tener miedo de lo que pueda pasarte si rompes ese juramento – me respondió arrebatándome de un tirón el papelito ya plegado de mis viejos dedos – te enviaré el correo nada más volver.

- ¿Qué buscabas en el bolso entonces? Pensé que estabas buscando un papel para que te anotara mi dirección – le dije, aún impresionado por esa inesperada reacción.

- Buscaba una grabadora para emplear una nota de voz como recordatorio – me respondió. En ese momento comprendí lo estúpido que había sido mi error.

- De acuerdo, deberíamos volver ya a nuestros puestos – concluí tras mirar el reloj. No quería tampoco dejar descuidado el control informático demasiado tiempo.

- Deberíamos – me secundó.

Tras levantarnos y pagar nuestra cuenta en la barra, nos dirigimos de nuevo al edificio. Con una serie de “maniobras de distracción” la doctora se aseguró de que por el camino no hubiera ningún indeseado que pudiera seguirnos hasta el edificio. Una vez dentro, volvimos cada uno de nosotros a nuestros puestos de trabajo sin articular más palabra.
Mi estómago, ya caliente por el efecto del whisky, apenas rugió de hambre. Pude continuar unas horas, gracias a esto, sin tener que llevarme algo al gaznate.

La jornada terminó de forma fugaz. Apenas tuve conciencia del paso del tiempo. Trabajé con la mente en blanco. Supongo que se trataría de un mecanismo de defensa para que no me matara todo lo que había oído ese mismo mediodía. No obstante, se lo agradezco a mi organismo.

Tras terminar mi turno y despedirme de Jacobo, abandoné aquel maldito lugar para dirigirme a mi humilde morada. Una vez allí, recordé que no había leído el correo de Alejandra. Se me había pasado por completo, presa de mi  bien recibido blanqueamiento mental. Abrí mi ordenador portátil y tras arrancarlo accedí a los servidores del proyecto, los cuales actúan bajo el nombre de opecs (Odigos Project Exchange between China and Spain). Una vez dentro introduje mis datos personales para acceder a la bandeja de entrada y allí estaba. Bajo el asunto de “Composición” un correo encabezaba mi casi vacía lista de emails. Abrí el correo y examiné el archivo adjunto, aunque esto no me sirvió de mucho. No entiendo mucho del tema y todo lo que estaba leyendo me estaba sonando a chino, ¿cómo podría saber yo que esa combinación de cosas te manipulan el cerebro llegando incluso a invadirlo completamente? No tengo conocimientos de biología así que por mucho que releyera el contenido del archivo, mis ojos iban a estar analizando letras en vano. Decidí memorizar gran parte de los compuestos para preguntarle en una futura charla a la doctora qué clase de efectos tenía cada uno de ellos.

Una vez finalicé sesión, apagué mi equipo y me incliné en mi silla. Volví a cerrar los ojos, como otras tantas largas noches, esta vez lejos de una barra, para pensar en Laura y en la pequeña Silvia. Ahora el miedo que sentía por ellas era mayor, ya que existía la cruda posibilidad de que el virus las matara, convirtiéndolas en unos simples vehículos de carne y hueso para un virus que únicamente busca su propia supervivencia. El miedo fluyó por todas mis arterias y llegué incluso a maldecir a Alejandra por hacerme conocedor de este horrible efecto secundario. Qué feliz (esto es un decir, claro) era yo en mi sola ignorancia.

Impotente me siento, sin duda. Sólo me queda rezar, como dijo la doctora. Rezar porque el mañana que aguarda a la humanidad sea… bueno, dejémoslo en “menos malo”.

Con mis castigados hombros cargando con el peso de una ya afectada parte de la población mundial, me he tumbado en la cama. Mis ojos se pierden en el vacío y ya no sigo con ganas de escribir. La noche va a ser larga, como dijo en este caso el bueno de Jacobo. Aunque en este preciso instante desearía que fuera por el sentido que tomaba en la frase de Jacobo: ahogando mis penas en bebidas destiladas, sin más preocupación que la de tenerme en pie para no lesionarme de gravedad en el cráneo con una gafe caída.

Sólo espero que nos ampare un mañana mejor.