Bem-vindo a uma nova lição do curso de programação para Makers com Arduino e Protocoder! Nesta entrada do curso, vamos utilizar dois sensores de ultrassons BAT para calcular a distância a que colocamos a mão, e depois, com um pequeno buzzer (ou cigarra), reproduziremos um som.
Lista de materiais
- ZUM BT-328, placa Arduino ou compatível.
- 2 sensores de ultrassons Bat
- 1 módulo Buzzer
Conceitos que vamos aprender
Nesta entrada vamos aprender a utilizar o sensor de ultrassons para calcular a distância em centímetros e utilizaremos a função Tone do Arduino, para emitir sons através do buzzer. Para conectar os sensores de ultrassons BAT, seguiremos as indicações da tabela:
Módulo Bat 1 | Módulo Bat 2 | |
VCC | VCC | VCC |
GND | GND | GND |
ECHO | Pino 8 | Pino 9 |
TRIGGER | Pino 10 | Pino 11 |
Na seguinte imagem, podes ver como se conectam os módulos à placa:
O código
No código do Arduino, começamos por declarar as variáveis globais, que neste caso, serão apenas as relativas às conexões dos pinos:
1 2 3 4 |
int TP1 = 9, EP1 = 8; // Trigger Pin 1, Echo Pin 1 int TP2 = 11, EP2 = 10; // Trigger Pin 2, Echo Pin 2 int pinBuzzer = 5; |
Depois, inicializamos o programa com a função setup:
1 2 3 4 5 6 7 8 9 10 11 12 |
void setup() { // pinos do sensor de ultrassons BAT 1 pinMode(EP1, INPUT); pinMode(TP1, OUTPUT); // pinos do sensor de ultrassons BAT 2 pinMode(EP2, INPUT); pinMode(TP2, OUTPUT); pinMode(pinBuzzer, OUTPUT); } |
Nesta função, indicamos os pinos que funcionarão como entrada (INPUT), e quais o que funcionarão como saída (OUTPUT). O código da função loop é:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
void loop() { int freq_maxima = 4000; //frequência máxima int distancia_frequencia = distance(TP1, EP1); int distancia_tempo = distance(TP2, EP2); distancia_frequencia = constrain(distancia_frequencia, 1, 20); distancia_tempo = constrain(distancia_tempo, 1, 10); // 1 equivale a 10 ms e 10 a 100ms distancia_frequencia = map(distancia_frequencia, 1, 20, 1, freq_maxima); distancia_tempo = map(distancia_tempo, 1, 10, 10, 100); // de (1,10) cm a (10,100)ms tone(pinBuzzer, distancia_frequencia, distancia_tempo); delay(distancia_tempo); } |
Em primeiro lugar declaramos a variável local freq_maxima, que indica ao Arduino qual será a frequência máxima a que soará o buzzer. Depois declaramos as variáveis distancia_frequencia e distancia_tempo, que armazenarão os dados da distancia lida pelos sensores de ultrassons, sendo essas distâncias que se utilizarão para modificar a frequência do sonido e o tempo de reprodução de cada “nota”, respectivamente. Para ler a distância, utilizamos a funcão distance, que toma como argumentos, os valores que enviamos do código principal para a função, o número do pino do trigger e echo do sensor de ultrassons. Se quiseres conhecer mais sobre o sensor de ultrassons, podes ver este tutorial da página do Arduino. O código da função distance é:
1 2 3 4 5 6 7 8 |
long distance(int TP, int EP) { long microseconds = TP_init(TP, EP); int distancia = microseconds / 29 / 2; // Distance_CM = ((Duração do alto nível)*(Sonic :340m/s))/2 // = ((Duração do alto nível)*(Sonic :0.034 cm/us))/2 // = ((Duração do alto nível)/(Sonic :29.4 cm/us))/2 return distancia; } |
Podes ver como esta função chama a função TP_init, à qual voltamos a enviar como argumentos, os dados dos pinos que declarámos na função loop anteriormente. Desta forma, podemos ir enviando dados de uma função para a outra, sem problemas. A função TP_init tem o seguinte código:
1 2 3 4 5 6 7 8 9 10 |
long TP_init(int TP, int EP) { digitalWrite( TP , LOW); delayMicroseconds(2); digitalWrite( TP , HIGH); delayMicroseconds(10); digitalWrite( TP , LOW); long microseconds = pulseIn( EP , HIGH); return microseconds; } |
Dentro desta função, alteramos o estado dos pinos, e enviamos vários sinais, de 2 e 10 microsegundos, através do pino Trigger do sensor de ultrassons e depois utilizamos a função pulseIn no pino Echo, para calcular o tempo que demora o pino a alterar o seu valor de cima a baixo. O dito tempo corresponde ao tempo que demorou o impulso a ser recebido, depois de ser enviado. Se quiseres conhecer mais sobre esta função, podes aceder à página de referência do Arduino para a função pulseIn. A função TP_init retorna o valor resultante da função pulseIn (em microsegundos), e dentro da função distance utilizamos o valor em microsegundos que recebemos, para calcular a distância a que se encontra o objecto. Uma vez calculadas as distâncias para os dois sensores de ultrassons, utilizamos a função constrain (que vimos no tutorial anterior) para forçar a que as leituras que realizámos, mantenham-se dentro de certos limites. Não te esqueças de modificar os valores para praticares e aprenderes mais. Uma vez que utilizámos a função constrain, vamos também utilizar a função map (que também vimos no tutorial anterior) para modificar o intervalo dos valores. A variável distancia_tempo, poderia multiplicar o valor por 10, para que a função map não fosse completamente necessária. Por último, fazemos soar o buzzer com o comando tone:
1 2 |
tone(pinBuzzer, distancia_frequencia, distancia_tempo); delay(distancia_tempo); |
A função tone é a responsável por reproduzir o tom que soará no buzzer e tem como parâmetros, o pino onde está conectado o buzzer, a frequência e a duração do tom. A seguir, realizamos um delay com a mesma duração do que o tom, para que esse tom se reproduza completamente. Como exercício, podes experimentar modificar os valores da frequência mínima e máxima, as distâncias, modificar a escala utilizada para mapear os valores, e ver o efeito que tem sobre o buzzer. Até à próxima!