Bonjour à tous,
Voilà mon code avec deux moteurs :
//Inclusion des librairies
//------------------------
#include <AccelStepper.h>
#include <LiquidCrystal.h>
// Broches E/S numériques
//-----------------------
int PneumatiqueRouleau = 48; // sortie penumatique
int RelaisFil = 47;
int EnableBobine = 45;
const int BoutonOrigine = 52; // bouton pour lancer prise origine
const int BoutonArret = 50; // bouton pour arreter la machine
const int BoutonMarche = 51; // bouton pour arreter la machine
const int BoutonOuvertureRouleau = 49; // bouton commande pneumatique rouleau en manuel
// Moteur rouleau couteau
//---------
const int Pul1 = 29; // pas couteau
const int Dir1 = 27; // dir couteau --> changer ici pour inverser le sens
unsigned long PasCouteau=0;
AccelStepper Couteau(AccelStepper::DRIVER, Pul1, Dir1);
// Moteur sortie papier
//---------
const int Pul3 = 23; // pas rouleau
const int Dir4 = 25; // dir rouleau --> changer ici pour inverser le sens
unsigned long PasSortie=0;
AccelStepper Sortie(AccelStepper::DRIVER, Pul3, Dir4);
//Gestion des interruptions
//-------------------------
// Autres variables
//-----------------
int EtatArret; // utilisé par le bouton arret
int EtatMarche; // utilise par le bouton marche
int EtatOuvertureRouleau; // utilise par le bouton pour commande pneumatique rouleau
boolean Marche = false;
//***********************************************************************************************
void setup()
{
Serial.begin(9600); // Initialisation du port série à 95600 bits/seconde
// Etat des variables
//---------------------
pinMode(PneumatiqueRouleau, OUTPUT);
digitalWrite(PneumatiqueRouleau, LOW);
pinMode(RelaisFil, OUTPUT);
digitalWrite(RelaisFil, LOW);
pinMode(EnableBobine, OUTPUT);
digitalWrite(EnableBobine, HIGH);
pinMode(BoutonArret, INPUT); // bouton en entree
pinMode(BoutonMarche, INPUT); // bouton en entree
pinMode(BoutonOuvertureRouleau, INPUT);// broche en entree
}// Fin de la fonction Setup
// ****************************************************************************************************
void loop()
{
EtatMarche = digitalRead(BoutonMarche);//
EtatArret = digitalRead(BoutonArret);//
EtatOuvertureRouleau = digitalRead(BoutonOuvertureRouleau);
Couteau.setMaxSpeed(330.0); // vitesse 55 piece = 440
Couteau.setSpeed(330);
Sortie.setMaxSpeed(1700.0);
Sortie.setSpeed(1700);
if(EtatMarche == HIGH) //test si le bouton est activé
{
delay (200) ; // ne pas relire tout de suite l'état, protection anti-rebond
// Serial.println("bouton marche"); // message
Marche = true;
}
if(EtatArret == HIGH) //test si le bouton est activé
{
delay (200) ; // ne pas relire tout de suite l'état, protection anti-rebond
// Serial.println("bouton arret"); // message
Marche = false;
}
if (Marche == true)
{
// Serial.println("Marche");
Couteau.runSpeed();
Sortie.runSpeed();
digitalWrite(RelaisFil, HIGH);
digitalWrite(EnableBobine, LOW);
}
else
{
digitalWrite(RelaisFil, LOW);
digitalWrite(EnableBobine, HIGH);
}
if(EtatOuvertureRouleau == HIGH) //test si le bouton est activé
{
delay (300) ; // ne pas relire tout de suite l'état, protection anti-rebond
Serial.println("Commande ouverture rouleau"); // message
EtatOuvertureRouleau = LOW;
digitalWrite(PneumatiqueRouleau, HIGH);
}
else
{
digitalWrite(PneumatiqueRouleau, LOW);
}
} // fin de la fonction loop()
Avec ce code la variable "Sortie.setMaxSpeed(1700.0);" doit être de 1700
Avec un seul moteur par carte 2560, elle est de 1440 pour la même vitesse.
A part la déclaration de la librairie LCD, il n'y a que des Digital read pour des boutons.
Pour Jean, la librairie Accelstepper est ici : AccelStepper: AccelStepper Class Reference
C'est pour une machine qui coupe du papier.
Pour l'instant, je dois juste commander des rouleaux à une certaine vitesse.
C'est pourquoi j'utilise Accelstepper sans accélération et c'est pourquoi je n'ai pas encore utilisé la boucle de Jean.
Dans le cas présent, pas d'importance si j'ai une perte de pas au lancement.
C'est pas des pas à pas classique mais des servomoteurs Hybride avec des drivers spécifique.
Par la suite, j'ai un plot sur le papier qui commandera le rouleau de coupe pour tourner a un nombre de pas définit.
Mais pour l'instant, la machine est en production sans cette fonction avec une carte mega 2560 par moteur.
Mon client est comptant, ça tourne !
J'essaie juste de comprendre...
J'ai encore beaucoup de fonctions, de boutons, de capteurs, de LCD à ajouter.
Dans ce cas, pourquoi pas continuer à utiliser un arduino par moteur commandé par une interruption.
Une carte principale qui gère les boutons, capteurs, LCD qui communique avec les arduinos esclaves via les interruptions et si je veux changer les vitesses utiliser le protocole I2c par exemple ?
J'ai fait des tests avec un code tout simple :
// MultiStepper.pde
#include <AccelStepper.h>
// Define some steppers and the pins the will use
AccelStepper stepper1(AccelStepper::DRIVER, 22, 26);
AccelStepper stepper2(AccelStepper::DRIVER, 29, 27);
void setup()
{
stepper1.setMaxSpeed(350.0);
stepper1.setAcceleration(1000.0);
stepper1.moveTo(3000000);
stepper2.setMaxSpeed(1440.0);
stepper2.setAcceleration(1000.0);
stepper2.moveTo(-3000000);
}
void loop()
{
stepper1.run();
stepper2.run();
}
Avec ce code basique, je suis à la bonne vitesse.