Bonjour à tous. Dans les imprimantes il y a de nombreux capteurs optiques qui captent des signaux (0/1) à travers des roues striées (blanc/noir). Comment capter ces signaux. Les moteurs font tourner ces roues striées à toute allure, je n'arrive pas à capter le HIGH/LOW qui lui tourne avec le loop(). Les signaux bien sur servant à contrôler l'avancée et le retour du chariot de l'imprimante (scan laser). merci beaucoup si vous avez un conseil. meilleures salutations à tous. et bravo ARDUINO
![]()
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. ➜ je l’ai déplacé vers le forum francophone pour vous pour cette fois...
Merci de prendre en compte les recommandations listées dans « Les bonnes pratiques du Forum Francophone”
Un capteur infrarouge est souvent utilisé pour cela.
J'ai déjà réutiliser des capteur Infra rouge trouver dans un vielle imprimante pour faire de la détection de passage.
J'ai fait quelques chose qui ressemblais bien a ça :
Sur les capteur optique, il y a toujours un émetteur et un récepteur.
Le plus difficile consiste a trouver quel est l'émetteur, quel est le récepteur, et quel est la référence du capteur...
Apres il suffit d'allumer l'émetteur avec une tension adapté, et de "lire" ce qui se passe sur le récepteur.
Pouvez vous nous en dire plus ?
Malheureusement c'est assez vague, il y a plusieurs raison à ça, la plus probable serait que ton programme n'est pas adapté à ce que tu veux faire.
Sans code et/ou schéma, c'est un peu comme jouer à la loterie.
J'ai bien sûr supposé à la lecture de ton message, que tu sais comment brancher la fourche infrarouge de détection et comment lire l'état de la broche de ton Arduino connecté à ton capteur. Mais peut être que ce n'est pas le cas ?
Bonjour Monsieur,
Grands mercis pour vos réponses très rapides. je suis désolé de n'avoir pas respecté les procédures normales. Je vais regarder cela.
meilleures salutations
j berville
à l'attention de monsieur TERWAL
Monsieur bonsoir.
Merci pour votre rapide réponse d'hier à mon petit souci de capteur fourche optique.
Je sais faire fonctionner une fourche optique comme un interrupteur par exemple. Mais dans une imprimante, il y a des roues (voir photo) qui sont avec des stries si fines, que je ne sais pas comment faire pour retrouver le 1/0 ou HIGH/SLOW.
Si vous avez une idée, merci.
meilleures salutations
j berville
Bonjour jb0000
Peut être que c'est équivalent aux bandes que l'on trouve dans les imprimantes, recherches:
Raster Strip Film
Sur AliExpress
Cordialement
jpbbricole
Il ne faut pas essayer de les lire avec digitalRead() qui n'est pas très rapide. Il faut utiliser une interruption pour traiter cela.
Si je comprend bien votre problème, vous ne savez pas comment arriver a détecter les stries ?
Si vous savez utiliser la fourche optique, il faut faire de la même façon.
Au niveau de la fourche (en partant du principe qu'il s'agit bien de la pièce d'origine), il n'y aura aucun problème pour capter les strie de la roue.
Le souci risque plutôt d'être du coté de l'Arduino : si la strie coupe le faisceau optique pendant trop peut de temps, l'Arduino risque de ne pas capter le changement d'état.
Est ce que vous arriver a lire le signal de la fourche optique en coupant le faisceau avec une feuille de papier par exemple ?
Encore une fois, c'est assez vague, plus vous nous donnerez de détailles, plus on sera à même de vous aiguiller au mieux.
Donc si tu veux dire que tu as tester un programme qui utilise la fonction DigitalRead, mais que cela ne te donne pas toutes les stries, il faut surement suivre le conseil de @fdufnews .
Mais un DigitalRead mets quelque micro-seconde à lire une état. Donc si ce n'est pas assez rapide pour suivre ta Roue strié, suivant ce que tu veux faire, peut être qu'une interruption ne donnera pas forcément le résultat voulu.
Le site de locoduino a un bon article sur les interruptions.
Peut être que si tu nous en disais un peu plus sur ce que tu veux vraiment faire, on pourrait la meilleur solution pour ton projet ?
Il n'y a pas que le temps de lecture qui puisse être problématique il y a aussi la récurrence.
S'il y a beaucoup de code dans loop() l'état du lecteur n'est pas lu assez souvent.
Bonsoir guillaume_lrt
Au vu de la finesse de pas de ces roues:
comme des bandes que l'on trouve dans une imprimante, je ne pense pas qu'une fourche "standard" puisse discerner les "crans", d'autant plus qu'il faudrait pouvoir discerner le sens de rotation.
Un lecteur de ce genre serait plus approprié:
Cordialement
jpbbricole
--------------------------------------------------------------------------------------------------------------
Préambule :
Nous ne sommes plus en 2005, année de la sortie de la première carte Arduino.
Parler d'Arduino pour désigner une carte microcontrôleur ne veut plus dire quelque chose.
Arduino SA propose de nombreuses cartes différentes avec différents micros et il existe d'autres cartes équipées d'autre microcontroleurs.
Le code de digitalRead est spécifique à chaque microcontroleur. Citer digitalRead() sans spécifier la plateforme ne veut plus dire grand-chose.
C'est pour cela que dans le message "les bonnes pratiques du forum francophone" il est demandé de décrire le matériel utilisé.
---------------------------------------------------------------------------------------------------------
Effectivement, la solution interruption parait la meilleure.
On peut faire un petit point sur digitalRead.
Si la carte utilisée est une UNO, nano ou pro-mini, le microcontrôleur est un ATMega328p.
Son horloge est 16 MHz (période = 62,5 ns) et la fonction digitalRead à la mode Wiring/Arduino prend environ 60 cycles horloge soit 62,5 ns * 60 ~= 4 µs.
Si on utilise la fonction digitalReadFast le temps d'éxécution n'est plus que de 2 cycles horloge, soit 30 fois plus rapide.
Elle est aussi rapide que si on lit directement les registres.
Attention digitalReadFast ne s'applique qu'aux micro AVR comme le 328p de la Uno.
Si la carte utilisée est une Arduino avec un micro Microchip ARM SAM D21 (cartes Zero et Mkr)
→ je n'ai jamais testé ce produit, je ne sais pas.
Si la carte utilisée est une ESP32, la fonction digitalRead n'est plus celle écrite par Arduino, mais celle écrite par Espressif.
Je n'ai qu'une estimation : approximativement 10 fois plus rapide que celle sur ATMega328p.
De mémoire (qui fout le camp) si on fait une lecture des registres sur ESP32 l'ordre de grandeur est celui de la fonction digitalReadFast.
Je n'ai pas testé avec l'accès DMA, vu que je n'y comprends rien, normalement ce devrait être plus rapide.
Le faible écart n'est pas surprenant malgré la grosse différence des fréquences horloges principales : ESP32= 320 MHz, ATMega328p = 16 MHz.
Les micros 32 bits sont complexes. Le micro ESP32 est encore plus complexe, c'est un micro non terminé, c'est le client, Espressif en l'occurrence, qui le termine comme il l'entend.
À ce que j'ai compris de l'arbre d'horloge :
- Horloge principale : 320 MHz
- Deux cœurs, chaque cœur a une horloge moitié : 160 MHz
- Il y a deux branches horloge pour les périphériques, chaque branche tourne à 80 MHz
- Le périphérique dédié aux GPIO a une horloge de 40 MHz.
Si j'ai bien compris, cela reste à confirmer puisque je n'ai pas trouvé de documentation officielle sur le sujet, il faut comparer un ATMega à 16 MHz avec un ESP32 à 40 MHz.
C'était ma contribution sur digitalRead.
Un dernier avis personnel :
Soit on n'a pas de but précis et on cherche obtenir les meilleurs résultats.
Dans ce cas on fonce et on voit.
Soit on a un but précis et dans ce cas il faut bien border le sujet.
- estimation du nombre de stries sur la roue. À vérifier sur de la documentation, le nombre est sûrement normalisé.
- estimation de la vitesse de rotation maximale que la roue striée devra atteindre.
Ce qui donnera le temps minimal entre deux interruptions.
Avant de se lancer dans des pages de code, il est bon de vérifier que le matériel est bien adapté au cahier des charges.
Dans le cas précis d'une imprimante ou d'un scanner on s'en moque un peu. Comme on pilote le moteur, on sait dans quel sens on se déplace.
Oui biensûre, mais ton interruption ne va pas enlever ce temps et suivant ce que tu veux faire, ce temps pourrait continuer à être un problème de congestion.
C'est pour ça que je pense qu'il faudrait qu'il nous en dise plus sur son projet.
S'l a la roue, il doit surement avoir aussi recupéré l'emeteur/recepteur ?
Messieurs,
merci beaucoup pour vos interventions et conseils.J'en apprend beaucoup. Par exemple avec le digitalReadFast et les cartes ...j'utilise la basique Arduino Uno et le L298N pour le moteur,
Je n'ai pas de projet précis. Je voulais juste contrôler, grâce à cette roue optique, l'avancée et le retour du chariot de numérisation de manière précise pour une autre utilisation. Comme vu sur la photo de la roue, il y a des centaines de stries blanc/noir, donc effectivement le digitalRead doit être très rapide.
Grâce à vous je vais poursuivre mes petites expériences. grands mercis
j berville

