- Materiais requisitados:
- Calculando a velocidade e distância percorrida:
- Diagrama de circuito e configuração de hardware:
- Simulação:
- Programando seu PIC16F877A:
- Explicação de trabalho:
Medir a velocidade / rpm de um veículo ou motor sempre foi um projeto fascinante para tentarmos. Portanto, neste projeto vamos construir um usando os microcontroladores PIC prontos para uso industrial. Usaremos um pedaço de ímã e um sensor Hall para medir a velocidade. Existem outras formas / sensores para medir a velocidade mas, usar um sensor Hall é barato e também pode ser usado em qualquer tipo de motor / veículo. Ao fazer este projeto, também iremos aprimorar nossas habilidades em aprender PIC16F877A, uma vez que o projeto envolve o uso de interrupções e temporizadores. Ao final deste projeto você poderá calcular a velocidade e distâncias percorridas por qualquer objeto em rotação e visualizá-las em uma tela LCD 16x2. Vamos começar com este velocímetro digital e circuito de odômetro com PIC.
Materiais requisitados:
- PIC16F877A
- 7805 Regulador de Tensão
- Sensor de efeito Hall (US1881 / 04E)
- Visor LCD 16 * 2
- Um pequeno pedaço de ímã
- Fios de conexão
- Capacitores
- Breadboard.
- Fonte de energia
Calculando a velocidade e distância percorrida:
Antes de realmente começarmos a construir o circuito, vamos entender como usaremos um sensor Hall e um ímã para calcular a velocidade de uma roda. Anteriormente, usamos a mesma técnica para construir o velocímetro Arduino, que exibe leituras no smartphone Android.
Um sensor Hall é um dispositivo que pode detectar a presença de um ímã com base em sua polaridade. Colocamos um pequeno pedaço de ímã na roda e colocamos o sensor Hall próximo a ele de forma que toda vez que a roda gira o sensor Hall o detecta. Em seguida, usamos a ajuda de temporizadores e interrupções em nosso microcontrolador PIC para calcular o tempo necessário para uma rotação completa da roda.
Uma vez que o tempo gasto é conhecido, podemos calcular o RPM usando as fórmulas abaixo, onde 1000 / tempo gasto nos dará o RPS e multiplicá-lo por 60 fornecerá o RPM
rpm = (1000 / tomada de tempo) * 60;
Onde (1000 / timetaken) dá as rps (rotações por segundo) e é multiplicado por 60 para converter rps em rpm (rotações por minuto).
Agora, para calcular a velocidade do veículo, temos que saber o raio da roda. Em nosso projeto, usamos uma pequena roda de brinquedo com um raio de apenas 3 cm. Porém, assumimos que o raio da roda é de 30 cm (0,3 m) para que possamos visualizar as leituras.
O valor também é multiplicado por 0,37699, pois sabemos que Velocidade = (RPM (diâmetro * Pi) / 60). As fórmulas são simplificadas para
v = raio_da_wheel * rpm * 0,37699;
Depois de calcular a velocidade, também podemos calcular a distância percorrida usando um método semelhante. Com nosso arranjo Hall e ímã, sabemos quantas vezes a roda girou. Também conhecemos o raio da roda, com o qual podemos encontrar a circunferência da roda, assumindo que o raio da roda seja de 0,3m (R) os valores da circunferência Pi * R * R serão 0,2827. Isso significa que, para cada vez que o sensor Hall encontra o ímã, uma distância de 0,2827 metros é percorrida pela roda.
Distance_covered = distance_covered + circunferência_of_the_circle
Uma vez que agora sabemos como este projeto funcionará, vamos prosseguir com nosso diagrama de circuito e começar a construí-lo.
Diagrama de circuito e configuração de hardware:
O diagrama de circuito deste projeto de velocímetro e odômetro é muito simples e pode ser construído em uma placa de ensaio. Se você tem seguido os tutoriais PIC, também pode reutilizar o hardware que usamos para aprender os microcontroladores PIC. Aqui, usamos a mesma placa de desempenho que construímos para LED piscando com microcontrolador PIC, conforme mostrado abaixo:
As conexões de pino para o MCU PIC16F877A são fornecidas na tabela abaixo.
S.No: |
Número do PIN |
Nome do Pin |
Conectado a |
1 |
21 |
RD2 |
RS de LCD |
2 |
22 |
RD3 |
E de LCD |
3 |
27 |
RD4 |
D4 de LCD |
4 |
28 |
RD5 |
D5 de LCD |
5 |
29 |
RD6 |
D6 de LCD |
6 |
30 |
RD7 |
D7 de LCD |
7 |
33 |
RB0 / INT |
3 rd pino de sensor Hall |
Depois de construir seu projeto, ele deve se parecer com isso na imagem abaixo
Como você pode ver, usei duas caixas para colocar o motor e um sensor Hall em uma posição próxima. Você pode fixar o ímã em seu objeto em rotação e intactar o sensor Hall próximo a ele de forma que ele possa detectar o ímã.
Observação: o sensor Hall tem polaridades, portanto, certifique-se de qual pólo ele está detectando e coloque-o de acordo.
Certifique-se também de usar um resistor pull-up com o pino de saída do sensor Hall.
Simulação:
A simulação para este projeto é feita usando Proteus. Como o projeto envolve objetos em movimento, não é possível demonstrar o projeto completo usando simulação, mas o funcionamento do LCD pode ser verificado. Basta carregar o arquivo hexadecimal para a Simulação e simular. Você poderá observar o LCD funcionando conforme mostrado abaixo.
Para verificar se o velocímetro e o hodômetro estão funcionando, substituí o sensor Hall por um dispositivo de estado lógico. Durante a simulação, você pode clicar no botão de estado lógico para acionar a interrupção e verificar se a velocidade e a distância percorrida estão sendo atualizadas conforme mostrado acima.
Programando seu PIC16F877A:
Como dito anteriormente, estaremos usando a ajuda de temporizadores e interrupções no Microcontrolador PIC16F877A para calcular o tempo necessário para uma rotação completa da roda. Já aprendemos como usar Timers em nosso tutorial anterior. Eu dei o código completo do projeto no final deste artigo. Além disso, expliquei algumas linhas importantes abaixo.
As linhas de código abaixo inicializam a Porta D como pinos de saída para interface LCD e RB0 como pino de entrada para usá-lo como pino externo. Além disso, habilitamos o resistor pull-up interno usando OPTION_REG e também configuramos 64 como pré-venda. A seguir, ativamos a interrupção global e periférica para ativar o temporizador e a interrupção externa. Para definir RB0 como bit de interrupção externa, INTE deve ser alto. O valor de Overflow é definido como 100, de modo que para cada 1 milissegundo o sinalizador de interrupção do temporizador TMR0IF seja acionado. Isso ajudará a executar um cronômetro de milissegundos para determinar o tempo gasto em milissegundos:
TRISD = 0x00; // PORTD declarado como saída para interface LCD TRISB0 = 1; // DEfina o pino RB0 como entrada para usar como pino de interrupção OPTION_REG = 0b00000101; // Timer0 64 como prescalar // Também habilita PULL UPs TMR0 = 100; // Carrega o valor do tempo para 1ms; delayValue pode estar entre 0-256 somente TMR0IE = 1; // Habilita o bit de interrupção do temporizador no registro PIE1 GIE = 1; // Habilita interrupção global PEIE = 1; // Habilita a interrupção periférica INTE = 1; // Habilita RB0 como pino de interrupção externa
A função abaixo será executada toda vez que uma interrupção for detectada. Podemos nomear a função de acordo com nosso desejo, então a chamei de speed_isr (). Este programa lida com duas interrupções, uma é a interrupção do temporizador e a outra é a interrupção externa. Sempre que ocorre uma interrupção do temporizador, o sinalizador TMR0IF fica alto, para limpar e redefinir a interrupção, temos que torná-la baixa definindo TMR0IF = 0 conforme mostrado no código abaixo.
void interrupt speed_isr () {if (TMR0IF == 1) // O temporizador estourou {TMR0IF = 0; // Limpa o sinalizador de interrupção do temporizador milli_sec ++; } if (INTF == 1) {rpm = (1000 / mili_seg) * 60; velocidade = 0,3 * rpm * 0,37699; // (Supondo que o raio da roda seja de 30 cm) INTF = 0; // limpa o sinalizador de interrupção milli_sec = 0; distância = distância + 028,2; }}
Da mesma forma, quando ocorre uma interrupção externa, o sinalizador INTF ficará alto, isso também deve ser apagado definindo INTF = 0. O tempo gasto é mantido no controle pela Interrupção do Temporizador e a Interrupção Externa determina quando a roda completou uma rotação completa. Com esses dados, a velocidade e a distância percorrida pela roda são calculadas durante cada interrupção externa.
Uma vez que a velocidade e a distância são calculadas, elas podem ser simplesmente exibidas na tela LCD usando nossas funções LCD. Se você é novo em LCDs, consulte nosso tutorial de interface de LCD com MCU PIC16F877A.
Explicação de trabalho:
Depois de preparar o hardware e o software, basta fazer o upload do código para o PIC16F877A. Se você é completamente novo no PIC, então deve ler alguns tutoriais sobre como fazer o upload do programa para um microcontrolador PIC16F877A.
Usei um POT variável para ajustar a velocidade do motor para fins de demonstração. Você também pode usar o mesmo para localizar um aplicativo em tempo real. Se tudo funcionar conforme o esperado, você deve ser capaz de obter a Velocidade em Km / Hr e a Distância percorrida em termos de metros, conforme mostrado no Vídeo abaixo.
Espero que você tenha gostado do projeto e feito funcionar. Se não, você pode usar a seção de comentários abaixo ou o fórum para postar suas dúvidas.