Positionnement moteur pas à pas avec des contact

Portrait de lamy971

Bonjour,

  Voilà je voudrai pouvoir positionner un moteur pas à pas nema17 sur un nombre de pas précis après avoir appuyer sur un contact. J'ai déjà câblé ma plaque d'essais avec un EasyDriver et un NANO. J'ai déjà une partie de mon code qui fonctionne mais quand je rajoute mes 4 contacts pour 4 positions différente cela ne fonctionne plus. Merci pour votre aide. 

Portrait de Anonyme

Bonjour lamy971

Je trouve ton code assez compliqué et pour le comprendre il en est de même.

Pourrais tu nous décrire le fonctionnement que tu veux obtenir, ce serait plus simple !

De plus un schéma de l'installation serait aussi le bienvenu !

J'ai essayé de corriger quelques erreurs mais je ne suis pas sûr du résultat !

Voir le code plus bas

Portrait de lamy971

Bonjour, 

Merci wolfram69 pour ta correction. Je n'ai pas encore essayé le code avec ta correction. 

Pour ce qui est des explications les voici :

Je suis en train de fabriquer un banc de mesure (projet perso). Un moteur Nema 17 entraîne une courroie qui se déplace comme un axe Y sur une imprimante 3D. Cette courroie entraîne donc le déplacement d'un plateau avec 4 points d'arrêts à quatre distances différentes et commandé par 4 boutons poussoirs. Chaques boutons activés correspond à une valeur fixe ou le chariot doit s'arrê​ter. le chariot peut se déplacer à nouveau quand le bouton est relâché et que le bouton suivant est appuyé. . 

En début de séquence le moteur tourne pour ramener systématiquement le chariot contre un contact pour marquer la position zéro (homing).

Le moniteur série est ouvert et sert à envoyé des commandes de déplacement en nombre de pas indépendamment des boutons poussoirs. Le zéro renvoie à la position "home"

Le moniteur serie ne me sert que pour faire les réglages des distances pour pouvoir assigner un nombre de pas aux quatre boutons de déplacement. Il pourra très bien être supprimer quand les quatre boutons seront calibré. 

Sans activation des boutons poussoirs le chariot reste en position "home"

Voilà voilà j'espère que c'est plus clair

Merci encore

Portrait de lamy971

Voici le schéma de la platine d'essais

Portrait de Anonyme

Merci lamy971 je vais pouvoir être beaucoup efficace à t'aider sur ce projet.

Mais dans un premier temps pour que mon code fonctionne il faut que tu changes le point commun de tous les bouton poussoir du Vcc (+) vers GND (-). De même le fin de course (home_switch) doit être branché d'un coté à la pin 9 comme c'est le cas mais l'autre coté doit être aussi au GND (-).

Portrait de Anonyme

Voici mon code non testé car je n'ai pas ton matériel mais si il y  a des dysfonctionnement merci de me les décrire !

Pour le code voir plus bas

Portrait de lamy971

Merci wolfram69

Bon je viens d'essayer ton code mais malheureusement cela ne fonctionne pas. Au début de la séquence le moteur tourne bien en CCW pour aller chercher le point zéro. J'appuie sur le switch et il se stop puis redémarre tout seul tout doucement dans un sens CW sans être vraiment continu car il s'arrête par moment. Seul un appuie sur le bouton 1 l'arrête puis il redémarre dès qu'on  relâche. Sur le moniteur série les lignes défilent sans interruption en suivant dans l'ordre les demandes de déplacement des boutons 1,2,3,4 avec les valeurs de pas qui correspondent. Il est par contre impossible de saisir un valeur dans la ligne de commande. J'ai bien évidemment fait les modifs que tu m'as demandé à savoir tout à GND (bouton + switch).

Juste pour infos le code ci dessous fonctionne mais sans les boutons poussoirs

   /*  Code pour banc de mesure utilisé avec homing et moniteur série
 

*/

#include "AccelStepper.h" 
// Library created by Mike McCauley at http://www.airspayce.com/mikem/arduino/AccelStepper/

// AccelStepper Setup
AccelStepper stepperX(1, 2, 3);   // 1 = Easy Driver interface
                                  // broche NANO 2 connectée à la broche STEP de Easy Driver
                                  // broche NANO 3 connectée à la broche DIR de Easy Driver

// Définissez les broches utilisées
#define home_switch 9 // Pin 9 connecté au Home Switch (MicroSwitch)

// Variables de déplacement pas à pas
long TravelX;  // Utilisé pour stocker la valeur X entrée dans le moniteur série
int move_finished=1;  // // Utilisé pour vérifier si le déplacement est terminé
long initial_homing=-1;  // Utilisé pour Home Stepper au démarrage

void setup() {
   Serial.begin(9600);  // Démarrez le moniteur série avec une vitesse de 9600 bauds
   
   pinMode(home_switch, INPUT_PULLUP);
   
   delay(5);  // Attendez pour réveiller EasyDriver

   //   Définir la vitesse maximale et l' accélération de chaque Steppers au démarrage pour le référencement
  stepperX.setMaxSpeed(100.0);      // Définir la vitesse maximale du moteur pas à pas (plus lente pour obtenir une meilleure précision)
  stepperX.setAcceleration(100.0);  // Définir l'accélération de Stepper
 

// Démarrer la procédure de référencement du moteur pas à pas au démarrage

  Serial.print("Le chariot va à sa position d'origine HOME. . . . . . . . . . . ");

  while (digitalRead(home_switch)) {  // Faire avancer le Stepper CCW jusqu'à ce que le commutateur soit activé
    stepperX.moveTo(initial_homing);  // Définit la position vers laquelle se déplacer
    initial_homing--;  // Diminue de 1  pour le  prochain coup si nécessaire
    stepperX.run();  // Commencez à déplacer le stepper
    delay(5);
}

  stepperX.setCurrentPosition(0);  // Définit la position actuelle à zéro pour l' instant
  stepperX.setMaxSpeed(100.0);      // Définir la vitesse maximale du moteur pas à pas (plus lente pour obtenir une meilleure précision)
  stepperX.setAcceleration(100.0);  // Définir l'accélération de Stepper
  initial_homing=1;

  while (!digitalRead(home_switch)) { // Faire avancer le Stepper CW jusqu'à ce que le commutateur soit désactivé
    stepperX.moveTo(initial_homing);  
    stepperX.run();
    initial_homing++;
    delay(5);
  }
  
  stepperX.setCurrentPosition(0);
  Serial.println("Homing Completed");
  Serial.println("");
  stepperX.setMaxSpeed(1000.0);      // Définir la vitesse maximale du stepper (plus rapide pour les mouvements réguliers)
  stepperX.setAcceleration(1000.0);  // Définir l'accélération de Stepper

// Imprimer les instructions sur le moniteur série au démarrage
  Serial.println("Entrer la distance de déplacement ou 0 pour retourner à la position HOME:");
}

void loop() {

 while (Serial.available()>0)  { // Vérifier si les valeurs sont disponibles dans le Serial Buffer

  move_finished=0;  // Définir une variable pour vérifier le déplacement du Stepper
  
  TravelX= Serial.parseInt();  // Mettez la valeur numérique du  tampon  dans la  variable TravelX
  if (TravelX < 0 || TravelX > 20000) {  // Assurez-vous que la position saisie n'est pas au-delà de la position HOME ou MAX
    Serial.println("");
    Serial.println("Veuillez saisir une valeur supérieure à zéro et inférieure ou égale à 20000 .....");
    Serial.println("");
  } else {
    Serial.print("Déplacement du chariot en position:");
    Serial.println(TravelX);
  
  stepperX.moveTo(TravelX);  // Définit la nouvelle position de déplacement de Stepper
  
  delay(1000);  // Attendez 1 seconde avant de déplacer le Stepper
  }
  }

  if (TravelX >= 0 && TravelX <= 20000) {

// Vérifiez si le Stepper a atteint la position souhaitée
  if ((stepperX.distanceToGo() != 0)) {
    
    stepperX.run();  // Déplacer le charriot en position
    
  }

// Si le déplacement est terminé, afficher le message sur le moniteur série
  if ((move_finished == 0) && (stepperX.distanceToGo() == 0)) {
    Serial.println("TERMINE!");
    Serial.println("");
     Serial.println("Entrer la distance de déplacement ou 0 pour retourner à la position HOME:");
    move_finished=1;  // Réinitialiser la variable de déplacement
  }
  }
}

Portrait de Anonyme

Je vais faire un petit montage chez moi pour piger le problème et le corriger mais pas avant cet après midi !

Mais as-tu bien réalisé les modifications de câblage que je t'ai demandé de faire ?

Les voici de nouveau !

Mais dans un premier temps pour que mon code fonctionne il faut que tu changes le point commun de tous les bouton poussoir du Vcc (+) vers GND (-). De même le fin de course (home_switch) doit être branché d'un coté à la pin 9 comme c'est le cas mais l'autre coté doit être aussi au GND (-).

Si non il se passera complètement autre chose !

Normalement il y a en initialisation un premier mouvement vers le point zéro à une certaine vitesse puis un léger déplacement, suivi d'un second mouvement vers le point zéro à vitesse réduite pour avoir une plus grande fiabilité dans ce point zéro !

Portrait de Anonyme

Désolé mais avec mon driver cette library ne fonctionne pas et elle est beaucoup trop lente !

Si tu veux je peux te faire un programme sans library AccelStepper

Portrait de lamy971

Bonjour, 

 Alors oui j'avais fais les modifs sur ma planche d'essais. Si tu veux essayer avec une autre library pas de soucis pour moi. C'est plus le résultat qui compte. 

Portrait de Anonyme

Voilà mon code cette fois il est testé et 100 % fonctionnel. Pour chaque BP tu peux donner la position et la vitesse !

int Vitesse ;//nombre de pas par seconde
unsigned long InterStep;
int Step = 2, Dir = 3, Ena = 4, Zero = 9, BP1 = 14, BP2 = 15, BP3 = 16, BP4 = 17, Pas, X, XPos;
bool Etat;

void setup() {
  Serial.begin(9600);
  pinMode(Dir,  OUTPUT);
  pinMode(Step, OUTPUT);
  pinMode(Ena,  OUTPUT);
  pinMode(Zero, INPUT_PULLUP);
  pinMode(BP1,  INPUT_PULLUP);
  pinMode(BP2,  INPUT_PULLUP);
  pinMode(BP3,  INPUT_PULLUP);
  pinMode(BP4,  INPUT_PULLUP);
  pinMode(Ena,  OUTPUT);
  digitalWrite(Dir, LOW);
  Serial.println("Recherche du point Zero");
  PointZero();
  Serial.println();
  Serial.println();
  Serial.println("Le point zero est initialisé");
  Messages();
}

void loop() {

  if (Serial.available() > 0) {
    int CibleX = Serial.parseInt();
    Serial.readString();
    if ( CibleX < 0 || CibleX > 10000) {
      Serial.println("La valeur " + String(CibleX) + " n'est pas autorisée");
      Messages();
    }
    else
      PositionX(CibleX, 200);

  }
  if (digitalRead(BP1) == LOW)
    PositionX(500, 100);// PositionX( POSTION, VITESSE en pas par seconde)
  if (digitalRead(BP2) == LOW)
    PositionX(1500, 200);
  if (digitalRead(BP3) == LOW)
    PositionX(2500, 300);
  if (digitalRead(BP4) == LOW)
    PositionX(5000, 400);

}

void Messages() {
  Serial.println();
  Serial.println();
  Serial.println("Entrez une Valeur entre 0 et 10000");
  Serial.println();
  Serial.println("Ou appuyez sur un Bouton Poussoir");
}

void PositionX( int CibleX, int vitesse) {

 Etat=1;
  Serial.println("Le point "+String(CibleX)+" est demande");
  digitalWrite(Ena, LOW);
  InterStep = 1000000 / vitesse;
  if (CibleX - XPos < 0) {
    digitalWrite(Dir, LOW);
    Pas = -1;
  }
  else {
    digitalWrite(Dir, HIGH);
    Pas = 1;
  }

  while (XPos != CibleX) {
    digitalWrite(Step, Etat);
    Etat = !Etat;
    delayMicroseconds(InterStep );
    digitalWrite(Step, Etat);
    Etat = !Etat;
    delayMicroseconds(InterStep );
    XPos += Pas;

  }
  digitalWrite(Ena, HIGH);
    Serial.println();

  Serial.println("Le point " + String(XPos) + " est atteint");
  for (int n = 0; n <4; n++)
    Serial.println();
  Messages();
}

void PointZero() {

  digitalWrite(Ena, LOW);
  Vitesse = 200;
  InterStep = 1000000 / Vitesse;
  digitalWrite(Dir, HIGH);
  while (digitalRead(Zero) == HIGH) {
    digitalWrite(Step, Etat);
    Etat = !Etat;
    delayMicroseconds(InterStep);
    digitalWrite(Step, Etat);
    Etat = !Etat;
    delayMicroseconds(InterStep);
  }// suppression des lignes suivantes ce qui diminue la précision du Point Zéro
//  Vitesse = 50;
//   InterStep = 1000000 / Vitesse;
//   digitalWrite(Dir, LOW);
//   while (digitalRead(Zero) == LOW) {
//     digitalWrite(Step, Etat);
 //    Etat = !Etat;
 //   delayMicroseconds(InterStep);
 //    digitalWrite(Step, Etat);
//     Etat = !Etat;
//     delayMicroseconds(InterStep);
//  }
  digitalWrite(Ena, HIGH);

  XPos = 0;
}

Portrait de lamy971

Bonjour,

Merci pour ton code. Je viens de l'essayer. De mon coté je n'y arrive pas. Le moteur tourne mais ne trouve pas la position zéro. La requête s'affiche bien dans le moniteur série.  C'est sans doute moi qui n'arrive pas à l'intégrer. Tu as changé de library?

Portrait de Anonyme

Je n'ai pas besoin de library.

J'ai modifié un détail sur le code essaye de nouveau !

Quand je suis en ligne on peut chatter regarde en bas à droite de cette page !

Portrait de lamy971

Bon c'est cool ça commence à être bon c'est super. Voilà ce que j'ai remarqué :

- Le point zéro se fait avec le moteur en CW (est t il possible qu'il se fasse en CCW pour revenir au début de la rampe?

 C'est super tu es vraiment un pro .... 

La finalité sera que je puisse afficher les messages de positionnement sur un LCD deux lignes une fois que les positions exactes seront trouvée. Je n'aurai plus besoin du moniteur serie ni d'être raccordé à un pc.... mais ça je vais essayer de le faire tout seul au niveau du code.... 

Portrait de Anonyme

Pourquoi utiliser "CW" et "CCW" pour " CounterClockWise  " pour sens horaire et anti horaire à moins que tu sois anglophone !

Pour inverser le sens il suffit de changer les "digitalWrite(Dir, HIGH);" par des "digitalWrite(Dir, LOW);" et inversement dans la fonction "void PointZero(){"

Par contre je ne sais pas si tu veux faire la même chose dans "void PositionX(){" , le principe reste le même !

Si tu as des problèmes pour coder le LCD dis le je te donnerai la solution.

Tu peux t'inspirer du code que j'ai écrit dans "Ruche connectée"  au niveau de ce poste :

Portrait de lamy971

Effectivement cela fonctionne super bien maintenant. Pour le CW et CCW c'est juste une question d'habitude dans un autre domaine ou ce vocabulaire est très employé. Bon il ne me reste plus qu'a faire fonctionner mon afficheur 16x2 avec un module I2C. Bon j'avoue que je patauge un peu. J'essaye d'inclure la library LiquidCrystal_I2C mais je n'ai que des galères dans la compilation. Je ne dois pas avoir la bonne version car il ne reconnait pas mon adresse 0x27. Je vais continuer à chercher mais pour ce soir j'arrête...

Portrait de Anonyme

J'attends de tes nouvelles pour savoir si tu as encore besoin d'aide...

Portrait de lamy971

Petite question, Je viens de m'apercevoir que quand le swicth de fin de course reste en contact, le moteur continue de tourner doucement dans le même sens. il ne s'arrête que quand le switch est relâché. Peut on faire en sorte que le moteur s'arrête quand le switch est en contact?

Pour l'afficheur je veux bien un coup de main car je ne m'en sort pas. La compilation ne passe pas. Je voudrais afficher les messages d'info des position correspondant au message du moniteur série. 

Voici me matériel que j'utilise 

https://www.amazon.fr/gp/product/B01N3B8JMN/ref=ppx_yo_dt_b_asin_image_o05_s00?ie=UTF8&th=1

Je ne trouve pas la bonne bibliothèque, je n'arrive même pas à le faire fonctionner de manière basique sur un arduino UNO avec un code simple. 

Merci encore pour ton aide 

Portrait de Anonyme

Pour ta première question oui c'est exacte et j'ai reproduit ce que faisait ton code, je pense que l'auteur pense que la précision est plus grande de cette manière, je m'explique, dans un premier temps le moteur tourne à une vitesse plus grande et s'arrête à la fermeture du contact puis redémarre à une vitesse plus lente en sens inverse jusqu'à la réouverture du contact ce qui peut éffectivement être plus précis mais si tu veux t'affranchir de ce principe il suffit de modidier la fonction PointZero(); comme suit :

void PointZero() {

  digitalWrite(Ena, LOW);
  Vitesse = 200;
  InterStep = 1000000 / Vitesse;
  digitalWrite(Dir, HIGH);
  while (digitalRead(Zero) == HIGH) {
    digitalWrite(Step, Etat);
    Etat = !Etat;
    delayMicroseconds(InterStep);
    digitalWrite(Step, Etat);
    Etat = !Etat;
    delayMicroseconds(InterStep);
  }
  // Vitesse = 50;
   // InterStep = 1000000 / Vitesse;
  //   digitalWrite(Dir, LOW);
  //   while (digitalRead(Zero) == LOW) {
  //     digitalWrite(Step, Etat);
   //    Etat = !Etat;
   //    delayMicroseconds(InterStep);
  //     digitalWrite(Step, Etat);
   //   Etat = !Etat;
   //    delayMicroseconds(InterStep);
  //   }
     digitalWrite(Ena, HIGH);

  XPos = 0;
}

Portrait de Anonyme

Ce jour je n'aurais pas le temps de coder quelque chose pour ton problème de LCD mais ce sera fait pendant le W.E !

De rien pour l'aide c'est avec plaisir !

Portrait de lamy971

Bonjour Ok pour le point zéro , effectivement c’est ce qu’il expliquait et c’est vrai que j’ai modifié la vitesse pour que le retour soit plus rapide car le rail fait 2 m de longueur.  Pas de soucis pour le code et bon WEEK-END 

Portrait de lamy971

Bonjour wolfram69

Juste pour te dire que j'ai fais ta dernière modif sur le code et que c'est nickel. Le switch arrête complètement le moteur.

Merci 

Portrait de Anonyme

Pas de problème c'est avec plaisir

Portrait de lamy971

Bonjour, 

 J’aurai encore besoin de ton aide pour l’afficheur. Si tu as encore un peu de dispo je suis preneur. 

Merci 

Portrait de Anonyme

Quel est le type exact de ton afficher LCD ?

Portrait de lamy971

Voici ce que j’utilise

https://www.amazon.fr/gp/product/B01N3B8JMN/ref=ppx_yo_dt_b_asin_image_o05_s00?ie=UTF8&th=1

toute les librairies que je trouve ne fonctionne pas. 

Portrait de Anonyme

Ok je te fais cela dans la journée je pense !

Portrait de lamy971

Hey pas de stress... quand tu as le temps...

Bonnes fêtes de Pâques. 

Portrait de Anonyme

Dans un premier temps il faut vérifié que ton module I2C est bien à l'adresse 0x27 sinon il te faudra l

mettre l'adresse trouvé par ce Code:

Fais les branchements suivants :

Gnd > Gnd
Vcc > 5 V
SDA > A4
SCL > A5
  
Respecte bien ces raccordements.

#include <Wire.h>
byte Erreur, Adresse;
void setup() {
  Wire.begin();
  Serial.begin(115200);
}
void loop() {
  Serial.println("Scan Bus I2C...");
  for (Adresse = 1; Adresse < 127; Adresse++ )
  {
    Wire.beginTransmission(Adresse);
    Erreur = Wire.endTransmission();
    if (Erreur == 0)
    {
      Serial.print("Module I2C trouvé à l'adresse 0x");
      if (Adresse < 16)
        Serial.print("0");
      Serial.print(Adresse, HEX);
      Serial.println("  !");
      while (Erreur == 0) {
      }
    }
  }
}

Installe la Library comme suit :

Dans Arduino IDE
Appuie sur " CTRL " + " SHIFT "+" i "  // Contrôle gauche  + Flèche au dessus de Contrôle Gauche + i

Attend quelques secondes que le PC te rende la main
Dans "Sujet" sélectionne "Affichage" et un peu plus à droite "LCD I2C" puis "Entrée" !

Sélectionne la library "LiquidCrystal I2C bye Frank de Brabander"

Tu peux alors tester le code suivant :

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);  // Si l'adresse qui tu as trouvé dans le Scan est différent change la valeur 0x27 par celle trouvé par le scan !
void setup()
{
  lcd.init();                  
  lcd.backlight();
  lcd.setCursor(4,0);
  lcd.print("Bravo !");
  lcd.setCursor(3,1);
  lcd.print("Bon Travail");
}
void loop()
{
}

Il te faut maintenant  ajuster le potentiomètre bleu sur le module I2C pour avoir un affichage correcte !

Veux tu que je modifie le code pour ton programme ou veux tu le faire toi même ?

Portrait de lamy971

Merci pour ton aide alors voilà:

J'avais déjà tout câblé mais 'est bon de re vérifier comme tu me l'a écris. J'avais scanner mon module I2C et j'ai bien trouvé l'adresse 0x27. J'ai voulu essayé de vérifier avec ton code mais dans le moniteur série cela n'a rien donné. Cela ne me marque pas d'adresse lisible mais un truc avec des 0???. J'ai alors remis un autre code de scanner et j'ai retrouvé la même adresse. Cependant je ne suis pas arrivé à afficher le texte de ton exemple même en changeant le potentiomètre. Je vois bien que l'afficheur communique car il clignote 1 fois mais rien ne s'affiche. J'ai essayé de changer d'afficheur mais tjrs pareil.... J'ai la poisse... Je vais essayer de modifier mon code et si je n'y arrive pas je te le dis mais quand j'arriverai à afficher quelque chose.

Portrait de Anonyme

As tu réglé le moniteur série à 115200 ? Je n'utilise jamais 9600 bauds, c'était bon du temps du DOS ! Mais depuis windows je suis plus souvent en 250000 voire même 1000000 bauds autrement à quoi bon d'utiliser des micropross à 16 Mhz  !

As tu aussi bien chargé la bonne library et supprimer les autres car il se peut que le compilateur ne prenne pas la bonne quand il y a plusieurs library avec des fichiers de même nom !

Je te ferais une vidéo pour te faire voir que je ne raconte pas de bêtises !

Un truc que j'aimerais savoir sur ton afficheur, il est bien allumé et lorsque tu tourne le potentiomètre dans un sens ou dans l'autre tu obtiens bien des pavés de points à la place des caractères, même si il n'y a pas de texte affiché ?

Portrait de lamy971

Oui c’est bien ça. Je n’ai pas encore supprimé les autres fichiers. L’afficheur affiche bien des pavés de leds quand je tourne le potentiomètre. J’ai bien téléchargé la bonne library.

Portrait de Anonyme

Peux tu faire une photo de ton montage ?

Portrait de lamy971

Voilà les photos. J'ai encore vérifier le câblage et cela me semble bon

Portrait de lamy971

Tu avais raison pour la vitesse du moniteur. Donc j'ai trouvé la même adresse soit 0x27

Portrait de Anonyme

Tu as inversé SDA et SCL tu les as branché à l'envers ! Fais plus attention dans ce cas ce n'est pas grave mais il y a des fois ou c'est fatale !

Portrait de lamy971

Alors j'ai bien regardé et pour moi ct bien branché. Cela parait à l'envers pacque mon module I2C est inversé par rapport à l'afficheur à cause de la plaque d'essais. J'ai essayé d'inverser mais cela ne fonctionne pas de plus l'afficheur ne clignote pas quand il démarre alors qu'avant oui il clignotait une fois ce qui me faisait dire que mon branchement était bon. Par contre j'ai changé mon arduino et miracle ça marche.  Je veux bien un coup de main pour le code car je n'y arrive pas et j'ai des inscriptions qui ne fonctionnent pas c'est trop difficile pour moi. Je voudrais que mon afficheur recopie les messages du moniteur série. 

  Merci d'avance 

Portrait de Anonyme

Je te fais cela dès que j'ai  5 minutes ! Je suis content que tu constates que les codes que je t'ai donnés sont parfaitement fonctionnels, comme c'est toujours le cas quand je ne précise pas que je n'ai pas pu le tester pour tel ou tel raison. Tu pourras remarqué que c'est loin d'être le cas sur d'autres sites !

Peux tu nous dévoiler l'utilité de ce montage je suis assez curieux d'n savoir d'avantage !

Portrait de lamy971

OUi je te remercie tes codes fonctionnent super bien. Je suis admiratif et j’aimerais beaucoup progresser dans ce domaine. En fait je construis un « slider » pour appareil photo. J’ai besoin de position bien précise pour de la macro photo.  Voilà rien de bien extraordinaire 

Portrait de Anonyme

Bonjour lamy971 

Comme promis tu trouveras le code juste en dessous, par contre comme je n'ai pas eu le temps de refaire le montage pour tester ce code, je te demande de le faire pour moi et de me donner les points de dysfonctionnement que je ne manquerai pas de modifier !

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // Si l'adresse qui tu as trouvé dans le Scan est différent change la valeur 0x27 par celle trouvé par le scan !
// Raccorder SCL sur A et SDA sur A4 entre le module LCD et l'Arduino
int Vitesse ;//nombre de pas par seconde
unsigned long InterStep;
int Step = 2, Dir = 3, Ena = 4, Zero = 9, BP1 = 14, BP2 = 15, BP3 = 16, BP4 = 17, Pas, X, XPos;
bool Etat;

void setup() {
  Serial.begin(9600);
  pinMode(Dir,  OUTPUT);
  pinMode(Step, OUTPUT);
  pinMode(Ena,  OUTPUT);
  pinMode(Zero, INPUT_PULLUP);
  pinMode(BP1,  INPUT_PULLUP);
  pinMode(BP2,  INPUT_PULLUP);
  pinMode(BP3,  INPUT_PULLUP);
  pinMode(BP4,  INPUT_PULLUP);
  pinMode(Ena,  OUTPUT);
  digitalWrite(Dir, LOW);
  lcd.init();
  lcd.backlight();
  lcd.setCursor(2, 0);

  lcd.print("Recherche du");
  Serial.println("Recherche du point Zero");
  PointZero();
  Serial.println();
  Serial.println();
  lcd.clear();
  lcd.setCursor(1, 0);

  lcd.print("Le point zero");
  lcd.setCursor(1, 1);

  lcd.print("est initialise");
  Serial.println("Le point zero est initialisé");
  Messages();
}

void loop() {

  if (Serial.available() > 0) {
    int CibleX = Serial.parseInt();
    Serial.readString();
    if ( CibleX < 0 || CibleX > 10000) {
      lcd.clear();
      lcd.setCursor(0, 0);

      lcd.print("La valeur est");
      lcd.print(CibleX);
      lcd.setCursor(1, 1);

      lcd.print("non autorisee");
      Serial.println("La valeur " + String(CibleX) + " n'est pas autorisée");
      Messages();
    }
    else
      PositionX(CibleX, 200);

  }
  if (digitalRead(BP1) == LOW)
    PositionX(500, 100);// PositionX( POSTION, VITESSE en pas par seconde)
  if (digitalRead(BP2) == LOW)
    PositionX(1500, 200);
  if (digitalRead(BP3) == LOW)
    PositionX(2500, 300);
  if (digitalRead(BP4) == LOW)
    PositionX(5000, 400);

}

void Messages() {
  Serial.println();
  Serial.println();

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Valeur 0<>10000");
  lcd.setCursor(2, 1);
  lcd.print("  Ou Bp 1 a 4");

  Serial.println("Entrez une Valeur entre 0 et 10000");
  Serial.println();
  Serial.println("Ou appuyez sur un Bouton Poussoir");
}

void PositionX( int CibleX, int vitesse) {
  Etat = 1;

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Le point ");
  lcd.print(CibleX);
  lcd.setCursor(2, 1);
  lcd.print("est demandé");

  Serial.println("Le point " + String(CibleX) + " est demande");
  digitalWrite(Ena, LOW);
  InterStep = 1000000 / vitesse;
  if (CibleX - XPos < 0) {
    digitalWrite(Dir, LOW);
    Pas = -1;
  }
  else {
    digitalWrite(Dir, HIGH);
    Pas = 1;
  }

  while (XPos != CibleX) {
    XPos += Pas;
    digitalWrite(Step, Etat);
    Etat = !Etat;
    delayMicroseconds(InterStep );
    digitalWrite(Step, Etat);
    Etat = !Etat;
    delayMicroseconds(InterStep );
  }
  // digitalWrite(Ena, HIGH);
 
  lcd.clear();
  lcd.setCursor(3, 0);
  lcd.print("Le point ");
  lcd.print(XPos);
  lcd.setCursor(2, 1);
  lcd.print("  est atteint");
 
  Serial.println();
  Serial.println("Le point " + String(XPos) + " est atteint");
  for (int n = 0; n < 4; n++)
    Serial.println();
  delay(2000);
  Messages();
}

void PointZero() {

  digitalWrite(Ena, LOW);
  Vitesse = 200;
  InterStep = 1000000 / Vitesse;
  digitalWrite(Dir, HIGH);
  while (digitalRead(Zero) == HIGH) {
    digitalWrite(Step, Etat);
    Etat = !Etat;
    delayMicroseconds(InterStep);
    digitalWrite(Step, Etat);
    Etat = !Etat;
    delayMicroseconds(InterStep);
  }
  XPos = 0;
}

Portrait de lamy971

Alors c'est super le code fonctionne. J'ai modifié des bricoles. Je te donne la dernière version. 

- Le point zéro est initialisé ne s'affiche pas. 

- Est t il possible d'afficher pour chaque BP la chose suivante;

 pour  BP1   <50cm>

          BP2  < 60cm>

          BP3  <100cm>

        et  BP4 <150cm>

et ceux quelque soit la valeur du nombre de pas pour chaque BP

voilà et encore un grand merci 

Portrait de lamy971

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // Si l'adresse qui tu as trouvé dans le Scan est différent change la valeur 0x27 par celle trouvé par le scan !
// Raccorder SCL sur A et SDA sur A4 entre le module LCD et l'Arduino
int Vitesse ;//nombre de pas par seconde
unsigned long InterStep;
int Step = 2, Dir = 3, Ena = 4, Zero = 9, BP1 = 14, BP2 = 15, BP3 = 16, BP4 = 17, Pas, X, XPos;
bool Etat;

void setup() {
  Serial.begin(9600);
  pinMode(Dir,  OUTPUT);
  pinMode(Step, OUTPUT);
  pinMode(Ena,  OUTPUT);
  pinMode(Zero, INPUT_PULLUP);
  pinMode(BP1,  INPUT_PULLUP);
  pinMode(BP2,  INPUT_PULLUP);
  pinMode(BP3,  INPUT_PULLUP);
  pinMode(BP4,  INPUT_PULLUP);
  pinMode(Ena,  OUTPUT);
  digitalWrite(Dir, LOW);
  lcd.init();
  lcd.backlight();
  lcd.setCursor(2, 0);
  lcd.print("Recherche du ");
  lcd.setCursor(3, 1);
  lcd.print("point Zero ");
  Serial.println("Recherche du point Zero");
  PointZero();
  Serial.println();
  Serial.println();
  lcd.clear();
  lcd.setCursor(1, 0);

  lcd.print("Le point zero");
  lcd.setCursor(1, 1);

  lcd.print("est initialise");
  Serial.println("Le point zero est initialisé");
  Messages();
}

void loop() {

  if (Serial.available() > 0) {
    int CibleX = Serial.parseInt();
    Serial.readString();
    if ( CibleX < 0 || CibleX > 100000) {
      lcd.clear();
      lcd.setCursor(0, 0);

      lcd.print("La valeur est");
      lcd.print(CibleX);
      lcd.setCursor(1, 1);

      lcd.print("non autorisee");
      Serial.println("La valeur " + String(CibleX) + " n'est pas autorisée");
      Messages();
    }
    else
      PositionX(CibleX, 200);

  }
  if (digitalRead(BP1) == LOW)
    PositionX(1000, 1000);// PositionX( POSTION, VITESSE en pas par seconde)
  if (digitalRead(BP2) == LOW)
    PositionX(4000, 1000);
  if (digitalRead(BP3) == LOW)
    PositionX(8000, 1000);
  if (digitalRead(BP4) == LOW)
    PositionX(20000, 1000);

}

void Messages() {
  Serial.println();
  Serial.println();

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Valeur 0<>100000");
  lcd.setCursor(2, 1);
  lcd.print("  Ou Bp 1 a 4");

  Serial.println("Entrez une Valeur entre 0 et 100000");
  Serial.println();
  Serial.println("Ou appuyez sur un Bouton Poussoir");
}

void PositionX( int CibleX, int vitesse) {
  Etat = 1;

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Le point ");
  lcd.print(CibleX);
  lcd.setCursor(1, 1);
  lcd.print("est demande");

  Serial.println("Le point " + String(CibleX) + " est demande");
  digitalWrite(Ena, LOW);
  InterStep = 1000000 / vitesse;
  if (CibleX - XPos < 0) {
    digitalWrite(Dir, LOW);
    Pas = -1;
  }
  else {
    digitalWrite(Dir, HIGH);
    Pas = 1;
  }

  while (XPos != CibleX) {
    XPos += Pas;
    digitalWrite(Step, Etat);
    Etat = !Etat;
    delayMicroseconds(InterStep );
    digitalWrite(Step, Etat);
    Etat = !Etat;
    delayMicroseconds(InterStep );
  }
  // digitalWrite(Ena, HIGH);
 
  lcd.clear();
  lcd.setCursor(3, 0);
  lcd.print("Le point ");
  lcd.print(XPos);
  lcd.setCursor(2, 1);
  lcd.print("  est atteint");
 
  Serial.println();
  Serial.println("Le point " + String(XPos) + " est atteint");
  for (int n = 0; n < 4; n++)
    Serial.println();
  delay(2000);
  Messages();
}

void PointZero() {

  digitalWrite(Ena, LOW);
  Vitesse = 1000;
  InterStep = 1000000 / Vitesse;
  digitalWrite(Dir, LOW);
  while (digitalRead(Zero) == HIGH) {
    digitalWrite(Step, Etat);
    Etat = !Etat;
    delayMicroseconds(InterStep);
    digitalWrite(Step, Etat);
    Etat = !Etat;
    delayMicroseconds(InterStep);
  }
  XPos = 0;
}

Portrait de Anonyme

lamy971  je ne comprends pas ce que tu veux concernant 50 cm, 60 c etc ...

Peux tu être plus explicite ?

Le point Zéro doit s'afficher mais comme il n'y a pas de tempo il est tout de suite remplacé par le message " Valeur 0<>100000 "  !

Il suffit de mettre " delay(2000); "  sous la ligne " lcd.print("  est atteint"); "

Portrait de lamy971

Ok pour le point zéro. 

Alors la distance d’arrêt définitive après réglage seront pour chaque BP les distances 50,60, 100 et 150. Je ne sais pas aujourd’hui combien de nombres de pas moteur cela représente par position. Ce réglage sera réalisé avec le moniteur série dès que le rail sera monté. La distance entre le rail et la télécommande filaire ou sera l’afficheur et les 4 BP sera assez importante et je voudrais si c’est possible qu’après avoir appuyé sur un BP j’ai la distance correspondante qui s’affiche. Quand tout sera terminé ces quatre distances ne bougeront plus. Sauf si un jour j’en ai besoin et je les changerai directement dans le code. 

Portrait de Anonyme

Ok donc au lieu du nombre de pas tu veux afficher la distance ! Je n'ai toujours pas testé mais cela devrait fonctionné !

    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x27, 16, 2); // Si l'adresse qui tu as trouvé dans le Scan est différent change la valeur 0x27 par celle trouvé par le scan !
    // Raccorder SCL sur A et SDA sur A4 entre le module LCD et l'Arduino
    int Vitesse ;//nombre de pas par seconde
    unsigned long InterStep;
    int Step = 2, Dir = 3, Ena = 4, Zero = 9, BP1 = 14, BP2 = 15, BP3 = 16, BP4 = 17, Pas, X, XPos;
    bool Etat;
    String Distance;

    void setup() {
      Serial.begin(9600);
      pinMode(Dir,  OUTPUT);
      pinMode(Step, OUTPUT);
      pinMode(Ena,  OUTPUT);
      pinMode(Zero, INPUT_PULLUP);
      pinMode(BP1,  INPUT_PULLUP);
      pinMode(BP2,  INPUT_PULLUP);
      pinMode(BP3,  INPUT_PULLUP);
      pinMode(BP4,  INPUT_PULLUP);
      pinMode(Ena,  OUTPUT);
      digitalWrite(Dir, LOW);
      lcd.init();
      lcd.backlight();
      lcd.setCursor(2, 0);
      lcd.print("Recherche du ");
      lcd.setCursor(3, 1);
      lcd.print("point Zero ");
      Serial.println("Recherche du point Zero");
      PointZero();
      Serial.println();
      Serial.println();
      lcd.clear();
      lcd.setCursor(1, 0);

      lcd.print("Le point zero");
      lcd.setCursor(1, 1);

      lcd.print("est initialise");
      Serial.println("Le point zero est initialisé");
      Messages();
    }

    void loop() {

      if (Serial.available() > 0) {
        int CibleX = Serial.parseInt();
        Serial.readString();
        if ( CibleX < 0 || CibleX > 100000) {
          lcd.clear();
          lcd.setCursor(0, 0);

          lcd.print("La valeur est");
          lcd.print(CibleX);
          lcd.setCursor(1, 1);

          lcd.print("non autorisee");
          Serial.println("La valeur " + String(CibleX) + " n'est pas autorisée");
          Messages();
        }
        else
          PositionX(CibleX, 200,"200");

      }
      if (digitalRead(BP1) == LOW)
        PositionX(1000, 1000,"50 cm");// PositionX( POSTION, VITESSE en pas par seconde)
      if (digitalRead(BP2) == LOW)
        PositionX(4000, 1000,"60 cm");
      if (digitalRead(BP3) == LOW)
        PositionX(8000, 1000,"100 cm");
      if (digitalRead(BP4) == LOW)
        PositionX(20000, 1000,"10 cm");

    }

    void Messages() {
      Serial.println();
      Serial.println();

      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Valeur 0<>100000");
      lcd.setCursor(2, 1);
      lcd.print("  Ou Bp 1 a 4");

      Serial.println("Entrez une Valeur entre 0 et 100000");
      Serial.println();
      Serial.println("Ou appuyez sur un Bouton Poussoir");
    }

    void PositionX( int CibleX, int vitesse, String Distance) {
      Etat = 1;

      lcd.clear();
      lcd.setCursor(1, 0);
      lcd.print("Transfert vers"+Distance);
      //lcd.print(CibleX);
      lcd.setCursor(1, 1);
      lcd.print(Distance + " est demande");

      Serial.println("Le point " + Distance+ " est demande");
      digitalWrite(Ena, LOW);
      InterStep = 1000000 / vitesse;
      if (CibleX - XPos < 0) {
        digitalWrite(Dir, LOW);
        Pas = -1;
      }
      else {
        digitalWrite(Dir, HIGH);
        Pas = 1;
      }

      while (XPos != CibleX) {
        XPos += Pas;
        digitalWrite(Step, Etat);
        Etat = !Etat;
        delayMicroseconds(InterStep );
        digitalWrite(Step, Etat);
        Etat = !Etat;
        delayMicroseconds(InterStep );
      }
      // digitalWrite(Ena, HIGH);
     
      lcd.clear();
      lcd.setCursor(3, 0);
      lcd.print("La distance "+Distance);
      lcd.print(XPos);
      lcd.setCursor(2, 1);
      lcd.print("  est atteinte");
     
      Serial.println();
      Serial.println("Le point " + Distance + " est atteint");
      for (int n = 0; n < 4; n++)
        Serial.println();
      delay(2000);
      Messages();
    }

    void PointZero() {

      digitalWrite(Ena, LOW);
      Vitesse = 1000;
      InterStep = 1000000 / Vitesse;
      digitalWrite(Dir, LOW);
      while (digitalRead(Zero) == HIGH) {
        digitalWrite(Step, Etat);
        Etat = !Etat;
        delayMicroseconds(InterStep);
        digitalWrite(Step, Etat);
        Etat = !Etat;
        delayMicroseconds(InterStep);
      }
      XPos = 0;
    }

Portrait de lamy971

Ok le code fonctionne, j'ai modifié quelques inscriptions et quelques position du curseur pour essayer de rentrer les infos importantes. Cependant j'ai des chiffre qui apparaissent quand le position est atteinte, je te mets une photo. Je ne sais pas d'ou cela vient je n'ai pas trouvé. Je te mets le dernier code.

Portrait de lamy971

#include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x27, 16, 2); // Si l'adresse 0x27 par celle trouvé par le scan !
                                        // Raccorder SCL sur A et SDA sur A4 entre le module LCD et l'Arduino
    int Vitesse ;//nombre de pas par seconde
    unsigned long InterStep;
    int Step = 2, Dir = 3, Ena = 4, Zero = 9, BP1 = 14, BP2 = 15, BP3 = 16, BP4 = 17, Pas, X, XPos;
    bool Etat;
    String Distance;

    void setup() {
      Serial.begin(9600);
      pinMode(Dir,  OUTPUT);
      pinMode(Step, OUTPUT);
      pinMode(Ena,  OUTPUT);
      pinMode(Zero, INPUT_PULLUP);
      pinMode(BP1,  INPUT_PULLUP);
      pinMode(BP2,  INPUT_PULLUP);
      pinMode(BP3,  INPUT_PULLUP);
      pinMode(BP4,  INPUT_PULLUP);
      pinMode(Ena,  OUTPUT);
      digitalWrite(Dir, LOW);
      lcd.init();
      lcd.backlight();
      lcd.setCursor(2, 0);
      lcd.print("Recherche du ");
      lcd.setCursor(3, 1);
      lcd.print("point Zero ");
      Serial.println("Recherche du point Zero");
      PointZero();
      Serial.println();
      Serial.println();
      lcd.clear();
      lcd.setCursor(1, 0);

      lcd.print("Le point zero");
      lcd.setCursor(1, 1);

      lcd.print("est initialise");
      delay(3000);
      
      Serial.println("Le point zero est initialisé");
      Messages();
    }

    void loop() {

      if (Serial.available() > 0) {
        int CibleX = Serial.parseInt();
        Serial.readString();
        if ( CibleX < 0 || CibleX > 100000) {
          lcd.clear();
          lcd.setCursor(0, 0);

          lcd.print("La valeur est");
          lcd.print(CibleX);
          lcd.setCursor(1, 1);

          lcd.print("non autorisee");
          Serial.println("La valeur " + String(CibleX) + " n'est pas autorisée");
          Messages();
        }
        else
          PositionX(CibleX, 200,"200");

      }
      if (digitalRead(BP1) == LOW)
        PositionX(1000, 1000,"50 cm");// PositionX( POSTION, VITESSE en pas par seconde)
      if (digitalRead(BP2) == LOW)
        PositionX(4000, 1000,"60 cm");
      if (digitalRead(BP3) == LOW)
        PositionX(8000, 1000,"100 cm");
      if (digitalRead(BP4) == LOW)
        PositionX(20000, 1000,"150 cm");

    }

    void Messages() {
      Serial.println();
      Serial.println();

      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Valeur 0<>100000");
      lcd.setCursor(2, 1);
      lcd.print("  Ou Bp 1 a 4");

      Serial.println("Entrez une Valeur entre 0 et 100000");
      Serial.println();
      Serial.println("Ou appuyez sur un Bouton Poussoir");
    }

    void PositionX( int CibleX, int vitesse, String Distance) {
      Etat = 1;

      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Position "+Distance);
      //lcd.print(CibleX);
      lcd.setCursor(0, 1);
      lcd.print(Distance + " est demande");

      Serial.println("Le point " +Distance + " est demande");
      digitalWrite(Ena, LOW);
      InterStep = 1000000 / vitesse;
      if (CibleX - XPos < 0) {
        digitalWrite(Dir, LOW);
        Pas = -1;
      }
      else {
        digitalWrite(Dir, HIGH);
        Pas = 1;
      }

      while (XPos != CibleX) {
        XPos += Pas;
        digitalWrite(Step, Etat);
        Etat = !Etat;
        delayMicroseconds(InterStep );
        digitalWrite(Step, Etat);
        Etat = !Etat;
        delayMicroseconds(InterStep );
      }
      // digitalWrite(Ena, HIGH);
     
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Position "+Distance);
      lcd.print(XPos);
      lcd.setCursor(0, 1);
      lcd.print("  est ok");//atteinte
     
      Serial.println();
      Serial.println("Le point " +Distance + " est atteint");
      for (int n = 0; n < 4; n++)
        Serial.println();
      delay(4000);
      Messages();
    }

    void PointZero() {

      digitalWrite(Ena, LOW);
      Vitesse = 1000;
      InterStep = 1000000 / Vitesse;
      digitalWrite(Dir, LOW);
      while (digitalRead(Zero) == HIGH) {
        digitalWrite(Step, Etat);
        Etat = !Etat;
        delayMicroseconds(InterStep);
        digitalWrite(Step, Etat);
        Etat = !Etat;
        delayMicroseconds(InterStep);
      }
      XPos = 0;
    }

Portrait de Anonyme

Ou est la photo ?

Portrait de lamy971

Oups j'ai zappé 

Portrait de lamy971

je ne suis pas arrivé à inclure la photo come toi dans le texte

Portrait de lamy971

img_3769.jpg

Pages