Hexapode avec Arduino Mega 2650

Bonjour @toutes et @tous :slight_smile:

Voilà je vous écris car cela fait plus de 4ans que je bosse sur un projet assez simple : un hexapode à 12 servos (2 par pattes)
le seul hic c'est que je suis un débutant en programmation....

Au début je me suis essayer sur un µc ATMega avec programmateur en langage C, mais impossible de créer les différents signaux PWM pour chaque servos, donc j'ai rangé mon projet.

Depuis peu j'utilise la carte Arduino Mega 2650. (moins d'un mois)
Grâce à la bibliothèque servo.h, j'ai pu faire bouger 2 servos en moins de 10 min de programmation ^^/

j'ai donc programmer mes différentes phases de marches de mon robot,
en utilisant des fonctions utilisateurs ( void fonction (void) )

En lançant mon programme pour faire un test :
tous mes servos se sont mis à trembler de façon désordonner :cry:

Après avoir fait plusieurs test, je peux contrôler 4 pattes (8 servos) sans problèmes mais pas plus.. :cry:

Je précise ma conception technique :

  • Alimentation 220/4,5V pour la puissance des servos
  • Alimentation via le cable usb pour la carte Arduino
  • 12 servos FUTABA S3003
  • (GND carte arduino relié au GND puissance servo)
  • squelette robot tout en balsa (ultra léger)

Voici mon programme : -> http://www.files-save.com/fr/download-2d71a76389ab32311bf69c02a1649d39.html
(pas assez de place pour le mettre :cry: )
je précise que dans la fonction loop(), je n'ai mis que 2 fonctions afin, bien sûr de voir si cela fonctionnait bien.

Merci pour toutes vos remarques et vos aides :slight_smile:
@plus

Magnifique projet ;)!

Aurais-tu une video du résultat à nous montrer et/ou éventuellement explicative :slight_smile: ?

Merci.
Joe.

Merci, :slight_smile:
pour l'instant j'ai pas de photos, dsl
pour des explications plus détaillées voilà :

sur l'arduino 2650 :

  • pour les signaux j'ai branché les servos 1 à 12 sur les broches PWM 2 à 13
  • l'alimentation des servos est branché sur une alimentation 4,5V 500mA
    entouré de 2 couple de condensateurs 100µF et 100nF.

Quand je lance mon programme, tous les servos tremblent et agissent à leurs guises... au lieu de respecter mon programme :cry:
=> Je voudrais savoir d'où peut venir ses interférences ??? :-/
Quelqu'un aurait une idée ? siouplay :wink: ?

Bonjour, avant tout bravo, je souhaite me lancer moi aussi (un jour) dans la création d'un hexapode, j'espère apprendre beaucoup de ton propre projet! (pour l'instant les finances me bloquent un peu, prévoir de 100 à 150? rien que pour les servos, + qq uns de rechange au cas où...)

J'ai lu le programme, je sais pas si il est optimisé au max mais y a une sacré quantité de données!
je comprends pas pourquoi tu fais ça:

//Robot se lève sur Neutre et reste plié
  for(posdepli = HAUT; posdepli <= NEUTRE; posdepli += 5)
  {
    HNB1.write(posdepli);
    HNB3.write(posdepli);
    HNB5.write(posdepli);
    HNB7.write(posdepli);
    HNB9.write(posdepli);
    HNB11.write(posdepli);
    delay(20);
  }

Au lieu de dire à tes servo d'aller directement à la position "neutre"?

Sinon niveau alim les servos ne disposent que de 500mA au total à se partager? Creuser à ce niveau peut être, 500 mA ça me parait léger, et niveau tension ils sont légèrement sous alimentés (une rapide recherche me donne 4.8/6V), c'est peut etre problématique aussi?

EDIT: http://www.planete-sciences.org/robot/boiteabots/components/com_mambowiki/index.php/Servo-moteurs
"Quand il force, il peut consommer facilement jusqu'à 600mA."
travailles sur l'alimentation, pourquoi pas utiliser http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1288890821?

l'alimentation des servos est branché sur une alimentation 4,5V 500mA

Je doute que 500mA soient suffisants pour alimenter une douzaine de servos. Personnellement je viserais plutôt les 5V et 4A minimum.

@MrAlexis44600 : Merci :slight_smile:
mon petit bout de programme est simple :
quand mon robot est complètement arrêté, il est replié sur lui-même (les pattes contres lui et posé au sol)
donc la boucle For consiste à le faire monter en position NEUTRE ( servo à 90° soit à mi-hauteur) en incrémentant petit à petit, afin de ne pas trop forcer sur les servos.
(car il va devoir lever entièrement son poid d'un coup, et si je dis à mes servo d'aller directement de HAUT à NEUTRE alors ils vont essayer d'y aller d'un coup et tirer un max de jus :o)
Mais effectivement j'aurais pu mettre d'aller de HAUT à NEUTRE directement. ton raisonnement est juste :slight_smile:
et puis je voulais aussi faire un effet de style " il se lève doucement " comme si " il se réveillait " -> IT'S ALIVE !!!! ALIVE !!!!! ;D

@MrAlexis44600 et @fdufnews : Merci pour vos conseils concernant les alims, je vais tester cela cet aprèm (je vais devoir démonter mon pc, c'est ma mère qui va gueuler ;D )

et je vous tiendrais au courant, avec photos si j'arrive à les mettre :wink:

p.s : comment faites vous pour insérer du code "encadré" ? :-?

@MrAlexis44600 et @fdufnews : Merci pour vos conseils concernant les alims, je vais tester cela cet aprèm (je vais devoir démonter mon pc, c'est ma mère qui va gueuler Grin )

Pourquoi démonter le PC pour l'alimentation de puissance?

p.s : comment faites vous pour insérer du code "encadré" ?

Il faut cliquer sur l'icône avec un dièse et insérer le code entre les balises.

MERCI pour vos conseils, avec une alim de pc, mes servos ne tremblent plus ^^/

fdufnews : Pourquoi démonter le PC pour l'alimentation de puissance?

parce que j'en ai un vieux sous le coude

Voilà quelques photos :
Mon hexapode dans sa boite : :sunglasses:

Tous les servos alignés pour les tests d'alimentation : :stuck_out_tongue:

je vais modifier les pattes de mon robot, et améliorer mon code :wink:
Pour ceux qui ont des questions n'hésitez pas :wink: je ne mord pas ;D

Bonjour @toutes et @tous :),

j'ai une petite question sur mon arduino :-/ :
il peut générer 14 signaux PWM (port n° 13 à 0 : avec 1 = TX0 et 0 = RX0 )
Cependant y aurait-il un moyen afin de lui faire générer 4 signaux PWM supplémentaire ? (pour pouvoir commander 18 servos :wink: )

Désolé si cette question est toute conne, mais je débute :wink:
Merci d'avance pour vos réponses

p.s : je vous tiens au courant de l'évolution de mon robot. :wink:

Je pilote mes servos sur des ports digitaux, qui ne sont pas forcements PWM. Avec une Mega ça t'ouvre pas mal de perspectives :wink:
Il faut bien différencier la fonction PWM apportée par Arduino et la modulation de rapport cyclique que tu peux faire manuellement sur tous les autres ports.

Merci pour ta réponse :slight_smile:

Tu veux dire, que je peux faire un signal "PWM" sur les ports digitaux en faisant moduler un signal avec de timers ?

cela me rappel de mauvais souvenir :-/ c'est ce que j'essayer de programmer sur mon ATmega8 et que j'ai jamais réussi à faire :cry:
(avec 2 timers et variation du signal sur chaque port toutes les 20ms... )

il y aurait moyen d'avoir un petit aiguillage de ta part ? stp :wink:
@plus

Pour ton besoins c'est normalement la librairie Servo qu'il faut que tu utilises, as-tu refais un essai, ça avais l'air de bugger au début ?

Dans ta boucle de 'levé en douceur" , il faut que tu mettes une tempo de plus de 100ms entre les "pas", avec 20ms tu vas aussi vite que le rafraichissement des servos.

N'oublie pas que les servos sont fait pour le modélisme, et en modélisme on alimente avec des batteries qui peuvent sortir en pointe de 5 à 120A ...
Tu devrais faire tes essaies avec une batterie de modélisme, tu aurais surement moins de problèmes ...

A+ Teiva


www.Zartronic.fr : Robots & Arduino

Je suis d'accord pour la batterie, si je devait compter le nombre de fois où je me suis arraché les cheveux lorsque mon montage ne fonctionnait pas alors que ça venait de l'alimentation...
Pour piloter les servos, la librairie servo est la mieux. après à mon IUT on utilisait l'outil PulseOut(pin,délai) qui fasait ceci:
mettre à l'état 1 le pin
attendre le délai
mettre à 0

il fallait donc ensuite compléter avec des tempos... un peu lourd comparé à la librairie servo toute faite!

je te la donne si tu veux t'en servir: ajoute ça au début de ton programme:

#define PulseOut(pin, us) digitalWrite(pin, HIGH); delayMicroseconds(us); digitalWrite(pin, LOW)

puis tu l'utilises comme cela:

PulseOut(BrocheServoGauche, ZeroServoGauche);

(ZeroServoGauche est un temps, pour lequel mon servo à rotation continue ne bougeait pas du tout)

mais perso je n'utilise plus que la librairie servo, bien plus pratique.

Et tu peux utiliser la librairie servo sur des ports digitaux non? (je veux dire "non-pwm") c'est ce que je fais sur ma duelaminove....
Du coup tu peux commander énormément de servo (voir le détail de la librairie: Servo - Arduino Reference => 48 servos!)

@Teiva, @MrAlexis44600 : Merci pour vos réponses :slight_smile:
@Teiva :
pour mes tests j'utilisais une alim 220V, mais qui n'était pas assez puissante mais avec une alim de pc tous va bien :slight_smile:

Pour info : Avec l'ampèremètre j'ai mesuré un pic de 1,4A (de qqles sec ) lorsque tous les servos bougent ensemble
Tant que je n'ai pas finis mon robot je n'utilises pas de batteries mais sinon j'en ai 3 de 800mAh mais il faut que je les chargent... :slight_smile:

@MrAlexis44600 :
La librairie "servo.h" peut diriger jusqu'à 48 servos O_o Wahou !!! :o
(merci pour le lien j'avais pas vu )
Je vais pouvoir m'éclater ^^/
j'essaye ça pendant les vacances et je vous tiens au courant.

Encore MERCI :wink:

Oui, je pense qu'avec 48 servos tu as de la marge... perso je suis en train de me faire un bras robotisé, équipé d'une pince, vu que je vois que tu as l'air de te débrouiller dans le travail du bois, ça pourrait peut être t'intéresser? si tu as des servomoteurs en rab', même pas très puissants... Je te montre mon résultat :ici
j'ai encore pas mal de calibration à faire, je me suis inspiré d'un tuto du site LetsMakeRobots.

@MrAlexis44600 : pas mal ton idée :slight_smile:
pour l'instant je me consacre à mon hexapode, mais pourquoi pas d'ici quelques temps : une pince ou des bras... ::slight_smile:
mais la priorité est la marche et son intelligence ( bah oui il faut qu'il soit autonome, sinon c'est c** si il se prend les portes ;D :wink: )
si tu veux de l'aide pour faire de plan ou si tu as des questions sur " le bois" et la découpe, n'hésites pas :wink:
@plus :slight_smile:

bonjour,
j'aurais une question piflechien54,
tu dit mettre des condensateur, si j'ai bien compris ce sont des filtres.
Moi j'ai une alim de 5V et 2A et j'aurais aimé savoir comment choisis tes condo et comment tu l'ai place.
Merci.

@JulienR2D2 :
Salut :slight_smile:
alors j'ai piqué cette idée de filtre dans ce bouquin : http://microbot.free.fr/index.html

car c'était ce qui se rapprochait le plus de mon projet :wink:

donc l'idée c'est de mettre 2 paires de condo :

  • C1 : 100µF/25V
    et
  • C2 : 100nF
    de chaque "cotés" des connecteurs des servos... :-/ t'es perdu, non ? ;D

pour info : il utilise une alim 6v 1450 mA/H donc les condo devraient correspondre pour ton alim.

Regarde sur cette photo:

Cela donne ceci en branchement (désolé pour le schéma, j'avais pas trop de temps :wink: )

J'espère avoir répondu à ta question :wink:
Je remercie Mr Yann LEIDWANGER pour son bouquin et son aide :slight_smile:

Si tu as d'autres question, n'hésites pas ::slight_smile:
@plus

Les condensateur servent à compenser les pics de consommation lorsque les servos sont sollicités.
C'est un problème connu en modélisme, lorsque les servos et le récépteur sont sur la même source, cela peut aller jusqu'à la coupure momentanée du récepteur, un condensateur sur l'alimentation des servos permet de palier à ce problème.

The storage capacitor can be plugged into any vacant servo socket at the receiver, and eliminates voltage spikes which could cause interference to the receiver. High-performance digital servos generate extremely high peak voltages under load, which may damage the receiver or have an adverse effect on the receiver's micro-controller under certain circumstances. Receivers and servos are fitted with reservoir capacitors, but they are often too small to filter out these unwanted voltages. The storage capacitor effectively protects the receiver and servos from severe voltage spikes. Brief collapses in voltage are also effectively bridged by the capacitor. The storage capacitor is a sensible precaution for any airborne system, as it enhances the security of thereceiving equipment. It is recommended for use with receiver batteries as well as with electronic receiver power supplies. The storage capacitor is particularly helpful with 2.4 GHz receivers, but is also a useful adjunct to conventional receivers.

@Jean-François : Merci pour ta précision :wink:

Pour info : j'ai complètement modifier les pattes de mon hexapode.
dès que je suis sûr de moi, je mettrais des photos.
Et dès qu'il marche, je mettrais le code et une vidéo.
Voilà
Bonne année @toutes et @tous :slight_smile: