Raspberry & sensores: tacômetro efeito Hall
Seguindo com o projeto que começou a ser descrito nos posts aqui e aqui, vamos falar do uso de sensores digitais no RPi.
Foi dito no último post que os servo-motores de giro contínuo não têm uma referência, ou seja, eles não "sabem" a sua posíção quando a gente os liga.
Se queremos usá-lo para tracionar um carrinho, por exemplo, sem problema, porque normalmente a gente sabe onde o carrinho está (vendo-o ou com algum esquema de monitoramento, como um GPS) e o motor só precisa girar a roda obedecendo a comandos.
Mas se queremos usar um servo 360 para posicionamento, devemos dar a ele uma referência, ou seja, um modo de identificar uma determinada posição como "0". Aí ele pode se deslocar relativamente a esse ponto, e toda vez que perder essa referência ele pode procurá-la novamente, zerando a posição.
Existem muitos (mesmo!) jeitos de se fazer isso. Um dos mais comuns é usar um sensor de efeito Hall. Como conta no artigo do link o grande Newton C. Braga (de quem eu já lia os artigos quando era adolescente e me iniciava nos mistérios da eletrônica), o sensor Hall é um dispositivo que detecta a presença de um campo magnético. Por ser muito pequeno, barato e consumir pouquíssima energia, ele é muito utilizado em circuitos, estando presentes em todos os veículos carros fabricados, por exemplo.
Abaixo, imagens da montagem:
Para gerar o sinal magnético no sensor, coloquei um pequeno ímã no CD qu está preso ao motor. O suporte foi feito em alumínio, porque este material estava literalmente "na mão", se é que vocês me entendem... quem disse que ímã não gruda em metais não ferrosos não conhecia os poderes de uma boa fita dupla-face... ;)
Abaixo, imagens do sensor e do ímã, este último retirado do falante de um fone de ouvido.
Para testar a montagem, fiz um programa que implementa um tacômetro, ou seja, conta as voltas dadas pelo CD.
# -*- coding: utf-8 -*-
import RPIO
from RPIO import PWM
import time
# pino do sensor Hall (número GPIO)
pinHall = 4
# pino do servo
servoPin = 24
inputValue = True
servo = PWM.Servo()
# Define o pino do Hall como entrada (RPIO.IN) e seta
# o pullup (mais sobre isso nesse blog, dê uma pesquisada
# em pulldown.
RPIO.setup(pinHall, RPIO.IN, pull_up_down=RPIO.PUD_UP)
i = 0
# aciona o servo com velocidade alta
servo.set_servo(servoPin, 2000)
time.sleep(1)
while(True):
# O Raspberry retorna True para o sensor desativado,
# por causa do pullup. Quando fica False é que o ímã está
# passando pelo sensor. Assim, o while abaixo fica rolando
# até que o ímã passe pelo sensor. O comando RPIO.input
# lê o valor do sensor (ativado/desativado) e coloca
# em inputValue.
while(inputValue):
inputValue= RPIO.input(pinHall)
# Saindo do while(imputValue) => passagem pelo sensor,
# ou seja, conta-se mais uma volta.
i=i+1
print(i)
# Para que o while de espera pela passagem do íma aconteca
# novamente...
inputValue=True
Foi dito no último post que os servo-motores de giro contínuo não têm uma referência, ou seja, eles não "sabem" a sua posíção quando a gente os liga.
Se queremos usá-lo para tracionar um carrinho, por exemplo, sem problema, porque normalmente a gente sabe onde o carrinho está (vendo-o ou com algum esquema de monitoramento, como um GPS) e o motor só precisa girar a roda obedecendo a comandos.
Mas se queremos usar um servo 360 para posicionamento, devemos dar a ele uma referência, ou seja, um modo de identificar uma determinada posição como "0". Aí ele pode se deslocar relativamente a esse ponto, e toda vez que perder essa referência ele pode procurá-la novamente, zerando a posição.
Existem muitos (mesmo!) jeitos de se fazer isso. Um dos mais comuns é usar um sensor de efeito Hall. Como conta no artigo do link o grande Newton C. Braga (de quem eu já lia os artigos quando era adolescente e me iniciava nos mistérios da eletrônica), o sensor Hall é um dispositivo que detecta a presença de um campo magnético. Por ser muito pequeno, barato e consumir pouquíssima energia, ele é muito utilizado em circuitos, estando presentes em todos os veículos carros fabricados, por exemplo.
Abaixo, imagens da montagem:
Sensor Hall A3144 |
Abaixo, imagens do sensor e do ímã, este último retirado do falante de um fone de ouvido.
Para testar a montagem, fiz um programa que implementa um tacômetro, ou seja, conta as voltas dadas pelo CD.
# -*- coding: utf-8 -*-
import RPIO
from RPIO import PWM
import time
# pino do sensor Hall (número GPIO)
pinHall = 4
# pino do servo
servoPin = 24
inputValue = True
servo = PWM.Servo()
# Define o pino do Hall como entrada (RPIO.IN) e seta
# o pullup (mais sobre isso nesse blog, dê uma pesquisada
# em pulldown.
RPIO.setup(pinHall, RPIO.IN, pull_up_down=RPIO.PUD_UP)
i = 0
# aciona o servo com velocidade alta
servo.set_servo(servoPin, 2000)
time.sleep(1)
while(True):
# O Raspberry retorna True para o sensor desativado,
# por causa do pullup. Quando fica False é que o ímã está
# passando pelo sensor. Assim, o while abaixo fica rolando
# até que o ímã passe pelo sensor. O comando RPIO.input
# lê o valor do sensor (ativado/desativado) e coloca
# em inputValue.
while(inputValue):
inputValue= RPIO.input(pinHall)
# Saindo do while(imputValue) => passagem pelo sensor,
# ou seja, conta-se mais uma volta.
i=i+1
print(i)
# Para que o while de espera pela passagem do íma aconteca
# novamente...
inputValue=True
Abaixo, por fim como usual neste blog, o vídeo da coisa funcionando.
É isso!
Bom post, saiu no everpi :)
ResponderExcluir