
Asservissement et temps de réaction du programme...
#1
Posté 25 février 2013 - 10:03
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
Posté 25 février 2013 - 11:00
Sur le même projet mais toujours en train d'essayer de l'améliorer;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!
;-)
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
le capteur c'est une résistance de 0.1ohm ,1 switch 4066 pour choisir la voie et 1 aop ad626La solution du capteur de courant est trop cher! Car 3 moteurs à équiper!
Modifié par hmnrobots, 25 février 2013 - 11:07 .
- bennurre aime ceci
http://hmnrobots.blogspot.fr/
#3
Posté 25 février 2013 - 02:04
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.
- bennurre aime ceci
#4
Posté 25 février 2013 - 03:33
http://hmnrobots.blogspot.fr/
#5
Posté 25 février 2013 - 06:33
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.
#6
Posté 25 février 2013 - 10:32
il faut quand même bien alors compter les impulsions ?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.
http://hmnrobots.blogspot.fr/
#7
Posté 25 février 2013 - 11:27
Exemple de code ici http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.ArduinoInitiationEntreesOnOffOptoFourcheCompteTourTerminal
- bennurre aime ceci
#8
Posté 26 février 2013 - 11:14
C'est vrai que l'arduino facilite quand même beaucoup les choses même par rapport à un compilateur comme CCSExemple de code ici http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.ArduinoInitiationEntreesOnOffOptoFourcheCompteTourTerminal
http://hmnrobots.blogspot.fr/
#9
Posté 26 février 2013 - 02:30
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
Posté 01 mars 2013 - 09:09
Il faut encore que je monte le retour base et que j'ajoute l'asservissement de vitesse qui lui nest pas encore fait!.
http://hmnrobots.blogspot.fr/
1 utilisateur(s) li(sen)t ce sujet
0 members, 1 guests, 0 anonymous users