Le téléversement fait planter mon arduino micro

Bonjour,

Je travail sur un programme qui permet de faire tourner un moteur pas à pas, le cycle fait tourné le moteur d'abord dans un sens de 180° puis dans l'autre de 540° (de mémoire). Mes premiers test ce sont bien passé bien que le moteur fasse un léger sifflement. Je cherchais à régler le temps entre deux pas, lorsque j'ai fait une fausse manipulation. J'ai accidentellement éteint l'alimentation de mon PCB alors que je téléversais mon programme avec sa nouvelle valeur de tempo dans l'Arduino micro.
L'Arduino en question ne marchait plus après ça. Je ne pouvais plus le voir depuis mon pc et il ne semble plus y avoir de programme dessus. Malgré tout la LED bleu de l'Arduino est allumé pour signaler qu'il est alimenté. Lorsque j'appuie sur le bouton reset de l'Arduino la LED jaune à coter du logo Arduino clignote et l'Arduino redevient visible depuis mon ordinateur durant quelque instant.
J'ai par la suite voulu remplacer l'Arduino par un nouveau, mais celui-ci finit immédiatement dans le même état que le premier. Après beaucoup de test du PCB, j'ai fini par me rendre compte que le problème apparaissait dès que je charge le programme depuis mon pc. (Il n'y a pas d'erreur de compilation et aucun message d'erreur lors du chargement)

Le cable que j'utilise à également été utiliser par une autre personne pour charger un programme différent depuis son ordi est ne semble pas avoir de problème. Je pense donc que le problème vient soit de la sauvegarde du programme, soit de mon application Arduino, mais je ne trouve aucune documentation sur un problème similaire.

Je suis sur la version 2.2.1 de l'IDE et mon programme est le suivant :

/*
This program make a motor makes an initial left rotation of 120°
it then rotates 480° and returns to its starting position. The complete turn ensures that the flex is in place.
*/

/* setting pin numbers: */
const int DIR = 3 ;
const int STEP = 4 ;

const int MS0 = 5 ;         // MS1/2/3 allows you to change to hlaf step or less (see datasheet !!Differnet value for DRV8825 and A4988)
const int MS1 = 6 ;
const int MS2 = 7 ;
const int Commande = 2 ;
//const int ModeAuto = 3 ;

/* setting value for input*/
int CommandState = 0 ;      // vairable for reading the commande status
int MemComState = 0 ;       // Variable for rising edge use of button
//int ModeState = 0 ;         // Variable for changing the mode state (manu or Auto)


/* setting value for time and step */
int TimeStep = 10 ;                       // This value influence the motor speed (ms)
int MicroStepRes = 1/2 ;                    // variable for the resolution of the microstep (1, 1/2, 1/4, 1/8...)
int FirstStep = 40/MicroStepRes ;          // First step of the programme, the motor rotates left 120° (100 step)
int SecondStep = 140/MicroStepRes ;        // Second step of the programm, the motor rotates right 120°+ 360° (100 step)

void setup() {

  /*initialize input pin :*/
  pinMode (Commande, INPUT_PULLUP);
  //pinMode (ModeAuto, INPUT_PULLUP);

  /* initialize output pin :*/
  pinMode (DIR, OUTPUT) ;
  pinMode (STEP, OUTPUT) ;

  pinMode (MS0, OUTPUT) ;
  pinMode (MS1, OUTPUT) ;
  pinMode (MS2, OUTPUT) ;

  /*Microstep Resolution !! The value may vary between the DRV8825 and A4988*/ 
  digitalWrite(MS0, HIGH);             // Actual Microstep résolution : 1 (for DRV8825 and A4988)
  digitalWrite(MS1, LOW);
  digitalWrite(MS2, LOW);
}

void loop() {
  
  CommandState = digitalRead(Commande) ;                  // Read the state of the command value

  if(CommandState == LOW & CommandState != MemComState){
    
    /* Motor 120° movement loop */
    for(int i = 0; i<FirstStep; i++){                     // Loop of step make by the stepper (stop when the number is egal to the setpoint)
      digitalWrite(DIR, HIGH) ;                           // Activate the direction of rotation reversal pin
      digitalWrite(STEP, HIGH) ;                          // Start step command
      delay(TimeStep) ;                                   // Time for making the step (thid value influence the sped of the motor)
      digitalWrite(STEP, LOW) ;                           // Stop step command
      digitalWrite(DIR, LOW) ;                            // Disable the direction of rotation reversal pin
      delay(TimeStep) ;                                   // Time befor start next step
    }
    /* Motor 480° movement loop */
    for(int i = 0; i<SecondStep; i++){                    // Loop of step make by the stepper (stop when the number is egal to the setpoint)
      digitalWrite(STEP, HIGH) ;                          // Start step command                         
      delay(TimeStep) ;                                   // Time for making the step (thid value influence the sped of the motor)
      digitalWrite(STEP, LOW) ;                           // Stop step command
      delay(TimeStep) ;                                   // Time befor start next step
    }
  }
  MemComState = CommandState ;
}

Auriez vous une idée de ce que je peux faire pour solutionner ce problème sans risquer de foutre en l'aire une nouvelle carte ? et peut être auriez vous une idée sur un moyen de sauver mes Arduino qui ne semble pas complétement KO ?

Je me demande bien combien peuvent valoir FirstStep et SecondStep sachant que MicroStepRes est un entier et que tu essaies de lui faire manger 0.5.


Pourquoi changer DIR dans la boucle (et 2 fois en plus)?
En principe, on fixe l'état de DIR on fait des pas dans un sens, on change la direction et on fait des pas dans l'autre sens.

Effectivement je n'avais pas fait attention à ces points (la résolution des pas devait originellement valoir 1 et ne posait donc pas de problème :sweat_smile:)

Le code modifier :

float MicroStepRes = 1/2 ;                    // variable for the resolution of the microstep (1, 1/2, 1/4, 1/8...)
float FirstStep = 40/MicroStepRes ;          // First step of the programme, the motor rotates left 120° (motor DM40100)
float SecondStep = 140/MicroStepRes ;        // Second step of the programm, the motor rotates right 120°+ 360° (motor DM40100)
digitalWrite(DIR, HIGH) ;                           // Activate the direction of rotation reversal pin
    for(int i = 0; i<FirstStep; i++){                     // Loop of step make by the stepper (stop when the number is egal to the setpoint)
      digitalWrite(STEP, HIGH) ;                          // Start step command
      delay(TimeStep) ;                                   // Time for making the step (thid value influence the sped of the motor)
      digitalWrite(STEP, LOW) ;                           // Stop step command
      delay(TimeStep) ;                                   // Time befor start next step
    }
    digitalWrite(DIR, LOW) ;                            // Disable the direction of rotation reversal pin

Pensez vous que cela puisse être la cause du mauvais fonctionnement de l'arduino (le faite qu'il devienne invisible pour la communication) ? Savez-vous comment je peux corriger ce problème sur les arduino qui ont ce programme charger à l'interieur ?

Oui.
J'ai fait un petit bout de code

int pas = 1/2;
int borne = 40/pas;

void setup() {
  Serial.begin(115200); 
  Serial.println(borne);
  Serial.println("Début");
  for (int i=0; i < borne; i++){
    Serial.println(i);
  }
 Serial.println("Fin");
}

void loop() {
  // put your main code here, to run repeatedly:

}

Il ne se passe rien. Je n'ai aucun affichage dans le moniteur série.


Peut-être tenir le bouton reset de la carte jusqu'au moment ou le téléchargement se lance.


Si tu prends le petit bout de code que j'ai fait et que tu déclares des float à la place des int cela ne fonctionne pas non plus.
Le plus simple serait de prendre le problème dans l'autre sens.
Tu restes en entier, tu définis le nombre de micropas et tu fais une multiplication

int MicroStepRes = 2 ;                    // variable for the number of microstep (1, 2, 4, 8...)
int FirstStep = 40 * MicroStepRes ;          // First step of the programme, the motor rotates left 120° (100 step)
int SecondStep = 140 * MicroStepRes ;        // Second step of the programm, the motor rotates right 120°+ 360° (100 step)

Bonjour,

J'ai fait les modification et ai recharger dans mon arduino et cela semble fonctionner. Je n'ai plus de problème pour voir l'Arduino depuis mon PC.

Merci beaucoup pour votre aide :smile: :grin:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.