Mostrando las entradas con la etiqueta Experimentos. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Experimentos. Mostrar todas las entradas

martes, mayo 15, 2012

Reconocimiento de voz con AVR de 8 bits


Desde hace unas semanas estoy trabajando en un experimento que espero se convierta en proyecto.

El objetivo es dotar del poder del entendimiento del habla a un robot que estoy armando, muy lentamente, con microcontroladores AVR de gama baja (ATMega8/16/128).

Estos micros poseen entre 0.5KB a 4KB de Memoria SRAM y entre 8KB a 128KB de Flash corriendo de unos pocos Mhz, el reconocimiento del habla típico en PCs requiere de una cantidad de memoria considerable y de una velocidad de proceso de varios GHz.

Debido a estas restricciones me limitaré a reconocer una x cantidad de comandos de voz, como podrían ser "Avanzar", "Retroceder", etc, o bien dígitos, "1", "2", etc.

Bien, comienzo esta locura de experimento y espero llegar a algo.. :D

La voz humana


La voz de una persona se emite en un rango de frecuencias entre 60Hz a 7000Hz, sin embargo podemos considerar que las frecuencias más usuales están entre los 120Hz a 2000Hz. Para capturar este  espectro de frecuencia por la teoría de Nyquist se debe hacer muestras a por lo menos el doble de rápido que la frecuencia más alta de la señal, por lo que nos da unos 4000 muestras por segundo.

El éxito de este experimento estará en lograr esas 4000 muestras/segundo con un uC a, digamos, 16Mhz.

Bueno lo primero que hice fue abordar el problema por partes, he aquí la primera parte, la analógica.

Filtro de frecuencias
Implementé esto en la protoboard, digamos que se trata de un amplificador operacional cuádruple (LM324N) con un filtro pasa alta a la entrada y un pasa bajos a la salida.


Alimenté el circuito con 5v y me puse a disfrutar como bailaba la gráfica en el osciloscopio mientras pensaba como digitalizar esa importante cantidad de información analógica, entonces activé la función Math del osciloscopio, puse FFT y salió esto:

Aquí digo "UNO"

Y aquí "DOS"

En la web encontré una implementación de la FFT (Transformada Rápida de Fourier) escrita por ChaN.

Y hasta aquí llegué por ahora, voy a probar la biblioteca de FFT e intentaré capturar/procesar los valores del ADC, si lo logro el paso siguiente será determinar el comando dictado, ahí el truco estará en hacerlo por correlación (estadística), alguna red neuronal, o ... ya se verá..

18/05/2012 - Captura y procesamiento de ADC

Realicé una prueba sencilla conectando la salida de audio a la entrada ADC0 de un ATmega8A ejecutandose a 16Mhz, con una referencia de voltaje de 5v y enviando datos de captura por puerto serie a la pc.
La velocidad del AVR es más que suficiente para cubrir con la tarea del sampleado, la biblioteca FFT en uso a 64 puntos(muestras) permite un throughput de hasta 19kbps con un tiempo de procesamiento de 3.4ms.
Estos 64 puntos los sumé en un vector de 32 bytes (la mitad útil del resultado de la FFT), la suma la realizo 20 veces y envío el vector de sumas por puerto serie.
Desde la PC tiré los valores a una planilla de cálculo con un gráfico simple que muestra el espectro de audio (de las sumas en realidad).
Capturé los valores de diferentes palabras y estos son los gráficos resultantes, los colores que corresponden a cada uno de los conjuntos obtenidos son:

UNO

DOS

ADELANTE

RETROCEDER



Nota: Aunque la línea azul (dato 1) parezca similar en algunas gráficas, es muy diferente (ver la escala del eje y).

Para hacer el código de la correlación usando tipos de datos flotantes el ATmega8 me queda corto de memoria, voy a tener que armar una plaquita para un ATmega16/32 o 128.

Como pensaba el reconocimiento es totalmente factible utilizando una correlación estadística o una red neuronal.


23/05/2012 - Prueba 001 - Clasificación por distancia

La prueba fue relativamente exitosa (~70% de acierto), como se puede ver en este video:
Lo que está funcionando es un muestreo a 7800Hz, recolectando 16 muestras del espectro (salida del FFT) y su respectiva comparación por distancia con respecto a un patrón almacenado en la flash (atributo PROGMEM en AVR). Como se puede ver depende mucho del tono, duración de la palabra, ruido, etc, estos factores son los que espero mejorar con el algoritmo de redes neuronales del modelo oculto de Markov.


Continuará...

lunes, agosto 15, 2011

Ethernet, te encontré!

Si bien la conectividad nació por los 70's con los proyectos ALOHA y ARPANET pasando por mejoras diversas hoy disfrutamos los beneficios de esta conectividad a todo, por tierra, aire, en un avión, etc, quien escribe recién hace un par de días pudo dar su primer paso con un PIC18F252 y un ENC28J60.

Experimento:
Montando sobre proboard el integrado que maneja la capa física y de acceso al medio (MAC), un conector RJ45 de dudosa calidad operativa, :), un router wireless y la multiboard logré levantar una conección telnet desde un celular con Android y encender/apagar una lámpara.

En el pic está corriendo una suerte de servidor TCP escrito en Jalv2.

Video:



En el celular ingreso

.[actuador][estado]#

donde

. indica inicio del "paquete"
[actuador] = a indica actuador 1, b actuador 2, etc
[estado] = 1 encender/0 apagar
# indica fin del paquete

26-08-2011 - Módulo ENC28j60 para Multiboard







viernes, septiembre 24, 2010

Hacer PCBs con burbujas

Un tanque para atacado de pcb con burbujitas










Ideal para los que quieren ahorrar calorías jeje


3 de Noviembre

Video usando el tanque de burbujas

miércoles, agosto 18, 2010

Motor monopolo cargador de baterías

Estuve leyendo sobre el proyecto de Bedini, un motor monopolo que crea una fuerza contra-electromotriz utilizado para cargar baterías.

La patente del señor este esta:
http://patft.uspto.gov/netacgi/nph-Parser?patentnumber=6545444

Uno de los diseños muestra esto:


El funcionamiento sería algo así, cuando se cierra S1 se energiza la bobina de forma alternada (usando un transistor y un diodo) y se le da impulso al plato con imanes permanentes, se produce un colapso del campo magnético que induce una fem sobre 13c la cual se rectifica y se almacena con el condensador 24, la energía que entrega ese circuito recarga otra batería de 12v.



Poniendo manos a la obra, ya tengo los imanes de neodimio y como base giratoria voy a usar un motor de disco rígido y su plato.




Continuará...

miércoles, febrero 10, 2010

Reparando un router wireless WRT54G

Cuando un amigo del trabajo me comentó que su router (enrutador de paquetes casero, wireless), dejó de funcionar pensé que sería buena idea ofrecerme para revisarlo y ver si podía hacer algo mágico ;)

Se trata de este router


Todo estaba impecable, menos de un año de uso y sin embargo el aparatito le dejó de funcionar, que raro es todo...

Mi amigo me cuenta que intentó seguir una guía de internet haciendo un corto en los pines de la memoria flash, dudando del método reviso el datasheet (modelo MBM29LV160) y parece que fuera correcto, aunque ello no solucionó el problema.

Esto versa en el datasheet
The MBM29LV160T/B also has a hardware RESET pin. When this pin is driven low, execution of any Embedded
Program Algorithm or Embedded Erase Algorithm is terminated. The internal state machine is then reset to the
read mode. The RESET pin may be tied to the system reset circuitry. Therefore, if a system reset occurs during
the Embedded Program Algorithm or Embedded Erase Algorithm, the device is automatically reset to the read
mode and will have erroneous data stored in the address locations being programmed or erased. These locations
need re-writing after the Reset. Resetting the device enables the system’s microprocessor to read the boot-up
firmware from the Flash memory.



Es decir, hay que seguir investigando, entonces procedo a abrir el aparato y veo que los pines sufrieron bastante daño con el método de "pinchar cablecitos".


Luego de leer, estudiar, leer y luego leer más las siguientes páginas:
http://www.dd-wrt.com/wiki/index.php/JTAG
http://www.dd-wrt.com/wiki/index.php/Recover_from_a_Bad_Flash
http://www.tiaowiki.com/w/Debrick_Routers_Using_JTAG_Cable
https://www.underground.org.mx/index.php?topic=23308.0

Decido que voy a intentar con el armado del cable JTAG, tomar una vieja PC pentium IV con puerto paralelo y SO ubuntu, recompilar el programa de HairyDairyMaid (aka lightbulb), etc

Pero primero lo primero, soldar los pines la placa para el conector JTAG


Luego armar el conector con las instrucciones de lightbulb


Luego de realizar un backup de toda la memoria flash tuve que actualizar todos los bloques
CFE (actualizando la MAC address)
KERNEL(le puse un DD-WRT ya que el de linksys no funcionaba)
NVRAM (la borré directamente)




Pero, nada de todo esto funcionaba hasta darme cuenta que el router no asignaba la IP a mi pc, entonces la establecí de forma fija:
IP: 192.168.1.2
MASK: 255.255.255.0
GW: 192.168.1.1

El router se conectó correctamente, acto seguido con el utilitario tftp

tftp 192.168.1.1
bin
put dd-wrt.bin

Luego de unos minutos el router salió funcionando con el nuevo kernel, mi amigo se salvó de pagar uno nuevo y a mi me salió otra cana.



Importante:
Esta no es una guía para hacer un "debrick" o recuperar un router, consultar a las páginas mencionadas.
Cualquier acción incorrecta sin conocimiento necesario puede dejar vuestro router inutilizable.

jueves, marzo 05, 2009

Calculadora Científica-Gráfica con PIC


En uControl estoy metiendo manos en un proyecto basado en el PIC 18F4550 capaz de realizar todas las operaciones de una calculadora científica/gráfica como esta:



Por ahora está definido la placa principal con un display de 128x64 pixeles, conexión por USB.

En un futuro, no muy lejano, integrará funciones de estadísticas y de esta manera ampliará la funcionalidad de la misma.

En el foro de uControl puedes ver los avances del proyecto y a medida que tenga diseños, códigos, etc., los voy a publicar también en este humilde blog.


UControl: http://www.ucontrol.com.ar
Foro de la calculadora: http://www.ucontrol.com.ar/forosmf/index.php?topic=446.0


Mi diseño:





Esta es la placa del amigo Ariel:

lunes, febrero 16, 2009

Conección usb-serial con PIC 16F628

Buscando en la red un tarjeta de entrenamiento para microcontroladores encontré la RRBOARD2 y de inmediato quedé alucinado con sus características.

La RRBOARD2 (creada por RedPic para el 16F877), que la pueden encontrar en picmania.garcia-cuervo.net es un sistema modular de entrenamiento de PIC y sirve para todo tipo de propósitos, además de que es muy flexible en el momento de reconfigurar pines (por ejemplo), allí es donde fallan las tarjetas entrenadoras grandes (y bastante caras por cierto).

Así que me interné por dos semanas (en mis vacaciones) haciendo una adaptación de la RRBOARD2 para que funcionara con un PIC 16F628 y además realicé los módulos de teclado, LCD, Leds, botones, interruptores, extensión, reloj, RS232, etc.

La obra quedó así:


La placa del borde inferior derecho es algo así como una RRBOARD2 pero con algunas modificaciones menores.
Al que esté pensando en hacer este tipo de placas le recomiendo la página mencionada, está todo lo necesario y explicado al detalle.

Luego, para realizar las pruebas con RS232 estrené un conversor USB-Serie que ni sabía si funcionaba comprado aprox. hace 1 año, y para mi sorpresa funca de maravilla.



El módulo del medio lo inventé para poder habilitar o no una linea de comunicación y/o cambiarla de lugar dentro del mismo puerto u otro.

Con el correr de los días desde que terminé esto me di cuenta que mi placa RRBOARD2 modificada tiene varios defectos, no maneja los PIC de 28 o 40 pines, tuve que por ejemplo cortar pistas, unir otras con cables y buee me puse a diseñar una nueva en base a varias ideas, y que pronto la mostraré junto con los diseños en EAGLE.

Les paso un adelanto:



Esa plaquita es una FR4 a doble cara...