Bonjour,
C’est la bonne façon de procéder.
A savoir que si c’est bien du PWM, c’est la longueur d’impulsion qu’il faudra mesurer.
Si la fréquence du RPM est trop élevée, il faudra éventuellement passer par un filtre RC qui jouera la fonction de transformer les longueurs d’impulsion en signal « continu ». Pour connaître la vitesse de rotation, il faudra alors mesurer cette tension.
C’est pour mesurer des ventilateurs noctua à 3000 RPM max, 2 impulsions par cycle donc 6000 impulsion par minute, je ne sais pas si c’est trop élevé ou pas pour un PI
Avez vous un exemple / modèle de filtre RC que je pourrais utiliser au cas ou ça ne fonctionne pas correctement ? Je n’ai jamais utilisé ce genre de matériel x)
A priori, aucun problème pour lire 6000 impulsions par minute. Les contraintes viendront du langage du code de la partie logicielle. Dans un but didactique, je recommande de commencer par écrire un programme qui génère un signal similaire à celui du ventilateur sur un port GPIO en sortie, puis d’écrire un programme qui lit ce signal. Avec les 2 ports GPIO connectés entreux.
Ensuite, réaliser le montage électronique, vérifier qu’en sortie il n’y a jamais plus de 3,3V, alors lancer le programme de lecture.
Bonne bidouilles.
EDIT: Pour le circuit RC, consulter le lien du post 2. Ce type de montage contourne le problème de lecture trop rapide des GPIO en générant un signal pseudo continu, mais fera apparaître d’autres problèmes. Je recommande d’aller au bout de la première solution avant d’envisager celle-ci.
Le montage fonctionne parfaitement.
J’ai du modifié quelques trucs mais rien de bien méchant.
Le signal est isolé par un optocoupleur + résistance.
Le branchement sur le PI se fait sur GPIO4 + GROUND.
Par contre je viens de me retrouver face a un problème inattendu, le script que j’utilise ne fonctionne que sur des ports GPCLCK, du moins je ne suis pas parvenu a le faire fonctionner sur d’autres ports :
import time
import statistics
import RPi.GPIO as GPIO
pin = 7
GPIO.setmode(GPIO.BOARD)
GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
tach = 0
tmp = []
def callback(channel):
global tach
tach += 1
def rpm():
global tach
global tmp
tmp.append(tach / 2)
tmp = tmp[-2:]
tach = 0
return statistics.mean(tmp) * 60
GPIO.add_event_detect(pin, GPIO.RISING, callback=callback, bouncetime=10)
while True:
print(rpm())
time.sleep(1)
Ca fonctionne très bien, je récupère mes 1500 rpms a pleine vitesse.
Mais si je ne peux pas utiliser d’autres ports que les GPCLK je suis coincé pour mon projet, il va me manquer au moins 2 ports GPCLK.
Quelqu’un aurait une idée ? Même si ca passe par des cartes d’extensions ou autre