Curso Arduino Nível II – #3 – Sirene de Alarme
Neste artigo, vamos abordar a criação de sons. Já geramos sinais acústicos simples, agora vamos variá-los. Isto, no sentido de criar uma sirene de alarme.
Durante o primeiro nível do curso Arduino, geramos sons utilizando um buzzer que tinha um oscilador integrado. Este elemento funcionou de forma muito simples: depois de lhe ser fornecida energia, emitia um som contínuo, ou melhor, um ruído alto. Agora vamos trabalhar com um buzzer sem oscilador. Desta vez, para conseguirmos ouvir algo, temos de fornecer o sinal certo. Naturalmente, como provavelmente adivinhou, a mudança deste sinal (principalmente a sua frequência) vai afetar o som.
Na imagem que podemos ver acima, encontra-se o altifalante que vamos utilizar neste artigo. Poderá adquiri-lo aqui.
Exercício Prático – Ligação do Altifalante ao Arduino
Material necessário:
- 1x Arduino UNO e Cabo USB;
- 1x Fonte de Alimentação;
- 1x Breadboard;
- 1x Altifalante;
- 2x Cabos jumper.
Vamos começar com a ligação mais simples, ou seja, ligar diretamente aos pinos do microcontrolador. Isto é possível porque o altifalante consome pouca corrente e não danifica a saída do Arduino.
Para isso, veja a parte de trás do altifalante:
Posto isto, basta fazer as seguintes ligações:
- Terminal com sinal – ao GND do Arduino;
- Terminal com sinal + ao pino A5.
Vejamos o esquema de montagem:
Inserir Imagem do Esquema de Montagem
1º Teste
Inicialmente, vamos verificar o que é que acontece quando usamos o altifalante de forma semelhante à utilizada no nível anterior do curso, isto é, como se tivesse um oscilador. Para este fim, simplesmente mudamos o estado de saída:
void setup() { pinMode(A5, OUTPUT); //Configuração do pino A5 como saída } void loop() { digitalWrite(A5, LOW); //Alteração cíclica do estado do pino delay(1000); digitalWrite(A5, HIGH); delay(1000); }
Quando usamos o buzzer com oscilador, ouvimos um ruído alto. No entanto, desta vez, apenas conseguimos ouvir uns “puffs” muito baixos. O som é curto e ocorre somente quando o estado da saída é alterado. Isto porque, à medida que a tensão fornecida muda, a placa, que está dentro do altifalante, é deformada. São as vibrações dessa placa que geram som.
A conclusão é que quanto maior for a frequência de mudança de estado, mais frequentemente ouvimos o som.
2º Teste
Vamos tentar uma outra versão do programa:
void setup() { pinMode(A5, OUTPUT); //Configuração do pino A5 como saída } void loop() { digitalWrite(A5, LOW); //Alteração cíclica do estado do pino delay(100); digitalWrite(A5, HIGH); delay(100); }
O efeito do código é o seguinte:
Como esperado, o som é mais frequente. Mas podemos aumentar ainda mais a taxa de mudança de estado.
3º Teste
void setup() { pinMode(A5, OUTPUT); //Configuração do pino A5 como saída } void loop() { digitalWrite(A5, LOW); //Alteração cíclica do estado do pino delay(10); digitalWrite(A5, HIGH); delay(10); }
Funcionamento do código na prática:
Desta vez, podemos perceber que acontece algo estranho – ouvimos claramente um outro som. Se for curioso e quiser dar um passo à frente, pode verificar o que acontece se colocar um delay de 1ms.
Mas, é claro que, gerar som através dos delays não é o mais conveniente. Seria muito melhor se existisse uma função que nos pudesse ajudar. É isso que vamos abordar de seguida.
Função Tone
A função tone () é muito simples e requer três argumentos:
- Pino no qual o sinal vai ser gerado;
- Frequência do sinal;
- Duração do sinal (não obrigatório).
Na prática, a utilização desta função faz-se da seguinte forma:
tone(A5, 1000, 2000); //Gerar um sinal de 1000Hz no pino A5 que dura 2000ms
Ou numa versão mais reduzida:
tone(A5, 1000); //Gerar um sinal de 1000Hz no pino A5
De agora em diante, vamos utilizar esta função.
Exercício Prático – Função Tone
Para este exercício, deverá utilizar o esquema de ligação montado anteriormente.
Vamos verificar se, com esta nova função, obtemos som. Confira o código abaixo:
void setup() { pinMode(A5, OUTPUT); //Configuração do pino A5 como saída tone(A5, 1000); //Gerar um sinal de 1000Hz no pino A5 } void loop() { }
O efeito do código deverá ser o seguinte:
Vale a pena referir que a função tone () começa a gerar o sinal no pino indicado e, por padrão, será sempre produzido nele o tempo todo. Portanto, apesar de no código acima a função estar inserida na função setup, o som não termina. Isto tem uma desvantagem: para gerar som com a função tone (), o contador (temporizador) integrado no Arduino é usado. Este também é responsável por gerar o sinal PWM. Desta forma, o uso da função afeta a capacidade de gerar sinais PWM nas saídas 3 e 11.
Para parar o som, use a seguinte função:
noTone(A5); //Parar a geração de sinais no pino A5
Vejamos um código exemplo:
void setup() { pinMode(A5, OUTPUT); //Configuração do pino A5 como saída } void loop() { tone(A5, 1000); //Gerar um sinal de 1000Hz no pino A5 delay(1000); noTone(A5); //Parar a geração de sinais no pino A5 delay(1000); }
Na prática, será isto que ouvimos:
Exercício Prático – Procurar a Frequência Mais Alta
Cada buzzer/altifalante, a uma certa frequência, começa a fazer ruídos muito altos. Falamos da frequência de ressonância. Mas, antes de abordarmos este assunto, encoramo-lo a realizar uma experiência.
Nos exemplos acima, geramos sinais com frequência de 1000Hz ou 1kHz. Mas de onde vem esse valor? É uma boa pergunta! A verdade é que o valor veio do nada, simplesmente colocámos um número aleatório e conseguimos acertar num valor que consegue gerar som. Porém, vamos usar o loop for para verificar um intervalo mais amplo:
void setup() { pinMode(A5, OUTPUT); //Configuração do pino A5 como saída } void loop() { int frequencia = 0; for (frequencia = 31; frequencia < 65535; frequencia++) { tone(A5, frequencia); //Gerar um sinal com determinada frequência no pino A5 } }
Porque é que o loop for é executado a partir de uma frequência de 31Hz até 65535Hz? Este é o limite da função tone.
O funcionamento do código acima na prática é o seguinte:
Depois de iniciar o programa, consegue ouvir um som muito alto e vários sons estranhos. Após alguns segundos, o circuito reinicia e ouvimos novamente um som alto. Ao alterar o intervalo pelo qual o loop passa, pode tentar encontrar a frequência mais alta.
Se tiver essa possibilidade, verifique a datasheet do produto e procure a frequência de ressonância. No caso do nosso altifalante é: 1200Hz ± 150Hz. Portanto, devemos esperar que a sua nota mais alta seja entre 1050Hz e 1350Hz.
Vamos verificar com um simples programa:
void setup() { pinMode(A5, OUTPUT); //Configuração do pino A5 como saída } void loop() { tone(A5, 1200); //Gerar um sinal de 1200Hz no pino A5 delay(100); noTone(A5); delay(100); }
Agora obtemos um som mais alto:
Exercício Prático – Sirene de Alarme
O programa acima permite gerar um som intermitente e uniforme. Como mostrado pelo teste do loop for, este altifalante também permite gerar outros sons, tudo depende da frequência selecionada. Então, podemos criar uma sirene de alarme simples:
void setup() { pinMode(A5, OUTPUT); //Configuração do pino A5 como saída } void loop() { tone(A5, 1350); //Gerar um sinal de 1350Hz no pino A5 delay(150); tone(A5, 1050); //Gerar um sinal de 1050Hz no pino A5 delay(150); }
O que ouvimos é o seguinte:
Escolhemos o tempo e as frequências de forma experimental. Acreditamos que muitos de vocês sejam mais talentosos a nível musical e que sejam capazes de criar sons muito mais interessantes. Ficámos à espera de ouvir os vossos alarmes!
Exercício Prático – Criação de Melodias (Avançado)
Se se interessar pelo mundo da música, pode gerar as mais diversas melodias. No próprio IDE existe um exemplo que pode verificar. Deverá fazer o seguinte:
Ficheiro > Exemplos > Digital > toneMelody
A melodia criada é a seguinte:
Para os que ficaram atraídos por esta área, aqui está a listagem das notas musicais com as diversas frequências, que pode encontrar no ficheiro pitches.h (abre automaticamente com o exemplo acima):
#define NOTE_B0 31 #define NOTE_C1 33 #define NOTE_CS1 35 #define NOTE_D1 37 #define NOTE_DS1 39 #define NOTE_E1 41 #define NOTE_F1 44 #define NOTE_FS1 46 #define NOTE_G1 49 #define NOTE_GS1 52 #define NOTE_A1 55 #define NOTE_AS1 58 #define NOTE_B1 62 #define NOTE_C2 65 #define NOTE_CS2 69 #define NOTE_D2 73 #define NOTE_DS2 78 #define NOTE_E2 82 #define NOTE_F2 87 #define NOTE_FS2 93 #define NOTE_G2 98 #define NOTE_GS2 104 #define NOTE_A2 110 #define NOTE_AS2 117 #define NOTE_B2 123 #define NOTE_C3 131 #define NOTE_CS3 139 #define NOTE_D3 147 #define NOTE_DS3 156 #define NOTE_E3 165 #define NOTE_F3 175 #define NOTE_FS3 185 #define NOTE_G3 196 #define NOTE_GS3 208 #define NOTE_A3 220 #define NOTE_AS3 233 #define NOTE_B3 247 #define NOTE_C4 262 #define NOTE_CS4 277 #define NOTE_D4 294 #define NOTE_DS4 311 #define NOTE_E4 330 #define NOTE_F4 349 #define NOTE_FS4 370 #define NOTE_G4 392 #define NOTE_GS4 415 #define NOTE_A4 440 #define NOTE_AS4 466 #define NOTE_B4 494 #define NOTE_C5 523 #define NOTE_CS5 554 #define NOTE_D5 587 #define NOTE_DS5 622 #define NOTE_E5 659 #define NOTE_F5 698 #define NOTE_FS5 740 #define NOTE_G5 784 #define NOTE_GS5 831 #define NOTE_A5 880 #define NOTE_AS5 932 #define NOTE_B5 988 #define NOTE_C6 1047 #define NOTE_CS6 1109 #define NOTE_D6 1175 #define NOTE_DS6 1245 #define NOTE_E6 1319 #define NOTE_F6 1397 #define NOTE_FS6 1480 #define NOTE_G6 1568 #define NOTE_GS6 1661 #define NOTE_A6 1760 #define NOTE_AS6 1865 #define NOTE_B6 1976 #define NOTE_C7 2093 #define NOTE_CS7 2217 #define NOTE_D7 2349 #define NOTE_DS7 2489 #define NOTE_E7 2637 #define NOTE_F7 2794 #define NOTE_FS7 2960 #define NOTE_G7 3136 #define NOTE_GS7 3322 #define NOTE_A7 3520 #define NOTE_AS7 3729 #define NOTE_B7 3951 #define NOTE_C8 4186 #define NOTE_CS8 4435 #define NOTE_D8 4699 #define NOTE_DS8 4978
Para além dos exemplos fornecidos no IDE, existe uma infinidade de projetos online que pode verificar. Eis um exemplo:
Sumário
O objetivo desta parte era dominar o novo elemento – altifalante sem oscilador. Agora, poderá criar um alarme para proteger os seus bens mais queridos! Se bem que não é um alarme muito completo… Por isso é que, de seguida, vamos abordar o sensor de movimento PIR. Portanto, não pode perder o artigo seguinte!