(Atualização em 07/11/2021): No final do post tem uma lista atualizada de experimentos feitos com este sensor.
No post anterior aprendemos a dar os primeiros passos com Arduino. E agora chegou a hora de desenvolvermos um sensor muito simples que servirá de base para vários experimentos: um sensor de passagem.
Este sensor tem um princípio de funcionamento bastante simples: coloca-se um LED IR frontalmente iluminando um fototransistor (FT). Se houver luz chegando no FT, ele manda um sinal de “ligado” ao Arduino. Se houver algum obstáculo entre os dois impedindo que o LED ilumine o FT, ele manda um sinal de “desligado” para o Arduino.
Um outro arranjo possível é o arranjo lateral. O LED é posicionado lateralmente ao FT, e a iluminação deste pelo LED acontece por reflexão. Nesta configuração, o comportamento do FT se inverte: o sinal de “ligado” é enviado somente se houver algum obstáculo na frente do sensor que reflita a luz do LED. A Figura 1 mostra a resposta do sensor no arranjo frontal e no arranjo lateral.

Circuito do sensor de passagem
O sensor de velocidade acima descrito pode ser facilmente construído com o Arduino Uno usando-se o diagrama abaixo:

A Figura 2 mostra que apenas 3 portas do Arduino são utilizadas. As portas 5V e GND fornecem energia para o LED e FT. O estado do FT pode ser lido tanto numa porta analógica, quanto numa porta digital. Mas preferi a porta digital (aqui escolhi a porta digital 3) porque há apenas dois estados possíveis: “ligado” ou “desligado”. Se utilizássemos a porta analógica, teríamos de nos preocupar em detectar valores entre 0 e 1023, e tentar entender se o sensor está no estado “ligado” ou “desligado”.
Vamos demonstrar o circuito acima de duas formas. A primeira forma é mais simples, e serve apenas para observar graficamente o funcionamento básico do sensor de passagem. Na segunda demonstração, iremos escrever um código que mede o tempo de passagem pelo sensor.
Sketch Arduino (1a. demonstração)
Na primeira demonstração, o Arduino monitora a porta digital onde o FD está conectado, envia o valor medido para a porta serial, enquanto nós observamos o valor de saída. Veja o código abaixo:
// Definição das entradas
// define o pino digital 3 como entrada do fototransistor
const int FOTOpin = 3;
void setup() {
// coloque aqui o código de inicialização que será executada apenas uma vez.
// configuração do pino 3 como entrada
pinMode(FOTOpin, INPUT);
// inicializa a saída serial do Arduino
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
// leitura do fotodiodo
int v1 = digitalRead(FOTOpin);
// escreve a leitura do fototransistor na porta serial
Serial.println(v1);
}
Faça o upload do código acima para o Arduíno, clique no menu TOOLS/SERIAL PLOTTER para observar a leitura do FD. Passe a mão entre o LED e o FD e veja o que acontece.
Sketch Arduino (2a. demonstração)
Na segunda demonstração, o Arduino vai monitorar o FD e medir o tempo de passagem do objeto pelo sensor.
// Definição das entradas
// define o pino digital 3 como entrada do fototransistor
const int FOTOpin = 3;
bool ligado = false;
long dt;
void setup() {
// coloque aqui o código de inicialização que será executada apenas uma vez.
// configuração do pino 3 como entrada
pinMode(FOTOpin, INPUT);
// inicializa a saída serial do Arduino
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
// leitura do fotodiodo
int v1 = digitalRead(FOTOpin);
// detecta se um objeto chegou no sensor
if ((v1 == HIGH) & (ligado == false)){
ligado = true;
dt = millis();
}
// detecta se um objeto saiu do sensor
if ((v1 == LOW) & (ligado == true)){
ligado = false;
dt = millis() - dt;
Serial.print("Tempo de passagem (ms) = ");
Serial.println(dt);
}
}
Faça o upload do código acima para o Arduíno, clique no menu TOOLS/SERIAL MONITOR para observar o conteúdo da porta serial. Passe a mão entre o LED e o FD e veja o que acontece. Não há mais uma descrição gráfica do sinal do FD, mas sim mensagens mostrando a duração em milissegundos da passagem de um objeto pelo sensor. Se conhecermos o tamanho do objeto é possível determinar a velocidade de passagem dele pelo sensor.
Sensor de passagem como um sensor de velocidade
Imagine que o nosso sensor acima possa ser montado de forma que um objeto de comprimento $L$ passe pelo sensor. Quando o objeto passa pelo sensor, a luz do LED no FT vai ser bloqueada por um tempo $\Delta t$. Assumindo que a largura do feixe do LED é infinitamente estreito, o objeto percorre uma distância $\Delta x = L$ ao cruzar o sensor. A velocidade média do objeto de comprimento $L$ ao passar pelo sensor é dada por:
$$\bar{v} = \frac{L}{\Delta t}.$$
O funcionamento básico do sensor é mostrado na animação abaixo:
Adaptando o sensor para medir a velocidade de uma NERF
Adaptei o sensor para medir a velocidade de carrinhos de brinquedo sobre umaa mesa e funcionou legal. Mas veio a pergunta “Será que este sensor funciona para coisas que se movem muito rápido?”. Daí resolvi testá-lo para medir a velocidade do objeto mais rápido a minha disposição: uma NERF. Para quem não sabe, NERF é aquela arma de brinquedo que atira dardos macios.
Um dardo de NERF (que peguei de um brinquedo que meu filho não brinca mais) tem 73 mm, e o tempo de passagem pelo sensor variou entre 4 ms e 5 ms. Usando-se o valor médio de 4.5 ms a velocidade de um tiro de NERF atinge impressionantes 58,4 km/h !!!!!!!
Tentei checar esse valor em outras fontes, e descobri neste vídeo aqui, que velocidade da NERF depende do modelo. No vídeo, um homem testa 5 modelos de NERF e mede velocidades que variam aproximadamente entre 50 km/h e 70 km/h, dependendo do modelo.
Fiquei muito feliz que o nosso sensor de passagem foi capaz de fornecer valores compatíveis com outras medições feitas com instrumentos profissionais de alta precisão.
Conclusões: um sensor, muitos experimentos
Em conclusão, nosso sensor baseado em Arduino, além de simples e barato, é bastante preciso. Como o título deste post já fala, este sensor servirá de base para uma série de experimentos muito interessantes nos próximos posts.
ATUALIZAÇÃO IMPORTANTE (feita em 07/08/2021): No post Conservação da energia mecânica com Hotwheels e Arduino, eu mostrei como mudar o código acima para aumentar a precisão do sensor de milissegundos para microssegundos, e obter velocidades ainda mais precisas.
Lista de experimentos feitos com apenas um sensor de velocidade (atualizado em 07/09/2021):
Gostei muito, excelente. Há muito tempo que andava na procura de algo tão simples
Tenho uma dúvida?
O resistor não devia estar em Pull_up? Da forma como está instalado não dá LOW quando bloqueia o feixe de luz?