Projet prehenseur votre avis compte :)

bonjour,

je suis nouveau dans le monde de l’Arduino et de l'automatisme (programmation en général).
pour être honnête je n'y connais rien (sauf depuis un bon mois :slight_smile: )

à force de recherche et de patience j'ai réussi à faire ce que je voulais, mais je pense qu'avec un regard plus aguerrie je vais encore en apprendre et améliorer mon projet:

matériels utilisés:
arduino mega 2560
afficheur I2C LCD 16x2
4x4 clavier pavé numérique à membrane
moteur pas à pas nema17
controleur tb6600

principe de fonctionnement:
au démarrage le moteur s'initialise sur sa position mini
la touche A fait faire un certain nombre de tour au moteur
la B ,C et D aussi, avec l'affichage de la consigne correspondante.
il y a deux touches de mouvement manuel
il y a deux fins de course de sécurité (ou prise d'origine)
la touche * ramène à l'origine + quelques tours
la touche # stop le moteur

ci dessous le code :je tiens à m'excuser si ça vous brule les yeux



// librairies
#include <Keypad.h>
#include "LiquidCrystal_I2C.h"
#include "Wire.h"
#include <AccelStepper.h>

//constantes
const int stepsPerRevolution = 800;  // Nombre de pas du servomoteur
const byte ROWS = 4; //nombre de lignes
const byte COLS = 4; //nombre de colonnes
const int led_rouge = 32;                       // pin 32 led rouge
const int led_verte = 34;                       // pin 34 led verte
const int fin_1 = 42;                           // pin 42 fin de course 1
const int fin_2 = 44;                           // pin 44 fin de course 1
const int bouton_noir = 48;                     // pin 48 bouton noir
const int bouton_rouge = 50;                    // pin 50 bouton rouge
int val = 0;     // variable pour mémoriser la valeur lue

#define STEPPIN 10 // 
#define DIRPIN 11 //  
#define TYPE_INTERFACE_MOTEUR 1

char touche;
char touches[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; //entrées numériques où sont branchées les lignes
byte colPins[COLS] = {5, 4, 3, 2}; //entrées numériques où sont branchées les colonnes

Keypad clavier = Keypad ( makeKeymap (touches), rowPins, colPins, ROWS, COLS );
LiquidCrystal_I2C LCD(0x27, 16, 2); // définit le type d'écran lcd 16 x 2
AccelStepper stepper = AccelStepper ( AccelStepper::DRIVER, STEPPIN, DIRPIN) ;



void setup() {
  {
    Serial.begin (115200) ;
    LCD.init(); // initialisation de l'afficheur
    LCD.setBacklight(HIGH);
    LCD.home ();
    LCD.setCursor(1, 0);
    LCD.print("hello lolo");

    LCD.setCursor(1, 1);
    LCD.print("attendre");

    pinMode(fin_1, INPUT_PULLUP); // capteur de Prise d'origine ,butée stop
    pinMode(fin_2, INPUT_PULLUP); // capteur de Prise d'origine ,butée stop
    pinMode(bouton_noir, INPUT_PULLUP); // deplacement droite
    pinMode(bouton_rouge, INPUT_PULLUP); // deplacement gauche
    pinMode(led_rouge, OUTPUT); // voyant defaut ou attendre
    pinMode(led_verte, OUTPUT); // voyant ok
    digitalWrite (fin_1, HIGH);
    digitalWrite (fin_2, HIGH);
    digitalWrite (bouton_noir, HIGH);
    digitalWrite (bouton_rouge, HIGH);
    pinMode(STEPPIN, OUTPUT);
    pinMode(DIRPIN, OUTPUT);

    stepper.setMaxSpeed(6000.0);
    stepper.setAcceleration(1000.0);
    stepper.moveTo(-1000000000);
    stepper.run();
    val = digitalRead(fin_1);
    while (val == HIGH) // tant que le moteur n'est pas à sa position d'origine je tourne et allume le voyant rouge
    {
      stepper.run();
      digitalWrite(led_rouge, 1);
      val = digitalRead(fin_1);
    }
    digitalWrite(led_verte, 1);
    digitalWrite(led_rouge, 0);
    delay(1000);
    stepper.setCurrentPosition(0);
  }
  {
    LCD.clear();
    LCD.setCursor(1, 0);
    LCD.print("hello lolo");
    LCD.setCursor(1, 1);
    LCD.print("choisir A,B,C,D");
  }
  while (val == LOW)
  {
    val = digitalRead(fin_1); stepper.moveTo(600); stepper.run();
  }
}


void loop() {
  {
    if (digitalRead(fin_1) == 0) // teste si le fin de course a une valeur de 1
      // ...on efface l'ecran , on affiche SECU et on stop le moteur
    {
      stepper.stop(); LCD.clear() ; LCD.setCursor(1, 0); LCD.print("securite"); LCD.setCursor(1, 1); LCD.print("STOP");
    }
    if (digitalRead(fin_2) == 0) // teste si le fin de course a une valeur de 1
      // ...on efface l'ecran , on affiche SECU et on stop le moteur
    {
      stepper.stop(); LCD.clear() ; LCD.setCursor(1, 0); LCD.print("securite"); LCD.setCursor(1, 1); LCD.print("STOP");
    }

    {
      touche = clavier.getKey();

      if (touche != NO_KEY) // si une touche a été frappée -- gestion de la touche appuyée
      {
        if (touche == 'A') {
          LCD.clear() ; LCD.setCursor(1, 0); LCD.print("votre choix"); LCD.setCursor(1, 1); LCD.print("A = 35");
        }
        else if (touche == 'B') {
          LCD.clear() ; LCD.setCursor(1, 0); LCD.print("votre choix"); LCD.setCursor(1, 1);  LCD.print("B = 40");
        }
        else if (touche == 'C') {
          LCD.clear() ; LCD.setCursor(1, 0); LCD.print("votre choix"); LCD.setCursor(1, 1);  LCD.print("C = 42-45");
        }
        else if (touche == 'D') {
          LCD.clear() ; LCD.setCursor(1, 0); LCD.print("votre choix"); LCD.setCursor(1, 1); LCD.print("D = 50");
        }
        else if (touche == '#') {
          LCD.clear() ; LCD.setCursor(6, 0); LCD.print("STOP"); LCD.setCursor(7, 1); LCD.print("MANU");
        }
        else if (touche == '*') {
          LCD.clear() ; LCD.setCursor(1, 0); LCD.print("position mini"); LCD.setCursor(7, 1); LCD.print("=0");

        }

      }
      if (touche == 'A') stepper.moveTo(40960);
      stepper.run();
      if (touche == 'B') stepper.moveTo(81920);
      stepper.run();
      if (touche == 'C') stepper.moveTo(122880);
      stepper.run();
      if (touche == 'D') stepper.moveTo(163840);
      stepper.run();
      if (touche == '#') stepper.stop();
      stepper.run();
      if (touche == '*') stepper.moveTo(600);
      stepper.run();

    }
  }
  if (digitalRead(bouton_noir) == 0) // teste si le bouton a une valeur de 1
    // ...on fait tourner le moteur
  {
    stepper.setSpeed(1000); stepper.move(10); stepper.runSpeed();
  }
  if (digitalRead(bouton_rouge) == 0) // teste si le bouton a une valeur de 1
    // ...on fait tourner le moteur dans l'autre sens
  {
    stepper.setSpeed(-1000); stepper.move(-10); stepper.runSpeed();
  }
}

et voila encore dsl en plus il n'y a pas les couleurs!?
à vos claviers, j'attends vos remarques et critiques constructives :wink:

message posté au mauvaise endroit, cette partie du forum accueille les projets FINIS
Déplacé dans la racine du forum français.

Merci de lire les bonnes pratiques du forum

Il y a une erreur sur cette instruction. Ce n'est pas faire tourner le moteur jusqu'à la position voulue comme le fait d'autres bibliothèques, mais cela signifie avance d'un pas si c'est l'heure de le faire. Pour faire avancer un moteur avec cette bibliothèque, il faut demander la position et boucler stepper.run() jusqu'à ce qu'il arrive au bout.

Pour ton code, il faut en gros supprimer tous les stepper.run() et en mettre un seul en fin de loop(). Vu que dans loop() il n'y a pas de partie bloquante (loop boucle rapidement) cela devrait fonctionner.

Actuellement, loop() boucle et la présence de nombreux stepper.run() fait le travail.

La deuxième ligne ne sert à rien, écrire cette deuxième ligne pour une entrée met la résistance de pullup. Mais c'est déja fait par la première ligne.
Au passage, on peut supprimer la première ligne et laisser la deuxième? C'est peu compréhensible, mais à l'initialisation les broches sont en entrée et la deuxième ligne met la résistance de pull up en service. Mais il vaut mieux un code compréhensif.

Dans la doc de setSpeed il est indiqué " Speeds of more than 1000 steps per second are unreliable" C'est pas la peine de mettre 6000, il n'y arrivera pas. Si tu veux ces vitesses, vois ma bibliothèque quickStep.

setSpeed, c'est la vitesse en pas/s, je ne suis pas sûr qu'un nombre négatif soit bien interprété. C'est le cas de stepper, mais pas de accelStepper.

bonjour,
oups fdufnews ,je pensais mon projet fini donc au bonne endroit. ainsi soit il :wink: ... merci pour la correction

merci vileroi pour les infos, j'ai corrigé les différentes remarques que tu as émises et je ne manquerai pas prochainement d'essayer quickstep par curiosité .
Par contre pour la vitesse max je peux monter à 4000 au dessous je vois la différence au delà ça ne change rien et si je ne mets pas stepper.setSpeed(-1000); ça ne tourne pas dans l'autre sens!?

Autant pour moi, il semble que si.

Bonjour lolo8222

Il me semble plus logique que pour inverser le sens de rotation, de mettre une valeur de déplacement négative, comme mystepper.move(-400);

Cordialement
jpbbricole

bonjour,

effectivement jpbbricole c'est ce que pensait mais si j'enleve stepper.setSpeed(-1000); dans la ligne stepper.setSpeed(-1000); stepper.move(-10); stepper.runSpeed(); ca ne tourne pas dans l'autre sens ... je ne comprend pas pourquoi.

D'après ce que je comprends, supposer que l'on écrit:
stepper.setSpeed(-1000); stepper.move(-10); runToPosition();
Quand on fait stepper.setSpeed(-1000);, la direction est mémorisée sens antihoraire. Quand on fait stepper.move(-10); on ignore l'ancienne valeur de la direction et on fixe alors la direction antihoraire. J'ai l'impression que:
stepper.setSpeed(-1000); stepper.move(-10); runToPosition();
et
stepper.setSpeed(+1000); stepper.move(-10); runToPosition();
et
stepper.move(-10); stepper.setSpeed(-1000); runToPosition();
et
stepper.move(+10); stepper.setSpeed(-1000); runToPosition();

sont tous équivalents, car pour le sens, c'est le dernier ordre qui compte. Comme d'habitude on utilise d'abord setSpeed (souvent qu'une fois d'ailleurs), on peut y mettre la valeur absolue.

:slight_smile: il y a une suite à ce projet :LCDKeypad+tb6600+arduinomega :wink:

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