Aller au contenu


Photo
- - - - -

UGV à base d'éléments de trottinette ou d'hoverboard


411 réponses à ce sujet

#301 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 932 messages
  • Gender:Male

Posté 19 mars 2023 - 08:42

Me revoilà, après une longue absence.

Je découvre vos réalisations.

Magnifique !

 

Heureusement qu'il y en a qui bossent pour me payer ma retraite, au soleil.  :drinks:



#302 dakota99

dakota99

    Membre occasionnel

  • Membres
  • Pip
  • 242 messages
  • Gender:Male
  • Interests:programmation Windev, Webdev, aviation, robotique, domotique, drones

Posté 19 mars 2023 - 08:49

C'est super de pouvoir utiliser l'hoverboard tel quel avec carte et batterie. Je vais m'intéresser au firmware hoverboard hack FOC.

Ca va sûrement intéresser Oracid.

 

Et ton bras manipulateur tu vas l'interfacer comment avec le NUC ?



#303 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 932 messages
  • Gender:Male

Posté 19 mars 2023 - 09:01

Ca va sûrement intéresser Oracid.

Pas vraiment !

Je continue à penser que la solution, contrôleur d'e-Bike, a plus d'avenir que la carte mère, spécifique aux Hoverboard.

Mais cela ne m'empêche pas d'apprécier le bel ouvrage de Patrick, et du tien, également.



#304 pat92fr

pat92fr

    Membre passionné

  • Membres
  • PipPipPip
  • 749 messages
  • Gender:Male

Posté 19 mars 2023 - 09:06

Oracid réalise son 4x4 avec des contrôleurs e-Bike plus puissants. Je cherche à voir si la carte de puissance Hoverboard peut atteindre le niveau de puissance qu'il vise, et ce n'est pas sûr encore... à suivre !

 

Pour le bras, je démarre de "zéro" ou presque. Pour l'instant, ma principale contrainte est que l'installation du bras sur le robot soit la plus simple possible. Cela se traduit par :

- un demie douzaine de boulons pour la fixation du bras sur le toit du robot,

- un seul connecteur 4 broches "alimentation + liaison série" pour le raccordement électrique.

 

La batterie hoverboard va alimenter le bras (carte de contrôle, drivers pas à pas, moteurs et capteurs).

 

Exact, le NUC pilote la liaison série à destination de la carte de contrôle au bras, via un adaptateur USB/Serie. La carte de contrôle sera surement un Arduino ou équivalent, avec assez de GPIO pour piloter ENA/PULSE/DIR des 6 axes.

 

Le premier axe est un plateau tournant, qui sera donc fixé au toit du robot. Je veux que tous les moteurs soient dans le bras, ainsi que les drivers et la carte de contrôle. Je ne veux pas d' "armoire électrique" à coté ou sous le bras... challenge !

 

Me connaissant, le truc va peser 10kg au moins... et je ne saurais plus où le ranger chez moi. L'essentiel, c'est la réalisation !

 

Patrick.



#305 dakota99

dakota99

    Membre occasionnel

  • Membres
  • Pip
  • 242 messages
  • Gender:Male
  • Interests:programmation Windev, Webdev, aviation, robotique, domotique, drones

Posté 19 mars 2023 - 09:33

Ok l'intérêt des contrôleurs e-bike est donc la puissance...

Pour ma part je continue mon robot de nettoyage avec des moteurs DC car avec les moteurs d'hoverboard je n'arrive pas à stabiliser les trajectoires quand le terrain est en pente....

Mais le problème se pose quand même avec les moteurs DC : quand le robot est bien chargé avec un pulvérisateur plein et qu'il doit faire un demi-tour dans une pente, c'est pas évident. Il est quand même entraîné par son poids. Donc même dans ce cas il faut pouvoir maîtriser l'asservissement en vitesse. Ce qui n'est pas encore évident pour moi.

(J'utilise un smartphone Android et un Arduino Mega)

.

Le but du bras est de manipuler une charge de quel poids ?



#306 pat92fr

pat92fr

    Membre passionné

  • Membres
  • PipPipPip
  • 749 messages
  • Gender:Male

Posté 19 mars 2023 - 09:59

Le but du bras est de manipuler une charge de quel poids ?

 

Un ordre de grandeur 150 à 500g ! Je vais faire un thread dans la bonne catégorie... Voir : https://www.robot-ma...ase-hoverboard/



#307 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 932 messages
  • Gender:Male

Posté 19 mars 2023 - 02:14

Pour ma part je continue mon robot de nettoyage avec des moteurs DC car avec les moteurs d'hoverboard je n'arrive pas à stabiliser les trajectoires quand le terrain est en pente....

Ah, oui, désolé ! J'avais oublié que tu étais revenu au moteur DC. L'important pour toi, il me semble, c'est que tu réussisses à maitriser le parcours. Le reste n'est que détails.

 

Oui, les contrôleurs e-bike sont sans doute plus puissants. Il n'est qu'à voir comment un vélo à assistance électrique monte les pentes.

Il y a une belle pente, à coté de chez moi. Régulièrement, je vois un gars monter cette pente avec un mono roue. C'est très impressionnant !



#308 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 932 messages
  • Gender:Male

Posté 03 avril 2023 - 02:56

J'ai mis en œuvre le filtre RC proposé par Sandro, https://www.robot-maker.com/forum/topic/13733-ugv-a-base-delements-de-trottinette-ou-dhoverboard/?p=117746  avec R=470ohm et C=100uF

Je ne l'ai pas mis en œuvre sur le robot lui-même, mais sur ma base de test, ceci afin de tester plus facilement le PID, ultérieurement.

 

Le filtre est parfait, même avec la charge sont amplitude va de 0V à 4.75V, avec une ondulation triangulaire d'environ 0.5V.

Le moteur démarre à environ 1V, mais bizarrement, il décroche à environ 3.5V (tension, en bas de l'ondulation).

Il ne reste plus qu'à mettre en œuvre le PID. 

 

Voici le code, ultra simple.

Spoiler


#309 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 932 messages
  • Gender:Male

Posté 05 avril 2023 - 02:16

Sandro.

 

Dans la fonction ISR_Hz_Hall_L() que tu m'as proposée ici, https://www.robot-ma...board/?p=117884 j

je pense que la première ligne :  static long int prev_tick=micros();   devrait être:   static long int prev_tick;

 

Qu'en penses tu ?



#310 Sandro

Sandro

    Membre chevronné

  • Modérateur
  • PipPipPipPip
  • 1 312 messages
  • Gender:Male

Posté 05 avril 2023 - 02:56

Ce que tu mets après le égal, c'est la valeur avec laquelle prev_tick est initialisée au premier appel de la fonction. Si tu ne mets rien, alors c'est initializé à 0.

 

Si tu initialises à 0, tu vas obtenir une grande période à la première exécution. Si tu initialise à micros(), tu vas obtenir une toute petite période. Dans les deux cas, la première valeur que tu obtiendras sera non représentative.

 

Et dans les deux cas, il y a un danger de division par zéro qui peut te faire planter le programme :

- dans le cas de micros, si le programme est assez rapide pour que la valeur de micros n'ait pas changée (ce qui risque d'arriver, surtout que de mémoie la valeur de micros change par bonds de quelques (4?) microseccondes)

- dans le cas de zéro, si le premier appel a lieu un multiple de 2^32 microsecondes (ie un peu plus d'une heure) après le démarrage de l'arduino.

 

Du coup, je te propose de mettre micros()-N : de cette manière, tu ne risques pas la division par zéro. Avec N=1 si tu veux que la première fois tu mesures une période très courte, ou N grand (par exemple 600000000L (ie 10 minutes)) si tu veux mesurer une très longue période la première fois


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#311 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 10 081 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 05 avril 2023 - 03:30

Oui micros() fait des bons de 4 microsecondes 


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  

 

 

 


#312 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 932 messages
  • Gender:Male

Posté 05 avril 2023 - 08:22

prev_tick est initialisée au premier appel de la fonction. 

C'est pas mal le C, quand même !

Merci.



#313 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 932 messages
  • Gender:Male

Posté 07 avril 2023 - 04:16

Je suis encore en train de tester un moteur sur mon banc de tests.

 

Voici le résultat que j'obtiens.

 loop:  Throttle: 110  ISR: prev_tick 150976416 µs   new_tick 151009928 µs   Period: 33512 µs   HallSpeed Hz: 29.91
 loop:  Throttle: 110  ISR: prev_tick 151110376 µs   new_tick 151110376 µs   Period: 33476 µs   HallSpeed Hz: 29.80
 loop:  Throttle: 110  ISR: prev_tick 151210972 µs   new_tick 151244312 µs   Period: 33340 µs   HallSpeed Hz: 29.80
 loop:  Throttle: 110  ISR: prev_tick 151344952 µs   new_tick 151378684 µs   Period: 33344 µs   HallSpeed Hz: 29.99
 loop:  Throttle: 110  ISR: prev_tick 151478980 µs   new_tick 151478980 µs   Period: 33496 µs   HallSpeed Hz: 29.90
 loop:  Throttle: 110  ISR: prev_tick 151579492 µs   new_tick 151612940 µs   Period: 33464 µs   HallSpeed Hz: 29.83
 loop:  Throttle: 110  ISR: prev_tick 151713472 µs   new_tick 151746816 µs   Period: 33256 µs   HallSpeed Hz: 30.07
 
 
Il ne faut tenir compte que de Period et de HallSpeed. Le reste est souvent erroné, en raison de la vitesse des interruptions et des print qui ne sont pas en phases.
 
Si on considère la dernière ligne avec une période de 33256 µs, on a bien 1 000 000 / 33256 = 30,07Hz
Sur l'oscilloscope, avec un carreau à 5ms, j'ai bien une période de 6,5 carreaux, soit 6,5 x 5 = 32,5Hz
Jusqu'à là, c'est cohérent !
 
Le problème, c'est qu'avec deux tachymètres différents, braqués sur la roue, j'obtiens environ 120 RPM. Soit 2Hz !
 
Je ne comprends pas cette différence entre 30Hz et 2Hz !
J'ai compté le nombre de tours avec le minuteur de mon smartphone, il y a bien 120 tours par minute.
 

 



#314 Sandro

Sandro

    Membre chevronné

  • Modérateur
  • PipPipPipPip
  • 1 312 messages
  • Gender:Male

Posté 07 avril 2023 - 04:28

Je penses que c'est normal.

Dans le message https://www.robot-ma...788#entry117788 j'avais compté 15 périodes par tour.

 

Donc si tu veux le nombre de tours, et pas de 1/15 de tours, il faut divisier par 15 (soit dans l'ISR si tu veux avoir directement la période et fréquence par tour et en Hz), soit ensuite dans ton code


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#315 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 932 messages
  • Gender:Male

Posté 07 avril 2023 - 06:31

Super ! Merci Sandro.

 

J'en étais arrivé à la conclusion que je ne mesurais pas la même chose, et effectivement j'avais relevé ce rapport de 15, mais je n'avais fait le lien avec ton lien que j'avais déjà trouvé génial.

Du coup, j'ai une plus grande précision. Je me souviens que tu étais favorable à une plus grande précision.

Sur mon robot, ce ne sont pas les mêmes moteurs, mais avec mes vidéos, tu avais déjà constaté qu'il y avait 15 impulsions par tours.

 

Bon, et bien voilà un problème résolu. Je vais donc me mettre au codage du PID.  :dash2:

 

Merci encore, Sandro.



#316 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 932 messages
  • Gender:Male

Posté 10 avril 2023 - 11:36

Voici la version de mon programme avec PID.

Cela ne fonctionne pas, mais alors, pas du tout.

J'ai mis toutes les variables en Global pour pouvoir les utiliser dans la fonction Trace().
 
A mon avis, c'est la ligne suivante, dan la fonction P_I_D()  qui pose problème :
  pid_Speed = map((unsigned int)pid_Speed,0,max_Hz,0,max_PWM);                                        // convert pid_Speed from Hz to PWM

 

Le programme :

Spoiler
 
Voici un morceau de la trace:

 



 loop:  Throttle: 110  ISR: prev_tick 50323180 µs   new_tick 50323180 µs   Period: 32940 µs   HallSpeed Hz: 30.46  P_I_D:   pid_Speed: 13  pid: 6.00
 loop:  Throttle: 110  ISR: prev_tick 50487552 µs   new_tick 50487552 µs   Period: 32648 µs   HallSpeed Hz: 30.64  P_I_D:   pid_Speed: 13  pid: 6.00
 loop:  Throttle: 110  ISR: prev_tick 50618680 µs   new_tick 50651680 µs   Period: 32696 µs   HallSpeed Hz: 30.54  P_I_D:   pid_Speed: 13  pid: 6.00
 loop:  Throttle: 110  ISR: prev_tick 50782612 µs   new_tick 50815372 µs   Period: 32908 µs   HallSpeed Hz: 30.39  P_I_D:   pid_Speed: 13  pid: 6.00
 loop:  Throttle: 110  ISR: prev_tick 50946856 µs   new_tick 50979744 µs   Period: 32888 µs   HallSpeed Hz: 30.61  P_I_D:   pid_Speed: 13  pid: 6.00
 loop:  Throttle: 110  ISR: prev_tick 51110928 µs   new_tick 51143912 µs   Period: 32984 µs   HallSpeed Hz: 20833.33  P_I_D:   pid_Speed: 13  pid: 6.00
 loop:  Throttle: 110  ISR: prev_tick 51274872 µs   new_tick 51274872 µs   Period: 32728 µs   HallSpeed Hz: 30.35  P_I_D:   pid_Speed: 13  pid: 6.00
Operator Interrupt !!!
To start pgm, click on the Start button

 



#317 bubu17

bubu17

    Nouveau membre

  • Membres
  • 15 messages

Posté 10 avril 2023 - 09:06

depuis mon dernier message j'ai mis les moteurs d'un hoverboard de 10 pouces, la tondeuse passe mieux les difficultés du terrain.

j'ai aussi modifier le code pour lire la vitesse, je suis parti du code de madd ee et j'ai rajouter le pid.

en piéce-joint le code que j'utilise pour faire des essais avec un moteur fixer sur une table:

 

le pid réagit bien à l'effort, quant je freine la roue avec les mains,

 

à partir d'un certain effort le moteur décroche, à ce moment la lecture de la vitesse est erronée donc le moteur ralenti ou ce bloque!!!!

 

par contre quant j'entraine le moteur plus vite que la consigne , le moteur saccade et ne respecte pas la consigne.

Fichier(s) joint(s)



#318 bubu17

bubu17

    Nouveau membre

  • Membres
  • 15 messages

Posté 10 avril 2023 - 09:40

voici une copie du serial pour un essai rapide, le serial n'enregistre pas toute les lectures ,ce qui entraine les variations brutale d'une ligne sur l'autre.

 

sur les 2 premiéres lignes la vitesse est erroné, pwm = 0

 

lignes 3 à 6 sans effort , pwm = 11 à 13   pour une vitesse de 1,2 km/h

 

lignes 7à 16 je freine progressivement la roue, le pwm monte à 45

 

ligne 17 le moteur décroche

 

lignes 18 à 28 je fais tourner la roue plus vite que la consigne, pwm = 0, le moteur saccade

 

ligne 29 je relâche l'entrainement

 

lignes 30 à 32 le moteur revient à la vitesse de consigne

Fichier(s) joint(s)



#319 Sandro

Sandro

    Membre chevronné

  • Modérateur
  • PipPipPipPip
  • 1 312 messages
  • Gender:Male

Posté 10 avril 2023 - 09:41

Bonsoir,

je penses que ton erreur vient de la ligne suivante (dans la fonction PID) :

  err=prev_HallSpeed-HallSpeed;                                                                       // getting err

Si on prends cette ligne, l'erreur est nulle lorsque la vitesse est constante (peu importe la vitesse).

 

La formule normale pour un PID est

  err=target_HallSpeed-HallSpeed;                                                                       // getting err

donc l'erreur est nulle lorsque tu vas à la vitesse voulue (target_HallSpeed)

 

 

 

La ligne suivante me semble aussi erronée :

  p=Kp*err;  i=Ki*(i+err);  d=Kd*(err-lastErr);  pid=p+i+d;  lastErr=err;  pid_Speed=HallSpeed+pid;   // calculation of the PID

Pour l'intégrale, la formule est :

i = i + (Ki * err);

Et la vitesse, c'est directement la valeur du PID :

 pid_Speed=pid;

(ou tu peux juste utiliser une seule variable
 

 

 

 


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#320 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 932 messages
  • Gender:Male

Posté 11 avril 2023 - 06:43

Pour l'intégrale, la formule est :

i = i + (Ki * err);

Aïe ! Cela veut dire que le programme de ce robot n'est pas bon. https://www.robot-ma...ylens/?p=115607

 

Je vais tester tes corrections dans la foulée.

Merci Sandro.





Répondre à ce sujet



  


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

0 members, 2 guests, 0 anonymous users