viernes, 22 de octubre de 2010

openQRP: firmware del PSoC

Hace unos meses había hablado de los kits de Steve - K1EL http://www.k1el.com/, en concreto el kit "K40 CW Reader Module" y su proyecto de transceptor abierto http://openqrp.org/

Una de los componentes del proyecto openQRP es un microcontrolador PSoC. Steve tiene previsto liberar el código fuente del PSoC en los próximos días, por lo que será una buena oportunidad para la experimentación. La descripción del firmware está disponible en la página del proyecto http://openqrp.org/?page_id=94 en inglés la cual traduciré directamente a continuación:

He pasado los últimos días preparando la entrega del firmware del PSoC. El micro-controlador PSoC se responsabiliza de varias tareas importantes. La primera es la decodificación de código Morse; y no solamente el código introducido por el operador con el manipulador, sino que tambíen puede decodificar el código recibido por la radio. Además, el PSoC proporciona un indicador de nivel de la señal en tiempo real que se muestra en un gráfico de barras en la pantalla LCD del transceptor openQRP. Esta característica se utilizará para sintonizar estaciones que emiten en CW para su decodificación y para proporcionar una indicación del nivel relativo de la señal.

La mayor parte del tiempo la he pasado en la limpieza y añadir comentarios del código fuente para que sea más legible y entendible por otros. Mientras realizaba este trabajo he descubierto varias maneras de mejorar la exactitud del decodificador. Funciona muy bien para un único chip de 8 pines con una frecuencia de reloj de 24Mhz. He podido recibir a W1AW esta tarde al 100% lo que no había podido realizar anteriormente.  Ahora el decodificador es capaz de procesar velocidades mayores de 40 palabras por minuto. Todavía hay margen para la mejora en especial en lo relacionado a la inmunidad al ruido, pero en conjunto estoy muy feliz con el resultado y espero con inquietud que otros lo ensayen.

PSoC significa "Programmable System on Chip" y es una invención de Cypress MicroSystems. Estos dispositivos están disponibles en muchos tamaños y variedades y se utilizan en el iPod, portátiles, sistemas embebidos, etc; la lista es interminable. El decodificador de CW que aquí se presenta, no es un trabajo desarrollado exclusivamente por mí. La idea surgió de una nota de aplicación publicada por Cypress en 2003 cuando el PSoC era relativamente nuevo. Esta nota de aplicación fué escrita por Melchor Varela - EA4FRB y merece la pena leer para obtener una comprensión básica de como funciona el decodificador. Comencé con el trabajo de Melchor y he utilizado el detector de tonos con pequeñas modificaciones. Posteriormente he reescrito la sección de decodificación de Morse escrita en C, basándome en decodificadores CW que había escrito anteriormente. Es un decodificador bastante bueno, pero sin duda puede ser mejorado. He utilizado solamente 1/4 del espacio de memoria del PSoC por lo que hay mucho espacio disponible para añadir inteligencia adicional al algoritmo de decodificación.

El diseño completo está contenido en un directorio que se puede almacenar en cualquier lugar del disco duro. Recientemente he actualizado el proyecto para que compile con la última versión del PSoC Designer generosamente suministrado por Cypress MicroSystems para su descarga gratuita. Para ello, será necesario registrarse y proporcionar una dirección de e-mail y alguna información adicional. Antes de ir demasiado lejos, comentar que esta no es una tarea para todos. La arquitectura del PSoC es bastante compleja y requiere un conocimiento tanto de electrónica digital como analógica. Además se necesita de un programador para programar los micros. La única fuente es Cypress, y el coste más bajo es de $185 US. Pero el PSoC es digno de aprender, puesto que se pueden realizar muchas aplicaciones.

Como he mencionado anteriormente, he utilizado el decodificador de tonos de Melchor para extraer la energía a la frecuencia central de 690 Hz. Esto se ha realizado por medio de un correlador de cuadratura. Parte del audio recuperado por el receptor se envía al PSoC donde pasa a través de dos filtros paso-banda que están sintonizados ligeramente asimétricamente uno de otro a 660 y 720 Hz. Esto reducirá ligeramente los efectos de zumbido de dos filtros de capacidades conmutadas en cascada. Después del filtrado, la señal se convertirá a formato digital por medio de un convertidor analógico digital produciendo una muestra cada 181 uS. El seno y el coseno de estas muestras se envían al correlador de cuadratura el cual efectivamente observa 8 muestras consecutivas y determina si esas muestras cumplen con el criterio para una señal a 690 Hz. Cuanto más cerca esté la señal a 690 Hz, mayor será la amplitud de salida del correlador. A continuación la señal se somete a un efecto de histéresis importante para filtrar los desvanecimientos y pulsos de ruido. En este punto, vamos a tener una amplitud de señal que se incrementa en valor cuando están presentes los puntos o rayas o sin señal en su ausencia. el nivel de señal es evaluado de tal forma que un valor por debajo de un nivel se ignora, y si el nivel de señal está por encima de un valor se considera una señal válida. A continuación los intervalos de señal se cronometran y se determinan la longitud de los intervalos por medio de un filtro de promedio. Finalmente, utilizando un valor de umbral para la longitud de los puntos/raya, los puntos se separan de las rayas y se cargan en un registro de desplazamiento. Los caracteres se envían cuando se detecta un espacio más largo entre los elementos. El byte digital resultante se busca en una tabla y para convertir el carácter Morse en ASCII. Este es enviado a la CPU Arduino y posteriormente mostrado en la pantalla LCD.

Algunos retos a los que se enfrenta el decodificador

El correlador en cuadratura funciona bien en condiciones de banda tranquila, pero los efectos de ruido y de desvanecimiento lo hacen difícil. Si bien la histéresis funciona bien, realiza un desplazamiento en el tiempo de la señal lo que la hace vulnerable a la distorsión. Una mejor manera podría ser filtrar los valores de salida del correlador de cuadratura con un umbral variable señal/pausa basado en un nivel de señal medio en lugar de un valor fijo.

El siguiente desafío es la adaptación a los diferentes estilos de manipulación que los operadores utilizan. Decodificar W1AW o cualquier máquina que genera CW es bastante fácil, se sabe que la raya es tres veces el ancho de un punto mientras que el espacio entre puntos y rayas es del ancho del punto, salvo el caso de un espacio entre caracteres (ancho de 3 puntos) o palabras (ancho de 7 puntos). En el mundo real uno se encuentra con todo tipo de cosas, los caracteres se juntan o se extienden, relaciones de punto/raya personalizadas, es el salvaje oeste. Hay maneras de hacer que un decodificador se adapte al estilo de envío del operador en tiempo real mediante el análisis y registro de diferentes intervalos de interés y utilizándolos como reglas para decodificar los caracteres. He empezado a trabajar en esto pero se complica con rapidez.


© EA4FRB - Melchor Varela 2010, Todos los derechos reservados

No hay comentarios:

Publicar un comentario