sábado, 14 de junho de 2014

NewTone - Alternativa à biblioteca Tone do Arduino

A biblioteca tone do Arduino realmente apresenta alguns problemas de compatibilidade com outras biblioteca quando estas utilizam a mesma interrupção/timer.


Syntax

  • NewTone( pin, frequency [, length ] ) - Play a note on pin at frequency in Hz.
    • pin - Pin speaker is wired to (other wire to ground, be sure to add an inline 100 ohm resistor).
    • frequency - Play the specified frequency indefinitely, turn off with noNewTone().
    • length - [optional] Set the length to play in milliseconds. (default: 0 [forever], range: 0 to 2^32-1)
  • noNewTone(pin) - Stop playing note (pin is optional, will always stop playing on pin that was last used).

Example

#include <NewTone.h>
#define TONE_PIN 2 // Pin you have speaker/piezo connected to (be sure to include a 100 ohm resistor).
// Melody (liberated from the toneMelody Arduino example sketch by Tom Igoe).
int melody[] = { 262, 196, 196, 220, 196, 0, 247, 262 };
int noteDurations[] = { 4, 8, 8, 4, 4, 4, 4, 4 };
void setup() {} // Nothing to setup, just start playing!
void loop() {
  for (unsigned long freq = 125; freq <= 15000; freq += 10) {  
    NewTone(TONE_PIN, freq); // Play the frequency (125 Hz to 15 kHz sweep in 10 Hz steps).
    delay(1); // Wait 1 ms so you can hear it.
  }
  noNewTone(TONE_PIN); // Turn off the tone.

  delay(1000); // Wait a second.

  for (int thisNote = 0; thisNote < 8; thisNote++) { // Loop through the notes in the array.
    int noteDuration = 1000/noteDurations[thisNote];
    NewTone(TONE_PIN, melody[thisNote], noteDuration); // Play thisNote for noteDuration.
    delay(noteDuration * 4 / 3); // Wait while the tone plays in the background, plus another 33% delay between notes.
  }

  while(1); // Stop (so it doesn't repeat forever driving you crazy--you're welcome).
}


Felizmente encontrei uma biblioteca bem simples, a NewTone, que pelo menos nos meus testes, não apresentou nenhum conflito. Inclusive utilizei os programas que eu já havia criado no post Sons no Arduino para me certificar que não seriam necessárias grandes alterações no código.

E realmente a utilização é simples. As únicas alterações no programa são o carregamento da bibliotecaNewTone no início, e a substituição dos comandos Tone por NewTone, e noTone por noNewTone. E só.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// Programa : Som no Arduino - Sirene - Teste biblioteca NewTone
// Autor : Arduino e Cia  
   
#include <NewTone.h>  
   
#define tempo 10  
int frequencia = 0;  
int Pinofalante = 10;  
   
void setup()  
{  
  pinMode(Pinofalante,OUTPUT); //Pino do buzzer  
}  

void loop()  
{  
  for (frequencia = 150; frequencia < 1800; frequencia += 1) 
  {  
    NewTone(Pinofalante, frequencia, tempo);   
    delay(1);  
  }  
  for (frequencia = 1800; frequencia > 150; frequencia -= 1) 
  {  
    NewTone(Pinofalante, frequencia, tempo);   
    delay(1);  
  }  
}  

Ao montar o circuito, ligue o buzzer na porta 10 do Arduino, e não se esqueça de ligar em série um resistor de pelo menos 100 ohms :

arduino buzzer tone newtone


Se você está enfrentando problemas de conflito com a biblioteca tone padrão do Arduino, esta pode ser a solução.

http://www.arduinoecia.com.br/2014/02/newtone-alternativa-biblioteca-tone-do.html

Nenhum comentário:

Postar um comentário