Aller au contenu


Photo
- - - - -

Comment arrêter un servo à rotation continue?

servo rotation moteur

  • Veuillez vous connecter pour répondre
20 réponses à ce sujet

#1 la.couenne

la.couenne

    Membre

  • Membres
  • 22 messages

Posté 13 mai 2017 - 10:55

Re Bonjour à tous!

 

Mon projet actuel est un petit chien qui suit une personne partout à l'aide d'OpenCV.

 

J'utilise deux servomoteurs à rotation continue, je programme en Python, et je ne parviens ni à varier leur vitesse, ni à les arrêter!

 

Je suis sûr que cette information figure quelque part dans ce forum, mais j'ai beau chercher je ne trouve rien, ni sur Google étonnamment  :crazy:

 
Voici un mini script python qui tente de faire varier la vitesse, je parviens à l'inverser mais pas le stopper:
# donc on fait une boucle de 1000 à 400 pour trouver où le servo veut bien s'arreter..

i = 1000
while 1:
    i = (i - 1)
    pwm.set_pwm(2, 0, i)
    print(i)
    time.sleep(0.2)
    if i < 400:
        break

print("fin")

Si quelqu'un a une idée je suis preneur, ça fait toute la soirée que je tourne en rond  :kez_11:

Merci d'avance!

 



#2 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 965 messages
  • Gender:Male
  • Location:Anglet

Posté 14 mai 2017 - 05:11

Hum ... Tu vois le servo qui ralentis avant de changer de sens ? Puis il accélère après avoir changé de sens ? 

Dans ce genre de cas une petite vidéo ça aide aussi ;) 
 

Si tu augmentes le time.sleep de beaucoup  ( genre 1 secondes  )  il se passe quoi ?


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#3 arobasseb

arobasseb

    Membre chevronné

  • Administrateur
  • PipPipPipPip
  • 737 messages
  • Gender:Male
  • Location:BORDEAUX (33)

Posté 14 mai 2017 - 08:27

D'où sortent les valeurs 1000 et 400 car si elle sont importante, pour information la boucle commence de 999 jusqu'à 399 et il faudrai mettre i = (i - 1) avant le if

et quelle librairie utilises tu pour savoir à quoi correspondent les paramètres de la méthode set_pwm

 

Pour rappel un servo à rotation continue fonctionne

    - dans un sens avec les largeurs d'impulsion entre 1ms et 1,5ms

    - à l'arrêt à 1,5ms

    - dans l'autre sens entre 1,5ms et 2ms



#4 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 758 messages
  • Gender:Male

Posté 14 mai 2017 - 08:30

Il serait peut être intéressant de calcul combien de temps met ton servo pour faire un tour, ensuite le gérer sur le temps, c'est juste une idée.

 

i = 360  #360 degrés = 1 tour

 

combien faut il de tour pour faire 1 mètre (et 10 cm dans l'exemple, du moins réunir l'informations de distance).

 

car ta valeur dans i = 1000 suis pas sur du coup.

 

 

Perso j'essaye de gérer mes servos sur les degrés et temps (car pas de rotation continue sur les miens).

 

En résumer, tu peux dire à ton robot de tourner toujours en boucle avec une base de 360 degrés pour un tour avec le temps comme ça tu peux lui dire fais tant de distance en temps de temps, ou lui créer des modes (speed il tourne pleine bille, middle mode tranquille, slow = mode asthmatique) et gérer ça avec des capteurs (distance ou autre).

 

PS : si tu cherches bien sur le forum, tu trouveras (si je me rappel bien), de quoi faire tourner ton servo gérer par le temps, en python 3 et sur la PCA9685 :)

 

Bon courage :)


signature_01.png -->

 

Mon Tipeee
 


#5 la.couenne

la.couenne

    Membre

  • Membres
  • 22 messages

Posté 14 mai 2017 - 01:38

Merci pour vos réponses rapides!

Je ne pensais vraiment pas être bloqué sur un truc aussi basique :/

 

Pour répondre à vos questions, j'utilise le PCA9685 de Adafruit:

https://cdn-shop.ada...x728/815-06.jpg

 

Mike118 Non il ne ralenti pas avant de changer de sens, alors qu'il devrait à mon avis aussi. Et il n'accélère pas non plus.. (Si j'augmente le time.sleep il ne se passe rien, le script est juste + long à executer)

 

Oui Arobasseb, j'ai souvent vu sur internet que 1,5ms l'arrête, et que le sens de rotation dépend des largeurs d'impulsions entre 1ms et 2ms, mais il me semble que c'est ce que je fais en écrivant pwm.set_pwm(2, 0, 1500) il est censé arrêter le servo, non?

(le 1000 et 400 était des valeurs au hasard, je voulais tester s'il y avait au moins un changement de vitesse)

 

J'ai refais mon code sans la boucle, ce sera + simple à comprendre:

#!/usr/bin/python
import Adafruit_PCA9685  # Le module PCA9685 pour le ctrl des servo
import time
pwm = Adafruit_PCA9685.PCA9685()
pwm.set_pwm_freq(60)  # La frequence des impulsions

pwm.set_pwm(2, 0, 2000) # moteur tourne
time.sleep(1)
pwm.set_pwm(2, 0, 710) # 710 -> le moteur s inverse
time.sleep(1)
pwm.set_pwm(2, 0, 2000) # ne fait rien?! (ne se rinverse pas)
time.sleep(1)
pwm.set_pwm(2, 0, 1500) # 1500 -> le moteur ne s arrete pas?!

Alors si je met 2000 il tourne, vers 710 (donc bien moins que 1000) il s'inverse, ce qui est curieux c'est que si je remet 2000 il ne se ré-inverse pas!

et si je mets 1500 il ne s'arrête pas...

 

Oliver17 c'est une très bonne idée de se baser sur le temps, mais mon problème c'est que mon servo ne s'arrête pas, je ferai comme ça dès que j'arrive à l'arrêter :)

 

Bonne fin de week-end à tous!



#6 arobasseb

arobasseb

    Membre chevronné

  • Administrateur
  • PipPipPipPip
  • 737 messages
  • Gender:Male
  • Location:BORDEAUX (33)

Posté 14 mai 2017 - 02:00

En regardant un peu sur internet je me demande s'il ne faudrait pas que tu utilises plutôt l'instruction 

pwm.set_duty_cycle(pin, largeur en millisecondes 1.5 pax exemple);

qui permet d'ajuster la largeur d’impulsion.



#7 Bobox

Bobox

    Habitué

  • Membres
  • PipPip
  • 157 messages
  • Gender:Male
  • Location:Montigny le Bretonneux

Posté 14 mai 2017 - 02:51

Si je lis bien la librairie Adafruiit_PCA9685, les arguments de la fonction set_pwm  ne sont pas en ms, c'est un nombre de tick/4096.

 

pwm.set_pwm_freq(60)

Tu met la frequence a 60Hz, donc la période de répétition est de 16.7ms.

 

pwm.set_pwm(2, 0, 2000)

2 est le numero du channel

0 est le 'tick' de depart de l'état haut, ce sera divisé par 4096 et multiplié par la période.

2000 est le 'tick' de fin de l'état haut, début de l'état bas, ce sera divisé par 4096 et multiplié par la période

 

Donc je crois que cette commande du crée :

1 état haut qui démarre au début du cycle et qui se termine a 2000/4096 du cycle, comme le cycle est de 16.7ms, cela fait un état haut de 8.13ms et un état bas de 8.56ms.

 

Ceci étant ça n'explique pas trop pourquoi quand tu renvois la commande pwm.set_pwm(2,0,2000) la deuxieme fois ca ne remet pas le moteur dans le même état que la première fois.

 

Voilà le lien sur une page en français qui devrait pouvoir t'aider:

http://gilles.thebault.free.fr/spip.php?article45



#8 cocothebo

cocothebo

    Membre passionné

  • Membres
  • PipPipPip
  • 341 messages
  • Gender:Male

Posté 15 mai 2017 - 08:24

Bonjour,

 

Je vais pe dire des bêtises n'ayant jamais utilisé de servo a rotation continue, mais pour moi c'est un moteur qui n'a que 3 modes:

  • tourne horaire
  • stop
  • tourne anti horaire

Le principe quand on le fait en modélisme est d’échanger le potar de position par deux résistances égales (ou fixer le potar de façon a ce qu'il soit équilibré), ce qui implique que si on envoie un ordre à

  • 90° (si bien centré évidemment): le servo ne bouge pas (on lui demande 90° et le potar affiche 90)
  • < 90°, il tourne dans un sens
  • > 90°, il tourne dans l'autre.

Si le servo est analogique, normalement plus on s'éloigne du centre (90°), plus ira vite (en atteignant sa vitesse maximum avant 0° ou 180°), ça s'explique par le fait que normalement en analogique c'est un comparetur qui va driver le moteur et donc laisser passer plus de tension quand on est loin de la consigne.

Par contre si le servo est numérique, la la vitesse à des chances d'être constante



#9 la.couenne

la.couenne

    Membre

  • Membres
  • 22 messages

Posté 15 mai 2017 - 09:31

Merci beaucoup pour toutes ces réponses :)

 

Suite à ton post arobasseb, j'ai cherché dans ce sens et trouvé des exemples qui utilisent l'instruction pwm.set_duty_cycle() mais ça me génère une erreur, je vais creuser ça cette fin de semaine!

 

Ce qui m’énerve c'est que j'ai 2 servo normal pour les axes horizontal et vertical de la tête qui fonctionnent nickel, et ces 2 servo continu ne marchent pas alors que ca doit être + ou - le même principe  :unsure:

 

Sinon Bobox merci pour ton explication, c'est bien ça mais comme tu dis ça n'explique pas pourquoi le servo ne se ré-inverse pas quand je renvoie la 1ère commande lol

 

Bref merci encore à tous, je vais creuser encore et je reviens dès que j'ai trouvé.. et sinon je vire mes 2 servo et je mets des moteur DC avec un pont en H, mais dans ce cas je vais perdre en précision par rapport à un servomoteur....

 

La suite dans qques jours !



#10 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 758 messages
  • Gender:Male

Posté 16 mai 2017 - 08:10

Perso j'utilise le même driver PCA9685 mais pas de la même façon : 

from Adafruit_PWM_Servo_Driver import PWM
pwm = PWM(0x40, debug = False)
pwm.setPWMFreq(50)

anglemin = 0  #angle mini que l'on veut donner à notre servo en degrés
anglemax = 180   #angle maxi que l'on veut donner à notre servo en degrés
servomin = 100  #position mini de notre servo
servomax = 515  #position maxi de notre servo

servo = 0 
degres = 0

#le result permet de mapper les valeurs de ton servo en degrés.
result = int(degres - anglemin) * (servomax - servomin) / (anglemax - anglemin) + servomin)

pwm.setPWM(servo, 0, result)

et dans ta boucle tu remplaces la valeurs de degres par celle que tu veux et le servo va à la position demandé.

Bon j'ai placé ce bout de code à la va vite mais dans l'ensemble ça fonctionne.

Maintenant pour qu'il tourne en continue, hum, je ne vois pas.


signature_01.png -->

 

Mon Tipeee
 


#11 la.couenne

la.couenne

    Membre

  • Membres
  • 22 messages

Posté 25 mai 2017 - 08:17

Hello,

 

Comme j'avais dit que je reviendrais donner des nouvelles, me revoilà :)

 

Donc j'ai viré mes 2 servo à rotation continue puisque je n'arrive à rien, j'ai fait un pont en H avec une puce L293D et 2 moteurs 6v.

 

Forcément je perds en précision, mais je crois que ça va quand même pas trop mal..

 

Je reprends donc mon code OpenCV, mon but est de repéré les yeux, afin de récupérer l'histogramme des couleurs d'un rectangle situé sous la tête (la couleur du t-shirt) afin de bêtement suivre cette couleur -> donc suivre la personne..

 

Si mon projet est concluant, je referai un post pour le présenter :)

 

Merci à tous pour votre aide en tout cas!

et bon bidouillage ;)



#12 arobasseb

arobasseb

    Membre chevronné

  • Administrateur
  • PipPipPipPip
  • 737 messages
  • Gender:Male
  • Location:BORDEAUX (33)

Posté 25 mai 2017 - 08:28

Si mon projet est concluant, je referai un post pour le présenter :)

 

 

Tu peux le présenter, quand même, et nous t'aiderons à le rendre concluant :)



#13 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 758 messages
  • Gender:Male

Posté 25 mai 2017 - 09:11

Dommage d'avoir abandonné les deux servos, il doit bien y avoir une solution, mais bon, si tu t'y retrouve comme ça, c'est tant mieux :)

 

Ouais, n'hésite pas à en parler de ton projet, en plus OpenCV je compte bien m'y mettre des que j'ai l'occasion ^^


signature_01.png -->

 

Mon Tipeee
 


#14 la.couenne

la.couenne

    Membre

  • Membres
  • 22 messages

Posté 25 mai 2017 - 10:51

Oui j'ai suivi un peu ton travail Oliver17 et j'ai bcp aimé! 
 
Voici en attendant une petite vidéo vite faite de mon robot, et je mettrais + d'info sur sa conception dès que j'arrive à faire qque chose de concert.

 
 
Avec OpenCV je parviens à suivre le regard, suivre une couleur, et reconnaître un visage (mais créer un décalage de 5 à 6 sec), le tout en python.
 
Mon but serait de repérer le regard, et récupéré la couleur du t-shirt afin que le robot suivie la personne... Tout un programme :D
 
A tout bientôt!

#15 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 758 messages
  • Gender:Male

Posté 26 mai 2017 - 09:26

Vidéo vu, et bien c'est déjà pas mal je trouve, c'est un bon début :)

 

Tu dis avoir un décalage de 5 à 6 secondes, n'aurais tu pas des print qui traînes ou truc du genre dans ton code qui pourrait effectivement donner un temps de latence. ?


signature_01.png -->

 

Mon Tipeee
 


#16 la.couenne

la.couenne

    Membre

  • Membres
  • 22 messages

Posté 26 mai 2017 - 01:04

Re,

 

le temps de latence c'est juste quand je fais la reconnaissance des visages, faudrait que je diminue la taille de l'image pour gagner du temps de traitement je pense, mais j'ai décidé de juste repérer les yeux, de cette façon ça prend moins d'une sec :)

 

Avec ma détection de couleur, je n'ai pas eu le temps de tester le suivi horizontal avec les 2 moteurs à chenilles, je ferai ça ces jours et reviendrai ici..

 

J'ai hâte que tu t'y mette Oliver17 à l'OpenCV, car vu comme tu as poussé tes recherches sur les servo, tu vas réaliser des trucs monstres  :yes:

 

A++



#17 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 758 messages
  • Gender:Male

Posté 26 mai 2017 - 02:31

Tu as mis quelle taille d'image (ou taille de la capture d'image) par curiosité ?

 

J'ai hâte que tu t'y mette Oliver17 à l'OpenCV, car vu comme tu as poussé tes recherches sur les servo, tu vas réaliser des trucs monstres  :yes:

 

 

Merci, mais suis bien loin d'être un expert, j'apprend petit à petit, dans un premier temps j'essaye développer (ou d'écrire plutôt) le programme qui va bien pour manipuler un bras (en se rapprochant d'un bras humain avec ces contraintes), par la suite, avec opencv, faire un peu comme toi pour de la reconnaissance et faire réagir ce fameux bras, (voir un deuxième plus tard je l'espère) :)

 

Déjà, tous ça c'est pas mal de boulot. :)


signature_01.png -->

 

Mon Tipeee
 


#18 la.couenne

la.couenne

    Membre

  • Membres
  • 22 messages

Posté 26 mai 2017 - 09:32

Je la mets en n/b puis la redimensionne de cette manière:

    newsize = (int(image.shape[1]/1.5), int(image.shape[0]/1.5)) # entre 1.5 et 2
    image = cv2.resize(image, newsize) 
 
Du coup je ne sais pas en pixel la taille que ça donne car je ne suis pas sur mon pc, mais environ 250x400 px je dirais. 
 
Je peux refaire un post et y mettre mon code, ça te donnera un début et permettra à ceux qui connaissent bien OpenCV de critiquer mon script :)
 
Mais comme je ne suis qu'au tout début, faut pas attendre quelque chose de fabuleux  :ignat_02:


#19 Ulysse

Ulysse

    Membre passionné

  • Membres
  • PipPipPip
  • 486 messages
  • Gender:Not Telling

Posté 26 mai 2017 - 10:09

Oups! 5 à 6 secondes pour une détection de visage sur une frame 250 x 400 ? Ça devrait tomber sous la seconde ... quoique ça dépend beaucoup de l'horloge de ton système. Ça toune sur ... ?

#20 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 758 messages
  • Gender:Male

Posté 26 mai 2017 - 11:32

Sans être un fin spécialiste, je rejoins Ulysse sur ces propos, cela fait beaucoup de latence pour une si petite image.

Ceci dis, c'est déjà un début ;)

Pour le code, je ne pourrai pas juger ou t'aider, je ne connais pas OpenCV, mise à part avoir essayé un ou deux exemples de test :)

 

Post toujours ton code, peut être qu'une personne plus calé pourra t'aider.


signature_01.png -->

 

Mon Tipeee
 





0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users