Comment traiter données issues d'un capteur

Python est le langage de prédilection du Raspberry Pi

Modérateurs : Francois, Manfraid

redscreen
Messages : 26
Enregistré le : ven. 28 févr. 2020 17:05

Re: Comment traiter données issues d'un capteur

Message par redscreen » lun. 6 juil. 2020 12:50

ATTENTION ! il y a bien 4 pins GPIO sur le PI qui peuvent servir en PWM mais seulement 2 canaux.
Oui j'ai bien remarqué qu'il y avait 2 canaux (PWM0 et PWM1) :
Un module BTS7960 doit être connecté à 2 pins PWM (L_PWM et R_PWM), donc il ma faut bien brancher les 4 si j'ai 2 modules.
Et c'est là que ça gène, (oui j'ai besoin de 2 moteurs avec des vitesses différentes) et si tu me dis que c'est ok, ça me rassure.

Mais pour le moment (avec un truc simple (avance recule les 2 vérins pendant 3 secondes)) :
- soit je branche GPIO 12-13 (channel 0 et 1) pour un BTS7960 et son vérin / et GPIO 18-19 (channel 0 et 1) pour l'autre -> (ça bouge mais perturbe le 1er si je branche le 2ème)
- soit je branche GPIO 12-18 (channel 0) pour un BTS7960 et son vérin / et GPIO 13-19 (channel 1) pour l'autre -> (là rien ne fonctionne)

Je re-essayerai demain
Modifié en dernier par redscreen le sam. 11 juil. 2020 22:08, modifié 1 fois.

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: Comment traiter données issues d'un capteur

Message par Bud Spencer » mar. 7 juil. 2020 13:02

C’est normal que cela ne fonctionne pas.
Je n’avais en effet pas percuté que les BTS utilisent un signal pour la rotation droite et un autre pour la rotation gauche. Pour remédier a ça, tu peux simplement connecter les pins R_EN et L_EN de chaque module a des GPIO de façon à désactiver les rotations de l'un quand l'autre utilise le signal pwm. Le problème, c’est que les moteurs ne pourraient pas tourner dans le même sens a des vitesses différentes en même temps :cry:

Cela dit, avec un peu d’imagination, c’est facilement jouable et en économisant 2 GPIO. C’est juste un Suggestion car c’ayant pas ce genre de module, je ne peux pas essayer, mais cela devrait fonctionner :
Une seule pin PWM du PI qui raccorde les broches L_PWM ET R_PWM d’un même module BTS.
Une GPIO en sortie qui définie le sens de rotation. Cette sortie GPIO directement relié à L_EN pour activer la rotation à gauche et un inverseur (NPN) qui switch R_EN pour désactiver la rotation à droite

Vite fait à l’arrache pour que tu comprennes ce que je veux dire, voilà à quoi va ressemblerait
btspi.png
btspi.png (20.24 Kio) Vu 5591 fois
Dans cette configuration :
Si la GPIO est à 0, R_EN est à l’état haut (pull up R1) et L_EN à l’état bas (pull_down R2), donc, rotation à droite

Si la GPIO est à 1, R_EN st mis a l’état bas par le swith Q1 et L_EN est mis à l’état haut par la GPIO, donc rotation à gauche

Avec ça, les 2 modules BTS devienne totalement indépendant aussi bien en vitesse qu’en sens de rotation. Il y a d’autres solutions que l’utilisation d’un transistor (porte logique, mini relais inverseur …) , mais c’est ce qu’il y a de plus facile a mettre en œuvre je pense
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

redscreen
Messages : 26
Enregistré le : ven. 28 févr. 2020 17:05

Re: Comment traiter données issues d'un capteur

Message par redscreen » mer. 8 juil. 2020 12:29

Merci beaucoup pour les infos et le temps que tu prends à m'expliquer avec des schémas ;) !! t'es génial.

Partant de cette idée (1 GPIO output pour désactiver un sens de rotation), je ne comprends pas pourquoi
les moteurs ne pourraient pas tourner dans le même sens a des vitesses différentes en même temps
:
car si je n'ai plus que 2 fils PWM au total, il y aurait 1 BTS sur PWM.channel 0 et l'autre sur PWM.channel 1, (avec 4 GPIO en output, 2 par BTS, pour activer les sens de rotations)...

M'enfin si tu me le présentes comme ça, c'est bien qu'il y a une raison!!... l'électronique ce n'est pas mon fort, j'ai déjà du regarder ce qu'était un Transitor NPN :roll:
Ceux-ci feront l’affaire ? :
https://fr.rs-online.com/web/p/transist ... t/6262793/

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: Comment traiter données issues d'un capteur

Message par Bud Spencer » mer. 8 juil. 2020 17:20

redscreen a écrit :
mer. 8 juil. 2020 12:29
Partant de cette idée (1 GPIO output pour désactiver un sens de rotation), je ne comprends pas pourquoi
les moteurs ne pourraient pas tourner dans le même sens a des vitesses différentes en même temps
C’était dans l’idée d’utiliser seulement 2 GPIOs en parallèle sur les x_EN des 2 modules mais en les inversant pour inhiber l’un ou l’autre.
redscreen a écrit :
mer. 8 juil. 2020 12:29
car si je n'ai plus que 2 fils PWM au total, il y aurait 1 BTS sur PWM.channel 0 et l'autre sur PWM.channel 1, (avec 4 GPIO en output, 2 par BTS, pour activer les sens de rotations)...
Bien sur, tu peux aussi faire comme ça si tu as suffisamment GPIO de libre. Ça t’évite les composants extérieurs. Ça donnerait :
1 pwm , une gpio rotation droite et une gpio rotation gauche par module BTS.

Pour le montage à transistor, c’est juste un exemple (un peu d’électronique de base ne fait pas de mal, il y en a bien besoin ici …) L’idée c’était de définir le sens de rotation avec une seule gpio de commande et un seul pwm. Pour ça, n’importe quel npn ferait l’affaire. La subtilité est juste dans le dimensionnement de R1 et R3 de façon à tirer un minimum sur le 5v tout en garantissant le régime de saturation. Un bon exercice pour les apprentis électronicien qui les ameneraient à la conclusion que dans ce cas particulier, il y a tout intérêt à prendre un transistor qui a un très faible gain.

Toujours dans un esprit ‘électronique’ Il y aussi la possibilité de faire toujours avec une seul gpio de rotation et même sans câbler les L_EN et R_EN en remplaçant le transistor et les résistance par un circuit logique.
Exemple avec 4 portes NOR (un 7402 …).
7402pwm.png
7402pwm.png (11.13 Kio) Vu 5574 fois
Tout ca pour dire qu'avec un peut réflexion, il ni a pas de problème, il y a juste des solutions ;-)
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

redscreen
Messages : 26
Enregistré le : ven. 28 févr. 2020 17:05

Re: Comment traiter données issues d'un capteur

Message par redscreen » sam. 11 juil. 2020 22:26

C'est clair que plus on connait l'électronique, plus on peu faire des trucs intéressants :ugeek:
Merci pour les 2 façons de faire !

Je n'ai ni transistor NPN, ni circuit logiques sous la main, donc j'ai testé avec 2 GPIO par module pour activer les sens de rotation:
je ne comprend pas, ces BTS7960 sont capricieux, illogiques...: si L_EN ET R_EN ne sont pas à l'état haut tous les 2, rien ne fonctionne !! :shock: :?

Je suis donc contraint de faire avec 4 PWM distincts, et la Pi n'a pas ça... :oops:

Je vais donc être forcé d'utiliser du PWM software pour commencer... :cry:
ou acheter un TLC5947 si tu me confirmes que ce serait vraiment mieux

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: Comment traiter données issues d'un capteur

Message par Bud Spencer » dim. 12 juil. 2020 08:46

Compte tenu du marquage on était en droit de penser que L_EN et R_EN pouvaient servir à inhiber l’un ou l’autre sens de rotation, ce qui visiblement n’est pas le cas. Cela veut donc dire que le montage a transistor ne fonctionnerait pas non plus puisqu’il fait la meme chose que la solution que tu as testée en câblant ces broches sauf qu’il ne se contente que d’une gpio. En revanche la solution logique que je t’ais proposé fonctionne de façon totalement différente. Celle la te permettrait de garder ces 2 pins à l’état haut (5v) et de n’utiliser aussi qu’une seul gpio de commande par module.

C’est vraiment de la logique de base facile à comprendre. Les portes sont des NOR (NON OU). La règle d’une porte logique NOR est que la sortie n’est à 1 que si toutes les entrées sont à 0.

a b o
0 0 1
1 0 0
0 1 0
1 1 0

ce qui donne :

Si GPIO_Rot est à 1, la sortie de la porte 3 est bloquée à 0 quel que soit l’état du signal pwm. La porte 2 qui est montée en inverseur maintient un état 0 sur l’entrée b de la porte 4 donc sa sortie (PWM_L) est l’inverse de la sortie de la porte 1 (/PWM_In).

SI GPIO_Rot est à 0, la sortie de la porte 3 (PWM_R) est l’inverse de la sortie de la porte 1 (/PWM_In). La porte 2 qui est montée en inverseur maintient un état 1 sur l’entrée b de la porte 4 donc sa sortie est bloquée à 0

La porte 1 est montée en inverseur de façon à avoir les meme niveau d'états pwm en sortie qu’en entrée.

Perso j’utiliserais sans hésiter cette solution. C’est extrême simple à mettre en œuvre puisqu’il ni a qu’un seul composant que l’on trouve partout. Cela peut etre soit un 74LS02 mais aussi CD4001. Ce sont des composant qui doivent couter tout au plus 50 cents à l’unité et que l’on trouve obligatoirement chez n'importe quel vendeur de composant et par poigné dans tous les tiroirs d’électroniciens amateur.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

dyox
Raspinaute
Messages : 969
Enregistré le : dim. 28 déc. 2014 15:28
Localisation : Le long de la côte, au dessus du pays des bigoudennes, aïe

Re: Comment traiter données issues d'un capteur

Message par dyox » dim. 12 juil. 2020 09:08

Bonjour,
Je suis donc contraint de faire avec 4 PWM distincts, et la Pi n'a pas ça... :oops:
D'après ses tests, elle en possède bien 4 et même plus, tous les gpios : https://www.radishlogic.com/raspberry-p ... -pwm-gpio/

A tester

redscreen
Messages : 26
Enregistré le : ven. 28 févr. 2020 17:05

Re: Comment traiter données issues d'un capteur

Message par redscreen » dim. 12 juil. 2020 12:18

Là si je ne comprend pas je n'ai plus d'excuse, superbe explication, clair et efficace ! (comme toujours avec mr Bud Spencer :D )
Logique simple, mais il faut y penser !
Les opérateurs logiques j'ai vu ça pendant mon année d'étude, mais pas mis en pratique, donc savoir qu'il faut un 74LS02 ou CD4001...
Je commande ça tout de suite, car ça me parait bien mieux que d'acheter une carte d'extension PWM TLC5947 qui me coutera bien plus cher.

Merci aussi pour l'article très intéressant:
I assumed at first when changing the duty cycle or the frequency of GPIO 12 (Pin#32) it would automatically change the duty cycle of the GPIO 18 (Pin#12) but it did not. Both PWM pins acted independently from each other.
Bien pas pour moi avec NodeJs en PWM Hardware, (j'ai vérifié au voltmètre, si j’envoie sur GPIO12, GPIO18 reçoit le même signal)


D'après tous mes tests j'ai bien peur que ses craintes soient fondées:
This makes me wonder if the Python PWM of the Raspberry Pi is a Hardware PWM or a Software PWM
-> Python PWM = Software PWM

Une chose m'intrigue quand je vois "BCM2835 Specification Sheet (PWM)": on voit un GPIO52 et 53, mais sans Pin, donc surement inutilisables... :?

Code : Tout sélectionner

raw_input('Press return to stop:')	#Wait

# Stops the PWM
pwm8.stop()
Ca me fait penser que je ferais bien d'inclure aussi une combinaison de touche qui stoppe le PWM dans mon programme JS (par sécurité)

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: Comment traiter données issues d'un capteur

Message par Bud Spencer » dim. 12 juil. 2020 21:13

dyox a écrit :
dim. 12 juil. 2020 09:08
Bonjour,
Je suis donc contraint de faire avec 4 PWM distincts, et la Pi n'a pas ça... :oops:
D'après ses tests, elle en possède bien 4 et même plus, tous les gpios : https://www.radishlogic.com/raspberry-p ... -pwm-gpio/
A tester
Salut Diox. Oublis ce genre de blog. Cela ne t’apprendra rien de bon. Ici, on parle de PWM Hardware, donc de signaux qui sont nativement générés par le BCM. Fais l’essais de mesurer la stabilité des signaux et la charge CPU entre 2 GPIOs scriptées PWM Soft en Python avec Rpi.GPIO et avec les 2 canaux PWM Hardware (écrit en n’importe quoi). Tu vas vite voir que l’on ne parle pas du tout de la meme chose. A partir du moment où tu fais du soft, tu peux le faire sur n’importe qu’elle I/O en sortie et ça ni change absolument rien que tu utilises les GPIO dédié au PWM Hard ou n’importe quelle autre. C’est d’ailleurs une des choses que l’auteur de ce truc n’a pas compris.
redscreen a écrit :
dim. 12 juil. 2020 12:18
I assumed at first when changing the duty cycle or the frequency of GPIO 12 (Pin#32) it would automatically change the duty cycle of the GPIO 18 (Pin#12) but it did not. Both PWM pins acted independently from each other.
Bien pas pour moi avec NodeJs en PWM Hardware, (j'ai vérifié au voltmètre, si j’envoie sur GPIO12, GPIO18 reçoit le même signal)
C’est normal et ni Python ni NodeJS n’ont rien à voir là-dedans. D’un côté on a une lib qui fait du Soft (Rpi.GPIO) et de l’autre, un lib qui adresse directement les registre du BCM pour faire du Hard (BCM2835) et Il y a autant de différences entre les 2 qu’il y en a entre une mobylette et un potiron.

Pour la logique, c’est très simple : AND, NAND, OR, NOR, XOR, XNOR. C’est ce qui régit toutes les bases fondamentales de l’informatique et de l’électronique numérique que l’on connait (on peut je pense faire abstraction du quantique ici …). En terme de programmation, on l’utilise tous les jours et ça s’applique exactement de la meme façon à l’électronique numérique. Un 7402 ou un CD400 (ou n’importe quel circuit logique), ça coute quedal et ça peut etre vraiment beaucoup plus instructif sur une breadbord qu’une led avec une résistance.

Coté code tu peux voir 'pratique' avec une seule et meme fonction d'objet ou tu passerais en paramètre le sens de rotation. Genre avec un enumérateur (ca a toujours de la gueule dans un code les enumérateurs)
MotorX.Rotate(RIGH, ... vitesse ...)
MotorX.Rotate(LEFT, ... vitesse ...)
MotorX.Rotate(NONE, ... )
...
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: Comment traiter données issues d'un capteur

Message par Bud Spencer » lun. 13 juil. 2020 10:08

kado :

Le petit montage en simulation logique en ligne : https://simulator.io/board/Cxbp7KTPRx/1
1to2pwm.png
1to2pwm.png (36.47 Kio) Vu 5520 fois
1 - Démarrer le générateur de signal
2 - tu peux ensuite changer l'état de la GPIO_Rot en cliquant dessus

Le simulateur ne propose pas de porte NOR, donc j'ai utilisé des porte OR que j'ai fais suivre par des inverseur (NOT)

ps: je l'ais fais en Anonymous, donc je ne sais pas combien de temps cela reste en ligne.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Répondre

Retourner vers « Python »