Cómo añadir funciones de botón a Auduino proyecto Peter Knight (3 / 4 paso)

Paso 3: Más botones!

¿Qué otros efectos puede Agregar? He probado ha añadido una función de pausa y una función de regulación, utilizando los operadores bit a bit para distorsionar la PWM_OUTPUT si las declaraciones de la parte inferior del código. Yo estaba teniendo problemas con el lenguaje C++ que Auduino biblioteca parece estar usando y que los operadores podía conseguir trabajo, pero lograron que estas pasando.

La función de pausa añadí también tiene cierto ruido de fondo que creo que es debido a la función de retardo. No podía deshacerse de él, pero en pulsaciones cortas que no se dan cuenta, es sólo si pulsa el botón de pausa para más luego un momento y sólo se produce cuando los potenciómetros están en posiciones extremas.

Utilicé estos botones:

http://www.Adafruit.com/products/1010

Son coloridos, grandes y diversión para presionar. De la soldadura en PCB muy bonita.

En este punto también soldar encima de todo el proyecto de un escudo de proto para que sea más robusto y compacto.

Aquí está el código de Peter Knight del blog de RCArduino con el botón de pausa y el botón "dim" que he añadido a ese tipo de distorsión y baja el volumen cuando presiona. Es un elemento de percusión fresco en algunas frecuencias. El botón de pausa es muy divertido para jugar, también.

Auduino, Lo-Fi sintetizador granular
//
por Peter Knight, Tinker.it http://tinker.it
//
Ayuda: http://code.google.com/p/tinkerit/wiki/Auduino
Más ayuda: http://groups.google.com/group/auduino
//
Analógica de 0: 1 echada del grano
Analógica 1: decaimiento de grano 2
Analógica de 2: 1 deterioro del grano
Analógica 3: tono de grano 2
Analógica 4: frecuencia de repetición del grano
//
Digital 3: Audio (Digital 11 en ATmega8)
//
Changelog:
19 de noviembre de 2008: se agrega soporte para tableros de ATmega8
21 de marzo de 2009: añadido soporte para las placas ATmega328
07 de abril de 2009: vector de interrupción fija para los tableros del ATmega328
08 de abril de 2009: añadido soporte para tableros de ATmega1280 (Arduino Mega)

#include
#include

syncPhaseAcc de uint16_t;
syncPhaseInc de uint16_t volátil;
uint16_t grainPhaseAcc;
uint16_t volátiles grainPhaseInc;
uint16_t grainAmp;
volátiles uint8_t grainDecay;
grain2PhaseAcc de uint16_t;
grain2PhaseInc de uint16_t volátil;
grain2Amp de uint16_t;
grain2Decay de uint8_t volátiles;

Mapa de canales analógicos
#define SYNC_CONTROL (4)
#define GRAIN_FREQ_CONTROL (0)
#define GRAIN_DECAY_CONTROL (2)
#define GRAIN2_FREQ_CONTROL (3)
#define GRAIN2_DECAY_CONTROL (1)

DB
#define SMOOTH_PIN 8

Cambio de estos se requiere también reescribir audioOn()

#if defined(__AVR_ATmega8__)
//
En antiguas placas de ATmega8.
Salida es el pin 11
//
#define LED_PIN 13
#define LED_PORT PORTB
#define LED_BIT 5
#define PWM_PIN 11
#define PWM_VALUE OCR2
#define PWM_INTERRUPT TIMER2_OVF_vect

#elif defined(__AVR_ATmega1280__)
//
En el Arduino Mega
Salida está en el pin 3
//
#define LED_PIN 13
#define LED_PORT PORTB
#define LED_BIT 7
#define PWM_PIN 3
#define PWM_VALUE OCR3C
#define PWM_INTERRUPT TIMER3_OVF_vect
#else
//
Para las modernas placas ATmega168 y ATmega328
Salida está en el pin 3
//
#define PWM_PIN 3
#define PWM_VALUE OCR2B
#define LED_PIN 13
#define LED_PORT PORTB
#define LED_BIT 5
#define PWM_INTERRUPT TIMER2_OVF_vect
#endif

Duane B
rcarduino.blogspot.com
15/11/2012
Retardo del buffer de anillo muy sencillo
se registra la salida en esta matriz
y luego hacia atrás con la salida como envuelve el buffer
puede encender y apagar mediante un botón en DELAY_BUTTON
#define MAX_DELAY 1024
unsigned char sDelayBuffer [MAX_DELAY];
unsigned int nDelayCounter = 0;
unsigned char bDelay;

#define DELAY_BUTTON 10

siguiente ejemplo fo retraso efecto, presentación variable unsigned y defingint pinout para el efecto puase
unsigned char bSync;
unsigned char bPause;

#define PAUSE_BUTTON 12
#define SYNC_BUTTON 11

4,5,10

Lisa mapeo logarítmico
//
uint16_t antilogTable [] = {}
64830,64132,63441,62757,62081,61413,60751,60097,59449,58809,58176,57549,56929,56316,55709,55109,
54515,53928,53347,52773,52204,51642,51085,50535,49991,49452,48920,48393,47871,47356,46846,46341,
45842,45348,44859,44376,43898,43425,42958,42495,42037,41584,41136,40693,40255,39821,39392,38968,
38548,38133,37722,37316,36914,36516,36123,35734,35349,34968,34591,34219,33850,33486,33125,32768
};
uint16_t mapPhaseInc (entrada uint16_t) {}
volver (antilogTable [entrada & 0x3f]) >> (entrada >> 6);
}

Caminó mapeo cromático
//
uint16_t midiTable [] = {}
17,18,19,20,22,23,24,26,27,29,31,32,34,36,38,41,43,46,48,51,54,58,61,65,69,73,
77,82,86,92,97,103,109,115,122,129,137,145,154,163,173,183,194,206,218,231,
244,259,274,291,308,326,346,366,388,411,435,461,489,518,549,581,616,652,691,
732,776,822,871,923,978,1036,1097,1163,1232,1305,1383,1465,1552,1644,1742,
1845,1955,2071,2195,2325,2463,2610,2765,2930,3104,3288,3484,3691,3910,4143,
4389,4650,4927,5220,5530,5859,6207,6577,6968,7382,7821,8286,8779,9301,9854,
10440,11060,11718,12415,13153,13935,14764,15642,16572,17557,18601,19708,20879,
22121,23436,24830,26306
};
uint16_t mapMidi (entrada uint16_t) {}
volver (midiTable[(1023-input) >> 3]);
}

Caminó asignación pentatónica
//
uint16_t pentatonicTable [54] = {}
0,19,22,26,29,32,38,43,51,58,65,77,86,103,115,129,154,173,206,231,259,308,346,
411,461,518,616,691,822,923,1036,1232,1383,1644,1845,2071,2463,2765,3288,
3691,4143,4927,5530,6577,7382,8286,9854,11060,13153,14764,16572,19708,22121,26306
};

uint16_t mapPentatonic (entrada uint16_t) {}
valor de uint8_t = (1023-entrada) / (1024/53);
retorno (pentatonicTable[value]);
}

void audioOn() {}
#if defined(__AVR_ATmega8__)
ATmega8 tiene diferentes registros
TCCR2 = _BV(WGM20) | _BV(COM21) | _BV(CS20);
TIMSK = _BV(TOIE2);
#elif defined(__AVR_ATmega1280__)
TCCR3A = _BV(COM3C1) | _BV(WGM30);
TCCR3B = _BV(CS30);
TIMSK3 = _BV(TOIE3);
#else
Configurar el PWM a 31.25 kHz, fase precisa
TCCR2A = _BV(COM2B1) | _BV(WGM20);
TCCR2B = _BV(CS20);
TIMSK2 = _BV(TOIE2);
#endif
}

void setup() {}
pinMode(PWM_PIN,OUTPUT);
audioOn();
pinMode(LED_PIN,OUTPUT);

pinMode(DELAY_BUTTON,INPUT);

ajuste mis botones como entradas, el siguiente ejemplo del efecto de retardo

pinMode (SYNC_BUTTON, entrada);
pinMode (PAUSE_BUTTON, entrada);

modo pin y activar tire hacia arriba para por defecto el modo
es PENTATÓNICO, hale el pasador de baja para cambiar para suavizar
pinMode(SMOOTH_PIN,INPUT);
digitalWrite(SMOOTH_PIN,HIGH);
}

void loop() {}
El circuito es bastante simple, simplemente actualiza los parámetros de los osciladores.
//
Evitar el uso de las funciones que hacen uso extensivo de las interrupciones, o desactivar interrupciones.
Causarán clics y poops en el audio.

por defecto es pentatónicas tonos escalonados, pasador de halar baja de frecuencia uniforme sin tonos distintos
syncPhaseInc = mapPhaseInc(analogRead(SYNC_CONTROL)) / 4;

syncPhaseInc = mapPentatonic(analogRead(SYNC_CONTROL));

actualizada 29/01/2013
Hale el pasador de DELAY_BUTTON alto demora, baja sin retraso
uso sea un tirón up/pull-down resistor
o un tirón para arriba resistencia con un interruptor de palanca entre el perno y la tierra
bDelay = digitalRead(DELAY_BUTTON);
bSync = digitalRead(SYNC_BUTTON);
bPause = digitalRead(PAUSE_BUTTON);

Caminó a notas MIDI: C, Db, D, Eb, E, f el....
syncPhaseInc = mapMidi(analogRead(SYNC_CONTROL));

Caminó asignación pentatónica: D, E, G, A, B

grainPhaseInc = mapPhaseInc(analogRead(GRAIN_FREQ_CONTROL)) / 2;
grainDecay = analogRead(GRAIN_DECAY_CONTROL) / 8;
grain2PhaseInc = mapPhaseInc(analogRead(GRAIN2_FREQ_CONTROL)) / 2;
grain2Decay = analogRead(GRAIN2_DECAY_CONTROL) / 4;
}

SIGNAL(PWM_INTERRUPT)
{
valor de uint8_t;
uint16_t de salida;

syncPhaseAcc += syncPhaseInc;
Si (syncPhaseAcc < syncPhaseInc) {}
Momento de comenzar el siguiente grano
grainPhaseAcc = 0;
grainAmp = 0x7fff;
grain2PhaseAcc = 0;
grain2Amp = 0x7fff;
LED_PORT ^ = 1 << LED_BIT; Más rápido que usando digitalWrite
}

Incremento de la fase de los osciladores de grano
grainPhaseAcc += grainPhaseInc;
grain2PhaseAcc += grain2PhaseInc;

Convertir la fase en una onda triangular
valor = (grainPhaseAcc >> 7) & 0xff;
Si (grainPhaseAcc & 0x8000) valor = ~ valor;
Multiplicar por la actual amplitud de grano para obtener muestra
salida = valor * (grainAmp >> 8);

Repita para el segundo grano
valor = (grain2PhaseAcc >> 7) & 0xff;
Si (grain2PhaseAcc & 0x8000) valor = ~ valor;
salida += valor * (grain2Amp >> 8);

Hacer el grano del decaen de las amplitudes por un factor de cada muestra (decaimiento exponencial)
grainAmp-= (grainAmp >> 8) * grainDecay;
grain2Amp-= (grain2Amp >> 8) * grain2Decay;

Escala de la salida a la gama disponible, recorte si es necesario
salida >> = 9;
Si la salida (salida > 255) = 255;

Duane B
rcarduino.blogspot.com
15/11/2012
Agregar un botón para configurar bDelay true o false para encender y apagar demora

if(bDelay)
{
Salida de PWM (esto es más rápido que usando analogWrite)
Aquí agregamos el buffer de retardo para el valor de salida, esto produce
un efecto de eco sutil, el búfer de retardo es buqe reproduciendo el sonido de
1/8 de segundo atrás.

LED_PORT | = 1 << LED_BIT; Más rápido que usando digitalWrite
PWM_VALUE = (salida + (sDelayBuffer[nDelayCounter])) >> 1;

Añadir la nueva salida en el búfer para que podamos usar cuando el buffer se envuelve luego
sDelayBuffer [nDelayCounter] = PWM_VALUE;
nDelayCounter ++;
if(nDelayCounter == MAX_DELAY)
{
nDelayCounter = 0;
}
}
otra cosa
{
LED_PORT & = ~ (1 << LED_BIT); Más rápido que usando digitalWrite

PWM_VALUE = salida;
}

Kyle
tomando el ejemplo de arriba y tratando de agregar una pausa de percusión y función dim botón 11 y 12
funciona y es difícil que el retraso y la pausa para trabajar juntos, a veces cuando está en pausa, hay ruido de fondo ahora

Si (bSync)
{
por dejar este espacio en blanco, el efecto de retardo se permite trabajar, en lugar de ser sobrescritos por lo que había aquí

}
otra cosa
{
++ hace un efecto de atenuación
LED_PORT | = 1 << LED_BIT; Más rápido que usando digitalWrite
PWM_VALUE = (salida ++) >> 1;

}

añadido otro efecto que incrementa ligeramente el sonido

Si (bPause)
{
}
otra cosa
{
cambiando los bits la escala para obtener un botón de "pausa" funcionó bien!
LED_PORT | = 1 << LED_BIT; Más rápido que usando digitalWrite
PWM_VALUE = (salida << 50) >> 1;

}
}

Artículos Relacionados

BMW 530i - BMW el añadir "Modo deportivo" botón Hack

BMW 530i - BMW el añadir "Modo deportivo" botón Hack

este instructable destapará la opción de añadir deportes BMW del modo de conducción en todo el 2006 BMW 530i con el chasis E60. Los deportes de modo de conducción nunca fue ofrecido para este modelo en particular, a pesar de clasifican este modelo de
Añadir una pantalla táctil de tu proyecto

Añadir una pantalla táctil de tu proyecto

añadir gráficos, visualización de la información en tiempo real y una interfaz de usuario dinámica a su proyecto de microcontrolador con una pantalla táctil!  En este instructable, te voy a mostrar cómo utilizar una pantalla táctil para:Imágenes de c
Añadir Bluetooth a un casco EEG para proyectos de control mental

Añadir Bluetooth a un casco EEG para proyectos de control mental

Controlar cosas con la mente es impresionante. Desafortunadamente, auriculares de EEG como el NeuroSky MyndWave son un poco demasiado caros si lo que desea experimentar. El año pasado, quería ver lo que podía controlar con mi cerebro en el presupuest
Añadir un kit de pesca a sus proyectos de papacord

Añadir un kit de pesca a sus proyectos de papacord

muchas personas ahora están haciendo Para cable cosas. Este instructable es una rápida agregar a hacerte son proyecto a ser aún más útiles en el bosque.Paso 1: Cosas que necesita Primero reunir tus cosas:Paja de beberLineas de pescaPlomadas Split tir
Añadir llaves a un sintetizador de Arduino el camino duro-el Blacklord: el órgano donante proyecto parte 2

Añadir llaves a un sintetizador de Arduino el camino duro-el Blacklord: el órgano donante proyecto parte 2

(Nota-Este es mi instructable 20! Gracias a todos los siguientes y commenting.on mis proyectos y a los funcionarios que hacen esto posible. Este sitio definitivamente me ha hecho llevar mi juego al Banco de trabajo.)El sintetizador granular Auduino p
DIY sensor Flex usando Sugru y grafito en polvo (Resistencia flexible usando Sugru y polvo de grafito)

DIY sensor Flex usando Sugru y grafito en polvo (Resistencia flexible usando Sugru y polvo de grafito)

Este es el primero de 5 instructables surgieron del Instructables y Sugru noche de construir (y día en nuestro caso) el de hicimos en Laboratorio de Juguete, el 20 de julio del 2013: una Resistencia Flexible o Sensor Flex hecha con Sugru y polvo de g
BRICOLAJE destornillador Sonic funcional

BRICOLAJE destornillador Sonic funcional

Último hijo de mi más antigua Halloween que Colin vestido como el Doctor de Doctor Who e improvisó un destornillador Sonic le de trozos de chatarra que robaban para arriba en el garaje. Al ver el destornillador Sonic mi hijo Sam decidido él absolutam
Menú de inicio de corrección no se abre o no funciona en Windows 10

Menú de inicio de corrección no se abre o no funciona en Windows 10

Cómo corregir Windows 10 menú de inicio hace no abre o no funciona. Herramientas de menú Inicio y los iconos del escritorio no funcionan!!!. Windows menú Inicio 10 y moderno no de aplicaciones no funcionan. 10 de Windows no puede abrir el menú de ini
Spy Video Trakr: Añadir un accesorio de garra de Lego

Spy Video Trakr: Añadir un accesorio de garra de Lego

en honor de la semana nacional de robótica y el reto de Robot de Instructables presento unos diseños de robot. Este diseño (para las edades 13-18) aprovecha Spy Video Trakr de Wild Planet, que es fácilmente programable y diseñado por sus desarrollado
Spy Video Trakr: Añadir un lanzador de misiles

Spy Video Trakr: Añadir un lanzador de misiles

en honor de la semana nacional de robótica y el reto de Robot de Instructables presento unos diseños de robot. Este diseño (para las edades 13-18) aprovecha Spy Video Trakr de Wild Planet, que es fácilmente programable y diseñado por sus desarrollado
Utilizando la fórmula de las funciones básicas de Excel para crear un proyecto de presupuesto

Utilizando la fórmula de las funciones básicas de Excel para crear un proyecto de presupuesto

en la industria de la construcción estimación de proyectos es muy importante. El dinero es la fuerza impulsora en la mayoría de las industrias y el sector de la construcción no es diferente. Puede ser una de la mayor cantidad de dinero impulsada por
Tutorial de Arduino botón

Tutorial de Arduino botón

qué es más simple y más tonto que un botón, preguntar...Digo: detrás de un botón, pueden ocultar cosas inesperadas. Y dentro de un programa que hace varias cosas, el manejo de un botón puede ser complicado. Lo bueno es que se pueden construir interes
Hacer un Wireless botón fácil

Hacer un Wireless botón fácil

Ah, las grapas ubicuas "Botón fácil".  Hay otros botones de gran cúpula, pero el botón de grapas tiene la particularidad de no necesitar un panel para ser montado en.  Sólo tiene una buena base plana.  Así que ¿por qué no liberar totalmente de c
Arduino - botón de doble función - largo corto Prensa prensa (sin demora) + Bonus

Arduino - botón de doble función - largo corto Prensa prensa (sin demora) + Bonus

Usando software podemos tomar un botón y que encender una luz o apagar, o realizar una función más complicada si lo deseamos. Pero ¿qué pasa si tenemos dos funciones pero todavía sólo un botón? Muchos de nosotros usamos un botón como este, en los sma