fusionner deux code?

bonsoir, etant toujours en phase d’apprentissage, je voudrais savoir comment
fusionner ces deux codes ayant deux fonctions qui m’intéresse.

merci d’avance.

code 1 (stepper potar speed)

#define potmeterPin A0

// defines pins numbers
const int stepPin = 5;
const int dirPin = 2;
const int enPin = 8;

int p;
float delay_time=500;

void setup() {

  Serial.begin(9600);


  // Sets the two pins as Outputs
  pinMode(stepPin,OUTPUT);
  pinMode(dirPin,OUTPUT);

  pinMode(enPin,OUTPUT);
  digitalWrite(enPin,LOW);

  // Set Dir to Home switch
  digitalWrite(dirPin,HIGH); // Enables the motor to move in a particular direction


}
void loop() {

     p = analogRead(potmeterPin);
    delay_time = map(p,0,1023,300,1000);
  
     motorStep(1);

}
void motorStep( int MAX){

   for(int x = 0; x < MAX; x++) {
        digitalWrite(stepPin,HIGH);
        delayMicroseconds(delay_time);
        digitalWrite(stepPin,LOW);
        delayMicroseconds(delay_time);
      }
  
}

code 2 (stepper joystick)

//Declare pin functions on Redboard
#define stp 2
#define dir 3
#define MS1 4
#define MS2 5
#define EN  6

//Declare variables for functions
char user_input;
int x;
int y;
int state;

int joyX = A0;
int joyVal;


void setup() {
 
  pinMode(stp, OUTPUT);
  pinMode(dir, OUTPUT);
  pinMode(MS1, OUTPUT);
  pinMode(MS2, OUTPUT);
  pinMode(EN, OUTPUT);

  digitalWrite(stp, LOW);
  digitalWrite(dir, LOW);
  digitalWrite(MS1, LOW);
  digitalWrite(MS2, LOW);
  digitalWrite(EN, HIGH);
 
  Serial.begin(9600); //Open Serial connection for debugging
  
}

//Main loop
void loop() {
  
   while( (analogRead(joyX) == 0 ) || (analogRead(joyX) > 1000 )){
           joyVal = analogRead(joyX);
           digitalWrite(EN, LOW);
   if( joyVal == 0){
           
      digitalWrite(dir, LOW);
  
   }
   else if( joyVal > 1000){
          
      digitalWrite(dir, HIGH);
   
   }
      digitalWrite(stp,HIGH); //Trigger one step forward
      delay(1);
      digitalWrite(stp,LOW); //Pull step pin low so it can be triggered again
      delay(1);
  
   } // while loop

  digitalWrite(EN, HIGH);
}

Bonsoir,

tu pourras peut-être partir du code que je propose. J’ai utiliser la technique classique bête et méchante :

Ajouter le code du programme 2 après celui du programme 1 dans les parties suivantes (cf. commentaire dans le programme) :

  • déclaration/définition
  • fonctions
  • setup
  • loop

Il y a un piège dans ton programme 2, il peut monopoliser éventuellement assez longtemps le processeur dans sa boucle “while( (analogRead(joyX) == 0 ) || (analogRead(joyX) > 1000 )){ …”. J’ai donc intégré loopProg1 à l’intérieur de cette boucle pour qu’il soit appelé assez souvent.

Je n’ai pas compilé, je n’ai pas testé.

#define potmeterPin A0

// defines pins numbers
const int stepPin = 5;
const int dirPin = 2;
const int enPin = 8;

int p;
float delay_time=500;

// Intégration des déclarations/définitions du programme 2

//Declare pin functions on Redboard
#define stp 2
#define dir 3
#define MS1 4
#define MS2 5
#define EN  6

//Declare variables for functions
char user_input;
int x;
int y;
int state;

int joyX = A0;
int joyVal;

void motorStep( int MAX){

   for(int x = 0; x < MAX; x++) {
        digitalWrite(stepPin,HIGH);
        delayMicroseconds(delay_time);
        digitalWrite(stepPin,LOW);
        delayMicroseconds(delay_time);
      }
 
}

void setup() {

  Serial.begin(9600);


  // Sets the two pins as Outputs
  pinMode(stepPin,OUTPUT);
  pinMode(dirPin,OUTPUT);

  pinMode(enPin,OUTPUT);
  digitalWrite(enPin,LOW);

  // Set Dir to Home switch
  digitalWrite(dirPin,HIGH); // Enables the motor to move in a particular direction

  // intégration du setup du programme 2

  pinMode(stp, OUTPUT);
  pinMode(dir, OUTPUT);
  pinMode(MS1, OUTPUT);
  pinMode(MS2, OUTPUT);
  pinMode(EN, OUTPUT);

  digitalWrite(stp, LOW);
  digitalWrite(dir, LOW);
  digitalWrite(MS1, LOW);
  digitalWrite(MS2, LOW);
  digitalWrite(EN, HIGH);


}

void loopProg1() {

     p = analogRead(potmeterPin);
    delay_time = map(p,0,1023,300,1000);
 
     motorStep(1);


}

void loopProg2() {
while( (analogRead(joyX) == 0 ) || (analogRead(joyX) > 1000 )){
           joyVal = analogRead(joyX);
           digitalWrite(EN, LOW);
   if( joyVal == 0){
           
      digitalWrite(dir, LOW);
 
   }
   else if( joyVal > 1000){
         
      digitalWrite(dir, HIGH);
   
   }
      digitalWrite(stp,HIGH); //Trigger one step forward
      delay(1);
      digitalWrite(stp,LOW); //Pull step pin low so it can be triggered again
      delay(1);

      //// Appel de loopProg1 à chaque tour de cette boucle
      loopProg1();

   } // while loop

  digitalWrite(EN, HIGH);
}

void loop() {
   loopProg2(); // qui appelle loopProg1
}

re bonsoir, merci pour votre aide. cela compile bien mais j’ai rien qui fonctionne :confused:
par contre ya le Xjoy et potar sur A1, c’est ptet ca qui cloche ?

edit: j’ai essayé de changer en A1 à la ligne:
int joyX = A0;

mais rien non plus

Oui, je n'ai pas vérifié c'est peut-être ça. J'ai oublié de fusionner les cartes :wink:

Autre erreur, j'ai oublié d'ajouter loopProg1(); après le commentaire :

//// Appel de loopProg1 à chaque tour de cette boucle

oui cela marche :slight_smile:
mais joystick à droite ou gauche le moteur va que dans le même sens.
autre soucis, par rapport au code (potar speed) le moteur tourne bizarrement coté vitesse.
Je voudrais garder les valeurs de speed du code potar si c’est possible. merci en tout cas,
j’essaye de comprendre au fur et à mesure mais pas facile :slight_smile:

En effet je vois un truc qui va pas.

Si le test (analogRead(joyX) == 0 ) || (analogRead(joyX) > 1000 ) n'est pas vrai l'appel à loopProg1 n'est pas fait. Ajoute également loopProg1(); après la boucle while( (analogRead(joyX) == 0 ) || (analogRead(joyX) > 1000 )).

Par contre je ne comprends pas comment fonctionne ta fonction motorStep. Tu lui passes toujours 1 en paramètre, c'est normal ?

hello,

non toujours le même sens :confused:
malheureusement ce n'est pas moi qui est écris ce code. je ne sais pas te répondre.

Sinon tu pourrais m'aider sur un projet, ou m’aiguiller ?

Je voudrais pouvoir contrôler un moteur avec un joystick, et que le moteur ralentisse et accélère doucement ( peut-être avec AccelStepper ? )

Mais aussi ajouter un potentiomètre pour régler la vitesse nominale.

depuis une semaine j'essaie plein de code ou d'en ecrire un moi même mais je n'arrive pas au résultat voulu
ou bien je trouve les codes mais séparés pour ces fonctions :confused:

bon je commence à trouver mon bonheur :slight_smile:

j’ai enfin un bon code qui utilise accélération et deceleration de “AccelStepper.h” + un joystick.

// Joystick.pde 
// -*- mode: C++ -*- 
// 
// Track forward/reverse speed from a joystick 
// 
// Copyright (C) 2016 Mike McCauley 
// $Id: $ 

#include <AccelStepper.h> 

// Define a stepper and the pins it will use 
AccelStepper stepper(1, 8, 9);//AccelStepper stepper; // Defaults to AccelStepper::FULL4WIRE (4 pins) on 2, 3,4,5

#define JOYSTICK_PIN A0 
#define MAX_SPEED 10000 
#define INPUT_READ_INTERVAL 100 //100 
unsigned long last_input_time = 0; 

void setup() 
{   
  Serial.begin(9600); 
  
  // Change these to suit your stepper if you want 
  stepper.setMaxSpeed(0); 
  stepper.setAcceleration(4000); 
//  stepper.moveTo(1000000000); 
} 

void loop() 
{ 
  // Every INPUT_READ_INTERVAL milliseconds, read inputs. 
  // We do this infrequently to prevent interfering 
  // with the stepper motor high speed stepping 
  // Get the current joystick position as analog value 

  unsigned long current_time = millis(); 
  if (current_time - last_input_time > INPUT_READ_INTERVAL) 
  { 
    int joystick_in = analogRead(JOYSTICK_PIN); 

    //shift the value from [0,1023] range to [-512, 512] range
    joystick_in = map(joystick_in, 0, 1023, -512, 512);

    //deadzone
    if (abs(joystick_in) < 3)
      joystick_in = 0;
    
    // Map the raw analog value to speed range from -MAX_SPEED to MAX_SPEED 
    int desired_speed = map(joystick_in, -512, 512, -MAX_SPEED, MAX_SPEED); 
//    Serial.println(desired_speed); 

    // Based on the input, set targets and max speed 
    stepper.setMaxSpeed(abs(desired_speed)); 
    if (desired_speed == 0 && stepper.speed() == 0) 
    { 
      // Prevent running off the end of the position range 
        stepper.setCurrentPosition(0); 
    } 
    else if (desired_speed < 0) 
    { 
      stepper.moveTo(-1000000000); 
    } 
    else if (desired_speed > 0) 
    { 
      stepper.moveTo(1000000000); 
    } 
    last_input_time = current_time; 
  } 


  stepper.run(); 
}

il me reste à ajouter un potentiomètre pour la vitesse. des idées ?

merci :slight_smile:

Bien ce code :wink:

Tu parles de vitesse nominale, c'est la vitesse maximale que tu souhaites régler (#define MAX_SPEED 10000) avec le potard ? Si c'est le cas remplace "#define MAX_SPEED 10000" par une variable (unsigned MAX_SPEED=10000;) et mets là à jour, en fonction de ce que le potard "retourne", avant de l'utiliser ("int desired_speed = map(joystick_in, -512, 512, -MAX_SPEED, MAX_SPEED); ").

oui la vitesse nominale, dans l’idée ca serait la vitesse max.

Je dois faire un #define speed_pin A0 aussi non ?

Tu m’aider pour le code, je sais pas trop ou mettre tes lignes dans mon code ^^

// Joystick.pde
// -*- mode: C++ -*-
//
// Track forward/reverse speed from a joystick
//
// Copyright (C) 2016 Mike McCauley
// $Id: $

#include <AccelStepper.h>

// Define a stepper and the pins it will use
AccelStepper stepper(1, 8, 9);//AccelStepper stepper; // Defaults to AccelStepper::FULL4WIRE (4 pins) on 2, 3,4,5

#define JOYSTICK_PIN A0

//#define MAX_SPEED 10000
unsigned  MAX_SPEED=10000;

#define INPUT_READ_INTERVAL 100 //100
unsigned long last_input_time = 0;

void setup()
{   
  Serial.begin(9600);
 
  // Change these to suit your stepper if you want
  stepper.setMaxSpeed(0);
  stepper.setAcceleration(4000);
//  stepper.moveTo(1000000000);
}

void loop()
{
  // Every INPUT_READ_INTERVAL milliseconds, read inputs.
  // We do this infrequently to prevent interfering
  // with the stepper motor high speed stepping
  // Get the current joystick position as analog value

  unsigned long current_time = millis();
  if (current_time - last_input_time > INPUT_READ_INTERVAL)
  {
    int joystick_in = analogRead(JOYSTICK_PIN);

    //shift the value from [0,1023] range to [-512, 512] range
    joystick_in = map(joystick_in, 0, 1023, -512, 512);

    //deadzone
    if (abs(joystick_in) < 3)
      joystick_in = 0;
   
   // Il faut mettre à jour MAX_SPEED (donc lire le potentiomètre)
   MAX_SPEED=analogRead...;


    // Map the raw analog value to speed range from -MAX_SPEED to MAX_SPEED
    int desired_speed = map(joystick_in, -512, 512, -MAX_SPEED, MAX_SPEED);
//    Serial.println(desired_speed);

    // Based on the input, set targets and max speed
    stepper.setMaxSpeed(abs(desired_speed));
    if (desired_speed == 0 && stepper.speed() == 0)
    {
      // Prevent running off the end of the position range
        stepper.setCurrentPosition(0);
    }
    else if (desired_speed < 0)
    {
      stepper.moveTo(-1000000000);
    }
    else if (desired_speed > 0)
    {
      stepper.moveTo(1000000000);
    }
    last_input_time = current_time;
  }


  stepper.run();
}

J’ai inséré le code, il te reste à faire la lecture du potentiomètre (voir le commentaire // Il faut mettre à jour MAX_SPEED (donc lire le potentiomètre)).

Je n’ai ni testé ni compilé.

voila ca compile mais ca foire un peu coté vitesse.

j’ai l’impression que ca mélange le SPEED du joystick avec celui du potar

je te met le code modifié si tu vois ou ca bloque

// Joystick.pde
// -*- mode: C++ -*-
//
// Track forward/reverse speed from a joystick
//
// Copyright (C) 2016 Mike McCauley
// $Id: $

#include <AccelStepper.h>

// Define a stepper and the pins it will use
AccelStepper stepper(1, 8, 9);//AccelStepper stepper; // Defaults to AccelStepper::FULL4WIRE (4 pins) on 2, 3,4,5

#define JOYSTICK_PIN A0
//#define MAX_SPEED 10000
unsigned  MAX_SPEED=10000;

// Define our analog pot input pin
#define  SPEED_PIN A1


#define INPUT_READ_INTERVAL 100 //100
unsigned long last_input_time = 0;

void setup()
{   
  Serial.begin(9600);
 
  // Change these to suit your stepper if you want
  stepper.setMaxSpeed(0);
  stepper.setAcceleration(4000);
//  stepper.moveTo(1000000000);
}

void loop()
{
  // Every INPUT_READ_INTERVAL milliseconds, read inputs.
  // We do this infrequently to prevent interfering
  // with the stepper motor high speed stepping
  // Get the current joystick position as analog value

  unsigned long current_time = millis();
  if (current_time - last_input_time > INPUT_READ_INTERVAL)
  {
    int joystick_in = analogRead(JOYSTICK_PIN);

    //shift the value from [0,1023] range to [-512, 512] range
    joystick_in = map(joystick_in, 0, 1023, -512, 512);

    //deadzone
    if (abs(joystick_in) < 3)
      joystick_in = 0;
   
   // Il faut mettre à jour MAX_SPEED (donc lire le potentiomètre)
   MAX_SPEED=analogRead(SPEED_PIN);


    // Map the raw analog value to speed range from -MAX_SPEED to MAX_SPEED
    int desired_speed = map(joystick_in, -512, 512, -MAX_SPEED, MAX_SPEED);
//    Serial.println(desired_speed);

    // Based on the input, set targets and max speed
    stepper.setMaxSpeed(abs(desired_speed));
    if (desired_speed == 0 && stepper.speed() == 0)
    {
      // Prevent running off the end of the position range
        stepper.setCurrentPosition(0);
    }
    else if (desired_speed < 0)
    {
      stepper.moveTo(-1000000000);
    }
    else if (desired_speed > 0)
    {
      stepper.moveTo(1000000000);
    }
    last_input_time = current_time;
  }


  stepper.run();
}

:slight_smile: :slight_smile:

Affiche peut-être MAX_SPEED après l'avoir mis à jour pour vérifier qu'il contient ce que tu penses ?

ah en fait le problème est que si le joystick et au milieu càd à l'arret. Et que si le potar est à 0, le moteur est arreté, mais si le potard est monté, le moteur tourne alors qui devrait pas vu que le joy est au milieu.

chepa si ca te parle. je cherche je cherche mais je bloque

Affiche MAX_SPEED et desired_speed peut-être.

sorry je vois ce que tu veux dire là :confused:

Ce que je veux dire c'est que comme cela je ne vois/comprends pas le problème donc je t'invite à tracer le programme avec des affichages un peu partout pour "voir" et comprendre ou il ne fait pas ce que tu veux.

merci mais je crois que je vais prendre un dev pour le taff, trop compliqué pour moi