Programme de grande précison pour moteur type dc 12 v 28byj-48

Portrait de Anonyme

J'ai testé les programmes et "libraries" fournis pour ce moteur elles sont pleines d'erreurs, et sans aucune précision.

Pour avoir quelque chose de très précis j'ai réalisé le programme qui suit , je l'ai commenté pour que tu puisses comprendre le fonctionnement .

Je veux pour exemple que le réducteur est de 1/64 et le nombre de pas de 64 non 48 !

ce qui donne 4096 pas par tour et non 3072 !!!!

Une fois le programme téléversé ouvre la console série à 250000 bauds en bas à droite !!

// Ici Les paramètres que tu peux changer :
float Vitesse = 16;

// Ceci est la vitesse que tu veux obtenir entre 0 et 16 maxi par exemple pour 1/4 de tour/mn la valeur est de 0.25

int Angle = 100 ;
// Angle en grade de rotation par cycle dans le cas de 1/4 de tour la valeur est de 100 grades (1 tour = 400 grades )

int Attente = 5000;
// Délais entre deux départs moteur en sens inverse 5000 = 5 secondes

int NbrCycle = 1;
// Nombre de cycle allez et retour

// à partir d'ici ne plus rien modifier !!!!

int Bp = 7; // Entree Bouton Poussoir à relier entre la pin 7 et GND
int IN1 = 8; // Relier IN1 du driver à la pin 8 de l'Arduino
int IN2 = 9; // Relier IN2 du driver à la pin 9 de l'Arduino
int IN3 = 10; // Relier IN3 du driver à la pin 10 de l'Arduino
int IN4 = 11; // Relier IN4 du driver à la pin 11 de l'Arduino
int n, pas = 0;// n est une variable utiiser dans les boucle "for ..." et pas est le numero du pas en cours à envoyé au driver.
int VitesseMax = 16; // Ceci est la vitesse maximum du moteur par construction
int LapsMini = 915; // Ceci est le Laps de temps mini entre deux pas en micros seconde
int Laps = LapsMini * VitesseMax / Vitesse; // calcul du laps de tems entre deux pas pour obtenir la vitesse désirée
int sens = 1; // si sens = 0 arrêt moteur, si sens = 1 sens horaire, et si sens = -1 sens anti horaire
int NbrPas = 4096 / (400 / Angle) ;

unsigned long Tps, Sec ; // Variables pour calul du temps

void setup() {

  Serial.begin( 250000); // vitesse en bauds ici 250000 pour ne pas pénaliser les temps de réaction du programme
  pinMode(7, INPUT_PULLUP); // Entrée du Bp Forcée à l'état haut
  for (n = 8; n < 12; n++) {
    pinMode(n, OUTPUT); // déclaration des pins 8 à 11 en sorties ( OUTPUT )
    digitalWrite(n, LOW); // mise à l'état bas de ces sorties
  }
  Serial.println("La vitesse est de " + String(Vitesse) + " tours par minute");
  Serial.println("L'angle de rotation est de " + String(Angle) + " grades par cycle");
  Serial.println("Le délai entre deux changements de sens " + String(Attente) + " en millisencode");
Serial.println("Nombre de cycle aller/retour " + String(NbrCycle) );
  Serial.println();
  Serial.println("----------------------------------------------------------");
  Serial.println();
  Serial.println("Appuyez sur le Bp pour le départ Cycle");

}

void loop() {

while (digitalRead(Bp) == HIGH) {
    return;
}
  Sec = millis(); // Attribution du temps depuis le démarrage du programme à la variable Sec en milliseconde
  Tps = micros() + Laps; // // Attribution du temps depuis le démarrage du programme + Laps à la variable Tps en milliseconde

for (int Cycle = 0 ; Cycle < (NbrCycle * 2); Cycle++) {
  for (n = 0; n < NbrPas; n++) { // boucle exécutée NbrPas de fois
    Step(); // Exécution d'un pas
    while (Tps > micros()) { // delai entre deux pas
    }
    Tps = micros() + Laps; // réinitilisation de Tps
  }

float Temps = (millis() - Sec) * (400 / 100);
  Serial.println( " Temps de la rotation " + String(Temps) + " pour 1 de tour"); // temps de la rotation en milliseconde
  float VitesseCalculee =  60000 / Temps;
  Serial.println( "Vitesse de rotation exacte " + String( VitesseCalculee, 3)+" pour vitesse paramètree "+ String( Vitesse,3));

  delay(Attente); // Attente entre deux rotation moteur
  sens = sens * -1; // inversion du sens de rotation
}
digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
}

void Step() { ; // programme pour faire progresser le moteur d'un pas

  pas = pas + sens; // le numéro du pas est incrémenté de sens (+ ou - 1)
  if (pas == 0) { // si pas = 0
    pas = 8; // recul d'un pas
  }
  if (pas == 9) { // si pas = 9
    pas = 1; // avance d'un pas
  }

  switch (pas) { // selon la valeur du pas paramètrage de sorties qui correspondent aux entrées du driver !
    case 1: //si le pas est égal à 1
      digitalWrite(IN1, HIGH); // Sortie IN1 à l'état haut (5 volts)
      digitalWrite(IN2, LOW); // Sortie IN2 à l'éat bas (0 volt )
      digitalWrite(IN3, LOW); // idem pour les suivants
      digitalWrite(IN4, LOW);
      break;
    case 2:
      digitalWrite(IN1, HIGH);
      digitalWrite(IN2, HIGH);
      digitalWrite(IN3, LOW);
      digitalWrite(IN4, LOW);
      break;
    case 3:
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, HIGH);
      digitalWrite(IN3, LOW);
      digitalWrite(IN4, LOW);
      break;
    case 4:
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, HIGH);
      digitalWrite(IN3, HIGH);
      digitalWrite(IN4, LOW);
      break;
    case 5:
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, LOW);
      digitalWrite(IN3, HIGH);
      digitalWrite(IN4, LOW);
      break;
    case 6:
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, LOW);
      digitalWrite(IN3, HIGH);
      digitalWrite(IN4, HIGH);
      break;
    case 7:
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, LOW);
      digitalWrite(IN3, LOW);
      digitalWrite(IN4, HIGH);
      break;
    case 8:
      digitalWrite(IN1, HIGH);
      digitalWrite(IN2, LOW);
      digitalWrite(IN3, LOW);
      digitalWrite(IN4, HIGH);
      break;
  }
}

Voilà il est possible de faire plus court mais ce serait certainement plus difficile à comprendre, avec ce programme tu as une erreur précision de moins de 4 pour 1000 pour la vitesse ! et l'angle une précision de 100 % + ou - le jeu mécanique ! (qui dit mieux ?)

J'ai modifié le code car j'avais omis le bouton poussoir, c'est corrigé !

Portrait de cerclo

Bonjour,

Merci beaucoup pour tout ses explication, j'ai teste et ca marche ;).

Pouvez-vous m'aider a trouver comment introduire des commandes en fonction d'un joystick ?

En effet ma quette finale consiste a commander deux moteurs pas a pas a des vitesses déférentes en plusieurs modes (pour compenser la rotation de la Terre):

-mode suivie stellaire

-mode suivie Lune etc

En vous remerciant

Portrait de Walter

Bonjour,
As tu déjà réussit à récupérer la position de ton joystick comme dans cet exemple simple?
 

Portrait de Walter

Je ne vois pas ce qui te fais dire qu'Alex les a repris à son compte?

Personnellement je pencherais plutôt sur le fais que l'utilisateur ayant était viré, son identifiant n'existe plus et les messages associés ne peuvent donc être rattaché à un utilisateur, du coup le site affiche "Anonyme".
Ca a l'avantage par rapport au nombreux comptes de wolfframe, brosden ou de leur groupe que cela ne rend pas illisible et incompréhensible les threads aux quels ils ont participé.

Je me demande pourquoi rester sur un site dont on méprise viscéralement l'auteur et donc l'aider par la même occasion?