Go Down

Topic: Microcontrôleur atmega328 et servomoteur (Read 1 time) previous topic - next topic

_Youn_

Bonjour,

Malgré mes recherches sur internet, je ne trouve pas de solution à mes problèmes, j'aurais donc besoin de vos conseils.
J'utilise l'arduino uno et j'ai réussi à graver un programme sur un atmega328 (différent de celui qui est présent sur l'arduino), et de le rendre indépendant sur une breadboard à l'aide d'un quartz (16MHz) et de condensateurs (22 pF). Et tout fonctionne très bien. Enfin presque... Lorsque j'y ai gravé un programme faisant appel à la bibliothèque Servo de l'IDE Arduino (comme par exemple le sketch Sweep, exemple faisant partie de cette bibliothèque (ce sketch fait simplement tourner le servomoteur dans un sens puis dans l'autre)), le servomoteur ne répond pas comme souhaité. Il se déplace simplement vers la gauche (vers les 180°) par saccades, et ce jusqu'à ce qu'il atteigne l'angle maximum (180°)... J'ai alors gravé le même programme sur d'autres microcontrôleurs atmega328 et le résultat est le même. J'ai donc gravé ce programme sur le microcontrôleur de l'arduino, enlevé celui-ci de l'arduino, et j'ai remplacé le microcontrôleur qui "dysfonctionne" par ce dernier. Le sketch s'exécute alors parfaitement... Avez-vous une idée de l'origine de ce dysfonctionnement ? Je tiens à préciser que tout les autres sketches que j'ai téléversés sur les microcontrôleurs "dysfonctionnants" fonctionnent correctement.

Dans l'attente de votre réponse,

Cordialement

68tjs

Comment est alimenté le servo ?
Il est probable que l'alim de tes montages ne soit pas assez puissante.

_Youn_

Bonjour,

Le servo est branché sur une sortie analogique PWM du microcontrôleur ainsi que sur une sortie +5V pour l'alimentation (et GND bien sûr). J'ai émis cette hypothèse moi aussi mais comme le montage fonctionne correctement avec le microcontrôleur de l'arduino uno, sans changer l'alimentation, je l'ai écartée... Serait-il possible que les microcontrôleurs ne soient pas adaptées ? Cela me semble quand même peu probable... Mais alors d'où peu provenir cette erreur ?

Cordialement

68tjs

On ne reprend jamais l'alimentation d'un moteur sur la carte microcontroleur.
Le moteur est un composant qui génère trop de parasites et qui consomme trop de courant.

pilote

+1 avec 68tjs
J'ai eu le même probleme et tout est rentré dans l'ordre en alimentant le servo avec une petite alim externe.
J'ai même essayé hier avec une batterie et le servo fonctionne nickel.
La batterie alimente un NRF24l01+ avec un micro moteur et le servo.
La carte est alimentée par une petite Alim 9v branchée sur le shield breadboard.
On peut aussi tout alimenter par le shield.


68tjs

C'est rassurant de voir un câblage où les fils sont bien alignés, bien répartis et bien immobilisés.
C'est aussi beaucoup d'ennuis évités.

fdufnews

Bonjour,

j'ai réussi à graver un programme sur un atmega328 (différent de celui qui est présent sur l'arduino), et de le rendre indépendant sur une breadboard à l'aide d'un quartz (16MHz) et de condensateurs (22 pF). Et tout fonctionne très bien. Enfin presque...
Est-ce que tu as bien programmé les fusibles de cet ATmega328?
Est-ce que blink clignote bien à 1Hz sur cet ATmega328?

_Youn_

Bonjour,

Merci à tous de vos réponses et des hypothèses que vous avez émis. J'ai vérifié mais il ne semble pas que l'alimentation soit en cause dans ces montages, sinon le sketch ne s'exécuterait pas correctement non plus avec le microcontrôleur de l'arduino uno... J'ai quand même vérifié en utilisant deux alimentations +5V différentes, une pour l'atmega et une pour le servo (tensions stables et suffisantes) , et en utilisant d'autres microcontrôleurs que celui de l'arduino (toujours avec le sketch Sweep), le servo tourne d'au moins +15-20° (vers les 180°) puis reste immobile... Est-ce un progrès ? Et pour répondre à fdufnews, tout les autres sketches que j'ai testé jusqu'à présent (dont Blink) sur les microcontrôleurs fonctionnent correctement. Par contre, qu'appelles-tu les fusibles des microcontrôleurs ?

Cordialement

fdufnews

#8
Jun 07, 2016, 01:26 pm Last Edit: Jun 07, 2016, 01:28 pm by fdufnews
Par défaut, un microcontrôleur vierge utilise une horloge interne et non le quartz.
Lors de la phase de programmation du bootloader il faut modifier certaines zones dans l'ATmega (les "fusibles") pour lui dire d'utiliser la quartz pour l'horloge. L'un des effets liés à cet oubli est une mauvaise fréquence d'horloge qui fait que la LED de blink ne clignote pas à 1Hz mais plus lentement et que les programmes s'exécutent plus lentement aussi mais ce n'est pas toujours aussi visible que le clignotement de la LED.

_Youn_

D'accord, merci pour tes indications. Connais-tu les modifications à apporter au bootloader pour "forcer" l'usage du quartz ? Même si je ne pense pas que ce soit cela le problème qui cause le mauvais fonctionnement du servo, ça ne coûte rien d'essayer.

kamill

Bonjour,

Avec quoi est ce que tu as programmé ton atmega? Est ce que tu as programmé le bootloader?
Les fuses ne sont pas dans le bootloader, mais sont programmés indépendamment.
La confusion vient du fait qu'avec l'ide arduino quand on fait 'graver la séquence d'initialisation', il programme à la fois les fuses et le bootloader.

68tjs

#11
Jun 07, 2016, 02:44 pm Last Edit: Jun 07, 2016, 02:53 pm by 68tjs
Quote
Même si je ne pense pas que ce soit cela le problème qui cause le mauvais fonctionnement du servo
il faut se méfier des fausses évidences !

Avec un 328p la bibliothèque Servo utilise le timer 1 (cf --> Servo.cpp et Servo.h)
Si l'horloge système n'est pas à 16 MHz mais à 8 MHz tous les temps pour commander les Servos sont faux.

_Youn_

J'ai programmé mes microcontrôleurs en utilisant l'arduino uno comme programmateur (Arduino as ISP), et oui j'ai bien pensé à programmer le bootloader avant de commencer à téléverser d'autres sketches. Comme dit auparavant j'utilise bien un quartz 16MHz (avec des condensateurs 22pF et une alimentation continue de +5V), ce n'est donc pas le quartz qui pose problème...

kamill

#13
Jun 07, 2016, 03:27 pm Last Edit: Jun 07, 2016, 03:29 pm by kamill
Ce n'est pas parce qu'il y a un quartz qu'il est utilisé.
Mais si tu as gravé la séquence d'initialisation avec l'ide en sélectionnant arduino uno, les fuses sont programmés pour un oscillateur quartz à 16 MHz

_Youn_

Les fusibles sont donc bien programmés, merci kamill. Et aurais-tu une idée de la source du dysfonctionnement du servo ?

Go Up