DreamsInCode logo

DreamsInCode

import { Research, Work, Passion } from Life;

Imagem de Arduino Basics – Piezo SounderImagem de Arduino Basics – Piezo Sounder

DFRduino Duemilanove

Arduino Basics – Piezo Sounder

Continuando as experiências básicas com o Arduino – e aproveitando para aprender como se coloca um vídeo no YouTube (sim, nunca tinha colocado um vídeo no YouTube, e quê?) – aqui fica um irritante tocador de música, ao nível daqueles que vêm nos (irritantes) postais musicais.

Publicado Tuesday, October 19, 2010 at 9:50 PM

O que é um cristal piezo-eléctrico?

Um cristal piezo-eléctrico é um tipo de cristal, natural ou sintético, capaz de gerar electricidade a partir de uma força mecânica que o deforme e o inverso, isto é, deformar-se ao ser-lhe aplicada uma corrente eléctrica.

No caso concreto, vamos aplicar corrente ao bicho, obrigando-o a deformar-se. Essa deformação gera um click muito rápido. Se o conseguirmos colocar a deformar-se várias vezes por segundo, conseguimos gerar um ruído numa dada frequência, fazendo as nossas notas musicais.

Como fazer soar a frequência correspondente?

O e-book que contém estas pequenas experiências, fornecido pela EarthShine Electronics, tem vários erros e explicações (ou falta delas) dúbias; nesta experiência em particular, apesar do código fornecido funcionar perfeitamente, tem um autêntico peido mental na explicação, e poder-se-ia tomar o que está lá escrito como certo. Não está. Falta o resto da explicação, além do erro. A parte relevante diz:

We then create another array of data type integer and this array stores numbers that correspond to the frequency of the tones, in Kilohertz, of each of the notes in the names[] array.

Os Arrays de que se fala, são os seguintes:

1char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
2int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };

Salta à vista de qualquer pessoa que perceba minimamente de música, que algo está errado. Logo no parágrafo introdutório, nunca notas musicais poderiam ser na ordem destes Kilohertz; depois, olhando para os arrays, e como é lógico, a notas mais altas não correspondem frequências mais baixas.

Começando então do início, que frequências correspondem às notas musicais? Desde o dó médio (c) até ao dó seguinte (C), as frequências, em Hertz (e não em Kilohertz), são as seguintes: 261, 294, 329, 349, 392, 440, 493, 523.

Para gerar a onda quadrada necessária ao nosso piezo, temos que saber uma coisa: qual é a duração do ciclo ligado-desligado para soar a uma frequência. A isto chama-se o período da onda, e, tal como aprendemos em Física (ou terá sido em Matemática?), o período é o inverso da frequência. Por exemplo, o Lá (a) tem 440 Hz, logo 1/440 = 2272 µs (microssegundos). Logo, para que o nosso piezo toque esta frequência, tem que ser ligado e desligado neste espaço de tempo, estando nos dois estados por metade do tempo, 1136 µs. Já vimos este número nalgum lado…

Agora que está reposta a explicação correcta, só nos falta…

O código relevante

1// passamos o tempo correspondente a metade do periodo da nota
2// que queremos tocar e a duracao, em milissegundos
3//
4// o piezoPin é uma variável global com o número do pino onde
5// está ligado o + do piezo (neste caso, era o 9)
6void playTone(int meioPeriodo, int duracao)
7{
8 // multiplicamos por 1000, para ficarmos com microssegundos
9 // o L a seguir ao 1000 força a usar o tipo long, de 4 bits
10 // o incremento é um periodo de cada vez
11 for (long i = 0; i < duracao * 1000L; i += meioPeriodo * 2)
12 {
13 // ligamos
14 digitalWrite(piezoPin, HIGH);
15 // agora que está ligado, aguardamos meio período
16 delayMicroseconds(meioPeriodo);
17 // desligamos
18 digitalWrite(piezoPin, LOW);
19 // e aguardamos o resto do período que falta
20 delayMicroseconds(meioPeriodo);
21 }
22}

O resultado é este som desagradável…

Arduino

Postas relacionadas