Robot interprete de theremin controlado por microfono

Hola a toda la comunidad Arduino. Acabo de adquirir una placa Mega 2560 (deseada hace años) y mis conocimientos de programación son nulos a día de hoy aunque ya he empezado a leer un manual.
El proyecto que quiero afrontar es la construcción de dos brazos articulados por sendos motores paso a paso bipolares (reciclados de DVDs) que seran controlados por Arduino en función de una señal de micrófono o linea desde una entrada analógica.
He realizado un esquema de la programación que considero necesaria. Recuerdo que no se programar ni conozco las librerías todavía.
En primer lugar tenemos el motor del brazo controlador del tono (Pitch), éste se moverá a cierta posición en función de la frecuencia de entrada (segmentada en notas musicales). Para definir la frecuencia de entrada se plantea la necesidad de un circuito FFT (creo) y tal vez el uso de librerías o una programación mayor.
1-Definir entrada (¿no necesario?)
2-Definir salida (stepper pin ¿librerías?)
3-Segmentar los valores de entrada en rangos para aplicar una posición de motor a cada uno de ellos (array?)
4-Definir posiciones del motor.
5-Definir posiciones del motor para cada rango del valor de entrada.
6-Definir movimiento mínimo y máximo del motor (0=0º; 255=45º).

Para el brazo controlador del volumen el paso 3 no se aplica puesto que el movimiento es lineal y en el 5 los valores serán equivalentes siempre que se limite el movimiento del motor según 6. Este motor se moverá en función del volumen de entrada. A falta de hacer pruebas pienso que un simple circuito de preamplificación de micro (tal vez un regulador en la salida para no sobrepasar 5v) es suficiente para conseguir la señal.

A partir de ayer empiezo a leer y probar cosas. Seguramente este proyecto avance muy lento pero espero tener la suficiente constancia para lograrlo y quería presentároslo para saber también si pretendo un imposible con el hardware que tengo. Toda ayuda será agradecidísima, sean bibliografías, links o código.
Salu2!

PD Sí, creo que es más facil hacer un robot que toque el theremin que yo aprenda a tocarlo :smiley:

Esbozando un poco de código para el brazo del volumen. Utilizando como base el ejemplo del control por potenciómetro. Para conseguir el objetivo tengo que conseguir una entrada de micro que oscile con una amplitud entre 0 y 5v a fin de conseguir la mayor definición. Para que el brazo se mueva solo 45 grados supongo que tendré que poner algún engranaje.

//incluye libreria de stepper motor
#include <Stepper.h>

//define los pasos por vuelta del motor
#define STEPS 20

// Crea una instancia de la clase stepper,
//especificando su numero de pasos y los pines asignados.
Stepper stepper(STEPS, 8, 9, 10, 11);

int previous = 0; //otorga valor 0 variable previous
previous /=4; //ajusta al margen de 255
return previous; //devuelve el valor final

void setup()
{
stepper.setSpeed(30); //define las rpm del motor
}

void loop()
{
int value=analogRead(0); //lee el valor de entrada del pin 0
value /=4; //ajuste al margen de 255
return value; //devuelve el valor final

stepper.step(value - previous); //mueve un numero de pasos igual al cambio en la entrada

previous = value; //actualiza la variable previous a la posición actual
}

puedes usar la funcion map para segun unos valores de entrada los convierta a otros adaptados a tus necesidades.
http://arduino.cc/en/Reference/Map

Recuerda usar las etiquetas code para insertar codigo de los sketch ,es el simbolo antes de la viñeta
(una hoja con simbolo <>)

En primer lugar tenemos el motor del brazo controlador del tono (Pitch), éste se moverá a cierta posición en función de la frecuencia de entrada (segmentada en notas musicales). Para definir la frecuencia de entrada se plantea la necesidad de un circuito FFT (creo) y tal vez el uso de librerías o una programación mayor.

Arranquemos por acá porque esto es el nudo de tu proyecto.
control de tono (pitch) ? puedes explicarte mejor.

Una FFT en arduino MEGA tarda creo que 7 mseg (en la librería que te voy a sugerir) usando 256 muestras.
Dices y repito :

éste se moverá a cierta posición en función de la frecuencia de entrada (segmentada en notas musicales)

De nuevo explicate mejor.

surbyte:
Arranquemos por acá porque esto es el nudo de tu proyecto.
control de tono (pitch) ? puedes explicarte mejor.

Por supuesto surbyte, gracias por interesarte. El control de tono o pitch al que me refiero es la antena del theremin a traves de la cual se controla el tono. Theremín - Wikipedia, la enciclopedia libre

surbyte:
Una FFT en arduino MEGA tarda creo que 7 mseg (en la librería que te voy a sugerir) usando 256 muestras.
Dices y repito : De nuevo explicate mejor.

El brazo del motor interactuará con la antena de tono del theremin. En un buen theremin la afinación es bastante lineal así que un cierto movimiento del motor corresponderá a una variación de un semitono con independencia de la octava en la que se esté (imagina una guitarra cuyo diapasón o mástil esté dividido en trastes de igual tamaño cuando en realidad se van estrechando a medida que subimos por la octava). El funcionamiento sería el siguiente: Yo canto un La en el micro, el Arduino a traves de la FFT resuelve una frecuencia (que seguramente no serán 440Hz porque no soy cantante ni una máquina). Arduino decide que para esa frecuencia debe redondear a la más cercana que tiene definida previamente -rangos de frecuencias que se reducen a un valor predefinido y que son los semitonos o notas (creo que los maps que me sugiere jose harían esa función)- y este último valor es el que define el movimiento del motor.
Estaré encantado de que me sugieras esa librería y de expliacarme mejor en lo que sea necesario. 7 ms me parece un tiempo estupendo y 256 muestras me parecen bien siempre que estemos hablando de procesado en tiempo real. El robot debe ser capaz de interactuar con otros músicos humanos. Lo óptimo para controlar éste dispositivo será un sonido lo más parecido a una onda senoidal pura. Armónicos y otros tipos de onda posiblemente harían necesarias más muestras.
Un video de lo que quiero hacer aproximadamente Lev does Patsy - YouTube
Gracias también jose por tu sugerencia de los map.
Hablo de una entrada de señal de micro cuando lo más probable es que deba amplificarla más aún que una entrada de linea ya que estoy viendo que ésta es de unos 0.7v de referencia. Si la FFT se puede usar para controlar también el motor del volumen será la mejor via de trabajo.

te comente lo de map por esto:

"Esbozando un poco de código para el brazo del volumen. Utilizando como base el ejemplo del control por potenciómetro. Para conseguir el objetivo tengo que conseguir una entrada de micro que oscile con una amplitud entre 0 y 5v a fin de conseguir la mayor definición. Para que el brazo se mueva solo 45 grados supongo que tendré que poner algún engranaje."

o sea mapeas lectura analogica de 0 a 1023 a valores 0 a 45 grados aunque si es correcto que tu motor tiene 20 pasos por vuelta ,o sea 18 grados por paso ,vas a tener poca resolucion,a no ser que puedas usar micropasos.

OK, todavía no conocía esa función, tengo mucho que leer antes de seguir más adelante.
Respecto a la resolución no me preocupa porque creo que los engranajes son la solución. Por suerte tengo un hermano ingeniero que espero me de las herramientas para calcular el engranaje adecuado al movimiento y resolución necesario, y como tiene una impresora 3D puedo fabricarlo a mi gusto.

Ivansan:
OK, todavía no conocía esa función, tengo mucho que leer antes de seguir más adelante.
Respecto a la resolución no me preocupa porque creo que los engranajes son la solución. Por suerte tengo un hermano ingeniero que espero me de las herramientas para calcular el engranaje adecuado al movimiento y resolución necesario, y como tiene una impresora 3D puedo fabricarlo a mi gusto.

Tambien tienes la opcion de usar un servo,son baratos,faciles de programar y te van a dar cualquier movimiento del eje entre 0 y 180 grados.

Pues lo había pensado para el brazo de tono porque, como tú dices, parecen más indicados para esto. Tampoco descarto acabar usándolo en los dos. Sigo tirando de familia y esta vez será mi padre, aficionado al modelismo, el que sufrirá mi rapiña. Me suena haber visto servos sin usar que ya veremos qué resultan ser. De momento me voy haciendo con los elementos para ir probando cosas... el trabajo se acumula.

Aca la FFT que te prometí que demora 7mseg

El link tiene ejemplos y mas información.

Antes de seguir yo te diria que evaluaras con detenimiento la plataforma a usar.
Desde ya, yo consideraría un MEGA como mínimo.
La librería no funciona en DUE según he leido, tal vez requiera algun trabajo.

Piensa bien que usar antes de embarcarte porque son muchas tareas las que debe hacer el procesador y puede resultar lento.

Retomando el proyecto y viendo que no me aclaro con la transformada he decidido simplificarlo. Lo primero ha sido construir un amplificador de micro electret (http://www.robotizando.com.br/artigos/ledVU/images/audioCap_esquema.png) y ya en el primer paso hay algo que no me cuadra. Los valores del amplificador son correctos en corriente alterna (0v en silencio y 5v de pico) pero en continua está fijo en 4v (mediciones entre Signal y masa). Puedo parecer muy novato, porque lo soy, pero las entradas analógicas ¿funcionan en AC ó DC? porque el servo no reacciona como debería usando el sketch de ejemplo Servo>Knobt (cambiando el pote por el micro). ¿Será por eso que las pruebas que he hecho con la FFT no me funcionan?
Optando por no usar la FFT el servo del tono sería controlado por un circuito conversor Frecuencia-Voltaje usando el CI LM2907 o similar (en estudio mientras no solucione el servo del volumen que supuestamente es el fácil).

Hola Ivasan. Tanto tiempo. Como tu dices al comienzo, eres tienes tesón para seguir con el proyecto.

El esquema del micrófono si lo miras bien, tiene a la entrada del AO (amplificador Operacional) un divisor resistivo que provee 2.5V. Ese punto hace que la salida Se mueva desde ese valor.
Pero a continuación tiene un capacitor y otro nuevo divisor resistivo con dos resistores de 220k.
Ahi debes leer 2.5V de nuevo.
O sea tienes dos puntos de control antes y despues.
Antes en el pin3 del AO y después, en el punto medio del divisor de 220k.
Siempre debes leer 2.5V o algo cercano.
4V indica que algo conectaste mal.

Revisa Colores:
Resistencias de 10k : Marrón (1) Negro (0) Naranja (3 que x la posición es 10^3=10k)
Resistencias de 220k: Rojo (2) Rojo (2) Amarillo (4 o sea 10^4 = 100k)

Tenía el proyecto abandonado porque me puse a hacer una Gen7 y estuve jugando con unos paso a paso, como se me han roto un par lo he retomado hasta que encuentre una impresora vieja por ahí.
No sería la primera vez que me equivoco con las resistencias pero no es el caso. He vuelto a medir, esta vez alimentando el circuito con 5v y no con la pila de 9v, y el resultado es 2.3v fijo en DC haga lo que haga al micro. Otra vez las mediciones en AC parecen correctas, es decir, varían en función de lo que grito por el micro (menos voltaje que alimentado con 9v). Eso me está mosqueando.

Usé este circuito porque explicaba que un amplificador de 0-5v en la contrafase daría valores no legibles por el Arduino (negativos) aunque, la verdad, yo solo necesito la amplitud de onda y no se hasta que punto es necesario el BIAS DC (0<2.5>5v) para mi proyecto pues desde mi comprensión esto haría bailar el servo de un modo que no es lo que busco aunque hay una linea de código en la web del circuito que dice corregir esto (código para FFT):

//convierte la muestra para 8 bits y remueve el “dc bias”
data = (muestra / 4) - 128; [/color]

  • Voy a probar con un amplificador sin BIAS a ver qué pasa y lo comento.*

Sin Bias lo que haces es amplificar solo el semicilo negativo (esta en modo inversor) porque no provees al AO de alimentación Negativa.
El problema será que tendrás intermitencias ya que el AO no podras seguir los semiciclos positivos y eso será un 0 a la salida. De modo que tendrás un nivel por X mseg y luego 0 por otros mseg
Lo que obligará a que tu código busque el máximo y luego se resetee cada cierto tiempo.

Si tu requieres de una buena FFT para determinar el tono, yo no recortaría la señal, pero prueba y ya veremos.