Aquisition d'impulsions provenant d'un capteur optique à fourche sur Arduino

Bonjour à tous et à toutes.
J’utilise un Arduino UNO et viens de m’apercevoir qu'il n'est pas aussi rapide que je le pensais et donc je sollicite votre attention et votre précieuse expertise pour m'aiguiller vers une éventuelle solution.

Un capteur à fourche fournit des impulsions déclenchées par une hélice de pompe à 6 pales (trace jaune) et la trace violette est le bruit de commutation du collecteur du moteur électrique (environ 3000tr/min) qui dispose de 3 pôles et deux balais (donc 6 impulsions par tour)
Hésitez pas à me dire si j'ai commis une erreur... je n’étais pas très concentré.

Voici une impulsion en détail, les traces fantômes viennent du fait que le régime moteur n'est pas parfaitement stable, l'aire se répartit sur environ 130µS.
La trace violette c'est les impulsions de mes synapses en quette d'une solution.

bonjour.

et, donc ... quelle est la question ?

si tu veux mesurer avec un Arduino la fréquence de tes impulsions (lue sur ton oscillo à env. 240Hz) c'est tout à fait possible, il est assez rapide pour ça.

précise ton besoin, mes synapses perso ne comprennent pas ce que tu veux.

5_cylindres:
et, donc ... quelle est la question ?

Acquérir et puis dans un second temps indexer des impulsion de 130µS avec un Arduino.

acquérir et indexer ? qu'entends-tu par là ?

explique en détails ce que tu veux obtenir, et quelles sont les caractéristiques de ton signal (amplitude, notamment) à capturer.

[EDIT]
du peu que je peux en juger de ta capture d'écran d'oscillo, l'amplitude est d'à peine 500mV, donc insuffisante pour une acquisition directe par une entrée de µC, il va falloir amplifier.

je suppose que si tu possèdes un tel matériel c'est que tu connais (au moins les bases de) l'électronique, tu dois donc savoir utiliser un AOP.

ceci pour le niveau du signal en entrée, passons au temps, qui semble tant te préoccuper : 130µs représentent plus de 2000 cycles d'horloge à 16MHz, donc le µC aura largement le temps de voir passer tes impulsions, il pourrait même aller se faire un café et le boire entre le début et la fin, alors entre deux d'entre elles ...
[/EDIT]

5_cylindres:
acquérir et indexer ? qu'entends-tu par là ?
explique en détails ce que tu veux obtenir, et quelles sont les caractéristiques de ton signal (amplitude, notamment) à capturer.

C'est autour de 500mV en effet, je dois donc amplifier, jusqu’à combien et sur quelle entrée ? j'ai lu dans un tutoriel que le temps d’accès au port (analogRead) est de 110µS, peut être ais-je mal interprété la chose.

L'objectif est de connaitre la position angulaire de mon hélice, donc de captuer chaque impulsion et de lui donner un angle.

re-

il va falloir conditionner ton signal pour une amplitude compatible avec la tension d'alim de ton µC, et donc admissible par une entrée (5V pour un Arduino UNO ou MEGA, par exemple) : en fait, un AOP alimenté directement par la carte devrait saturer aux alims (GND/VCC), et tu peux amplifier autant que tu veux, et même te contenter d'un comparateur, ce sera encore mieux.
(bien sûr : dans le cas d'un AOP, préférer un modèle Rail-to-Rail)

ensuite, oublier l'ADC qui n'est pas du tout indiqué ici : il faut utiliser une entrée numérique.

il existe plusieurs façons de programmer ce que tu veux réaliser :

  • faire du polling, autrement dit surveiller par programme l'entrée, et détecter ses changements d'état : c'est la plus mauvaise solution, tu risques de "perdre" un top ;

  • utiliser les interruptions : une routine automatique peut se déclencher sur un front (montant ou descendant, voire les deux) de ton signal : en fonction de ce que tu veux faire derrière, c'est une des meilleures solutions ;

  • si ton but n'est que de mesurer une période/fréquence, il existe aussi une fonction liée aux timers qui s'appelle Input Capture, qui te permet de "capturer" la valeur d'un timer au moment du front (cette fois soit montant, soit descendant), et également de déclencher une routine d'interruption.
    dans ce cas précis (mesure de période), c'est la meilleure option.

comme disait Coluche : "fais ton choix, camarade".

[EDIT]
pardon, en tapant (je suis long) j'ai oublié une partie de ta requête.

tu parles de "donner un angle" à ton rotor : si toutes les impulsions sont identiques, tu ne sauras jamais quel est l'angle, tu ne pourras savoir que de combien de pas de 60° (360°/6) il a tourné depuis un instant t.
il te faut donc déjà connaître l'angle de départ.

encore une fois, expose ton besoin en détails, je suis comme tous les autres ici : je n'ai pas de boule de cristal. d'ailleurs personne n'en possède, ils le répètent tous suffisamment.

déjà, quelques infos seraient les bienvenues (il en faudrait certainement d'autres, mais je ne connais pas ton sujet) :
ton moteur tourne-t-il a vitesse fixe ou variable ?
si variable : dans quelle plage ? suivant le max, le µC risque de ne pas suivre, comme tu pensais que c'était le cas au début.
[/EDIT]

J'ai des doutes sur la forme d'onde en sortie du capteur à fourche.
A 200hz elles devraient être rectangulaires et faire plus d'amplitude.

Lire le message épinglé "Règles du forum francophone"
Il y est indiqué qu'il faut fournir la référence des composants utilisés.

Comment est câblé le capteur à fourche ?
Un schéma électrique est assez nécessaire pour pouvoir discuter à distance, la boule de cristal j'ai abandonné, ce n'est pas fiable.

J'ai des doutes sur la forme d'onde en sortie du capteur à fourche.
A 200hz elles devraient être rectangulaires et faire plus d'amplitude.

idem,

Le câblage du phototransistor (sortie capteur en fourche) n'est probablement pas optimal, d'où un temps de montée excessif qui ne permet pas aux impulsions d'atteindre 5V

schéma et référence des composants indispensables

bonjour.

pour ma part, j'aimerais voir les formes de l'hélice : le jour entre deux pales est sans doute très réduit, d'où la faible largeur du pic de détection (une photo serait la bienvenue).

idem pour le capteur, que je suppose "fabriqué" : comme écrit par 68tjs, schéma et références sont indispensables.

avec 68tjs et al1fch, ton problème de conditionnement de signal devrait être vite réglé.
la partie logicielle peut attendre ...

Bonjour à tous, je ne sais pas faire du multi "Quote", je réponds donc à tout le monde en simultané et c'est un peu "impersonnel" de fait.

Je suis navré que les traces ne soient pas stables mais le petit moteur de test est neuf et les charbons ne sont par rodés, le régime est d'une stabilité précaire, j'ai essayé d'en laisser un tourner un pour régler le problème et l'ai oublié longtemps... les charbons étaient usés jusqu'au support quand je m'en suis souvenu.

Le capteur est un OPB815WZ doté d'une fourche large et l'hélice fait 30mm de Ø sur une épaisseur de 5mm, les pales quand à elles sont très fines (1.4mm) car l'hélice provient une pompe hydraulique centrifuge.

J'ai fait un petit montage ce matin à l'aide d'un LM393 qui semble fonctionner :

Le résultat à la sortie du montage me paraît "acceptable" :

Un petit test pour apprendre un peu (sert à rien):

int out = 13; // voie2
int in = 7; // Voie1
// avec une résistance de pulldown
int val = 0; // variable pour mémoriser la valeur lue

void setup()
{
pinMode(out, OUTPUT);// configure la broche 13 en SORTIE
pinMode(in, INPUT);// configure la broche 7 en ENTREE

digitalWrite(in, HIGH);// écrit la valeur HIGH (=1) sur la broche en entrée
// ce qui active la résistance de "rappel au +" (pullup) au plus de la broche
}

void loop()
{
val = digitalRead(in);
digitalWrite(out, val);
}

Le résultat :

...et enfin ma tentative de rédaction du programme permettant de capturer les 6 angles dans l'Arduino :

int Opto = 0; // Interruption 0 (Arduino Pin 2)
volatile int valeur = 0;

void setup() {
attachInterrupt( Opto, AngleIncrement, RISING );
}

void AngleIncrement() {
valeur = valeur + 60;
if( valeur > 360 ) {
valeur = 0;
}
}

void loop() {

}

bonsoir.

plus qu'acceptable !

le glissement sur la durée de l'impulsion est certainement dû à des largeurs de pales irrégulières : pas grave dans l'absolu, mais vérifie la régularité des fronts que tu utilises pour les interruptions, de là dépend la précision de tes acquisitions.

en fait, c'est le contraire de ce que croyais : les pales sont étroites.
ça doit donc ne pas occulter complètement la lumière ... d'où la faible largeur des impulsions et leurs fronts pas assez raides.

beau (début de) boulot.

Les fronts montants un peu mous sont probablement dus à la 10k qui ne tire pas très fort le collecteur. Cela peut introduire du jitter sur le signal.

Pour info, l'ATmega328 intègre un comparateur qui reçoit A0 sur son entrée + et une autre des entrées analogique sur son entrée -. La sortie du comparateuri peut attaquer le timer1 ou générer une interruption. Par conte, il faut mettre les mains dans le cambouis les librairies Arduino ne gérant pas cette fonctionnalité, à ma connaissance.

Essayer avec 1kOhm dans le collecteur du phototransistor.

Merci pour le compliment, cela ne fait pas de mal, j'ai en effet omis de lire de datasheet de l'OP550A par pure fainéantise... Erreur, j'y ai pensé en lisant le datasheet de l'optocoupleur puis dans le feu de l'action j'ai oublié de télécharger le document et pour finir j'étais surpris par le manque de documentation concernant le transistor.

Un petit lien s'impose : Reduced cognitive function during a heat wave among residents of non-air-conditioned buildings: An observational study of young adults in the summer of 2016

Suite au passage à 1K c’est super pêchu et l’amortissement est bien visible :

C'est vraiment dur d’attraper un signal aléatoirement glissant :

Une question cependant, le schémas donne une résistance de 0.1K pour la led ce qui donne un courant de 50mA qui correspond à la valeur maxi des "absolute maximum ratings", je ma demande combien de temps il faut pour que la led se mette à sentir le plastique fondu ?

Pour ce qui est de mettre les mains dans le cambouis, je pensais déjà en avoir un peu sur le front, tout est relatif mais la perspective donne le vertige :grinning:

Au vu des derniers oscillogrammes , avec 1k Ohm il n'y a pas besoin de comparateur si le signal en mauve est bien la sortie de l'optocoupleur

LED :

...... ce qui donne un courant de 50mA qui correspond à la valeur maxi des "absolute maximum ratings", je ma demande combien de temps il faut pour que la led se mette à sentir le plastique fondu ?

50mA c'est la valeur à ne pas dépasser à 25°C.

A cette température ambiante la LED va tenir , mais elle peut perdre peu à peu de l'efficacité et émettre de moins en moins de lumière au fil des ans.

perso : j'aime travailler à 50% de la valeur maximale autorisée, marge de sécurité confortable !

al1fch:
Au vu des derniers oscillogrammes , avec 1k Ohm il n'y a pas besoin de comparateur si le signal en mauve est bien la sortie de l'optocoupleur

LED :

50mA c'est la valeur à ne pas dépasser à 25°C.

A cette température ambiante la LED va tenir , mais elle peut perdre peu à peu de l'efficacité et émettre de moins en moins de lumière au fil des ans.

perso : j'aime travailler à 50% de la valeur maximale autorisée, marge de sécurité confortable !

Merci pour le conseil, cela fait un paquet de composants en moins et donc de problèmes en moins et je pense que la qualité de l'optocoupleur y est pour beaucoup, cela semble expliquer pourquoi il coûte cher.

Maintenant que les impulsions sont perceptibles par l'Arduino il me faut les synchroniser avec deux valeurs de pesage pour faire un diagramme en forme de patate. Puis-je ouvrir un sujet, à quel endroit ?

Je viens de lire la datasheet du OPB815WZ.

Premièrement il faut distinguer les valeurs indiquées dans les "ABSOLUTE MAXIMUM RATING" du reste des tableaux.

Les "AMR" indiquent un courant à ne jamais dépasser de 50 mA dans la diode émétrice mais ce n'est pas la valeur de courant recommandé.

Dans le reste des tableaux les valeurs sont données pour un courant de 20 mA dans la diode c'est donc la valeur optimale, celle qui permet d'avoir les meilleures performances.
Avec un Vd de 1,7 V pour avoir 20 mA dans la diode il faut sous 5V R= (5-1,7)/20 10-3 = 330 ohms. 270 ohms ça passe.

Courant de sortie :
Généralement dans les bonnes datasheets on dispose du CTR (Current Ratio Transfert). On dispose surtout des courbes CTR = f(Idiode).
Ici il n'est pas indiqué, seul est indiqué le courant max que l'on peut obtenir avec un courant de diode émettrice de 20 mA.
Imax collecteur 3,5 mA <Imax < 16 mA.
Ce qui donne, pour un courant de diode de 20 mA, un CTR compris entre 0.2 et 0,8 => ce produit est fortement dispersé.
Avec une tension de saturation de 0,4 V pour avoir 16 mA il faut une résistance de collecteur égale à (5-0,4)/16 mA = 290 ohms.
Maintenant il n'est pas utile de se placer au courant max et la valeur de 1 k est très convenable.

Par contre je serais curieux d'avoir la confirmation que le transistor est bien saturé.
C'est à dire est-ce que la valeur de la tension mesurée entre le collecteur du transistor et la masse fait bien autour de 0,4V.
A ce sujet j'ajoute que pour l'utilisation dans le projet il est bon que le transistor soit saturé mais juste ce qu'il faut. S'il est trop saturé il lui faudra évacuer les charges en trop avant de pouvoir se bloquer.

68tjs:
Je viens de lire la datasheet du OPB815WZ.

Premièrement il faut distinguer les valeurs indiquées dans les "ABSOLUTE MAXIMUM RATING" du reste des tableaux.

Les "AMR" indiquent un courant à ne jamais dépasser de 50 mA dans la diode émétrice mais ce n'est pas la valeur de courant recommandé.

Dans le reste des tableaux les valeurs sont données pour un courant de 20 mA dans la diode c'est donc la valeur optimale, celle qui permet d'avoir les meilleures performances.
Avec un Vd de 1,7 V pour avoir 20 mA dans la diode il faut sous 5V R= (5-1,7)/20 10-3 = 330 ohms. 270 ohms ça passe.

Courant de sortie :
Généralement dans les bonnes datasheets on dispose du CTR (Current Ratio Transfert). On dispose surtout des courbes CTR = f(Idiode).
Ici il n'est pas indiqué, seul est indiqué le courant max que l'on peut obtenir avec un courant de diode émettrice de 20 mA.
Imax collecteur 3,5 mA <Imax < 16 mA.
Ce qui donne, pour un courant de diode de 20 mA, un CTR compris entre 0.2 et 0,8 => ce produit est fortement dispersé.
Avec une tension de saturation de 0,4 V pour avoir 16 mA il faut une résistance de collecteur égale à (5-0,4)/16 mA = 290 ohms.
Maintenant il n'est pas utile de se placer au courant max et la valeur de 1 k est très convenable.

Par contre je serais curieux d'avoir la confirmation que le transistor est bien saturé.
C'est à dire est-ce que la valeur de la tension mesurée entre le collecteur du transistor et la masse fait bien autour de 0,4V.
A ce sujet j'ajoute que pour l'utilisation dans le projet il est bon que le transistor soit saturé mais juste ce qu'il faut. S'il est trop saturé il lui faudra évacuer les charges en trop avant de pouvoir se bloquer.

Pour moi la dispersion et la qualité peuvent coexister, c'est peut-être la solution qui a été délibérément choisie pour de contenir les coûts de production.
Je suis incapable de mettre la main sur les 330ohm de ma boite E12, de plus les bandelettes laissent un résidu de colle sur les pattes qu'il faut éliminer avec un solvant, il faut soigneusement l'appliquer car tout débordement efface le code couleur des résistances. Pourquoi ne pas tout simplement couper les pattes ?... par ce que les résistances Velleman ont les pattes très courtes, c'est une bonne idée car cela prend moins de place dans nos tiroirs.

Bref... la tension collecteur/masse est de 1V avec 1000ohm et il m'a fallu monter à 1213ohm pour avoir 0.4V

Pour moi la dispersion et la qualité peuvent coexister,

Je n'ai pas dis le contraire.
Simplement utiliser un produit dispersé est moins simple qu'utiliser un produit avec des spécifications resserrées.
Il faut penser à faire des contrôles. La preuve avec un Vce mesuré de 1V le transistor était toujours en zone linéaire.

Remarque : je ne sais plus calculer parce dans le message précédent j'ai écrit des âneries.
Pour avoir I =20 mA dans la diode il faut une résistance de (5-1,7)/20 mA = 165 ohms.
Avec 270 ohms -> I = (5-1,7)/270 = 12 mA.

Dans le collecteur il passe (5-0,4)/1270 = 3,62 mA (1213 n'est pas une valeur normalisée)

C'est a mon avis trop proche de la limite inférieure de la spec (avec 10k tu étais carrément hors specs).
Tu devrais augmenter le courant dans la diode vers 20 mA (en fonction des valeurs de résistances dont tu dispose ce n'est hyper précis, il y a de la marge).

Je te conseille de faire cela car même si en ce moment le montage peut fonctionner rien ne prouve qu'avec 10 ou 20 degrés de moins il fonctionnera encore et là tu te posera des tas de questions sans penser à ce dont on vient de discuter. Autant se mettre bien de suite.

68tjs:
Je n'ai pas dis le contraire.
Simplement utiliser un produit dispersé est moins simple qu'utiliser un produit avec des spécifications resserrées.
Il faut penser à faire des contrôles. La preuve avec un Vce mesuré de 1V le transistor était toujours en zone linéaire.

Remarque : je ne sais plus calculer parce dans le message précédent j'ai écrit des âneries.
Pour avoir I =20 mA dans la diode il faut une résistance de (5-1,7)/20 mA = 165 ohms.
Avec 270 ohms -> I = (5-1,7)/270 = 12 mA.

Dans le collecteur il passe (5-0,4)/1270 = 3,62 mA (1213 n'est pas une valeur normalisée)

C'est a mon avis trop proche de la limite inférieure de la spec (avec 10k tu étais carrément hors specs).
Tu devrais augmenter le courant dans la diode vers 20 mA (en fonction des valeurs de résistances dont tu dispose ce n'est hyper précis, il y a de la marge).

Je te conseille de faire cela car même si en ce moment le montage peut fonctionner rien ne prouve qu'avec 10 ou 20 degrés de moins il fonctionnera encore et là tu te posera des tas de questions sans penser à ce dont on vient de discuter. Autant se mettre bien de suite.

J'ai laissé tombé les résistances fixes E12 pour les remplacer par des cremet multitours, expérimentalement cela donne :

Pour avoir 20mA de courant dans la diode la résistance est à 186.2ohm
Puis pour avoir 0.4V entre le collecteur/masse du transistor il me faut 811ohm

Dans mon stock E12 j'ai donc pris 180ohm et 820ohm.