Réduire la vitesse d'un moteur pas à pas (stepper) - Problématique

Bonjour à tous,

Je viens d'acquérir récemment un pan/tilt (photos) pour projet DIY.

Celui-ci est motorisé par 2 moteurs pas à pas bipolaire 2-phases 4 fils (réf en photo)

La télécommande permet de les contrôler, ainsi que divers fonctions que je souhaite garder.
Les 3 vitesses sélectionnables sont : 6, 12 et 20°/s (soit 1, 2 et 3,33 tr/min)

Problématique : la vitesse minimum (6°/s) est trop rapide. Vitesse recherchée : 0,6°/s (10x plus lent) Cela peut être +/-

Contraintes :

  • la modification par démultiplication d'engrenages n'est pas possible (taille réduite)
  • l'accès et la bonne modification du code de l'eeprom relève du miracle (d'après recherche)

Idées de solution :

  • un contrôleur avec joystick 3 axes de camera PTZ qui communique par protocole RS485 (le support en est équipé), mais pas sûr d'avoir la vitesse proportionnelle à la variation du joystick
  • un modulateur de fréquence avec input/output pour moteur 2 phases (pas trouvé en ligne)
  • un arduino qui lit les PWM des 2 sorties, divise la fréquence par 10, et renvoie le signal aux moteurs (nouveau driver nécessaire?)
  • Autres ?

référencement: 3D Axis Joystick CCTV Keyboard Controller Keypad for Security PTZ Speed Dome Camera Decoder DVR NVR Pelco RS485 Pan Tilt Zoom stepping stepper motor speed slow down ralentir

la première photo est cassée
un lien vers votre produit serait utile

Un diviseur de fréquence avec arduino et deux drivers me parait possible. Sinon remplacer la carte complète (quasi le même matériel plus un capteur optique).

Il y a une référence exploitable sur les deux drivers de pas à pas (photo)?

Bonjour JML, voici le lien du produit. Espérant que ça t'aide ?

Remplacer la carte complètement me parait trop compliqué, mais j'aime bien cette idée d'un diviseur de fréquence avec arduino. Quel modèle serait approprié ?

La référence des 2 drivers moteurs est : HR4995 B2407A. La première mention m'a fait trouvé ce PDF explicatif dans lequel on retrouve le schéma suivant :
cms

Pour une approche d'un point de vue logiciel il faudrait comprendre quel est le protocole utilisé sur cette liaison RS485 et ce qu'ils supportent réellement comme commandes.

C'est peut-être un protocole PTZ mais il y en a une tripoté (Pelco-D, Pelco-P, Santachi, Hunda600, zongcomity, Panasonic, Kalatel, Samsung, ...)

par exemple en Pelco-D on envoie une trame de 7 octets

  • l'octet 4 contient des bits de commandes (par exemple Tilt bas, Tilt Haut, Pan à Gauche, Pan à Droite)
  • l'octet 5 va définir la vitesse de pan, on peut mettre une valeur entre 0 (stop) et 63 (haute vitesse) ou 255 pour un mode turbo.
  • l'octet 6 va définir de même la vitesse du tilt (idem entre 0 et 63 mais pas de mode turbo).

mais peut-être ils n'ont qu'un sous ensemble ou un protocole propriétaire

Le driver utilisé dont tu as gentiment fourni la doc (j'ai lu en diagonale...) peut fournir une piste.

D'après la photo des moteurs, il s'agit de moteurs commandés en tension (impédance des enroulements élevée, marquage 12V). Pour ces moteurs, on le mets en général en mode pas entiers ou demi-pas, car les courant étant faibles, les micros pas ne fonctionnent pas correctement: quand on envoi des pas, le moteur n'avance pas ou avance de plusieurs pas en une fois. C'est la même chose si on utilise un diviseur de fréquence par 10: seul le dixième pas fait avancer, les autres ne font rien.

Si on peut passer les drivers du mode pas entier ou demi-pas au mode 16 micros-pas, on peut diviser l'avance. Malheureusement le driver n'accepte en plus du mode pas entier que 2, 4 et 16 micro-pas.
-> si le driver est en pas entier, on peut diviser la vitesse par 16
-> si le driver est en demi-pas, on peut diviser la fréquence par 8
Dans les deux cas on n'a pas le rapport 10.

Pour faire cette modification (et vérifier si c'est possible): carte non alimentée, voir si les broches repérées MS1 et MS2 sont reliées au 0V ou au 5V (broche repérée VDD). Cela se fait avec un ohmmètre.
la configuration est la suivante (voir la table 细分真值表):

Mode           MS2           MS1
pas entiers reliée à GND
ou en l'air
reliée à GND
ou en l'air
demi-pas reliée à GND
ou en l'air
reliée à VDD
4 micro-pas reliée à VDD reliée à GND
ou en l'air
16 micro-pas reliée à VDD reliée à VDD

Si on est en pas entiers ou en demi-pas, on peut peut être passer en 16 micro-pas.

Pour faire le changement:

  • si la broche MS1 et/ou MS2 est en l'air, la connecter à Vdd
  • si MS1 est déja à VDD, c'est parfait
  • sii la broche MS1 et/ou MS2 est connectée à GND, c'est plus compliqué, car il faut la connecter à Vdd

Dans le dernier cas, le mieux est de couper la broche en laissant la patte la plus longue possible, le désoudage étant quasi impossible. Puis souder le bout qui reste à un fil qui sera branché à VDD.

C'est pas forcément plus compliqué que de faire une nouvelle carte et un logiciel.

Au vu des drivers, il n'est pas nécessaire de lire le PWM qui va aux moteurs parce que:

  • c'est du 12V
  • il y a 4 signaux à lire et à décoder.

En fait il vaut mieux récupérer les infos STEP et DIR qui sont en 5V. Pour chaque front montant sur STEP, si DIR est à 1, on incrémente un compteur, sinon on le décrémente.
Quand le compteur modulo 10 passe se 0 à 1 on envoie sur le nouveau driver DIR=1 et une impulsion positive sur STEP. Quand le compteur modulo 10 passe se 1 à 0 on envoie sur le nouveau driver DIR=0 et une impulsion positive sur STEP. Les impulsions doivent durer au moins 1µs.

Je pense à une nano et deux A4988. Peu cher et très courant.

@J-M-L Le protocole bien vu est pelco P/D, au choix. D par default il me semble. Comment intervenir sur la modification des octets que tu décris ? Sur quel composant ?

@vileroi Génial, bien vu pour la tables des pas.
Après mesures, MS1 et MS2 sont reliés au GND... Donc c'est un pas entier.

Chose intrigante, j'ai obtenu le même résultat après modification à 6°/s avec la télécommande (Il conserve la valeur puisque quand on le réalimente il reste à cette vitesse). Pour ralentir c'est des 1/2 pas pourtant non ?
Ca va être chaud pour chinter les pistes sur 1mm de dispo...Et pas sûr du résultat (?)

Bonne idée le STEP et DIR, avec division par arduino.
Pour la vitesse recherchée, c'est pas du x10 précisément, c'est entre x8 et x14 en gros, mais la démarche sera la même.
.


Après de longue recherche, j'ai 2 autres solutions :

1/ Ajouter un diviseur de fréquence entre la carte et le moteur, pour chaque phase (4 x2moteur) !! Par le biais d'un composant CD4018 ou 74LS90 (74HS90). Qu'en pensez-vous, ça va marcher aussi facilement ?

cd4018 cms cou29

2/ Avec l'arduino, utiliser pulseIn() pour mesurer la fréquence de la phase venant du driver, et passer le résultat multiplié par 10 (par ex) à la fonction tone(). Condition: tone() n'est utilisable sur qu'une PIN à la fois. Problématique ?

Il faut un adapteur série vers RS485 ( TTL RS-485 converter) et ensuite si ce protocole est réellement supporté il suffît de balancer des commandes sous forme de trames (Le protocole est bien documenté) donc en gros une série de Serial.write() avec des valeurs bien choisies. C’est ce que font les télécommandes PTZ

L’adaptateur ne doute pas une fortune 5 modules pour 7€

(Je n’ai jamais essayé mais ça n’a pas l’air trop compliqué à tester)

Passer de pas à 1/2 pas va aller seulement 2 fois moins vite. Pour aller 8 fois moins vite, il faut passer en 1/8 pas.

Pour faire la soudure, il est pratique de le faire sous la loupe. Il vaut mieux étamer les deux fils et dans un deuxième temps souder en chauffant sans soudure.

Pour récupérer les signaux Step et Dir, il faut aussi faire ce genre de soudure.

Avec Arduino, cela sera pareil pour X8, X10 ou autre.

Ajouter des diviseurs ne fonctionnera pas car les moteurs doivent aller dans les deux sens.

C'est pareil, il faut pouvoir aller dans les deux sens.

Pour intercaler une carte entre la carte et les moteurs implique de lire les deux informations du moteur et de recalculer Comme indiqué post #7. Par contre maintenant que l'on sait que le moteur est en mode deux phases à la fois, il suffit de deux informations seulement (tout comme si on récupère step et dir. Une seule information ne suffit pas pour déterminer le sens.

Avec le trifouillage sur MS1 et MS2, c'est division par 16 seulement (ou par 4). Avantage: deux pattes à déplacer, pas de place prise. Inconvénient: soudures pas commodes à faire.

Citation @vileroi
Pour ces moteurs, on le mets en général en mode pas entiers ou demi-pas, car les courant étant faibles, les micros pas ne fonctionnent pas correctement

Citation @vileroi
Avec le trifouillage sur MS1 et MS2, c'est division par 16 (ou par 4)

Il n'y a pas contradiction là ? Puisque que le "trifouillage" sur MS1 et MS2 créera les micro-pas

Pour un moteur alimenté en tension, la limitation de courant ne fonctionne pas, on met soit du +12V, soit du -12V. Du coup si la limitation du courant intervient à 1A, elle ne limitera jamais rien.

Si on passe en pas entiers ou en demi-pas, cela fonctionne correctement. Mais si on passe en micro-pas, le driver cherche à mettre par exemple 10% de courant sur un enroulement et 93% du courant dans l'autre. Tant que le courant n'est pas atteint, il va mettre toute la tension. Et comme la limitation ne joue pas son rôle, on aura alors du 12V sur les deux enroulements soit 100% dès que l'on veut un peu de courant. on se retrouve alors pour les micros-pas sur des demis-pas. En gros, on va envoyer 16 ordres différents, mais le moteur ne peut prendre que 2 positions possible. Il est probable que si on envoi des pas régulièrement, que le moteur avance 3 fois d'un demi-pas puis reste sur place 13 fois, avance de 3 fois d'un demi-pas puis reste sur place 13 fois...

Le fonctionnement n'est pas régulier, presque comme si il n'avance qu'une fois sur 16. C'est pire qu'en mode demi-pas. C'est pourquoi je dis que cela ne fonctionne pas en micro-pas. Mais dans le cas qui nous préoccupe, cela revient presque à faire qu'une impulsion sur 16 fasse avancer le moteur d'un pas, puis 15 impulsions ne fasse rien.

Il y a de grandes chance que les micros-pas ne fonctionnent pas et que l'on soit en pas entiers... mais avec une division par 16. Ce qui peut convenir.

Ce n'est pas très simple, il faudra que j'écrive une page à ce sujet avec des illustrations

 

 

Maintenant si le courant est réglé à la bonne valeur cela fonctionnerait en 16 micro-pas. Ce qui n'est pas complètement impossible car les résistances de shunt (1,2Ω et 1,8Ω) sont présentes. Mais il n'y a pas la possibilité de réglages.

Tu me confirmes que si MS1 (ou MS2) et GND affichent une résistance c'est qu'ils sont reliés, et si aucunes résistances alors pas reliés ?

Je n'ai pas bien compris!

Pour être en mode pas, ils peuvent soit relier MS1à GND, soit laisser MS1 en l'air car il y a à l'intérieur du circuit une résistance de pull-down de 100kΩ (résistance à l'intérieur entre MS1 et GND). Il y a donc forcément une résistance de 100kΩ. Si l'ohmmètre indique 0Ω, c'est qu'il y a une piste sur la carte qui relie MS1 et GND.

C'est pareil pour MS2, sauf que la résistance de pull-down est de 50kΩ.

Que donne l’ohmmètre?

ms1 gnd: 2,1kΩ
ms1 vdd: 186kΩ
ms2 gnd: 2,1kΩ
ms2 vdd: 186kΩ

En mode test de continuité: (unité?)
ms1 gnd: 438 (très bref bip)
ms1 vdd: 550
ms2 gnd: 438 (très bref bip)
ms2 vdd: 550

Cela veut dire que MS1 et MS2 sont "en l'air" ?

Un peu surpris par le résultat de la mesure.
Sur la photo du coté où l'on voit les drivers moteur, ms2 semble aller sur une résistance de 10k.
Est-ce que ms1 et ms2 ne serait pas reliés l'un à l'autre?

Broches en l'air, non on aurait plutôt 100kΩ et 50kΩ. La valeur indiqué par le testeur de continuité est souvent une tensio (cela permet de vérifier les diodes. Par contre un bip peut indiquer qu'il y a un condensateur. Mais je en vois pas pourquoi ils en aurait mis un. J'ai plus l'impression qu'il y a une résistance de 2,2kΩ enter les sorties et la masse. Le test de résistance entre MS1 et MS2 peut dire si les broches sont reliées ou pas.

Par le test de continuité ces broches sont-elles reliée aux résistances? aux broches du processeur? (valeur nulle ou inférieur à 10Ω sur le testeur). Et si c'esr sur une résistance, l'autre côté de la résistance est branchée où?

Si jamais elles ne sont que sur une résistance de tirage au 0V de 2,2kΩ, c'est nettement plus simple pour y mettre du 5V. Il n'y a rien à dessouder ni à couper.

Il est aussi possible que ces broches soient reliées plus ou moins directement sur le contrôleur. Ainsi par programmation on pourrait changer de micro-steps. J'y cois assez peu parce que cela mobilise alors 4 broches pour ne pas simplifier beaucoup le programme.

UNe autre information qui serait intéressante, serait en fonctionnement de mesurer la tension de MS1 ou MS2, et de refaire la même mesure avec une résistance de 2,2kΩ entre MS1 ou MS2 et le 5V. Avec 2,2V on ne risque rien.

Bon, malheureusement je crois pas que ce soit aussi simple que de mettre +5v sur MS1/2 pour activer le step 1/16...

Je viens de faire les mesures, bizarre ou pas, j'ai 2 tensions différentes sur VDD suivant les GND.

Voici les résultats avec mesures de tension sur les MS1/2:

haut:
GND3  VDD 0v
GND16 VDD -4.3v
GND3  MS1/2 0v (standby)
GND16 MS1/2 -5v (standby)
bas:
GND3  VDD 5.5v
GND16 VDD 1.2v
GND3  MS1/2 0v (standby)
GND3  MS1/2 -10.6v (marche)
GND16 MS1/2 -5v (standby)
GND16 MS1/2 -5v (marche) 

C'est à ne rien comprendre pour moi..

Tu es certain de ne pas t'être trompé sur la position du 1 du boitier?
Tu as bien vu que le boitier dans l'image est tourné d'un quart de tour par rapport au dessin que tu as placé à coté.