Star Wars al estilo de timbre musicales sobre el Arduino

Hola, hace poco me dijo que sí y le señalé al vídeo, como puede parpadean ATtiny13 usando Arduino, y ahora mostrar la práctica utilizarlo.

He de decir, Fyuz, firmware como un código hexadecimal archivo C, un boceto para el Arduino IDE, archivos de Proteus 7 se puede descargar al final del artículo.

Bueno, eso realmente tire, mostrar cómo funciona:



Hace tiempo que quería permitirse un timbre tan musical, de modo que cuando usted presiona el juego marchar Imperio (Imperial March o el tema de Darth Vader) de «Звёздных Guerras », me gusta mucho esta canción.


Como su nombre indica el vídeo de arriba, el componente principal del dispositivo - microcontrolador ATtiny13 , su aplicación ha hecho posible para hacer que el tamaño de la mesa varias veces Más pequeño que una caja de cerillas:

Tablero Dimensiones

Y ahora todo el documento adjunto:



Rango de potencia de aproximadamente 2 a 6, es decir, de dos a cuatro pilas de tamaño AA, aunque lo ideal sería proporcionar voltaje 3.4 V, es decir, para este fin es la batería de iones de litio ideal de un teléfono móvil o un formato batería 18650, Sin embargo, es deseable que ser protegido con, ya que todavía no he implementado ningún tipo de protección contra descarga profunda.

Bueno, voy a decir algunas palabras sobre el diseño del circuito:

El esquema se parece a esto (Proteus archivos adjuntos al final del artículo, usted puede incluso no cobrar maketke):

pintado en Proteus'e



Desde el microcontrolador por sí sola no puede tirar de un volumen suficiente para ser escuchado por toda la visita a domicilio, añadí transistor NPN 2N3904 < / a>, un transistor bastante común, en principio, puede acercarse a cualquier transistor que tira del altavoz, en mi caso la capacidad transistor de 100 mA.
Cuando se utiliza 3 pilas AA formato transistor Ligeramente tibia, utilizando dos - el volumen se mantuvo en un buen nivel, pero el transistor fue un poco de calor
. La resistencia R2 - Instalación estándar para microcontrolador proporciona protección contra activación accidental del microcontrolador, en principio, debería funcionar sin él, la resistencia R1 sirve para limitar la corriente a la base del transistor.
La foto muestra el diodo más protectora protege de omisión, es decir, la inversión de polaridad, en mi caso, revirtió rápidamente bajar el microcontrolador, con bastante posible como fuegos artificiales y efectos de sonido. Por cierto, en el siguiente diagrama, se me olvidó especificarlo, se puede utilizar cualquier diodo que está clasificado para la tensión de 10 V y una corriente de 200 mA, en vías de ser derechos de inscripción o menos o más, menos para mí.
Presidente de la vieja Dial up modem Zyxel, por cierto, acerca de los módems de acceso telefónico a esta empresa tiene una anécdota muy conocida:

Broma Sit dos hackers, y la habitación llega un gato. Un pirata informático se pregunta:
- Su gato
- Sí, mi. Nombre Zuhel!
- ¿Por qué Zuhel
- Mire aquí. Toma la escoba, le asoma en el gato y dice: "Zuhel, conexión !!!" Gato:
- Pshshshshshshshshshshshshshsh



El código que tengo que decir, , más precisamente, que se encuentra en la gran youtube, aquí está el vídeo en sí:



Bajo el vídeo tiene un enlace a , aquí está:

código de la descripción del video
 & lt; code class = & quot; cpp & quot; & gt; #include & lt; avr / pgmspace.h & gt; // // Bytartakynov programado para ATtiny13 en Arduino IDE usando core13 http://sourceforge.net/projects/ard-core13/ #define PIN_LED 1 #define PIN_BUZZER 0 #define COUNT_NOTES 39 frecuencias de palabras [COUNT_NOTES] PROGMEM = {392 , 392, 392, 311, 466, 392, 311, 466, 392, 587, 587, 587, 622, 466, 369, 311, 466, 392, 784, 392, 392, 784, 739, 698, 659, 622 , 659, 415, 554, 523, 493, 466, 440, 466, 311, 369, 311, 466, 392}; duraciones palabra [COUNT_NOTES] PROGMEM = {350, 350, 350, 250, 100, 350, 250, 100, 700, 350, 350, 350, 250, 100, 350, 250, 100, 700, 350, 250, 100, 350, 250, 100, 100, 100, 200, 100, 350, 250, 100, 100, 100, 200, 100, 350, 250, 100, 750}; void setup () {pinMode (PIN_LED, OUTPUT); pinMode (PIN_BUZZER, OUTPUT); } Lazo vacío () {for (byte i = 0; i & lt; COUNT_NOTES; i ++) {zumbido (PIN_BUZZER, pgm_read_word (& amp; (frecuencias [i])), 2 * pgm_read_word (& amp; (duraciones [i])) ); retardo (100); } Delay (3000); } Zumbido Void (pin unsigned char, palabra frequencyInHertz, timeInMilliseconds palabra) {long DELAYAMOUNT = (largo) (largo (1000000) / (longitud) frequencyInHertz); largo LOOPTIME (largos) (((largos) timeInMilliseconds * 500) / DELAYAMOUNT); para (a largo i = 0; i & lt; looptime; i ++) {digitalWrite (pin, HIGH); delayMicroseconds (DELAYAMOUNT); digitalWrite (pin, LOW); delayMicroseconds (DELAYAMOUNT); }} & Lt; / Código & gt;  pre> El tamaño del boceto en código binario: 946 bytes (de 1024 bytes como máximo) 


Como se puede ver, hay dos arrays frecuencias - traducido del Inglés frequency y duraciones - duración, todas las palabras de tipo de datos, PROGMEM - los datos se almacenan en el microcontrolador de memoria flash (sin el uso de la biblioteca pgmspace.h no funcionará) Bueno, hay un generador de frecuencia buzz (), que toma tres parámetros - el pasador, que se genera la frecuencia, la segunda - la frecuencia en hercios, y el tercero -. la duración en milisegundos
Este código debe ser Arduino compatible y trabajar incluso en Arduino Uno, Arduino Nano o Arduino Pro Mini y otros bien y Duino.

Como se puede escuchar en el video, el sonido de mis vídeos es ligeramente diferente del segundo video, el hecho de que soy un pequeño cambio de la duración de las notas y tres veces como método popular de "lanza científica", planteó la frecuencia, ya que un pequeño altavoz tal como me malas jugadas aquellas frecuencias que eran originalmente, y añadir un botón, lo que timbre sin botones?

Un poco corregido por él mismo y comentada
 & lt; código class = & quot; cpp & quot; & gt; // Bytartakynov: // // http://youtu.be/5R7NeQkVS_8 y yo - vk.com/razniepodelki #define F_CPU 1200000L // frecuencia en hertz MK #include & lt; avr / pgmspace.h & gt; // Necesidad de PROGMEM #define PIN_BUZZER 2 // PB2 Altavoz BOTÓN #define botón 4 // PB4 #define COUNT_NOTES 39 // número de frecuencias notas palabra [COUNT_NOTES] PROGMEM = {// aquí son la frecuencia 392, 392, 392, 311, 466, 392, 311, 466, 392, 587, 587, 587, 622, 466, 369, 311, 466, 392, 784, 392, 392, 784, 739, 698, 659, 622, 659, 415, 554, 523, 493, 466, 440, 466, 311, 369, 311, 466, 392}; duraciones de palabras [COUNT_NOTES] PROGMEM = {// aquí sus duraciones 350, 350, 350, 250, 100, 350, 250, 100, 700, 350, 350, 350, 250, 100, 350, 250, 100, 700, 350 , 250, 100, 350, 250, 100, 100, 100, 450, 150, 350, 250, 100, 100, 100, 450, 150, 350, 250, 100, 750}; // Configura Void () // {int main (void) // esta es una configuración vacío analógico (), para ahorrar espacio {pinMode (PIN_BUZZER, OUTPUT); // Inicializar el pasadores pinMode (BUTTON, INPUT); // Conecte un digitalWrite resistencia pullup (BOTÓN, HIGH); // Botón para volver al // BAJA cuando //} // void loop () {// while (1) {// analógica void loop () (bucle infinito) si (digitalRead (BOTÓN) == LOW) {/ / cuando se pulsa el botón para (byte i = 0; i & lt; COUNT_NOTES; i ++) // en realidad pierdo sintonizar {zumbido (PIN_BUZZER, pgm_read_word (& amp; (Fréquences [i])) * 3, 2 * pgm_read_word (& Amp; (duraciones [yo]))); // ¿Fue originalmente: // zumbido (PIN_BUZZER, pgm_read_word (& amp; (frecuencias [i])), 2 * pgm_read_word (& amp; (duraciones [i]))); // Pero yo multipliqué frecuencia 3 // (pgm_read_word (& amp; (frecuencias [i])) * 3) // que sea más fuerte audible en el pequeño altavoz // retardo (100); // No es necesario}} // retardo (3000); // Y esto} // estas líneas deben volver 0; // Int main (void)} // y mientras (1) vacío zumbido (pin unsigned char, palabra frequencyInHertz, timeInMilliseconds palabra) // en realidad {// generador de frecuencia a largo DELAYAMOUNT = (largo) (largo (1000000) / (largo) frequencyInHertz); // El parámetro tiene tres largos LOOPTIME (largos) (((largos) timeInMilliseconds * 500) / DELAYAMOUNT); // 1 - pin para (a largo i = 0; i & lt; looptime; i ++) // 2 - {// frecuencia 3 - duración digitalWrite (pin, HIGH); // Generar las delayMicroseconds impulsos de frecuencia que desee (DELAYAMOUNT); digitalWrite (pin, LOW); delayMicroseconds (DELAYAMOUNT); }} & Lt; / Código & gt;  pre> El tamaño del boceto en código binario: 976 bytes (de 1024 bytes como máximo) 


Como se puede ver, añadir la respuesta cuando se pulse el botón supera 1.024 bytes, y tuvo que insertar fragmentos de código C para caber en ATtiny13.
Frecuencia de elevada líneas zumbido (PIN_BUZZER, pgm_read_word (& (frecuencias [i])) * 3, 2 * pgm_read_word (& (duraciones [i]))); multiplicando la frecuencia generada como a determinar tres, esto es puramente mi capricho, no puede multiplicar nada en absoluto.

Si usted es un arduinschik experimentado, creo aviso en el código que he hecho resistencia software ascensor PULLUP al PB4 puerto.
Para aquellos que no lo conocen se hace para:
Exposición en el puerto de entrada; Ideas y que la unidad lógica. Ahora, el puerto será la tensión es aproximadamente igual a la tensión de alimentación, si este puerto está cortocircuitado a tierra, que va a cambiar su estado de una unidad lógica a cero lógico, con el microcontrolador al mismo tiempo no sufrirá, ya que utiliza una resistencia interna cuyo valor 10-100 ohms.
Lo hice simplemente para ahorrar espacio en la placa, sólo puede soldar resistencia a 10k además de comida y el puerto deseado pulsando el botón que "atraemos puerto a la tierra", y sería cero lógico.

Añadir un código para limpiar AVR-C de mano de obra AVR'schikov:

Código para AVR-C
 & lt; code class = & quot; cpp & quot; & gt; // Bytartakynov: // // http://youtu.be/5R7NeQkVS_8 y yo - vk.com/razniepodelki #define F_CPU 1200000UL // frecuencia en hertz MK #include & lt; avr / io.h & gt; // Biblioteca #include Input Output & lt; util / delay.h & gt; // Biblioteca para hacer frente a los retrasos #include & lt; avr / pgmspace.h & gt; // Necesidad de PROGMEM #define PIN_BUZZER 2 // PB2 Altavoz BOTÓN #define botón 4 // PB4 #define COUNT_NOTES 39 // número de frecuencias notas palabra [COUNT_NOTES] PROGMEM = {// aquí son la frecuencia 392, 392, 392, 311, 466, 392, 311, 466, 392, 587, 587, 587, 622, 466, 369, 311, 466, 392, 784, 392, 392, 784, 739, 698, 659, 622, 659, 415, 554, 523, 493, 466, 440, 466, 311, 369, 311, 466, 392}; duraciones de palabras [COUNT_NOTES] PROGMEM = {// aquí sus duraciones 350, 350, 350, 250, 100, 350, 250, 100, 700, 350, 350, 350, 250, 100, 350, 250, 100, 700, 350 , 250, 100, 350, 250, 100, 100, 100, 450, 150, 350, 250, 100, 100, 100, 450, 150, 350, 250, 100, 750}; // Configura Void () // {int main (void) // esta es una configuración vacío analógico (), para ahorrar espacio {DDRB | = (1 & lt; & lt; PIN_BUZZER); // Puerto initsyalizatsiya DDRB & amp; = ~ (1 & lt; & lt; BOTÓN); // Conecte un PORTB resistencia pullup | = (1 & lt; & lt; BOTÓN); // // Este botón restablece a 0 cuando se pulsa (zamykinii) //} // void loop () {// while (1) {// analógica void loop () (bucle infinito) if ((PINB & amp;! (1 & lt ; & lt; BOTÓN))) {// cuando se pulsa el botón para (byte i = 0; i & lt; COUNT_NOTES; i ++) // en realidad perder sintonía {zumbido (pgm_read_word (& amp; (frecuencias [i])) * 3 2 * pgm_read_word (& amp; (duraciones [i]))); // ¿Fue originalmente: // zumbido (PIN_BUZZER, pgm_read_word (& amp; (frecuencias [i])), 2 * pgm_read_word (& amp; (duraciones [i]))); // Pero yo multipliqué frecuencia 3 // (pgm_read_word (& amp; (frecuencias [i])) * 3) // que sea más fuerte audible en el pequeño altavoz} // _ delay_ms (100); // Para la depuración} // _ delay_ms (3000); // Para la depuración} // estas líneas deben volver 0; // Int main (void)} // y mientras (1) // vacío zumbido (pin unsigned char, palabra frequencyInHertz, timeInMilliseconds palabra) vacío zumbido (palabra frequencyInHertz, timeInMilliseconds palabra) // en realidad {// generador de frecuencia larga DELAYAMOUNT = (largo) (largo (1000000) / (longitud) frequencyInHertz); // El parámetro tiene tres largos LOOPTIME (largos) (((largos) timeInMilliseconds * 500) / DELAYAMOUNT); // 1 - pin para (a largo i = 0; i & lt; looptime; i ++) // 2 - {// frecuencia 3 - duración // digitalWrite (pin, HIGH); // Generar pulsos de la frecuencia deseada PORTB | = (1 & lt; & lt; PIN_BUZZER); // Para save'll poner puntos de sutura en C // delayMicroseconds (DELAYAMOUNT); // Sra retraso en la _delay_us Arduino (DELAYAMOUNT); // En C // digitalWrite (pin, LOW); PORTB & amp; = ~ (1 & lt; & lt; PIN_BUZZER); // delayMicroseconds (DELAYAMOUNT); // Sra retraso en la _delay_us Arduino (DELAYAMOUNT); // En C}} & lt; / Código & gt;  pre> 

Parece como debe compilar sin problemas, pero cuando se utiliza este código en el Arduino IDE de alguna manera el tamaño del archivo hex de por lo menos duplicado "El tamaño del boceto en código binario:. 1986 bytes (1024 bytes del máximo)"
Como me enteré de todo esto desde el _delay_us uso (*); aunque arduinovskaya delayMicroseconds función (*); básicamente hace lo mismo, creo que es archivos del kernel Incidencias para tini13, que se ramifican en el :

texto oculto



Ahora, cualquiera que tenga AVR programador puede repetir este dispositivo.

Como se prometió en el principio de este artículo .

Y, por último - "Sí llegar con usted la fuerza."

Fuente: