Lire le signal RPM (12V) dernière un optocoupleur

Bonjour,

Je cherche a récupérer le signal RPM d’un ventilateur 12V PWM.
L’alimentation et contrôle PWM de ce ventilateur se fait via une carte mère.

Je pensais relier le signal+ground du ventilateur a un optocoupleur coté émetteur et un port+ground du PI coté récepteur.

Faire une boule sur la lecture sur ce port pour ensuite déterminé la vitesse du ventilateur.
Est ce que ce genre de montage peut fonctionner ?

Merci !

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.

Voir ce sujet:

Bonne bidouilles
A+

Bonjour,

Merci pour votre réponse =)

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 :confused:

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)

Merci !

Bonjour,

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.

A+

Merci pour votre temps !
Je test tout ca et je reviens avec les résultats =)

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 :confused:

Merci pour votre aide.

Ne tenez pas compte du message ci-dessous tout fonctionne.
Juste besoin de dormir visiblement x)

Encore merci pour votre aide !

Voila premier version du projet terminé.
Je vous le git avec tout dessus pour ceux qui ca pourrait intéresser a l’avenir.

1 « J'aime »