IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Besoin d'aide, débutant en Arduino (TMC2209 et NEMA 17 en mode UART)


Sujet :

Arduino

  1. #1
    Invité de passage
    Homme Profil pro
    ingénieur chimiste
    Inscrit en
    Septembre 2025
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : ingénieur chimiste
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2025
    Messages : 4
    Par défaut Besoin d'aide, débutant en Arduino (TMC2209 et NEMA 17 en mode UART)
    Bonjour,
    nouveau dans le monde de la programmation je me présente : Alexis, ingénieur en chimie et passionné d'astronomie.
    J'ai construit mon premier télescope il y a un an et aujourd'hui je penche sur un nouveau projet : la fabrication d'une table équatoriale.
    Quel rapport avec la programmation et l'Arduino ? Et bien cette table est un support motorisé permettant de compenser la rotation de la Terre et de garder un objet immobile dans le champ de vision. Mon projet nécessite un moteur pas à pas pour de la précision et une vitesse très lente, et donc de le programmer.
    J'ai donc fait les courses et je dispose actuellement d'un NEMA 17 (avec reducteur 1:50), d'une carte arduino UNO, d'un driver TMC2209 v2 et d'une powerbank 12V pour l'alimentation. Et tout un tas de cables et accessoires divers...

    Je pars de zéro ou presque et donc je galère. Pour le moment je n'ai pas encore réussi à faire tourner mon moteur et j'ai déjà cramé une carte arduino.
    Mon gros souci est le suivant : comment câbler tout ce petit monde pour que ça fonctionne ? En particulier les liens entre arduino et driver, et comment alimenter l'arduino et le driver avec une seule source d'alimentation.
    J'ai fait quelques recherches et même interrogé une IA pour commencer à comprendre et à coder, mais beaucoup d'infos qui se contredisent et une masse d'infos que je ne maîtrise pas encore.
    J'ai lu en particulier qu'il valait mieux utiliser le mode UART pour dialoguer entre l'arduino et le driver, mais je n'ai pas compris comment faire précisément la liaison, et comment utiliser les bibliothèques TMCStepper pour rédiger mon code.

    Ce que je voudrais pour le moment : pouvoir tester mon moteur, le faire tourner avec un certain nombre de micropas et régler le courant, et si possible que le PC me renvoie des messages pour confirmer que les réglages sont bien pris en compte, en particulier les micropas dont j'ai absolument besoin.
    J'espère que cette bouteille à la mer trouvera une âme charitable et expérimentée qui pourra m'aider à avancer dans mon projet.
    Merci par avance.
    Alexis

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 599
    Par défaut
    pour commencer https://www.raspberryme.com/interfac...oogle_vignette
    Attention, ton moteur est en quelle tension?
    si ton powerbank délivre du 12V, il peut alimenter l'arduino via son connecteur Jack (il accepte entre 7V et 12V, attention à la polarité, le + est au milieu), si il délivre du 5V, il peut l'alimenter par le port USB ou par les PIn Vin et GND (maiis bien faire attention))
    De même selon la tension de ton moteur, si 5V tu peux essayer de l'alimenter via les sorties 5V et GND de la carte Arduino, ou avec régulateur de tension 5V par ton powerbank (si le moteur est en 12V tu peux l'alimenter directement par le powerbank); si c'est une autre tension, passer par un régulateur de la bonne tension.

    autre point de départ possible pour l'utilisation TMCStepper => https://forum.arduino.cc/t/tmcsteppe...c2209/956036/8

    PS: il y a une section dédié pour les question Arduino sur le forum https://www.developpez.net/forums/f2...arque/arduino/

  3. #3
    Invité de passage
    Homme Profil pro
    ingénieur chimiste
    Inscrit en
    Septembre 2025
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : ingénieur chimiste
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2025
    Messages : 4
    Par défaut
    Bonjour et merci infiniment pour cette première réponse !
    Merci pour le lien, j'atais déjà tombé dessus et effectivement il y a quelques infos intéressantes.

    Mon moteur est en 12V, j'ai donc besoin de l'alimenter directement avec la powerbank, via les pins GND et VM du driver si j'ai bien compris.
    J'ai aussi compris que le driver devait recevoir une tension logique de 5V : a priori j'obtiens ça en reliant les pins GND de l'arduino et du driver ensemble ainsi que les pins 5V et VIO.
    Enfin pour alimenter l'arduino j'ai cru comprendre que je pouvais utiliser le 12V de la powerbank et relier ça au GND et à l'entrée Vin de l'arduino, qui supporte 7 à 12V et converti ça en 5V.
    Est-ce que c'est OK pour l'instant pour la logique d'alimentation ?

    Pour la suite j'aimerais vraiment utiliser le mode UART pour faciliter les réglages du driver et avoir un retour via le moniteur série (du moins pour les tests pour vérifier une fois que le programme fonctionne et que les valeurs sont bien envoyées). Si j'ai bien compris je ne dois pas utiliser les pins 0 et 1 (TX et RX) qui sont réservés à la communication avec l'ordinateur. Je peux utiliser d'autres pins à la place grâce à la fonction SoftwareSerial. Dans ce cas j'ai besoin d'un fil reliant un pin de l'arduino au pin UART du driver pour la transmission par exemple et un second fil reliant un autre pin de l'arduino au pin PDN du driver pour la réception par exemple. Puis j'utilise SoftwareSerial TMCSerial(SERIAL_RX_PIN, SERIAL_TX_PIN) pour configurer les deux pins de l'arduino. Est-ce que ça vous parait correct ?
    Encore merci

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 599
    Par défaut
    pour la question sur l'UART, tu peux utiliser le Serial Monitor (je crois qu'il utilise les pins 1 et 0 justement) pour faire tes tests et même après si tu fais une application. Tu peux envoyer des commandes avec la fenêtre Serial Monitor de l'IDE Arduino

    en effet, contrairement à ce que j'ai indiqué Vin accepte la même tension que le Jack (7-12V), mais la carte peut être alimenté aussi directement par l'USB du PC, donc dans un 1er temps, tu n'es pas obligé d'y mettre ton powerbank.

  5. #5
    Invité de passage
    Homme Profil pro
    ingénieur chimiste
    Inscrit en
    Septembre 2025
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : ingénieur chimiste
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2025
    Messages : 4
    Par défaut
    Citation Envoyé par umfred Voir le message
    Tu peux envoyer des commandes avec la fenêtre Serial Monitor de l'IDE Arduino
    Merci. Ah je ne savais pas qu'on pouvait faire ça, je pensais que toutes les commandes étaient dans le code... Donc par exemple en réalisant mon montage avec l'arduino connecté à l'ordinateur (sans tension sur Vin du coup pour le moment) je peux modifier le nombre de pas ou le sens ? et demander un renvoi de la valeur ?

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 599
    Par défaut
    Il faut que tu le programmes, il n'y pas de magie.
    Tu peux te servir du Serial Monitor pour envoyer tes commandes, à toi d'écrire le programme qui lit et interprète ces commandes, et éventuellement renvoyer de l'info sur ce même port série.
    (quand je parlais d'une application c'était une application côté PC pour commander par le port série moniteur ton moteur (sans passer par l'IDE)

  7. #7
    Invité de passage
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2025
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Août 2025
    Messages : 3
    Par défaut
    Salut! Sur le TMC2209, les broches VM et GND sont l’alimentation moteur : ton powerbank 12 V s’y branche directement, tandis que la masse de l’Arduino doit être commune avec celle du driver. La broche VIO du TMC2209 doit recevoir une logique 5 V; tu la relies donc au 5 V de l’Arduino comme tu l’avais compris. Pour alimenter l’Arduino, tu peux utiliser le jack ou la broche Vin avec 7–12 V, mais attention, le régulateur interne chauffe ; un petit convertisseur buck 12 V→5 V externe donnera un meilleur rendement.

    Concernant l’UART : sur l’Uno, les pins 0/1 sont déjà utilisés pour l’USB. Il vaut mieux utiliser la librairie TMCStepper avec un port série logiciel. Tu connectes PDN/UART du driver à la broche Rx d’un SoftwareSerial et Tx du SoftwareSerial au pin DIAG du module si ton breakout le propose. Dans ton code, crée SoftwareSerial TMCSerial(rxPin, txPin) puis passe ce port à la classe TMC2209Stepper driver(&TMCSerial, EN_PIN, DIR_PIN, STEP_PIN, R_SENSE);. N’oublie pas d’appeler driver.begin(); driver.rms_current(800); driver.microsteps(16); pour initialiser le courant et les micro‑pas. Ainsi tu pourras envoyer des commandes via l’IDE et récupérer des infos comme le courant et l’état du moteur. L’astuce d’umfred est bonne : utilise le Serial Monitor pour dialoguer avec ton programme, tu peux envoyer des commandes et voir les réponses.

    En résumé : un schéma clair (VM/GND pour le moteur, VIO/5 V pour la logique, STEP/DIR vers deux pins digitales, UART via SoftwareSerial), une alimentation stable et un code qui écoute le port série

  8. #8
    Invité de passage
    Homme Profil pro
    ingénieur chimiste
    Inscrit en
    Septembre 2025
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : ingénieur chimiste
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2025
    Messages : 4
    Par défaut
    Merci pour toutes ces informations.
    Je note l'intérêt d'un convertisseur. Est-ce qu'un modèle comme celui-ci pourrait convenir : https://fr.aliexpress.com/item/10050...xoC13wQAvD_BwE ?
    La sortie du convertisseur toujours sur l'entrée Vin de l'arduino ?

    Pour l'instant j'ai réussi à faire fonctionner le mode UART en reliant deux pins de l'arduino au même pin UART du driver. C'est celui-ci : https://makerselectronics.com/produc...7hlmURGIln3okV. J'ai pu constater que ça fonctionnait de la même manière si j'utilise le pin PDN, les deux semblent pontés. Je n'ai pas de pin DIAG. Pour le moment j'arrive à récupérer la valeur du courant que je choisis mais en revanche quel que soit la valeur de microstep que je choisis je récupère toujours sur le moniteur la valeur 256 quand j'interroge le driver (voir la partie du code "test de connexion"). Je ne comprends pas pourquoi. Pourant les micropas sont bien mis à jour réélement, je le constate sur la vitesse du moteur.

    Le code que j'utilise pour le moment est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    #include <TMCStepper.h>
    #include <SoftwareSerial.h>
     
    // Définitions des broches
    #define SERIAL_TX_PIN 4
    #define SERIAL_RX_PIN 3
     
    #define EN_PIN 8
    #define DIR_PIN 5
    #define STEP_PIN 2
    #define BUTTON_PIN 7 // Broche pour le bouton-poussoir 1
    #define BUTTON2_PIN 6 // Broche pour le bouton-poussoir 2
    #define BUZZER_PIN 9 // Broche pour le buzzer passif
     
    // Initialisation de la communication série pour le driver
    SoftwareSerial TMCSerial(SERIAL_RX_PIN, SERIAL_TX_PIN);
     
    // Paramètres du driver
    #define R_SENSE 0.11f
    #define DRIVER_ADDRESS 0b00
    TMC2209Stepper driver(&TMCSerial, R_SENSE, DRIVER_ADDRESS);
     
    // Configuration du hachage
    const bool USE_STEALTHCHOP = true;
     
    // Variables pour la gestion des boutons et de l'état du moteur
    bool moteur_en_marche = false; // Le moteur est éteint au démarrage
    bool bouton1_actif = false;
    bool bouton2_actif = false;
     
    // Variables pour le sens et les micropas
    bool dir_forward = true;
    int microsteps = 0;
     
    // Variable pour le délai entre les pas du moteur
    unsigned int step_delay_micros = 1000;
     
    // Définition des notes de musique pour le buzzer
    #define NOTE_C4  262
    #define NOTE_D4  294
    #define NOTE_E4  330
    #define NOTE_G4  392
    #define NOTE_A4  440
     
    // Mélodie pour le bouton 1 (vitesse lente)
    int melodie1[] = {NOTE_E4, NOTE_G4, NOTE_A4};
    int durees1[] = {100, 100, 100};
     
    // Mélodie pour le bouton 2 (vitesse rapide)
    int melodie2[] = {NOTE_A4, NOTE_G4, NOTE_E4};
    int durees2[] = {100, 100, 100};
     
    // Fréquence et durée pour le bip d'arrêt
    const int bip_frequence = 800;
    const int bip_duree = 100;
     
    // Fonction pour jouer une mélodie
    void jouerMelodie(int notes[], int durees[], int taille) {
      for (int i = 0; i < taille; i++) {
        tone(BUZZER_PIN, notes[i], durees[i]);
        delay(durees[i] + 30); // Petit délai entre les notes
      }
      noTone(BUZZER_PIN);
    }
     
    // Fonction pour jouer un simple bip
    void jouerBip() {
      tone(BUZZER_PIN, bip_frequence, bip_duree);
      delay(bip_duree);
      noTone(BUZZER_PIN);
    }
     
    void setup() {
      Serial.begin(115200);
      Serial.println("Initialisation du driver TMC2209...");
      TMCSerial.begin(115200);
     
      // Configuration des broches
      pinMode(EN_PIN, OUTPUT);
      pinMode(DIR_PIN, OUTPUT);
      pinMode(STEP_PIN, OUTPUT);
      pinMode(BUZZER_PIN, OUTPUT);
      pinMode(BUTTON_PIN, INPUT_PULLUP); // Active la résistance de pull-up interne
      pinMode(BUTTON2_PIN, INPUT_PULLUP); // Active la résistance de pull-up interne pour le deuxième bouton
     
      // Démarrage du driver
      digitalWrite(EN_PIN, LOW);
      driver.begin();
      driver.toff(5);
      driver.rms_current(1100); // Réglage du courant
      driver.microsteps(microsteps);
     
      // Configuration du mode de hachage (StealthChop pour un fonctionnement silencieux)
      if (USE_STEALTHCHOP) {
        Serial.println("Activation du mode StealthChop");
        driver.en_spreadCycle(false);
        driver.pwm_autoscale(true);
      } else {
        Serial.println("Activation du mode SpreadCycle");
        driver.en_spreadCycle(true);
        driver.pwm_autoscale(false);
      }
     
      // Test de connexion
      if (driver.test_connection()) {
        Serial.println("Connexion reussie!");
        Serial.print("Courant RMS: ");
        Serial.print(driver.rms_current() / 1000.0);
        Serial.println(" A");
        Serial.print("Micro-pas: ");
        Serial.println(driver.microsteps());
      } else {
        Serial.println("Erreur de connexion!");
      }
    }
     
    void loop() {
      // Lecture des états des boutons
      int etat_bouton1 = digitalRead(BUTTON_PIN);
      int etat_bouton2 = digitalRead(BUTTON2_PIN);
     
      // Gère le premier bouton (sens par défaut, 0 micropas)
      if (etat_bouton1 == LOW && !bouton1_actif) {
        bouton1_actif = true;
        if (moteur_en_marche) {
          moteur_en_marche = false;
          Serial.println("Moteur arrete.");
          jouerBip();
        } else {
          moteur_en_marche = true;
          dir_forward = true;
          microsteps = 0;
          driver.microsteps(microsteps);
          Serial.print("Moteur en marche (sens direct, 0 micropas, delai ");
          Serial.print(step_delay_micros);
          Serial.println(" us).");
          jouerMelodie(melodie1, durees1, sizeof(melodie1) / sizeof(melodie1[0]));
        }
      }
      if (etat_bouton1 == HIGH) {
        bouton1_actif = false;
      }
     
      // Gère le deuxième bouton (sens inverse, 4 micropas)
      if (etat_bouton2 == LOW && !bouton2_actif) {
        bouton2_actif = true;
        if (moteur_en_marche) {
          moteur_en_marche = false;
          Serial.println("Moteur arrete.");
          jouerBip();
        } else {
          moteur_en_marche = true;
          dir_forward = false;
          microsteps = 4;
          driver.microsteps(microsteps);
          Serial.print("Moteur en marche (sens inverse, 4 micropas, delai ");
          Serial.print(step_delay_micros);
          Serial.println(" us).");
          jouerMelodie(melodie2, durees2, sizeof(melodie2) / sizeof(melodie2[0]));
        }
      }
      if (etat_bouton2 == HIGH) {
        bouton2_actif = false;
      }
     
      // Contrôle du moteur
      if (moteur_en_marche) {
        digitalWrite(EN_PIN, LOW);
        if (dir_forward) {
          digitalWrite(DIR_PIN, HIGH);
        } else {
          digitalWrite(DIR_PIN, LOW);
        }
        digitalWrite(STEP_PIN, HIGH);
        delayMicroseconds(step_delay_micros);
        digitalWrite(STEP_PIN, LOW);
        delayMicroseconds(step_delay_micros);
      } else {
        digitalWrite(EN_PIN, HIGH);
      }
    }
    Je ne sais pas si tout est bien codé mais ça fonctionne, à part le retour de la valeur des microsteps qui ne se met pas à jour.

    Dernière chose : je note bien qu'on peut envoyer des commandes via le port série. S'agit-il des mêmes instructions que celles qui sont écrites dans le code ?

    Encore merci pour votre aide, c'est super !

Discussions similaires

  1. Besoin d'aide pour programme Arduino ( projet étudiant )
    Par ArmandGuitton dans le forum Arduino
    Réponses: 4
    Dernier message: 04/06/2021, 22h54
  2. Besoin d'aide pour programme Arduino pour un TIPE
    Par ArmandGuitton dans le forum Arduino
    Réponses: 2
    Dernier message: 16/04/2021, 11h55
  3. Besoin d'aide pour donner un ordre Arduino
    Par Guldir dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 03/04/2018, 19h00
  4. besoin d'aide pour projet arduino
    Par arduinoguy123 dans le forum C++
    Réponses: 1
    Dernier message: 21/04/2017, 16h40
  5. Besoin d' Aide programation sur arduino Urgent
    Par Bourdrafik dans le forum C++
    Réponses: 0
    Dernier message: 07/06/2016, 10h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo