Cómo construir una guitarra de aire con el Arduino, también conocido como la guitarra de AIRduino (5 / 5 paso)

Paso 5: código

Aquí está el código de Arduino requerido:

Se toma la parte de generación de sonido en tiempo real de este gran tutorial.

------------------------------------------------------
Una matriz que contiene la forma de onda
de un sonido de guitarra
Char [] de la forma de onda =
{125, 148, 171, 194, 209, 230, 252, 255,
253 244, 235, 223, 207, 184, 169, 167,
163, 158, 146, 131, 126, 129, 134, 127,
105, 80, 58, 51,38, 22, 12, 2, 10, 35,
58, 75, 89, 103, 120, 141, 150, 148, 145,
144 140 129, 116, 105, 95, 86, 75, 72,
73, 76, 88, 103, 117, 121, 120, 115, 120,
143, 159, 162, 156, 155, 163, 184, 202,
214, 215, 211, 213, 212, 205, 196, 182,
162, 142, 118, 99, 84, 68, 54, 40, 28,
19, 10, 7, 0, 0, 5, 9, 14, 21, 33,
49, 59, 65, 75, 92, 110};

Utilizamos esta forma de onda para cambiar el
volumen de la salida
char waveformVolume [] =
{125, 148, 171, 194, 209, 230, 252, 255,
253 244, 235, 223, 207, 184, 169, 167,
163, 158, 146, 131, 126, 129, 134, 127,
105, 80, 58, 51,38, 22, 12, 2, 10, 35,
58, 75, 89, 103, 120, 141, 150, 148, 145,
144 140 129, 116, 105, 95, 86, 75, 72,
73, 76, 88, 103, 117, 121, 120, 115, 120,
143, 159, 162, 156, 155, 163, 184, 202,
214, 215, 211, 213, 212, 205, 196, 182,
162, 142, 118, 99, 84, 68, 54, 40, 28,
19, 10, 7, 0, 0, 5, 9, 14, 21, 33,
49, 59, 65, 75, 92, 110};
Una matriz que se utiliza como un buffer para evitar
distancia puntual errónea
mediciones de
unsigned int distance_buffer [] = {16000,
16000 16000 16000, 16000, 16000, 16000,
16000 16000 16000, 16000, 16000, 16000,
16000 16000, 16000};

const int distance_length = 3;
int distance_index = 0;

Los valores de desbordamiento de 2 octavas
int frecuencia [] = {39, 42, 44, 47,
50, 52, 56, 59, 63, 66, 70, 74, 79,
84, 89, 94, 100, 105, 112, 118, 126,
133, 141, 149};

Tono inicial
campo de int = 160;

Aceleración y volumen inicial
parámetro
int lastAcc = 0;
volumen del flotador = 0;

reproducción de audio en el pin 3
byte speakerpin = 3;

variable índice para la posición en
forma de onda
volátiles byte waveindex = 0
currentvalue volátiles byte = 0;

Perno usado para sensor ultrasónico
const int pingPin = 7;

Pins para los potenciómetros
const int sustainPin = 1;
const int sensitivityPin = 2;

Clavijas para cada dedo de la izquierda
mano
const int finger1 = 9;
const int finger2 = 10;
const int finger3 = 11;
const int finger4 = 12;

int fingerValue = 0;

larga duración, pulgadas, cm;

void setup() {}

pinMode(3,OUTPUT); Altavoz en el pin 3

pinMode(finger1,INPUT);
pinMode(finger2,INPUT);
pinMode(finger3,INPUT);
pinMode(finger4,INPUT);

/**************************
Configuración de audio PWM
****************************/
Timer2 Set rápido modo PWM
(duplica la frecuencia PWM)
bitSet (TCCR2A, WGM21);
bitSet (TCCR2B, CS20);
bitClear (TCCR2B, CS21);
bitClear (TCCR2B, CS22);

habilitar interrupciones ahora registra
se han establecido
SEI();

/*************************
Configuración de interrupción de TIMER 1
*************************/
deshabilitar interrupciones mientras
se configuran los registros
CLI();

/ * Operación normal del puerto, pernos desconectados
de funcionamiento del temporizador (rompiendo pwm) * /
bitClear (TCCR1A, COM1A1);
bitClear (TCCR1A, COM1A1);
bitClear (TCCR1A, COM1A1);
bitClear (TCCR1A, COM1A1);

/ * 4, CTC con tapa set por registro
OCR1A. Nos permite establecer sincronización variable para
la interrupción al escribir nuevos valores a
OCR1A. */
bitClear (TCCR1A, WGM10);
bitClear (TCCR1A, WGM11);
bitSet (TCCR1B, WGM12);
bitClear (TCCR1B, WGM13);

/ * establece el prescaler de reloj en 8.  */
bitClear (TCCR1B, CS10);
bitSet (TCCR1B, CS11);
bitClear (TCCR1B, CS12);

/ * Deshabilitar fuerza salida compara para
Canales A y B. * /
bitClear (TCCR1C, FOC1A);
bitClear (TCCR1C, FOC1B);

/ * Inicializa salida compara
Registro A 160 para establecer la
inicial de campo * /
OCR1A = 160;

desactivar la interrupción de la captura de entrada
bitClear (TIMSK1, ICIE1);
desactivar salida
Comparar interrupción de partido B
bitClear (TIMSK1, OCIE1B);
activar salida
Comparar una interrupción del partido
bitSet (TIMSK1, OCIE1A);
desactivar el desbordamiento de interrumpir
bitClear (TIMSK1, TOIE1);

Enable interrumpe ahora
se han establecido registros
SEI();
}

Controlador de desbordamiento del temporizador
{ISR(TIMER1_COMPA_vect)}

/ * ISR timer1  Cada vez
se llama fija speakerpin a la
siguiente valor en forma de onda []. Frecuencia
modulación se hace cambiando la
tiempo entre llamadas sucesivas de
Esta función, por ejemplo, para un tono de 1KHz,
configurar la sincronización para que se ejecute
a través de la forma de onda [] 1000 veces
un segundo. */

restablecer waveindex si ha alcanzado
el final de la matriz

Si {} (waveindex > 102)
waveindex = 0;
}

Establecer el valor de salida
Si {} (volumen > 0.03)
analogWrite (speakerpin,
waveformVolume[waveindex]);
}
waveindex ++;

Actualización de la echada
OCR1A = pitch;
}

void loop()
{
Desactivar interputs, enviar un ping
mensaje y espere la respuesta.
CLI();
pinMode (pingPin, salida);
digitalWrite (pingPin, LOW);
delayMicroseconds(2);
digitalWrite (pingPin, HIGH);
delayMicroseconds(5);
digitalWrite (pingPin, LOW);
duración = pulseIn (pingPin, HIGH, 2000);
SEI();
convertir el tiempo en una distancia
en centímetros
y almacenar en búfer
distance_buffer [distance_index ++
distance_length %] = Duración / 20;

Encuentra en el búfer de la menor
distancia medida
cm = 16000;
para (int i = 0; i < distance_length; i ++) {}
cm = min (cm, distance_buffer[i]);
}

Comprobar que los dedos se presionan
fingerValue = 5;
{if(!digitalRead(finger4))}
fingerValue = 4;
}
{if(!digitalRead(finger3))}
fingerValue = 3;
}
{if(!digitalRead(finger2))}
fingerValue = 2;
}
{if(!digitalRead(finger1))}
fingerValue = 1;
}

Actualizar el tiempo de sostenimiento y
valores de sensibilidad
mantener la flotación =
Map(analogRead(sustainPin), 0,
1024, 101, 130) / 100.0;
sensibilidad de int =
Map(analogRead(sensitivityPin),
0, 1024, 100, 200);

Actualizar el volumen
volumen = volumen / sostener;
Si (volumen < 0) {}
volumen = 0;
}

Compruebe el acelerómetro
acc de int = analogRead(0);
int accDiff = lastAcc - CAC;

Actualizar el valor de volumen
Si (accDiff > 5 * (200 - sensibilidad)) {}
volumen += (flotador)
Pow (accDiff,
sensibilidad / 100.0) / 50000;
}
lastAcc = acc;

Compruebe que el volumen no es mayor que 1
Si {} (volumen > 95)
volumen =. 95;
}

Actualización del volumen en la forma de onda
para (int i = 0; i < = 102; i ++) {}
waveformVolume [i] =
((forma de onda [i] - 127) * volumen) + 127;
}

Establecer el tono según la distancia
entre las dos manos y la
dedos presionando
Si (cm < 102 & & cm > 0) {}
Si (cm > 30) {}
Pitch = frecuencias [7 +
(((cm-30) / 24) * 4 + fingerValue - 1)];
} else {}
Pitch = mapa (cm, 0, 30, 39, 79);
}
} else {}
Pitch = frecuencias [7 +
(((102-30)/24) * 4 + fingerValue - 1)];
}

Retardo para evitar rebotes de señales
Delay(50);
}

------------------------------------------------------

Artículos Relacionados

Aplicaciones industriales de la IoT - sensores externos + carga con USB Android también conocido como Micro USB Host OTG Y Cable con energía

Aplicaciones industriales de la IoT - sensores externos + carga con USB Android también conocido como Micro USB Host OTG Y Cable con energía

** Actualización: El siguiente artículo es de nuestra aplicación Android obsoleta! VALARM es IoT Industrial. Ayudaremos a sus equipos y su empresa con aplicaciones de IoT Industrial utilizando Herramientas de nube de Valarm.Se recomienda utilizar dis
Cómo construir una cocina al aire libre

Cómo construir una cocina al aire libre

Una cocina al aire libre es una excelente manera de entretener a su familia e invitados, así como lanzar partidos increíbles bajo cielo abierto. La cocina al aire libre usualmente tendrá toda la "diversión" cocina gadgets que mayoría de las pers
Construir una guitarra acústica

Construir una guitarra acústica

hice esta guitarra para mi evento de Olimpiada de la ciencia. Olimpíada de Ciencias es un torneo competitivo donde los estudiantes participan en diferentes eventos científicos contra otras escuelas.  Uno de mis eventos se llama sonidos de la música d
Cómo no construir una piscina de reflejo con Galium

Cómo no construir una piscina de reflejo con Galium

¡ Hola!Esto es una introducción de cómo no construir una piscina de reflejo con galio!Los dos primeros pasos era demostrar los pasos de principio sin embargo al final se documentan los errores que he hecho y lo que no debe hacer.La idea original era
Cómo construir una mesa de icosaedro con reciclado de madera

Cómo construir una mesa de icosaedro con reciclado de madera

¿No tiene ganas de leer? Revisa el video de arriba muestra un resumen del proceso de construcción.Si estás todavía con nosotros y quisiera hacer esto, los siguientes pasos le guiará a través del proceso y las lecciones que aprendí en el camino.Paso 1
Construir una tabla de icosaedro con madera recuperada

Construir una tabla de icosaedro con madera recuperada

NOTA: ACTUALMENTE ESTOY EDITANDO ESTE INSTRUCTABLE PARA TENER INFORMACIÓN MÁS ÚTIL, PERO "VA HACER EN UN PAR DE DÍAS! :)¿No tiene ganas de leer? Revisa el video de arriba muestra un resumen del proceso de construcción.Si estás todavía con nosotros y
Controla una válvula solenoide con un Arduino

Controla una válvula solenoide con un Arduino

Es necesario tomar un tiempo de vacaciones y por desgracia, si bien no tengo hijos, tengo bonsais.Como niños, estos bichos poco necesidad de cuidado constante y sobre todo, agua.Cada día.Argh!¿Por qué no beben cerveza y vino por sí mismos?de todos mo
Eliminar arbustos y tocones la manera fácil con un gato de la granja (también conocido como Hi-Lift Jack)

Eliminar arbustos y tocones la manera fácil con un gato de la granja (también conocido como Hi-Lift Jack)

Recientemente compramos una casa de 100 años, y los dueños anteriores amaban árboles y arbustos rebeldes. Tuvimos un buen número que fueron tocando el techo de la casa o derramándose sobre la entrada de vecinos, por lo que decidimos deshacernos de lo
Construir una guitarra eléctrica de Semi-hollowbody

Construir una guitarra eléctrica de Semi-hollowbody

Este instructable le mostrará cómo construir un perno en cuello, guitarra eléctrica semi-hollowbody, en la forma de las guitarras de Fender Thinline y similares. El cuerpo es similar a una Jazzmaster o Jaguar, con una tapa plana, pero los pasos sería
Construir una guitarra de viaje de tamaño medio bajo

Construir una guitarra de viaje de tamaño medio bajo

Paso 1: Conseguir madera para cuerpoHe querido construir este bajo de poco costo como sea posible. Tengo estos espacios en blanco de mesa de madera maciza superior en Home Depot por $4.99.Paso 2: Crear una plantillaPaso 3: Corte el cuerpo Esta madera
Cómo construir una guitarra eléctrica.

Cómo construir una guitarra eléctrica.

Aunque reconozco que hay muchos instructables en edificio, modding y hacking guitarras de todo tipo; es mi intención demostrar cómo usted también puede lograr profesionales como resultados al construir sus propios instrumentos. También voy a llevarte
Cómo construir una guitarra de bajo 5 cuerdas

Cómo construir una guitarra de bajo 5 cuerdas

si usted es un principiante o un constructor experimentado de la guitarra, esta guía educacional le ayudará a construir tu propia guitarra baja personalizada en pocos pasos.  Antes de comenzar, usted necesitará unos cuantos herramientas y materiales.
Construir una aspiradora de potencia con trinquete mano

Construir una aspiradora de potencia con trinquete mano

así que usted puede comprar una aspiradora de mano alimentado por el bajo precio de $159,99.  Pero eso no es muy divertido.Y nuestro parece un arma loco!Tomé muchas fotos.  Probablemente incluso podría pasar por alto el texto y mirar las fotos para l
Cómo construir una pistola de aire!

Cómo construir una pistola de aire!

He intentado construir un rifle de aire muchas veces y han fallado. Después de mucho investigación y planificación he creado un rifle de aire bastante decente. Fue planeado para ser construido con herramientas básicas, y se puede modificar muy fácilm