Microcontrôleur atmega328 et servomoteur

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

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

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

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.

+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.

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.

Youn:
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?

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

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.

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.

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.

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.

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...

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

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

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

C'est sans doute vrai mais attention a ne pas faire de confusions comme il y en a trop chez Arduino.
Le réglage des FUSES et la gravure du BOOTLOADER n'ont strictement rien à voir entre eux.

Il semble que l'opération qu'Arduino appelle la gravure du boatloader règle aussi les fuses dans ton dos et sans te le dire.
Mais pour moi rien n'est assuré.

Pour le vérifier tu peux utiliser avrdude en ligne de commande (voir la doc, sous win il doit exister des applis graphiques) et lire les valeurs des fuses.
Pour connaître la bonne valeur il y a soit la datasheet du micro soit le site :
http://www.engbedded.com/fusecalc

Un 328p fuses non programmés tourne à 1 MHz

  1. oscillateur interne = 8 MHz
  2. diviseur par 8 activé en sortie usine