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

sexta-feira, 13 de junho de 2014

Criando suas próprias bibliotecas para Arduino

A plataforma Arduino trouxe a facilidade de criar projetos com microcontroladores, principalmente para iniciantes, devido à abstração de código de baixo nível. Quando você utiliza uma função para escrita ou leitura de um sinal digital, você não precisa se preocupar com a correta manipulação dos registradores internos do microcontrolador que está utilizando em seu projeto. Essa abstração apresenta vantagens, como a portabilidade de código, e desvantagens, como, por exemplo, o possível aumento do código de programa gerado e o consequente atraso para manipulação de sinais.

Outra vantagem de se utilizar bibliotecas é a abstração de hardware, uma vez que você pode manipular o hardware com métodos mais próximos à nossa linguagem.

Nesse tutorial vamos apresentar como criar uma biblioteca para manipular um pino de saída de forma mais alto nível.

As bibliotecas para Arduino são feitas em C++. Inicialmente deve-se criar uma pasta com o mesmo nome que vai ser chamada a biblioteca, contendo o seguinte conteúdo:
A pasta examples conterá os exemplos que apareceram na IDE do Arduino. O Arquivo keywords.txt servirá para as palavras da biblioteca mudarem de cor na IDE. Os arquivos Saida.h e Saida.cpp conterão os códigos da biblioteca. Vamos começar a estruturar nossa biblioteca Saida.

Inicialmente vamos pensar nas ações que uma saída digital poderá demonstrar:
  • ligar;
  • desligar;
  • inverter o seu estado.

Agora temos que editar o arquivo Saida.h, que é o arquivo de cabeçalho da nossa biblioteca. Primeiro vamos inserir as seguintes diretivas de compilação:


Essas diretivas não deixarão as declarações/definições da biblioteca serem inseridas mais de uma vez em um projeto.

Para ter acesso às funções do Arduino, é necessário fazer uso da biblioteca Arduino, inserindo o arquivo de cabeçalho Arduino.h:


Agora vamos criar a classe Saida:

Como pode ser observado, a classe Saida possui um construtor que recebe como parâmetro o pino correspondente a saída. Possui também 3 métodos públicos que poderão ser acessados por quem for utilizar a biblioteca e um atributo privado que só poderá ser acessado dentro da classe.
Vamos agora para a codificação dos métodos da classe no arquivo Saida.cpp:


O construtor Saida::Saida(int pin) configura o pino passado como parâmetro como saída e depois atribui o seu valor à variável privada pino, de modo que esse pino possa ser utilizado pelos métodos da classe futuramente.

Os métodos demonstram as ações que os seus nomes propõem, fazendo uso das funções da biblioteca Arduino.

O arquivo keywords.txt deve ficar da seguinte forma:

O nome da classe deve estar na linha de KEYWORD1 e os métodos serão KEYWORD2.

Agora que nossa biblioteca está pronta, basta adicionar a pasta libraries no diretório do Arduino e vamos criar dois exemplos para testes. Esses exemplos devem ser salvos na pasta examples da nossa biblioteca.

O primeiro exemplo é SaidaBlink, que consiste em piscar um led em intervalos de 1 segundo:

No segundo exemplo é criada uma saída chamada rele, que inverte seu estado quando uma tecla for pressionada:




O exemplo apresentado para criação de bibliotecas foi bem simples e servirá de base para que você possa criar as suas próprias bibliotecas, ou caso você queira entender como uma biblioteca é criada. Você pode adicionar outros métodos a essa biblioteca e testar com o seu hardware, por exemplo, um método que retorne o estado atual de uma saída, etc.