Obtener el esquema desde una placa de circuito impreso

Pasar de una PCB al esquema es siempre un coñazo, lo hagas como lo hagas. Además es fácil equivocarse y acabar liado con un circuito que no tira ni para atrás. Por eso os quiero presentar un método sistemático que os servirá de guía para no perder el hilo. Para los expertos, lo que vamos buscando es reconstruir el netlist.

Tengo un sencillo transmisor de un coche de juguete y voy a dibujar el esquema para analizarlo en una próxima entrada. Como la placa es pequeña, con componentes habituales y de una sola cara me servirá de ejemplo.
Artículo completo >>

Multivibrador astable a transistores: explicación

El astable con dos transistores NPN es de los primeros circuitos que se estudian cuando se habla de transistores en conmutación. Como su esquema es tan simple, es de esas cosas pequeñas que te crees que las entiendes, hasta que te das cuenta de que tú también habrías colocado los condensadores del revés. Voy a explicar despacio cómo funciona, y veréis que aunque parece sencillo su funcionamiento es interesante.


Artículo completo >>

Preamplificador para micrófono multimedia

Actualización: Este es un preamplificador de baja calidad a transistores que tiene puntos flojos. Si buscas preamplificar un micrófono de una manera más sencilla tal vez te interesa esta otra entrada.

Sigo utilizando el viejo micrófono que venía con el primer PC multimedia que compré. Consta de una capsula electret con un preamplificador en la base del micro. Aunque si ponemos atención a las conexiones resulta que la señal pasa directamente del micro al jack, el preamplificador está puenteado y no se usa. Supongo que antaño cuando las tarjetas de sonido sólo tenían entrada micro mono, el tercer hilo era una alimentación de 5V que serviría para el amplificador. Hoy en día ambos canales tienen una tensión de entre 3V y 5V que sólo sirven para alimentar el micrófono. De hecho si conecto el amplificador a un canal libre irremediablemente los canales se acoplan y la señal se distorsiona por falta de alimentación.

El circuito en cuestión es este:



Análisis del circuito

Me gustaría analizarlo por encima. Os pongo el esquema obtenido siguiendo la placa:


Es un diseño bastante sencillo. Tiene cuatro terminales: entrada para el micro, salida a la tarjeta de sonido, alimentación y masa.

C1 y C4 se encargan de filtrar la alimentación. La resistencia R6 y C3 es la forma estándar de conectar una capsula electret. C3 y C2 se encargan del acoplamiento en alterna de la entrada y la salida.

El transistor Q1, junto a sus resistencias de polarización, está configurado como un amplificador clase A, en emisor común. Mientras Q2 actúa como colector común, que no amplifica nada pero proporciona una baja impedancia de salida óptima para aplicarla a la entrada de Micrófono de la tarjeta de sonido.

La idea es buena, pero adolece de algunos fallos típicos de los circuitos baratos.
  • Para empezar los condensadores de entrada y salida tienen un valor muy bajo de sólo 10nF. Para una frecuencia de 440Hz suponen una impedancia de 3600ohm. Con una capacidad tan baja, se nota mucho la atenuación de los tonos graves frente a los agudos, produciendo el típico sonido a lata característico de las cosas made in china. Podríamos ampliar un poco la capacidad, 10uF serán suficientes. Pero necesitamos electrolíticos. En grandes tiradas, pasar de los electrolíticos y usar cerámicos supone un ahorro importante a costa de sacrificar la calidad, pero en un micrófono barato de PC esto último es secundario.
  • Hay un fallo más grave en la polarización del emisor de Q1. Está bien polarizado para continua, pero a menos que conectemos un condensador en paralelo con R1 apenas conseguiremos amplificar las señales alternas. Un condensador de 10uF funcionará bien, aunque lo recomendable sería de 100uF en adelante.
  • Acoplamiento capacitivo entre etapas. En este caso es opcional porque la siguiente etapa es un seguidor de emisor y sólo amplifica en corriente. Si tuviéramos una etapa amplificadora de tensión tendríamos que conectar un condensador para filtrar la componente continua, de lo contrario la saturaríamos. Como hemos dicho en este caso no es necesario.
  • Polarización de la base de Q1. Esto último no es un fallo, pero colocar una resistencia entre la base de Q1 y tierra mejoraría la estabilidad térmica del circuito. Para lo que vamos a hacer no es fundamental.
Vamos a arreglar los fallos 1 y 2. El esquema quedaría como sigue:


El espacio libre que hay por encima del circuito es muy limitado. Por suerte tenía algunos electrolíticos en miniatura que desoldé de una lectora de CDROM. En esta imagen vemos el circuito una vez modificado.


La tensión de alimentación puede ir desde los 3 a los 5V, para alimentarlo con 9 o 12 habría que recalcular algunas resistencias. Este circuito amplifica entre 50 y 100 veces la señal de entrada. Es difícil de determinar pues, al no tener el emisor degenerado, depende de la resistencia intrínseca del transistor. Si quisiéramos atenuar un poco la ganancia basta conectar una resistencia justo antes del emisor de Q1, digamos R7 de 220ohm. La ganancia sería aproximadamente R5/R7 = 2200/220 = 10 veces.
Artículo completo >>

Control de velocidad por PWM

Algo ligero para hoy. Se trata de un control de potencia por Modulación de Anchura de Pulsos (PWM). Está basado en un TL494CN que desoldé de una fuente de alimentación para PC estropeada. Como siempre al final de la entrada os dejo un enlace a los ficheros, incluido el datasheet y una nota de aplicación de TI titulada Designing Switching Voltage Regulators With the TL494.

Este integrado tiene todos los elementos necesarios para construir una fuente conmutada:
The TL494 contains two error amplifiers, an on-chip adjustable oscillator, a dead-time control (DTC) comparator, a pulse-steering control flip-flop, a 5V - 5% precision regulator, and output-control circuits.
Aunque hoy sólo vamos a usar parte de la circuitería es interesante echarle un ojo a la nota de aplicación -el datasheet deja bastante que desear- porque tal vez se nos ocurran otros usos. Si bien es cierto que es un integrado diseñado para un propósito muy concreto, merece la pena conocerlo porque es bastante frecuente y muy sencillo de reutilizar. Lo podemos encontrar en fuentes de alimentación conmutadas, sobre todo en fuentes de PC antiguas posteriores al 2003 (fecha de la publicación de la nota de diseño).

Vamos a construir un sencillo circuito para controlar la tensión aplicada a una bombilla o un motor. Cuidado cuando apliquemos pulsos discontinuos a un motor que como sabéis es una carga inductiva y va a generar picos de tensión inversa que hay que considerar.


Descripción del circuito


Lo primero que hacemos es llevar a masa lo que no vayamos a utilizar: las patillas 1, 2, 15 y 16 que corresponden a dos amplificadores pensados para sensar y corregir la tensión de salida. Y la patilla 13, que determina si las dos salidas que tiene actúan en push-pull o en paralelo. Como sólo vamos a usar una nos da igual, así que la conectamos a 0V y tenemos salidas en paralelo.

La resistencia R2 y C1 están conectados al oscilador, en el datasheet los llaman CT y RT (T de timing). Con los valores que he elegido obtenemos una frecuencia de conmutación de 10kHz. Si os molesta el pitido podéis aumentarla, el límite de este integrado está en 150kHz. Pero si pensáis usarlo para controlar un motor, debéis tener en cuenta que la resistencia del bobinado aumenta con la frecuencia. La formula para calcular la frecuencia de oscilación no viene en el datasheet, pero en la nota se indica y es la habitual:

\[F_{osc} = \frac{1}{R_T \times C_T}\]
El duty-cycle lo fijamos mediante R1 y el potenciómetro. La patilla 4 (Dead Time Control) controla el tiempo de apagado, desde un mínimo de 3% (Duty Cycle 97%) cuando se le aplica una tensión de 3.3V a un máximo de 100% (Duty Cycle 0% o apagado) cuando se conecta a 0V. Podríamos haber conectado las salidas en push-pull y utilizar la salida complementaria, de esa otra forma tendríamos un duty de 3% a 100% en lugar de 0% a 97% como tenemos con esta configuración.

R1 actúa como divisor de tensión con P1 para que la tensión en la patilla 4 no sobrepase los 3.3V. Debéis calcularla en función del valor del potenciómetro que penséis usar. Ya que

\[V_{max} = \frac{5V}{R_1 + Pot}Pot = 3.3V\rightarrow R_1 \simeq 0.5Pot\]
A la salida hemos colocado un BD140 que puede conmutar hasta 1.5A. El diodo D1 sirve para cortocircuitar los picos de retorno en caso de que conectemos un motor a la salida, y que no lleguen al transistor.

El circuito puede alimentarse entre 7 y 30V aunque los valores de R3 y R4 están pensados para 9V, así que si vais a usar otras tensiones diferentes puede que tengáis que recalcularlos para aseguraros de que el transistor funciona efectivamente en conmutación.

Aquí tenéis una foto del circuito terminado.


En este enlace os dejo los ficheros de Eagle, el datasheet, la nota de aplicación antes mencionada y las fotos.
Artículo completo >>

Del óxido a las ondas de choque

Por difícil que resulte creerlo, la corrosión de una lata de chapa en el campo y las voladuras de una cantera son el mismo fenómeno químico. Cuestión de cinética química, hoy me apetece hablar de la oxidación.

Corrosión

La oxidación, como su nombre indica, es la combinación de una sustancia con el oxígeno. Si dejáis un clavo sumergido en agua durante 24 horas, se empezará a oxidar. El agua contiene oxígeno disuelto, que se combina con el clavo para formar óxido férrico de color naranja marrón. Aquí viene una propiedad curiosa de los gases: es más fácil disolver algo en agua cuando está el agua caliente que cuando está fría, en general para cualquier disolución es así... pero para los gases es al contrario. Cuando tenemos gas disuelto en líquido, y lo calentamos, la solubilidad de los gases disminuye. Así el agua hervida no contiene oxigeno disuelto apenas, y un clavo sumergido en ella no se oxidará.


A propósito, los peces respiran el oxigeno disuelto. Podéis haceros una idea de lo que pasa si sube la temperatura del agua. Es más, en cierto sentido el oxigeno purifica, cuando escasea empiezan a proliferan otro tipo de microorganismos (anaerobios) y huelen bastante mal. Es la causa del hedor de agua estancada: aguas que no se agitan, no se mezclan con el oxígeno, y como no es agua corriente está calentita. El poco oxígeno que queda lo producen las plantitas verdes del fondo. Si además hay nutrientes, arriba las algas crecen, apagan la luz del fondo, la fotosíntesis se va a la mierda y las bacterias se dan el festín. Después todo huele a podrido.

Pilas

Siempre que hay una oxidación hay desprendimiento de energía. Si la oxidación es lenta, como en el caso de una chapa a la intemperie, esa combinación se hace con el oxígeno atmosférico. Y la potencia (energía / tiempo) es casi nula. Podríamos aprovechar esa energía si facilitamos la oxidación. Se dará más deprisa, mayor energía en el mismo tiempo: más potencia. Hemos construido una pila.

Respiración

No sólo los metales se combinan con oxígeno. También se oxidan las sustancias orgánicas. Por ejemplo la glucosa. Igual que cuando quemamos butano, y general cualquier hidrocarburo, al quemar glucosa se produce CO2 y agua, además de energía. Esta reacción es la que utiliza cada una de nuestras células para obtener energía para vivir. El proceso biológico se llama respiración aerobia, está diseñado para aprovechar la energía lo máximo posible. Eso sí, es un infierno bioquímico de reacciones, enzimas y procesos físicos.

Fuego

Hay sustancias que se combinan fácilmente con el oxígeno, son combustibles, pero para que se de la reacción necesitan una energía de activación. Energía que en general se aplica en forma de calor acercando una llama o una brasa o una chispa o comprimiendo el combustible. Si la oxidación de una sustancia combustible una vez iniciada no se controla, la velocidad de la reacción aumenta varios órdenes de magnitud. Se desprende tanta energía que el calor inicia la reacción en zonas adyacentes inflamándolas también. El fuego no es más que una reacción de oxidación autosostenida. Y se mantiene hasta que no haya nada más que combinar con oxigeno (combustible), no haya nada oxígeno con el que combinarlo (comburente) o eliminemos esa capacidad de automantenerse (aplicando agua por ejemplo).

Llamarada

Si el combustible es sólido o líquido sólo ciertas partes están expuestas al oxígeno. En cambio si es gaseoso puede mezclarse con él y aumentar la velocidad más aún. Se produce una deflagración.

Es lo mismo cuando el combustible está finamente pulverizado. Por ejemplo la mezcla de gasolina y oxígeno en un motor. O cuando escupimos Colacao. Sí, si pulverizamos cualquier cosa que se oxide, a una temperatura adecuada y le acercamos una cerilla arde. Hasta el aluminio. De hecho en habitáculos donde se acumula polvo en el suelo (tiene que ser una capa bien gorda) se debe considerar el riesgo de explosión.

Muchos desastres domésticos son debidos a fugas de gas. El combustible se escapa durante la noche acumulándose en la cocina mezclado con el oxígeno. Cuando el interruptor de la luz o una cerilla inician la reacción, todo arde casi en el instante (el casi es muy importante aquí). Entre otros factores, dependiendo de la concentración, el resultado será una llamarada o una explosión.

Una explosión por gas en realidad son dos procesos. Primero se crea un vacío inicial resultado de combinarse gas y oxígeno, y acto seguido un incremento del volumen debido al calor generado en la reacción. Se trata de una implosión más una explosión. Los efectos son devastadores.

Depender del oxígeno del aire es un factor limitante para la velocidad de reacción. Si queremos aumentarla no nos queda otra que mezclar un combustible con un oxidante para disponer de todo el oxígeno que necesitemos sin depender del atmosférico. En la pólvora, por ejemplo, se mezcla el carbón con un compuesto que desprende oxígeno al calentarse. Además con este sistema se puede empaquetar en un cartucho para facilitar el manejo e incluso arder sin oxígeno (bajo el agua).

Detonación

Si seguimos aumentando la velocidad de reacción llegará un momento en que esta supere la velocidad del sonido. Más propiamente dicho, el desprendimiento de energía se hace a tal velocidad que el aire que lo rodea se expande rápidamente, generando una onda de choque que percibimos como un estampido.

Hay sustancias que impiden o dificultan la detonación. En los motores una vez que la gasolina está caliente, pulverizada y mezclada con el oxígeno detonará antes de tiempo al comprimirla. Para eso se añaden compuestos antidetonantes, que hacen que la mezcla necesite una chispa y no se encienda espontáneamente. Es lo que se mide con el índice de octano.

El daño destructivo de una detonación lo causa la onda de presión que se produce cuando el aire es desplazado de golpe de las cercanías del explosivo. Este desplazamiento se debe normalmente al calor generado.

Como nota curiosa hay ciertas sustancias que detonan sin arder, sin apenas desprendimiento de energía. Ante un golpe, por ejemplo, las moléculas que antes eran sólidas pasan a descomponerse en varias gaseosas. Como gas ocupan mucho más espacio del que ocupaban como sólido. Es lo que se denomina explosión entrópica. Es como si en un punto liberásemos instantáneamente cientos de litros de aire, forzando al aire de los alrededores a comprimirse de golpe.
Artículo completo >>

Comparar matrices en Perl

En algunas ocasiones tenemos dos listas y necesitamos saber qué elementos han entrado nuevos en la segunda, cuales estaban en la primera pero no en la segunda -han salido- y cuales se han mantenido. Podríamos utilizar el módulo Array::Diff pero tiene un defecto, y es que depende del orden. Como utiliza un algoritmo similar a Diff, cuando los elementos cambian de orden el módulo ofrece resultados incorrectos.

Para eso podemos usar la siguiente función:

#===  FUNCTION  ================================================================
#         NAME:  array_entran_salen
#      PURPOSE:  Calcula los elementos que han entrado o han salido al comparar matrices
#   PARAMETERS:  ref_array_origen, ref_array_destino
#      RETURNS:  ref_array_entran, ref_array_salen, ref_array_comunes
#        NOTES:  Hago esta rutina porque el Array::Diff depende del orden
#===============================================================================
sub array_entran_salen {
 my $origen  = shift;
 my $destino = shift;
 my %elem;
 my @entran;
 my @salen;
 my @comunes;

 $elem{$_} = 1  for @$origen;
 $elem{$_} += 2 for @$destino;

 foreach (keys %elem) {
  $elem{$_} == 1 and push @salen, $_;
  $elem{$_} == 2 and push @entran, $_;
  $elem{$_} == 3 and push @comunes, $_;
 }

 return (\@entran, \@salen, \@comunes);
}


Tenemos dos listas:
a b c d e f g

a   c d   f g h


Al aplicar la función nos devuelve:
Entran: h
Salen: b e
Comunes: a c d f g

El funcionamiento es sencillo:
  1. Se toman los elementos de la matriz A y se les asigna un valor 1.
  2. Se toman los de la B y se les asigna un valor 2.
  3. Al sumar las claves, los que sólo estaban en la A pero no en la B, seguirán teniendo valor 1. Los que estaban en la A y la B tendrán valor 3, y los que estaban sólo en la B, pero no en A valdrán 2.
Este método es escalable y podríamos comparar varias matrices, sumando 2, 4, 8...

Es posible que no se vea bien el código porque el render de LaTeX se empeña en interpretar expresiones de Perl, y claro, pues no le molan. Creo que lo he corregido pero por si acaso os dejo el código en este enlace.
Artículo completo >>

Espectroscopía casera con copas

La espectroscopia es una técnica analítica que nos permite distinguir los componentes de una sustancia desconocida. Aprovecha que cada molécula tiene una configuración específica y por tanto unas frecuencias de resonancia que la caracterizan. En estas frecuencias la molécula vibra acumulando la energía de la onda, hecho que puede producir calor. Tal es el fundamento del microondas.

Lo de tener ciertas frecuencias con un comportamiento especial no es exclusivo de las moléculas ni mucho menos. Todo oscilador tiene una frecuencia de resonancia que se corresponde con la frecuencia natural de vibración del sistema. Cuando sólo hay un oscilador y es armónico sólo tiene una, pero en la naturaleza nada es ideal, y los espectros de emisión son muy variados. Las longitudes de onda para las que el sistema tiene un comportamiento diferente al resto son del orden del tamaño de este, así pues los sistemas pequeños resuenan en frecuencias más altas, por ejemplo:
  • Osciladores microscópicos: un átomo o una molécula presentan líneas de emisión en el ultravioleta (mercurio), espectro visible (sodio), infrarrojo (metano) o microondas (agua).
  • Osciladores electrónicos: un circuito resonante RLC puede oscilar entre unas pocas hasta varios millones de veces por segundo, dependiendo de los valores L y C. Se cumple que cuando L o C aumentan, baja la frecuencia y viceversa.
  • Osciladores mecánicos: un resorte, un diapasón, un instrumento musical o una copa de vidrio son ejemplos clásicos. La frecuencia de las oscilaciones cae en un espectro fácilmente audible (entre 50 y 10.000Hz). Y todos sabemos que una campana o tubo de órgano suenan más grave cuanto más grandes son.

En este artículo vamos a ver algunos experimentos sencillos de espectroscopia acústica en los que usaremos copas como elementos resonantes.


Averiguar las frecuencias de resonancia

Tomemos una copa, un vodka con naranja estaría bien. Ahora vamos a por una copa vacía para hacer las pruebas. Lo primero que hemos de obtener son las frecuencias de oscilación libre de esa copa. Estas dependerán del tamaño y forma, así como de la composición y grosor del material. De ahí el timbre característico de una copa de fino cristal de Bohemia, frente a una copa usual de vino o un simple vaso. Y de ahí también el que varíe cuando se llena de un líquido, cuando se toca, etc.


Podríamos utilizar un oscilador y un micrófono. Si variamos la frecuencia mientras visualizamos la amplitud de la señal captada veremos cómo crece al acercarnos a una frecuencia de resonancia. Este método es viable y así es como se hacía antes de que existieran los ordenadores, cuando no era tan sencillo calcular la Transformada de Fourier. Otro día me detendré en explicarla, porque es realmente interesante; baste hoy con decir que es una operación tal que, a partir de un sonido, obtiene las frecuencias de que se compone.

Este proceso de variar la frecuencia y observar la respuesta es más o menos fácil de hacer con el sonido; con las microondas es un poquito más chungo; y con la luz necesitamos un monocromador, que es bastante caro. Así que lo que se hace hoy día se parece a lo que vamos a hacer nosotros: excitar la muestra con todas las frecuencias por igual y analizar la respuesta a usando la transformada de Fourier.

Parece sencillo, sólo necesitamos un sonido que se componga de todas las frecuencias, y tenemos dos opciones:
  • ruido blanco. Dado que el ruido no sigue ningún patrón, todas las frecuencias tienen la misma probabilidad. Así la densidad espectral es constante. Pero hay otra forma de obtener un espectro con todas las frecuencias posibles.
  • pulso instantáneo. Si nos vamos a una tabla de transformadas básicas la función pulso (también llamada delta de Dirac) tiene un espectro que no depende de la frecuencia, constante por lo tanto. Es el mismo fenómeno por el que un rayo o una chispa de un mal contacto hacen interferencias en todos los canales de radio y televisión: tienen componentes electromagnéticos en todas las frecuencias.


Respuesta a un impulso

¿Cómo podemos aplicar energía instantánea a una copa? muy fácil: dándole un golpecito. Así es, ese tíiinnnn característico que oímos se compone de las frecuencias de resonancia. Pero eso es hacer trampa, a una copa podemos darle un golpe, pero supongamos que no podemos tocar el sistema. Necesitamos algo que lo golpee sin tocarlo. Necesitamos un flash de sonido, una onda de choque es decir, necesitamos una detonación. No es plan de tirar un petardo en casa. Así que, aunque quede más ridículo, para lo que quiero hacer también me servirá con explotar un globo.

Lo siguiente es un sonograma creado por el programa baudline. El tiempo avanza hacia abajo de la pantalla, siguiendo el eje vertical. Las frecuencias están en el eje horizontal.


Cuando aportamos energía a la copa, esta absorbe la que corresponde con sus frecuencias características y a continuación la emite. Lo que vemos es un aporte inicial de energía -la explosión- y a continuación los ecos. Hay tres tonos principales, los llamaremos A1, A2 y A3 (copa A, tonos 1, 2 y 3) de 1160Hz, 2410Hz y alrededor de 4400Hz. Nos centraremos en A1 y A2, vale la pena observar que son dos tonos limpios, en el sentido de que ninguno presenta armónicos superiores.

Lo que vemos instantes después de la explosión es la reverberación en las paredes, así como otras resonancias más débiles de los objetos de la habitación. Al ser tan débiles se desvanecen rápidamente, si quisiéramos apreciarlo con claridad en el espectro necesitaríamos una frecuencia de muestreo mucho más alta que la que tenemos con nuestra tarjeta de sonido. Con esta información podríamos obtener la respuesta acústica de un espacio y nos serviría si quisiéramos adecuarlo para un concierto por ejemplo.

Una onda de choque transporta energía, en algunos casos mucha, que absorben los cuerpos con los que se topa. Un cuerpo que puede vibrar libremente recibe más energía que otro que esté sujeto. Por eso una explosión puede romper cristales y tímpanos a cierta distancia. A la onda de choque se le llama también onda expansiva u onda de presión. Los órganos internos están sujetos pero no demasiado: aún cuando no haya efectos visibles, un testigo cercano de una detonación potente puede presentar daños internos de mucha severidad debido únicamente a la onda expansiva.


Oscilación forzada

Cabe preguntarse qué sucede si aplicamos a la copa un tono de una frecuencia a la que esta resuene. El resultado es esperable: que vibra. Pero esto tiene dos consecuencias:


  •  Que una vez la fuente desaparece, al cabo de 0.1s, la vibración persiste durante un tiempo largo (tiempo que viene dado por el llamado factor de calidad Q). Encontramos una aplicación de este fenómeno en los amplificadores de clase C. En un amplificador de clase C, el transistor amplifica mucho muchísimo la señal, pero sólo durante un tiempo que no cubre ni medio ciclo. Produce una distorsión muy desagradable y no sirve para audio. Pero ¿y si quisiéramos amplificar una frecuencia en concreto, para radio por ejemplo? Si lo acompañamos de un circuito tanque (un circuito LC paralelo) que resuene a la frecuencia que queramos pasará como con la copa: que el circuito resonante recompone el resto de la sinusoide que no amplificaba el transistor. Tendremos una amplificación muy eficiente, a cambio de limitarnos a una sola frecuencia.

  •  Lo otro es que la copa vibra (lo habíamos dicho), y vibra más cuanto mayor es la amplitud de la señal aplicada (obvio), y si subimos el volumen lo suficiente vibra tanto que se rompe. Seguro que todos habéis oído eso de romper una copa con la voz. Pues sí, es posible, con una nota que coincida con la frecuencia de resonancia, siempre que se cante a suficiente volumen la copa se parte. De hecho hay un episodio de Mythbusters donde hacen la prueba. ¿Por qué? Pues porque lo que se forma en el cristal es una onda estacionaria y cuando la amplitud del desplazamiento sobrepasa la flexibilidad del cristal, pues se parte.
En el sonograma veis un tono de 1160Hz y varios armónicos (nombrados A1 -fundamental-, A1b, A1c, etc.). Me hubiera gustado ofreceros una sinusoidal pura, pero no tenía altavoces amplificados y tuve que improvisar con un altavoz de mierda y un LM386. Como veis la copa también es sensible a los armónicos pero sólo si la forzamos y, mucho menos que a la fundamental. Por eso no se aprecian en la respuesta a impulso.

Por cierto, al final del post pongo un enlace a los archivos wav. Si reproducís al revés la explosión obtendréis un impresionante efecto "peli de misterio".


Espectroscopia

Hagámoslo más interesante. Antes hemos dicho que se podía intuir la composición de una muestra viendo su espectro de emisión. Es una consecuencia de que el sonido y la luz son ondas, y como tales cumplen el principio de superposición.

Tengo un sistema compuesto de tres copas, llamémoslas A (la que hemos usado antes), B y C. Cada copa tendrá unos picos de emisión, esos los nombraremos con un número correlativo. En el siguiente sonograma vemos los picos excitando cada copa individualmente para ver su espectro característico y después todas al mismo tiempo para ver el espectro completo del sistema.


Antes de nada recordar que lo que estamos viendo no es un espectro de emisión, es un sonograma. Los picos no son picos, sino prolongaciones de esa frecuencia en el tiempo posterior a la excitación. Aún así hablaré de picos por comodidad. Realmente se parece más a una Resonancia Magnética (RMN), pero no quiero complicar más la entrada.

Varias cosas interesantes:
  • El espectro conjunto es la suma del espectro de cada copa por separado. Lo que muestra que no hay interacción de una copa con las demás. Así, si tenemos una base de datos con los espectros de todos los modelos de copas que tenemos en casa y nos dan el espectro de un grupo de ellas, podemos decir exactamente de cuales se componía. Extrapolad esto a cientos de miles de moléculas conocidas y sabréis cómo se identifican dentro de una muestra.
  • Los picos C2 y B2 tienen una frecuencia muy cercana. Por eso cuando excitamos cada copa de forma independiente la frecuencia que emite el uno hace también vibrar al otro. Pero aquí ocurre algo muy interesante, porque fijaos en esta imagen ampliada:


He sacrificado definición de la imagen en favor de que se vea más claro lo siguiente. Cuando golpeamos la copa B, oímos el golpe, que como ya hemos dicho se compone de todas las frecuencias, bueno de todas no. Resulta que el sonido de B tiene que atravesar C para llegar al micrófono, así que C absorbe la energía en su frecuencia C2 e instantes después la vuelve a emitir. En esta imagen no se ve cómo la emite, para verlo tenéis que mirar la anterior.

  • El pico A3 parece que esté dividido en dos muy próximos. En efecto al menos los picos A2 y A3 se desdoblan. Es algo común en espectroscopia, y pueden deberse a una acción externa (como el efecto Zeeman o el efecto Stark), pero aquí seguramente se deba a defectos en el material. Estos son los picos anteriores ampliados. Se necesita estrujar la FFT para obtenerlos y no se ven del todo bien.




Espectro completo de A

Para terminar, os dejo el espectro completo de A hasta los 15.000Hz. Espero que hayáis encontrado este artículo tan interesante como yo.


Como siempre, podéis encontrar los ficheros utilizados en esta entrada aquí.
Artículo completo >>

Descifrar las contraseñas guardadas de Opera

Así como en Firefox tenemos la opción de mostrar una contraseña guardada, en Opera no existe esa posibilidad. En alguna ocasión puede ser útil extraer la lista de las contraseñas guardadas. Como Opera no es open source no conocemos el algoritmo de cifrado, lo único que está claro es que, de alguna manera, si el navegador tiene acceso a esa información es que el cifrado debe ser reversible.

Gracias a SNA de Reverse Engineering Team, tenemos una herramienta capaz de descifrar las claves. El código fuente original lo podeis encontrar aqui. Compila sin problemas en Windows según el autor; pero no en Linux, donde se necesitan unos ligeros retoques. A continuación explico los cambios:

La ruta de las cabeceras en Linux es un poco distinta:
#include "md5.h"
#include "des.h"

por
#include <string.h>
#include <openssl/md5.h>
#include <openssl/des.h>


Y además, por la razón que pongo abajo:
std::wcout << (wchar_t *)cryptoData << std::endl;

por
// Quick and dirty workaround to convert UTF chars.
int i=0;
while(cryptoData[i]) {
    printf("%c", cryptoData[i]);
    i += 2;
}
std::wcout << std::endl;

Los carácteres se almacenan en formato widechar, lo que en términos prácticos y para caracteres estándar significa que para poner Hola se almacena H\0o\0l\0a\0 (intercalando un carácter nulo tras cada letra). Que dará problemas o no dependiendo de la configuración del terminal. Puede ocurrir que salgan bien, o que sólo salgan interrogaciones o que sólo aparezca la primera letra de cada palabra, incluso podrían salir caracteres chinos. Así que para evitar estos efectos eliminamos los caracteres nulos intercalados. Es una manera simple de hacer la conversión, y que sólo funciona para caracteres ASCII. En caso de caracteres no estándar lo anterior no es cierto.

Para compilarlo utilizamos el siguiente comando:

c++ unwand.cpp -lcrypto -o unwand

Necesitaremos instalar la librería OpenSSL (libssl) si no la tenemos ya instalada y sus correspondientes cabeceras (libssl-dev). Lo ejecutamos y el programa explora el archivo Wand volcando todos los bloques de información que pueda descifrar. La salida, semejante a esta, puede ser difícil de leer pero al menos tenemos lo que buscábamos.

> unwand wand.pruebas.dat
Personal profile                <- Cabecera del fichero
Ecom_SchemaVersion              <- Tipo de base de datos
http://www.ejemplo.com/login    <- Pagina
http://www.ejemplo.com          <- Dominio completo
user                            <- Campo formulario
Pepito                          <- Valor del campo
password                        <- Campo formulario
f4k3p4$s                        <- Valor del campo
...


Para encontrar el archivo wand.dat podemos escribir en la barra de direcciones about:config y acto seguido buscar wand:


Ni que decir tiene que este programita sólo será útil si no hemos establecido una contraseña maestra. Lo he probado con las versiones 9 y 10 para Linux y para Windows, con el resto debería funcionar también. A menos que cambien el algoritmo en el futuro. Encontraréis el archivo adaptado para Linux, junto con un fichero wand.dat para pruebas y el ejecutable ya compilado en este enlace.
Artículo completo >>

Reutilizar el motor de un lector CDROM

Hoy tenemos un lector de CDROM para desguazar. Es un tanto antiguo, pero eso nos favorece. Como ya os podéis imaginar mientras más moderno es un cacharro, mayor grado de integración y más complicado es reutilizar sus componentes.

Lo que me propongo es hacer funcionar el motor principal del CDROM, el que gira el disco a tropecientasmil revoluciones por minuto. Este tipo de motores son complicados de usar, ya que son prácticamente motores de AC trifásicos sin escobillas. Estos se componen de varias bobinas (generalmente 9) conectadas en triángulo, o también llamada configuración delta. En oposición a la configuración en estrella (wye) que permite un mayor torque a bajas velocidades, la configuración en triángulo permite más revoluciones, a costa de un arranque más lento. Además de las bobinas tienen algunos sensores de efecto Hall para determinar en qué posición está el rotor. Otro día haremos experimentos con estos sensores.


El truco es alimentar las bobinas en su momento oportuno o mejor, con un determinado desfase, pero NO es un motor paso a paso. Buscando por Internet encontraréis esquemas y proyectos que utilizan un micro para aplicar corriente alterna a las bobinas. El problema es que estos chismes están diseñados para funcionar con una señal sinusoidal y no cuadrada. Además si no usamos los sensores Hall seguramente no excitemos cada bobina a tiempo y tendremos unas pérdidas de aúpa.


Dentro de los diversos tipos que hay, podemos distinguir los que efectivamente cuentan con sensores Hall, y los que se sirven de la tensión inducida en las bobinas que en cada momento no estén activas, o miden la Fuerza Contraelectromotriz de cada bobina.

El caso es que si queremos un circuito para alimentar al motor con el que podamos variar la velocidad de rotación y que sufra lo menos posible, los esquemas se complican. ¡Pero el motor funcionaba cuando estaba montado en su placa!


Secuestrar el driver
La solución técnicamente óptima es usar el propio driver que tenía la unidad lectora. Se tratará de un integrado como este:


Encontrar su datasheet es una tarea de chinos (a veces literalmente). Cada fabricante usa su propia referencia que no encontraréis en Google, o si la encontráis entenderéis por qué digo lo de chinos. Pero en realidad sólo hay un puñado de integrados diferentes y el resto son más o menos equivalentes. Buscad "spindle motor driver datasheet" y bajaos unos cuantos modelos. Después quedaos con la hoja que mejor se adapte al circuito que tengáis, en base a:
  • Número de patillas, forma y aspecto del integrado.
  • ¿El motor tiene sensores hall o no? Si los tiene, el driver debe incluir patillas para estos.
  • ¿Hay más motores que controle ese driver? Algunos integrados también llevan el motor del pick-up o de la bandeja. Si veis que esos motores van a parar al mismo integrado, debe indicarse en el datasheet.
  • Por último, casi todos los datasheet incluyen un ejemplo de aplicación. Y los fabricantes no le echan mucha imaginación, comprobad que en buena medida se corresponden.

En mi caso descubrí que la referencia que veis arriba se corresponde con el patillaje del KA3020D. Cuyo datasheet podéis encontrar aquí. Y este esquema de ejemplo es muy parecido al que veo en la placa -es difícil asegurarlo, teniendo en cuenta que los componentes son SMD y el PCB tiene varias capas-.


Lo que vamos a hacer es, manteniendo el circuito soldado a la placa y sus componentes afines (alimentación, conectores, etc) tomaremos el control de algunas líneas. Las desconectaremos del microcontrolador principal y podremos controlar nosotros el motor. Para este propósito secuestraremos las siguientes líneas:
  • Start / Stop: Nos servirá para encender y apagar el motor.
  • Short Brake: Cuando está patilla se lleva a nivel alto, el driver aplica tensión a todas las bobinas por igual, frenando el motor. Esta no es la mejor forma de bajar gradualmente las revoluciones, pero  dependiendo de la inercia de la carga y su velocidad, frenar utilizando torque inverso (lo vemos debajo) obliga al integrado a aguantar una corriente elevada hasta detener el motor, y puede calentarse más de la cuenta.
  • Ecr: Tensión de referencia.
  • Ec: Torque aplicado. Al variar esta tensión respecto a la de referencia, el integrado aplicará más o menos tensión al motor variando la velocidad. Cuando se aplica una tensión menor a Ecr el driver aplica un par de frenado (o torque inverso), que es menor que si aplicáramos la patilla de freno.


Con estas 4 líneas podemos aprovechar el driver mientras aún está en la placa del CDROM. Basta con aplicar tensión a la placa procedente de una fuente de alimentación para PC y conectar nuestras líneas secuestradas:
  • Start/Stop a +5V.
  • Brake a 0V.
  • Ec: a 2.5V.
  • Ecr: potenciómetro para regular la velocidad. La velocidad es proporcional a Ecr - Ec.


Determinar la velocidad de rotación
Ahora que somos dueños del motor, nos interesa saber la velocidad que alcanza a la máxima potencia. Hay muchas formas de medir esto, una que tenía más a mano es usar la tarjeta de sonido y el programa Xoscope. Si pudiéramos oír un 'tic' en cada vuelta del motor, sería inmediato determinar el periodo de rotación, y con él las RPM.

Para oir ese 'tic' sin frenar el motor -eso es importante- atamos un hilo corto al eje y lo ponemos en marcha. Parte del hilo se enrollará mientras el extremo queda rotando con el motor. Ponemos una hoja de papel de forma que el hilo la toque de refilón en cada vuelta y visualizamos la señal en el PC.


En la imagen se aprecian picos de mayor amplitud (fruto del toque contra la hoja) y otros de menor amplitud, que no son otra cosa sino ecos del primero ya que el golpe contra la hoja no es seco. Medimos el periodo entre dos picos 'altos', y obtenemos 5056us. Lo que nos da un periodo de 197 vueltas por segundo o unas 11800 revoluciones por minuto.

En esta tabla (tomada de Wikipedia), podemos ver la velocidad de giro en relación a la velocidad de lectura. El nuestro era un lector x52 por lo que esperaríamos un resultado de 10400 rpm. No obstante hemos obtenido más; es justo pensar que la limitación de x52 no está en el hardware que hace girar el CD sino en la misma circuitería del lector, además estamos girando en vacío, sin carga alguna por lo que esperamos más revoluciones.


Discos de color
Hay algunos experimentos curiosos con discos que giran. Aprovechando esta entrada os voy a hablar de dos: el disco de Newton y el disco de Benham.

El disco de Newton, como podéis ver debajo tiene varios colores pintados de tal forma que al girar da la sensación de ser blanco. Simplemente por la suma aditiva de luces. Con un prisma vemos que la luz blanca está compuesta por varios colores, aquí vemos el efecto contrario, componemos esa luz blanca a base de superponer colores a una velocidad mayor que el refresco de la retina.


El disco de Benham me resulta mucho más curioso. Se trata de una ilusión óptica por la cual un disco con un determinado diseño, pintado únicamente con tinta negra sobre fondo blanco, produce al girar la sensación de estar coloreado. Hay varios diseños, este que os pongo aquí es el que me ha dado mejor resultado.


Hay mucha información en Internet sobre ambos fenómenos y os animo a seguir investigando.
Artículo completo >>

Decodificacion del protocolo RC5 usando un PIC

Dicen que la gran mayoría de los mandos a distancia infrarrojos que tenemos por casa funcionan usando la codificación RC5. En mi caso, de nada menos que 7 mandos analizados, 2 son Sony y el resto usan la codificación NEC o similares. Pero hoy voy a hablar del RC5.

Empecemos por lo básico, los impacientes pueden saltarse la intro.

Transmisión
Los mandos a distancia funcionan transmitiendo al receptor un código binario. La longitud en bits del código depende del formato, pero en ese código ciertos bits indican el aparato y otros la función. El aparato (o identificador) indica a qué electrodoméstico va destinada la orden (TV, TDT, DVD...), mientras que la función indica cuál es la orden. El identificador no es único, en el sentido de que es el mismo para todos los aparados de una misma marca y modelo. Por regla general el aparato es siempre el mismo para todos los botones del mando, y cada botón está identificado por un código que es el número de la función.

Puede ocurrir que una marca use el mismo formato que otra, y además dé a casualidad de que ambas marcas han elegido los mismo códigos de identificación y de función que otra, en ese caso podemos usar el mando de una con la otra. Pero habitualmente la concordancia no es total:
  • Si sólo coinciden las funciones da lo mismo, porque el receptor no va a hacer ningún caso códigos que no vayan destinados a él.
  • En cambio, si sólo coincide el código de identificación pero las funciones son distintas. El receptor obedecerá una orden que no iba para él, llevándole a ejecutar a saber qué función, y por eso cuando subimos el volumen de la tele, se apaga el DVD.
Para transmitir el código y que el receptor pueda distinguirlo del ruido de ambiente se usa una portadora que está entre 36 y 40kHz. Un módulo especial se encarga de detectar y demodular tal frecuencia, así transforma la señal recibida en niveles lógicos que pueden interpretarse luego mediante un micro.

La forma de codificar un 1 o un 0 en esa portadora es lo que diferencia el formato. Veamos como es en el caso de RC5.

Modulación RC5
La modulación que emplea el formato RC5 es una codificación Manchester, que se emplea también en algunos tipos de redes. En el enlace dela Wikipedia que os doy lo explican mucho mejor de lo que yo sabría hacerlo.

El protocolo RC5 se compone de:
  • 2 Bits de start, siempre a 1. Sirven para que el módulo receptor ajuste su ganancia respecto al ruido de fondo. Además el receptor puede usarlos para sincronizar su señal de reloj.
  • Un bit de toogle. Cambia de 1 a 0 y de 0 a 1 cuando se pulsa el mismo botón dos veces seguidas. A diferencia de otros protocolos, los mandos RC5 repiten el mismo código íntegro cada 114ms. Viendo el estado de este bit el receptor sabe si el usuario ha levantado el dedo y lo ha vuelto a pulsar. Útil para los botones que tienen una función y la contraria como encender/apagar, silencio/voz, canales 1_/1, etc.
  • 5 bits de identificación, también llamados address. Como ya hemos dicho sirven para indicar a qué aparato nos dirigimos.
  • 6 bits de comando,indican qué botón se ha pulsado.
  • Este protocolo no tiene un último bit de stop.
En total son 14 bits.

En esta pagina web hay unas imágenes muy buenas de cómo funciona la modulación RC5 y otras:
All bits are of equal length of 1.778ms in this protocol, with half of the bit time filled with a burst of the 36kHz carrier and the other half being idle. A logical zero is represented by a burst in the first half of the bit time. A logical one is represented by a burst in the second half of the bit time.

Vamos a la práctica

Supongamos que recibimos un tren de impulsos como este:
No es un código RC5, ya que sólo consta de 5 bits de datos, no 11 y además uno de parada, pero la modulación es similar. Con un micro ¿cómo transformamos eso a unos y ceros?

Hay varias formas. La más utilizada y más sencilla es tomar el tiempo de cada bit, que en teoría son 1778ms y dividirlo en dos. Ahora comprobar el nivel del puerto en una de esas mitades, supongamos que en la segunda mitad. Si la segunda mitad es un nivel alto se trata de un 1, de lo contrario es un 0. Si cogiésemos la mitad primera sería al revés: un nivel alto nos indicaría que se está transmitiendo un cero. Este proceso tiene varios inconvenientes, por ejemplo:
  • Frecuencia de reloj inexacta. Si el transmisor o el receptor sufre una deriva temporal, es posible que empecemos bien pero erremos los bit finales.
  • Inversión de los bits. Por lo general los módulos decodificadores TSOP invierten los bits, es decir, su salida está a nivel alto continuamente salvo cuando reciben una portadora de 36kHz (la frecuencia depende del modelo) que ponen su salida a 0. Esto puede dar lugar a confusión.
  • Exige una interrupción periódica. A veces no podemos permitirnos usar un temporizador de micro sólo para esto y el desarrollo se complica.
Forma de decodificación alternativa

La rutina que quiero presentaros funciona de otra manera. El uso de un temporizador es opcional y sólo precisa una interrupción de cambio de estado para el pin en concreto.

Si miramos la imagen de arriba, la idea principal es que cuando cambiamos de 1 a 0 y viceversa transcurre el doble de tiempo que si continuamos con el mismo valor. Además si seguimos con el valor anterior ya fuera 0 o 1 se producen 2 interrupciones.

La línea superior en la imagen indica con un punto numerado el lugar de cada transición. Por orden numérico:
  1. Partimos de 0, así que esta primera transición la tomaremos como a marca de cambio a 1. Anotamos un 1.
  2. Se produce en un tiempo t, no es más que una marca de confirmación del valor anterior, o sea 1. Como se trata de una señal de las llamadas self-clocking, habrá transiciones que no porten datos. No hacemos nada.
  3. Como sólo transcurre t, indica que continuamos con el valor anterior, es una marca de continuación. Anotamos otro 1.
  4. Aquí pasa un intervalo 2t, significa una marca de cambio, el bit anterior era 1 luego este será un 0. Anotamos un 0.
  5. De nuevo intervalo 2t, marca de cambio: Estábamos con 0 así que anotamos un 1.
  6. 2t, marca de cambio: anotamos un 0.
  7. Sólo t, marca de continuación del valor anterior: anotamos un 0.
  8. Sólo t, marca de confirmación, no hacemos nada.
  9. Marca de cambio: anotamos 1.
  10. Marca de confirmación: nada.
  11. 1.
  12. 0.
  13. 1. Aquí pararíamos, porque con este ya hemos recibido nuestros 10 bits. En el caso de RC5 son 14 bits.
  14. nada.
El número decodificado es 1101001101. Lo que signifique ya vendrá luego. La máquina de estados sería algo así:


TiempoEspera conf.Marca deAccion
t No Continuación Anotamos el mismo valor anterior y pasamos a esperar marca de confirmación.
t Si Confirmación No hacemos nada. Tan sólo dejamos de esperar la confirmación.
2t No Cambio Anotamos el valor opuesto al último recibido.
2t Si ERROR ERROR de transmisión. La marca de confirmación siempre llega en un tiempo t.



Para obtener el periodo de reloj podemos valernos de que cada transición se da en t o en 2t, en concreto durante los 2 bits de start se producen 3 transiciones t pues sabemos que esos bits siempre están a 1.


Esta entrada me está quedando demasiado larga. Voy a parar aquí y dejo la programación para más adelante.

Actualización: El código para implementar este algoritmo se describe en http://electronicayciencia.blogspot.com/2011/01/programacion-pic-para-decodificar-rc5.html
Artículo completo >>