Aller au contenu


Photo
- - - - -

Asservissement et temps de réaction du programme...


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

#1 bennurre

bennurre

    Habitué

  • Membres
  • PipPip
  • 160 messages
  • Gender:Male

Posté 25 février 2013 - 10:03

Bonjour, après pas mal de creusage de tête je viens vous donner ma langue au chat!

J'ai un problème! Lol

Je suis toujours entrain de préparer mon robot tondeuse sous arduino. La partie déplacement est presque fini et paraît être assez stable!
Je suis entrain de préparer la partie coupe, pour cela je vais utiliser 3 disques de coupe propulsé par 3 moteur brushless.

Ma première volonté est d'asservir chaque moteur afin que le moteur regul sa vitesse en fonction du bourage de l'herbe et qu'il soit capable de relancer le moteur en cas de calage du brushless. Pour cela il faut compter le nombre de tour minutes etc...

Mais je problème est là: si je créer un objet pour compter la vitesse moteur pendant, ex: 500ms, le programme ne va faire que cela pendant ce temps là, et si un obstacle surgit devant, il ne le verra pas puisse qu'il ne vérifie pas les sonars, il compte la vitesse du brushless! Et cela X3, car 3 moteurs! J'ai peur que le robot n'ai trop de temps de latence!

Deuxième volonté si je n'arrive pas à faire la première! : pour éviter de compter le nombre de tour pour en déduire une vitesse, il faudrait juste savoir si le moteur tourne, afin de le relancer si calage. J'ai bien pensé à un capteur à effet hall, mais est ce que le champ magnétique d'un moteur varie significativement quand il tourne pour être détecté par le capteur? La solution du capteur de courant est trop cher! Car 3 moteurs à équiper!

Comment faire en sorte que mon programme ne soit pas ralentit par des delay pour qu'il est le temps de compter!?

Merci d'avance pour toutes vos idées!

;-)

...................................................

Mon premier projet arduino...

Blog de ma Tondeuse RC...

...................................................


#2 hmnrobots

hmnrobots

    Membre passionné

  • Membres
  • PipPipPip
  • 316 messages
  • Gender:Male
  • Location:Périphérie Nantes

Posté 25 février 2013 - 11:00

Bonjour, après pas mal de creusage de tête je viens vous donner ma langue au chat!

J'ai un problème! Lol

Je suis toujours entrain de préparer mon robot tondeuse sous arduino. La partie déplacement est presque fini et paraît être assez stable!
Je suis entrain de préparer la partie coupe, pour cela je vais utiliser 3 disques de coupe propulsé par 3 moteur brushless.

Ma première volonté est d'asservir chaque moteur afin que le moteur regul sa vitesse en fonction du bourage de l'herbe et qu'il soit capable de relancer le moteur en cas de calage du brushless. Pour cela il faut compter le nombre de tour minutes etc...

Mais je problème est là: si je créer un objet pour compter la vitesse moteur pendant, ex: 500ms, le programme ne va faire que cela pendant ce temps là, et si un obstacle surgit devant, il ne le verra pas puisse qu'il ne vérifie pas les sonars, il compte la vitesse du brushless! Et cela X3, car 3 moteurs! J'ai peur que le robot n'ai trop de temps de latence!

Deuxième volonté si je n'arrive pas à faire la première! : pour éviter de compter le nombre de tour pour en déduire une vitesse, il faudrait juste savoir si le moteur tourne, afin de le relancer si calage. J'ai bien pensé à un capteur à effet hall, mais est ce que le champ magnétique d'un moteur varie significativement quand il tourne pour être détecté par le capteur? La solution du capteur de courant est trop cher! Car 3 moteurs à équiper!

Comment faire en sorte que mon programme ne soit pas ralentit par des delay pour qu'il est le temps de compter!?

Merci d'avance pour toutes vos idées!

;-)

Sur le même projet mais toujours en train d'essayer de l'améliorer;
Pour ma part je n'utilise pas l'Arduino mais un PIC avec un RTOS (noyau temps réel de CCS sommaire et non préemptif) et aussi et surtout les interruptions : lorsqu'un obstacle arrive il faut le prendre en compte immédiatement.Je ne sais pas si la gestion des interruptions est dispo sous arduino.
Pour le moteur de coupe, il n'est toujours pas régulé en vitesse, je ne fais (encore) que mesurer le courant absorbé afin de détecter un bourrage.Je pense ajouter bientôt un asservissement de vitesse mais qui sera confié à un autre petit PIC (629) qui recevra ses ordres par I2C; Dans mon cas l'unité centrale ne peut pas tout faire.
Souvent la solution pour les asservissement de vitesse c'est d'envoyer le capteur de vitesse dans une entrée compteur, lequel compteur sera géré par interruption au dépassement ou lu à intervalles réguliers.Traiter ne serait ce qu'une interruption par tours à 3000 RPM monopoliserait beaucoup l'UC.
Pour conclure je dirais recherche de gestion et utilisation des compteurs sous arduino et gestion des interruptions à moins qu'un RTOS préemptif n'existe (lequel fonctionnera d'ailleurs par interruptions).

je viens de voir que la gestion des interruptions est possible sous arduino: par ex


La solution du capteur de courant est trop cher! Car 3 moteurs à équiper!

le capteur c'est une résistance de 0.1ohm ,1 switch 4066 pour choisir la voie et 1 aop ad626

Modifié par hmnrobots, 25 février 2013 - 11:07 .

Faire simple, c'est déjà bien assez compliqué!
http://hmnrobots.blogspot.fr/

#3 ChristianR

ChristianR

    Membre passionné

  • Membres
  • PipPipPip
  • 474 messages
  • Gender:Male
  • Location:Isère (38)

Posté 25 février 2013 - 02:04

Les capteurs Hall fonctionnent très bien pour mesurer la vitesse de rotation d'un moteur, on s'en sert par exemple pour caler précisément les phases de moteurs brushless triphasés. (Ou sur des compteurs de vitesse de vélos avec un aimant sur la jante).

On les monte soit dans le moteur (à démonter), soit sur l'extérieur du moteur. Il y a une face sensible au champ magnétique, tester leur position et orientation avant de les coller.

Il est tout à fait possible de mesurer la vitesse du moteur tout en restant vigilant sur les obstacles devant le robot.
Il ne faut pas faire une boucle "bloquante" qui ne fait que chronométrer la vitesse, sinon ça fait un temps mort dans l'exécution du reste du programme qui sera "aveugle" pendant ce temps.

L'arduino est capable de mesurer une durée d'impulsion avec PulseIn :
http://arduino.cc/en/Reference/PulseIn

L'utilisation de la fonction millis() permet d'éviter la fonction delay() ou d'autres fonctions bloquantes, qui sont à éviter d'une manière générale en robotique.

Voir cet exemple http://arduino.cc/en/Tutorial/BlinkWithoutDelay

Tu crées une variable qui mémorise millis() au moment de l'entrée de la boucle principale, et au passage suivant tu calcule le temps écoulé par différence, d'où la vitesse de rotation.

Arduino gère les interruptions heureusement.
Christian

#4 hmnrobots

hmnrobots

    Membre passionné

  • Membres
  • PipPipPip
  • 316 messages
  • Gender:Male
  • Location:Périphérie Nantes

Posté 25 février 2013 - 03:33

bien cette fonction millis(); il y a donc une horloge temps réel incluse dans l'arduino; c'est donc bien plus simple en effet de proscrire l'utilisation de delay
Faire simple, c'est déjà bien assez compliqué!
http://hmnrobots.blogspot.fr/

#5 ChristianR

ChristianR

    Membre passionné

  • Membres
  • PipPipPip
  • 474 messages
  • Gender:Male
  • Location:Isère (38)

Posté 25 février 2013 - 06:33

Ce n'est pas exactement une horloge temps réel, car à chaque réinitialisation ça repart à 0.
On ne connait pas la date et l'heure (si on en a besoin, ajouter un module horloge temps réel DS1302 avec sa pile bouton), mais le nombre de millisecondes écoulées depuis le dernier redémarrage.
Christian

#6 hmnrobots

hmnrobots

    Membre passionné

  • Membres
  • PipPipPip
  • 316 messages
  • Gender:Male
  • Location:Périphérie Nantes

Posté 25 février 2013 - 10:32

Tu crées une variable qui mémorise millis() au moment de l'entrée de la boucle principale, et au passage suivant tu calcule le temps écoulé par différence, d'où la vitesse de rotation.

il faut quand même bien alors compter les impulsions ?
Faire simple, c'est déjà bien assez compliqué!
http://hmnrobots.blogspot.fr/

#7 ChristianR

ChristianR

    Membre passionné

  • Membres
  • PipPipPip
  • 474 messages
  • Gender:Male
  • Location:Isère (38)

Posté 25 février 2013 - 11:27

Oui tu comptes toutes les impulsions, mais en utilisant une interruption Arduino qui dure très peu de temps à chaque pulse, le reste du temps le programme est disponible pour faire autre chose.

Exemple de code ici http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.ArduinoInitiationEntreesOnOffOptoFourcheCompteTourTerminal
Christian

#8 hmnrobots

hmnrobots

    Membre passionné

  • Membres
  • PipPipPip
  • 316 messages
  • Gender:Male
  • Location:Périphérie Nantes

Posté 26 février 2013 - 11:14

Exemple de code ici http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.ArduinoInitiationEntreesOnOffOptoFourcheCompteTourTerminal

C'est vrai que l'arduino facilite quand même beaucoup les choses même par rapport à un compilateur comme CCS
Faire simple, c'est déjà bien assez compliqué!
http://hmnrobots.blogspot.fr/

#9 bennurre

bennurre

    Habitué

  • Membres
  • PipPip
  • 160 messages
  • Gender:Male

Posté 26 février 2013 - 02:30

Un grand merci pour toutes vos réponse, je vois que vous êtes des pros! Et du coup j'y vois beaucoup plus clair!
L'exemple que vous me donnez est très clair et me convient bien! J'ai surtout tout compris!

J'avais été voir des truc sur : http://arduino.cc/fr/Main/PulseIn mais c'est unpeu incompatible avec ma vitesse de rotation etc...

Je viens de brancher mon brushless sur l'arduino pour faire les tests, et il faut que je mette la main sur un capteur effet hall!

Sur votre exemple, la technique pour compter pendant une certaine durée est bien plus pratique que l'utilisation du delay!

Merci encore pour vos infos!

...................................................

Mon premier projet arduino...

Blog de ma Tondeuse RC...

...................................................


#10 hmnrobots

hmnrobots

    Membre passionné

  • Membres
  • PipPipPip
  • 316 messages
  • Gender:Male
  • Location:Périphérie Nantes

Posté 01 mars 2013 - 09:09

L'herbe pousse ,la tondeuse va bientôt être nécessaire. Voila ma version 6
Il faut encore que je monte le retour base et que j'ajoute l'asservissement de vitesse qui lui nest pas encore fait!.
Faire simple, c'est déjà bien assez compliqué!
http://hmnrobots.blogspot.fr/




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

0 members, 0 guests, 0 anonymous users