Neste post vamos mostrar como utilizar o sensor óptico reflexivo TCRT5000 com o Arduino. Este sensor é barato e possui boas especificações para ser usado em pequenos projetos de robótica e automação. Vamos explicar como ele funciona, as suas principais aplicações e desenvolver um projeto com Arduino para mostrar como ler os sinais do sensor óptico com um Arduino.
O sensor óptico reflexivo TCRT5000 é um dos mais populares para utilização em projetos com Arduino. O sensor é fabricado pela Vishay, uma tradicional fabricante de componentes eletrônicos. Recomendamos fortemente a leitura do datasheet do sensor aqui.
Trata-se de um sensor reflexivo que possui embutido um emissor infravermelho e um fototransistor. O emissor é um led infravermelho que emite um sinal nessa faixa do espectro. Já o fototransistor é o receptor que faz a leitura do sinal refletido. Ou seja, o led emite um feixe infravermelho que pode ou não ser refletido por um objeto. Caso o feixe seja refletido, o fototransistor identifica o sinal refletido e gera um pulso em sua saída.
Na figura 1 temos uma ilustração do sensor e o seu circuito eletrônico básico:
No circuito da figura 1, vemos o led infravermelho entre os terminais A e B e o fototransistor entre os terminais C e E. Na imagem do sensor é muito visível os dois componentes.
A distância máxima de detecção não é grande, ficando em torno de 25mm (dois centímetros e meio), o que pode limitar um pouco a sua aplicação. O fototransistor vem com um filtro de luz ambiente, o que maximiza a identificação do feixe infravermelho refletido.
A Vishay disponibiliza duas versões deste sensor: O TCRT5000 e o TCRT5000L. A única diferença é que o TCRT5000L possui os terminais mais longos. A corrente de saída para as duas versões não ultrapassa 1mA.
Na figura 2 temos o circuito de aplicação e um desenho mostrando como o sensor é utilizado para identificar objetos reflexivos.
As principais aplicações do sensor óptico reflexivo TCRT5000 são:
Agora que conhecemos como funciona o sensor, vamos aplicá-lo em um projeto utilizando o Arduino.
Para aplicarmos o TCRT5000 com o arduino, vamos utilizá-lo para identificar e contar o objetos com superfície reflexiva. Vamos conectar o sensor ao arduino. Sempre que um objeto for identificado, vamos acender um led vermelho para mostrar que um objeto foi percebido pelo sensor e vamos mostrar também o tempo decorrido entre cada leitura do objeto. Esse tempo será usado para calcular a velocidade de uma bicicleta. Bicicleta? Sim! A ideia é instalar o sensor reflexivo e um elemento reflexivo na roda da bicicleta, de forma que a cada volta que a roda fizer o sensor será ativado uma vez.
Vamos para a montagem de hardware!
Esta montagem é simples e não tem muito segredo para interfacear o TCRT5000 com Arduino. Primeiro, vamos à nossa lista de componentes.
O resistor de 330R será ligado no diodo infravermelho e o de 10K será ligado no fototransistor. Esses são os valores mais comumente usados, no entanto, você pode usar outros resistores da mesma ordem de grandeza.
Na figura 3 temos como o circuito foi montado no protoboard. O coletor do fototransistor é ligado ao resistor de 10K e em uma entrada digital do Arduino. Essa entrada é que vamos usar para identificar se o sensor percebeu algum objeto ou não. O emissor do fototransistor é ligado em GND.
O terminal positivo do led infravermelho é ligado por meio de um resistor de 330R ao VCC e o seu terminal negativo é ligado em GND. Por fim, ligamos um led em uma saída digital do arduino.
Agora precisamos escrever nosso programa para fazer a leitura do sensor, contar o número de objetos identificados e acionar o led quando um objeto entrar no raio de leitura do sensor.
Na figura 4 temos a função void setup(). Ela inicializamos o pino que vamos usar para acionar o led como saída digital e um outro pino digital como entrada para podermos ler o sinal no coletor do fototransistor. Inicializamos também a porta serial para podermos mostrar na tela do monitor serial o tempo decorrido entre cada vez que um objeto é identificado.
No nosso caso, a variável led corresponde ao pino 10 e a variável saidaSensor corresponde ao pino 7,conforme a montagem da figura 3.
#define led 10 #define saidaSensor 7 int Time; int lasTime; int difference; int IsUpdated; void setup(){ Time = lasTime = difference = 0; pinMode(led, OUTPUT); // Pino para ativar o led pinMode(saidaSensor, INPUT); // Pino para ler o sinal no coletor do fototransistor Serial.begin(9600); // Inicializa a porta serial com baud rate de 9600 }
Na função void loop tempo nós fazemos a leitura do sensor utilizando a função digitalReal(). Logo após a leitura nós avaliamos em um if se o sinal lido é baixo ou alto. Se o sinal for baixo, isto significa que o fototransistor está em fechado, o que faz com que o pino conectado ao coletor fique conectado ao GND. Ou seja, um objeto está refletindo o sinal infravermelho para o fototransistor. Dentro do if nós usamos a função milis() para saber o tempo naquele exato momento. Esse valor é usado para calcular o tempo decorrido entre uma detecção e outra. Ainda dentro do if, nós ativamos o led conectado ao arduino,para mostrar que houve uma detecção, e chamamos calcSpeed(), que foi implementada para calcular a velocidade da bicicleta (ou qualquer veículo sobre rodas).
Caso o sinal seja HIGH, significa que o fototransistor está aberto e nenhum objetivo passou no raio de leitura do TCRT5000, assim, não fazemos nada, apenas atribuímos o último valor de tempo lido com a função milis() na variável lastTime. Esta variável armazena o momento da última detecção de um objeto, para que na próxima vez que um novo objeto for identificado, o tempo decorrido entre cada detecção seja calculado. A variável IsUpdated é usada para saber a primeira vez que o sensor foi ativado.
void loop(){ bool leituraSensor = digitalRead(saidaSensor); if (leituraSensor == 0){ Time = millis(); difference = (Time - lastTime); // Calcula o tempo em segundos IsUpdated++; digitalWrite(led, HIGH); calcSpeed(difference, IsUpdated); }else{ IsUpdated = 0; digitalWrite(led, LOW); lastTime = Time; } delay(10); }
Por fim, na figura 6 temos a função calcSpeed, na qual utilizamos o tempo entre cada ativação do sensor para calcular a velocidade percorrida. Repare que usamos um buffer de N posições que armazena N velocidades. Caso N seja 10, por exemplo, nó vamos fazer 10 leituras de com o sensor reflexivo. Ao fim das 10 leituras, nós calculamos a velocidade média e mostramos na porta serial.
Considerando que o sensor está afixado na roda, temos que utilizar a seguinte relação:
Velocidade = (2* *raio) / Tempo
Para obter a velocidade em metros por segundo (m/s), o raio da roda deve estar em metros e o tempo entre uma ativação e outra do sensor deve estar em segundos. Lembre que a função milis() retorna o tempo em milissegundos, o que faz com que seja necessário fazer a conversão. O cálculo é feito para 10 leituras. Ao final, somamos todas as leituras e dividimos por 10 para obter o valor médio das dez últimas voltas que roda deu.
void calcSpeed(unsigned long Time, int IsUpdated){ int i; float vel; if (IsUpdated == 1){ Serial.println("Tempo"); Serial.println(Time); SpeedVector[counter++] = (Raio*2*PI/Time)*1000; if (counter == N){ counter = 0; for (i=0; i<N; i++){ vel =+ SpeedVector[i]; } Serial.println("Velocidade(m/s) ="); Serial.println(vel/N ,4); } } }
Você também pode conferir o código completo e atualizado visitando o repositório desse post no GitHub da Eletrogate.
Agora basta carregarmos o programa no Arduino e com o circuito montado colocar para roda. Veja abaixo os valores que obtivemos no monitor serial.
Calculando o tempo entre uma detecção pode ser usado para calcular a velocidade de rotação de uma roda (uma roda de bicicleta ou eixo de motor por exemplo), além de outras aplicações. Sabendo montar o TCRT5000 de forma correta e como ler o seu sinal de saída (Coletor do fototransistor) possibilita a você implementar qualquer uma das aplicações para as quais o sensor foi feito.
Aqui neste exemplo o velocidade foi apenas mostrada no monitor serial. Serial legal se você tivesse um display LCD bem no guidão da bicicleta para mostrar a velocidade. Esse é o desafio que fica para você. Complementar esse firmware enviando os dados para um display LCD e não para o monitor serial.
Tenha a Metodologia Eletrogate na sua Escola! Conheça nosso Programa de Robótica Educacional.
|
A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.
Tenha a Metodologia Eletrogate dentro da sua Escola! Conheça nosso Programa de Robótica nas Escolas!