Muitas vezes, fazendo protótipos de robótica ou fazendo algum troubleshooting em alguma ferramenta elétrica, é necessário medir rotação. O custo de um instrumento de medir rotação/pulsação(tacômetro) é relativamente alto para usar tão pouco e esporadicamente.
A depender da aplicação até dá pra improvisar a medição com um osciloscopio, leds, imãs e sensores hall, mas, como sempre, é bem útil ter algo pronto e disponível quando necessário. Esse post é dedicado a prototipar um tacômetro com Arduino.
Para isso, podemos construir um tacômetro óptico, que se baseia em oscilações luminosas, na verdade, em variações ritmadas de reflexão de uma superfície.

Isso quer dizer que ele faz uma medição de velocidade de maneira não-invasiva, porque basta colocar uma fita ou marcar com caneta o eixo que vai ser medido, criando uma diferença de reflexão entre a superfície do eixo e a superfície coberta por fita.
Estratégia de medição
A estratégia de medição é simples: contar o tempo entre uma pulsação e outra, assumindo que uma pulsação equivale a uma revolução(logo, coloque apenas um trecho de fita no eixo). Dessa forma, encontramos o período de rotação.
Com isso, podemos calcular a rotação em rpm:
Construtivamente, o tacômetro DIY vai consistir em 4 componentes principais:
- sensor ótico
- potenciômetro de ajuste, usado para calibração do limiar de detecção do sensor
- microcontrolador
- display
Materiais necessários Para montar o Tacômetro com Arduino
- Placa Uno R3
- Shield Arduino Multifunções
- Sensor Óptico Reflexivo Fototransistor TCRT5000
- Resistor 10k ohms
- Resistor 200 ohms
- Mini protoboard
- Algo para marcar o eixo a ser medido (sugiro fita branca)
Opcionais para portabilidade:
Diagrama de ligação do Tacômetro com Arduino
A shield multifunções (inclusive, temos outros posts sobre ela) facilita bastante as coisas pois o display, o potenciômetro e os terminais de sinal já estão instalados e agrupados, basta então montar externamente o circuito do sensor, que consiste nos resistores de 200 (que limita a corrente do emissor) e o resistor de 10k (pull-down associado ao receptor), como no diagrama abaixo.

Vale destacar, em verde, o grupo de pinos de entrada do sensor e o potenciômetro que deve ser usado para calibrar o limiar de luminosidade (isso é útil para calibrar, se necessário, o limite de detecção do sensor, em situações variadas de luminosidade e reflexão das superfícies medidas)
O projeto pode ser alimentado por pela USB do arduino Uno, ou pela entrada p4, usando uma bateria 9v e seu suporte (melhorando a portabilidade), como descrito na lista de materiais necessários.
Código
O código basicamente inicia exibindo o valor de referência coletado pelo pino do trimmer ( um valor de 0 a 1024). Esse valor corresponde ao limiar de tensão do sensor, no qual abaixo desse valor quer dizer pouca reflexão, e acima quer dizer alta reflexão ( reflexão essa que ocorre quando a fita branca passa na frente do sensor, fechando um ciclo). Dessa forma, é sempre possível consultar esse valor resetando o arduino.
Após isso, temos a estratégia de medição implementada: o valor do sensor é lido e comparado com o valor do trimmer, se o valor do sensor for maior que o valor do trimmer, quer dizer que estamos na parte clara do ciclo, então o tempo atual é capturado e, em seguida, esperamos até a parte escura do ciclo, quando o valor lido do sensor fica menor que o de referência.
Feito isso, repetimos o processo 10 vezes, tiramos a média do tempo de ciclo e calculamos a rotação em rpm usando a fórmula descrita no início desse post.
#include <TimerOne.h> // Bibliotec TimerOne #include <MultiFuncShield.h> // Biblioteca Multifunction shield const int n_amostras = 10, tcrt5000_pino = A5, trimmer_pino = A0; int count, rpm, valor_trimmer, valor_sensor; long ultimo_pulso = 0, pulso_atual; float periodo, periodo_medio; void setup() { // Inicializando a biblioteca da MultiFunction Shield Timer1.initialize(); MFS.initialize(&Timer1); // Exibindo o valor de referencia do trimmer durante alguns segundos valor_trimmer = analogRead(trimmer_pino); MFS.write(valor_trimmer); delay(3000); } void loop() { count = 0; periodo_medio = 0; int valor_sensor = analogRead(tcrt5000_pino); // Executando amostragem e média do tempo entre pulsos do { valor_sensor = analogRead(tcrt5000_pino); valor_trimmer = analogRead(trimmer_pino); if (valor_sensor > valor_trimmer) { // a parte clara do ciclo, dentro da fita/marcação pulso_atual = millis(); periodo = pulso_atual - ultimo_pulso; periodo_medio = periodo_medio + periodo; ultimo_pulso = pulso_atual; count++; while (valor_sensor > valor_trimmer) { // esperando a parte escura do ciclo, fora da fita/marcação valor_sensor = analogRead(tcrt5000_pino); } } } while (count < n_amostras) periodo_medio = periodo_medio / n_amostras; rpm = int(60000.0 / periodo_medio); MFS.write(rpm); }
Testes e Conclusão
Nesse vídeo, eu instalei o tacômetro no meu torno de bancada, cuja rotação varia entre 0 e 3000rpm, dá uma olhada:
Atenção ao detalhe da distância entre o sensor e a fita, isso pode precisar de testes para encontrar a distância ideal, mas recomendo inicialmente cerca de 2 centímetros.
Deixe um comentário abaixo contando pra nós se você gostou de aprender a montar um Tacômetro usando o Arduino. E nos siga no Instagram para ficar por dentro de todas as novidades da MakerHero
boa tarde, da erro” tacometro:51:3: error: expected ‘;’ before ‘periodo_medio'”
Olá Jaci.
Confirme que você instalou corretamente todas as bibliotecas.
Att.
Vitor Mattos.
Suporte Técnico MakerHero.