Aller au contenu


cook

Inscrit(e) (le) 25 mars 2020
Déconnecté Dernière activité juil. 03 2024 06:25
-----

Sujets que j'ai initiés

moteur pas a pas

01 juillet 2024 - 08:54

Bonjour ,

 

voici un code avec lequel j'ai fait beaucoup d'essais . Il marchais très bien . Mais voila , je le remet en route, mais avec une carte méga 2560 et un nouveau écran LCD 1602A .

Le soucis c'est que le moteur pas a pas ne tourne pas .
Toutes les infos à l'écran s'affichent comme demandé dans le code . Ligne 182 , Start press init pour commencer . Ligne 141 , J'appuis sur le bouton init , l'écran affiche initiatisation en cour , mais le moteur ne tourne pas . Je simule la buté , la led s'allume . L'écran affiche butés à 30 cm comme prévu . tout vas bien coté commande . Tous les boutons et la led fonctionnent .

Mais le moteur ne tourne pas .
 Pour info quand je rentre mon code dans la carte 2560 mega , le moteur tourne , pourquoi je sais pas, mais cela me fait dire que le pilote et moteur fonctionnent .
Le moniteur serie affiche les bonnes infos en fonction du code .
. Je suis perplexe , cela viendrai de la carte qui n'est plus une uno ?

Comment je peux savoir dans le moniteur serie se qui se passe quand j'appuis sur le bouton  init en ce qui concerne le moteur ?

#include <AccelStepper.h>
AccelStepper stepper (1, 0, 1); // 1 pour dire je sais pas. 0 c'est le pul + sur l’arduino et 1 le dir +
#include <LiquidCrystal.h>
LiquidCrystal lcd(9, 8, 7, 6, 5, 4);

const int PinBoutonInit = 26; //Bouton qui déplacera le chariot vers la buté à 30 cm
const int PinContactBute = 42;// Contact qui stope le chariot à 30 cm
const int PinBoutonReglageDistanceCm = 28;//Bouton de reglage distance en Cm
const int PinBoutonReglageDistanceMm = 30;//Bouton de reglage distance en Mm
const int PinBoutonReglageDistancePlus5Mm = 32;//Bouton de reglage distance + 5 Mm
const int PinBoutonReglageDistanceMoins5Mm = 34;//Bouton de reglage distance - 5 Mm
const int PinBoutonConfigurationPlateau = 36;//Bouton pour envoyer les 4 Plateaux à la distance écrite sur écran LCD
const int LED = 37;// initialisation  OK
const float distanceMin = 30.0 ; // reglage mécanique minimum de mon guide
const float distanceMax = 290.0 ; // reglage mécanique maximum de mon guide
//stepper.setPinsInverted(true, false, false);

float  ReglageAffichageDistance   (float NouvelleDistance)  {

  while (digitalRead(PinBoutonReglageDistancePlus5Mm) == 0) {// Bouton + 5 mm
    NouvelleDistance = NouvelleDistance + 0.5 ;
    if (NouvelleDistance > distanceMax ) {
      NouvelleDistance = distanceMin ;
    }
    attendreMs(300);
    Serial.println(NouvelleDistance);
    AfficherLaDistance(NouvelleDistance);
    AfficherLaDistancePouce(NouvelleDistance);
  }

  while (digitalRead(PinBoutonReglageDistanceMoins5Mm) == 0)  { // Bouton - 5 mm
    NouvelleDistance = NouvelleDistance - 0.5 ;
    if (NouvelleDistance < distanceMin ) {
      NouvelleDistance = distanceMax ;
    }
    attendreMs(300);
    Serial.println(NouvelleDistance);
    AfficherLaDistance(NouvelleDistance);
    AfficherLaDistancePouce(NouvelleDistance);
  }


  while (digitalRead(PinBoutonReglageDistanceMm) == 0) { // Bouton réglage des millimetres
    NouvelleDistance = NouvelleDistance + 0.01 ;
    if (NouvelleDistance > distanceMax ) {
      NouvelleDistance = distanceMin ;
    }
    attendreMs(100);
    Serial.println(NouvelleDistance);
    AfficherLaDistance(NouvelleDistance);
    AfficherLaDistancePouce(NouvelleDistance);
  }

  while (digitalRead(PinBoutonReglageDistanceCm ) == 0) { // Bouton réglage des cm

    NouvelleDistance = NouvelleDistance + 1 ;   // Le compteur s'incrémente de 1 cm
    if (NouvelleDistance > distanceMax) {
      NouvelleDistance = distanceMin ;
    }
    attendreMs(200);                            // on attend 500 ms sans utiliser la fonction delay()
    Serial.println(NouvelleDistance);
    AfficherLaDistance(NouvelleDistance);
    AfficherLaDistancePouce(NouvelleDistance);
  }
  return NouvelleDistance;       // quand on a fini d'incrémenter on retourne la valeur au reste du programme
}

int32_t ConversionDistanceCmEnPas (float DistanceEnCm) {   // On met un type d'entier car le nombre de pas c'est un entier
 int32_t DistanceEnPas = DistanceEnCm * 3905.4 ;// 1tour = 11cm = 42960 pas soit 390.54 pas pour 1 mm avec le signe - car inversion
 
 Serial.println("C");   // print utile que pour du débug à commenter ou supprimer plus tard ... 
 Serial.println(DistanceEnPas); // idem
 return DistanceEnPas ; // aprés la conversion, on retourne la valeur au reste du programme
}

void  ConfigurationPlateau (float Distance) {

  if (digitalRead(PinBoutonConfigurationPlateau) == 0)  {

    stepper.moveTo(ConversionDistanceCmEnPas(Distance));// move to prend en paramètre une distance en pas.
    stepper.runToPosition () ;
    attendreMs(100);

  }
  else {
     stepper.stop();
  }
}


void attendreMs (unsigned int attente) {
  unsigned long InstantouJappuis = millis();           // Variable qui enregistre le déroulement du temps qui passe depuis l'appuis
  while (millis() - InstantouJappuis <  attente ) { // décompte de 500ms en cours
  }
}



void  AfficherLaDistance  (float Distance) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print (  " BUTEE " );
  lcd.setCursor(7, 0);
  lcd.print (  Distance  );
  lcd.setCursor(13, 0);
  lcd.print (  " cm "   );
}

void  AfficherLaDistancePouce  (float Distance) {

  lcd.setCursor(1, 1);
  lcd.print (  Distance / 2.54  );
  lcd.setCursor(11, 1);
  lcd.print (  " inch "   );
}



void  AfficherInitTermine () {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print (" Initialisation  "  );
  lcd.setCursor(0, 1 );
  lcd.print (" terminée "  );
  Serial.println ("Initialisation terminée " );
}

void  AfficherInitEnCours () {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print (" Initialisation  "  );
  lcd.setCursor(0, 1 );
  lcd.print (" en cours "  );
  Serial.println (" Initialisation en cours "  );

}

float initMoteur (float InitDistance ) {


  if (digitalRead(PinBoutonInit) == 0) {
    AfficherInitEnCours ();
    stepper.setSpeed(-400);
    
    while (digitalRead(PinContactBute) == 1) {
      
      stepper.runSpeed();
       digitalWrite(37, LOW); // initialisation non réalisé
      // on attends la buté
    }
    stepper.stop(); // On remet à 0 les consignes de vitesse ...
   digitalWrite(37, HIGH);  // initialisation  réalisé

    InitDistance  = distanceMin ;
    stepper. setCurrentPosition (ConversionDistanceCmEnPas(distanceMin)) ;// Permet de mettre le moteur à sa position cible de 30 cm à la butée

  

    Serial.println (InitDistance);

    AfficherInitTermine ();
     attendreMs(1000);
    AfficherLaDistance(InitDistance) ;
  }
  return InitDistance;   // quand on a fini d'initialisé on retourne la valeur au reste du programme
}

void setup() {

  Serial.begin(9600);
  pinMode(26, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
  pinMode(28, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
  pinMode(30, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
  pinMode(32, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
  pinMode(34, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
  pinMode(36, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
  pinMode(42, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
  pinMode(37, OUTPUT);
  stepper.setMaxSpeed(400);
  stepper. setAcceleration (100 ) ;
  lcd.begin(16, 2);
  lcd.print("START PRESS INIT");
}

void loop() {

  static float maDistance = 29; // Variable qui va stocker la distance de consigne
  maDistance = initMoteur (maDistance);  // Permet d'initialisé ma distance sur 30 cm
  maDistance = ReglageAffichageDistance (maDistance); // réglage de la distance de 30 à 290 cm
  Serial.println (maDistance );
  ConfigurationPlateau (maDistance) ;

}

bonton marche arret pour moteur pas à pas

16 mars 2024 - 04:44

Bonjour , 

pour tester la partie mécanique de mon projet , il me faut faire mettre en marche et arrêter   2 moteurs pas à pas simultanément avec l'aide d'un bouton . 

J'ai trouver la solution pour les faires démarrer  avec 1 bouton  , modifier leur vitesses et le nombre de pas en modifiant le code , mais cela ne marche qu'une fois après le téléchargement  . Si j' appuis à nouveau , il ne se passe plus rien . J'ai essayé avec 2 boutons , rien y fait . Mélangé plusieurs codes et fait des essais et liens à tout vas . J'ai lu que la fonction est bloquante  . je tourne en rond . 

Avez vous une idée de ce qu'il faut faire ? 

merci pour votre aide .


#include <AccelStepper.h>
#include <MultiStepper.h>
const int boutonmarche = 12;
const int boutonarret = 13;
int etatboutonmarche = 0;
int etatboutonarret = 0;
const int led = 8;
int etatboutonprecedent = 0;
int motors = 0;
//ccelStepper stepper2(AccelStepper::FULL4WIRE, 6, 7, 8, 9);
//AccelStepper stepper3(AccelStepper::FULL2WIRE, 10, 11);
AccelStepper stepper1(1, 2, 3);   // 1 pour dire je sais pas. 2 c'est le pul + sur l’arduino et 3 le dir +
AccelStepper stepper2(1, 5, 6);   // 1 pour dire je sais pas. 2 c'est le pul + sur l’arduino et 3 le dir +



void setup() {
  // Serial.begin(9600);
  pinMode(boutonmarche, INPUT_PULLUP);
  pinMode(boutonarret, INPUT_PULLUP);
  pinMode(8, OUTPUT);
}
void moteursMarche()  {

  stepper1.setMaxSpeed(1000);
  stepper1.setAcceleration(400);
  stepper1.moveTo(4000);

  stepper2.setMaxSpeed(2000);
  stepper2.setAcceleration(400);
  stepper2.moveTo(800);
  stepper1.run();
  stepper2.run();
  digitalWrite(8, HIGH);
}


void boutondecommande() {
  etatboutonmarche = digitalRead(boutonmarche);
  if ((etatboutonmarche == LOW) && (etatboutonprecedent == HIGH)) {
    motors = 1 - motors ;
  }
  etatboutonprecedent = etatboutonmarche ;
  if ( motors == 1) {
    moteursMarche();
  }
}

void loop() {
  boutondecommande();
}

//Serial.println("avant");
//Serial.print(motors);


Débrancher son driver et son moteur

10 juillet 2022 - 11:44

Bonjour à tous,

 

J'ai mis en route un moteur Nema 17 avec son driver TB 6600 , un Arduino uno et une alimention à découpage en  24 Vdc .

Dès le branchement de  l' alim sur la prise 220v et du l'USB à l'Arduino le moteur se met en route et fait ses aller retour grâce au code BOUNCE de https://www.airspayce.com/.

 

Jusqu'à là tout va bien mais je me souviens plus comment débrancher sans rien abimer ! Il me semble avoir entendu qu'une mauvaise manipulation entrainait une détérioration du matériel . 

 

Faut t'il débrancher l'alim 220 v qui alimente le driver en premier ou l'USB qui alimente l'Arduino ? 

Est 'il mieux de le débrancher le moins possible ?

 

Tous avis sera le bienvenue . Merci pour votre aide.


Guide linéaire motorisé

14 avril 2020 - 01:36

Bonjour à tous ,

en quelques lignes, je vais essayé de vous présenter au mieux mon projet .

Ça fait quelques semaines que je me suis plongé dans l'arduino et mon projet serait de faire fonctionner un guide linéaire motorisé avec un moteur pas à pas nema 17 .

 

"Photo jointe " Fichier joint  CHARIOT LINEAIRE.jpg   18,66 Ko   108 téléchargement(s)

 

Ce guide ou " rail " linéaire est équipé d'un plateau coulissant qui se déplace de gauche à droite avec une butée électrique sur une de ses extrémités .

 

L'idée étant de le faire fonctionner avec du matériel connu et très utilisé sur les vidéos en ligne  . Comme un écran LCD  , quelques boutons poussoirs , une carte uno ,Un pilote TB 6600 .

Dans l'idéal et si nécessaire avec les librairie Accel stepper , one button , liquid cristal .

 

Le mode de fonctionnement , est celui ci :

 

En premier ,comme ce rail est équipé d'un contact de fin de course je souhaiterai avec un bouton poussoir, le diriger vers cette butée réglé à 30,0 cm du bord . En résumé , j’appuie , ,le plateau se déplace et il s’arrête à 30,0 cm du bord . L'écran affiche 30 cm .

 

En second , je souhaiterai afficher sur l'écran avec l'aide d'un bouton poussoir la distance de déplacement situé en 30,0 et 190 cm . Les millimètres sont important .

Pour résumer , je reste appuyé, le menu se déroule sans s’arrêter . Si je fait un appuis il incrémente le compteur au millimètre par millimètre .

 

En troisième appuyer sur un autre bouton poussoir pour effectuer le déplacement du moteur à la distance noté sur l'écran soit de 30,0 à 190,0 cm possible .

 

En quatrième , rajouter deux boutons ,soit un pour faire avancé le plateau de 5 mm par appuis et l'autre pour le faire reculer de 5 mm . La mesure sur l’écran affichera 5 mm de plus ou de moins .

Puis retour à l’étape 1 .

 

 

Voila , j'en suis là ! 

 Bien sur , depuis je lis , je visionne , je teste . Je code , j'allume des leds .

Mais ce n'ai pas suffisant . Je ne sais pas par quel bout le prendre. Par quoi  il faut démarrer pour concrétiser ce code ?

Toute aide sera appréciable .

En vous remerciant .

 

cook.


Carte uno pour accel stepper

25 mars 2020 - 09:07

Bonjour, il y a quelques temps j'ai récupéré un spot professionnel pivotant dans tous les sens . Mais après une chute beaucoup de pièce ont manquées . Il a été réparé avec une carte arduino et un driver stepperonline digital , des explications et un numéro de téléphone en dérangement .

Il n'as plus que un sens unique de marche , mais c'est pas grave . Dans tous les cas ,mécaniquement il n’accepte plus que ça .

Il fonctionne avec constand speed de chez accel stepper . Une petite merveille .

Depuis , pour une question d'usure latérale il a fallu que je retourne le moteur sans penser que le sens de rotation serai plus bon . :Alvarin_07:

Je cherche encore le moyen d'inverser son sens mais électriquement rien y fait . Connaissez vous le bon fil à inverser , non les bons fils ?

 

Bien sur j'ai pensé à modifier son code , mais c'est pas faute d'avoir chercher . Des signes moins de partout , ça marche pas non plus .

Le programme est celui de www.airspayce.com , accel stepper . Il s'appelle constand speed . Je vais modifier le câblage moteur du codage . J'ai un brouillon pour ça,  et du temps en ce moment . Comme beaucoup je me confine .

Si quelqu'un connais un spécialiste accel stepper pour changer son sens ? 

Merci pour votre lecture et si vous pouvez passer le mot .

cook

 

// ConstantSpeed.pde
 
 
#include <AccelStepper.h>
 
AccelStepper stepper (1.5.6)
 
void setupe()
{
stepper.setMaxSpeed ​​(1000);
stepper.setSpeed ​​(50);
}
 
boucle loope ()
{
stepper.runSpeed ​​();
}