LusoRobótica - Robótica em Português
Sistemas específicos => Arduino / AVR => Tópico iniciado por: michael em 17 de Março de 2011, 13:40
-
Olá, estou desenvolvendo um projeto onde tenho a necessidade em calcular a velocidade em metros por segundo usando um encoder e o arduino, será que alguem pode me ajudar.
objetivo e través dos pulsos do encoder saber qual a velocidade em metros por segundo.
ou qualque coisa q eu possa medir a velocidade, não sei como proceder com o arduino, como conseguir medir o tempo.
antecipadamente agradeço.
Michael
-
Olá, estou desenvolvendo um projeto onde tenho a necessidade em calcular a velocidade em metros por segundo usando um encoder e o arduino, será que alguem pode me ajudar.
objetivo e través dos pulsos do encoder saber qual a velocidade em metros por segundo.
ou qualque coisa q eu possa medir a velocidade, não sei como proceder com o arduino, como conseguir medir o tempo.
antecipadamente agradeço.
Michael
O procedimento que deves fazer é o seguinte:
1-Saber quantos pulsos por volta tem o encoder. Sabendo o diâmetro da roda, consegues saber qual a distancia percorrida em cada pulso.
2-Para ler os impulsos o ideal é utilizar interrupções externas, isto é, tens o sinal do encoder ligado ao arduino, sempre que este sinal passa de 0 para 1 quer dizer que passou um pulso. ver http://www.arduino.cc/en/Reference/AttachInterrupt (http://www.arduino.cc/en/Reference/AttachInterrupt)
3-Cada vez que der um pulso incrementar uma variável, assim sabes que se deu 10 pulsos andou x metros.
4-Gerar uma interrupção temporal, isto é, se gerares por exemplo um interrupção a cada 1 segundo podes calcular a velocidade pois tens o tempo que é 1segundo e tens os pulsos que te dizem a distancia. ver http://www.arduino.cc/playground/Main/MsTimer2 (http://www.arduino.cc/playground/Main/MsTimer2)
ver também: http://pt.wikibooks.org/wiki/Introdu%C3%A7%C3%A3o_%C3%A0_F%C3%ADsica/Movimento (http://pt.wikibooks.org/wiki/Introdu%C3%A7%C3%A3o_%C3%A0_F%C3%ADsica/Movimento)
-
O ATMEGA do Arduino não tem uma entrada externa de pulsos?
Então basta ter uma interrupção temporizada. Ex.: a cada 100ms (interrupção), vai ler qts pulsos estão no contador de entrada externa.
De certeza q da´para fazer isso! afinal, o Arduino é um IDE, o hardware é um ATMEGA :)
-
Fico muito agradecido com a resposta, vou continuar pesquisando.
Eu sei como funciona o encoder e sei também como gerar o algoritimo para converter nas medidas que necessito, o maior problema é relaciona ao próprio arduino, sou iniciante com microcontroladores.
Exemplo, no pino 7 do arduino eu recebo os pulsos do encoder, meu encoder tem uma resolução de 300, 300 pulsos por rotação.
Qual seria o código para eu calcular o tempo que levou para passar todos os pulsos?
Em outras linguagens que eu conheço faria um start em um timer q ficaria contando até que uma variável seja igual a 300, aí eu paro o contador e vejo quantos segundos, ou milésimos de segundos foi esse intervalo e é exatamente isso que quero fazer, mas não sei como fazer isso com o arduino, não conheço todos os comando e funções.
Será que poderia fazer um exemplo simples para eu entender melhor.
Obrigado Novamente.
-
Tens aqui um exemplo: http://www.arduino.cc/playground/Main/MsTimer2 (http://www.arduino.cc/playground/Main/MsTimer2)
Simplesmente em vez de ver quanto tempo mudou quando contou 300pulsos, vais ver quantos pulsos contou(bem mais facil) quando atingiu um determinado tempo.
-
Este exemplo com interrupções externas é bem mais simples, dá rotação por minuto, depois é só multiplicar pelo tamanho da roda.
-
Se queres um cálculo de velocidade preciso e exacto, deves calcular o tempo que passa entre cada pulso (ou entre cada x pulsos). Digo isto porque no caso de teres poucos pulsos por rotação, pode acontecer teres "2,5" pulsos por rotação.. Se activares um timer num pulso e lendo esse timer no pulso seguinte é muito mais preciso
No teu caso, com 300 pulsos por rotação, o erro de contares os pulsos num determinado tempo em vez de contares o tempo entre pulsos deve ser desprezavel (depende da gama de velocidade)