Go Down

Topic: je n'arrive pas a faire deux actions en même temps (Read 291 times) previous topic - next topic

electronique

Bonjour,

J'aimerais faire clignoter une del plus ou moins vite en fonction de ma résistance variable et mon servo en fonction d'une autre résistance variable.
Mais je n'arrive pas à faire les deux sans qu'une action gêne l'autre.
La del ne clignote pas quand le servo se déplace.

Comment puis-je faire ?

Merci d'avance
Ci joint mon code :

Code: [Select]
#include <Servo.h>

Servo myservo; 

int pin_servo = 8;       // Pin sur lequel est branché le servo
int pos = 0;             // variable permettant de conserver la position du servo
int angle_initial = 5;   //angle initial
int angle_final = 90;   //angle final
int increment = 1;       //incrément entre chaque position
bool angle_actuel = false;//Envoi sur le port série la position courante du servomoteur
int val;
int STROBLED;

const int laser = 3;
int ledState = LOW;
long previousMillis = 0;        // variable pour mémoriser le temps écoulé depuis le dernier changement de la LED





void setup() {
  Serial.begin(9600);
  myservo.attach(pin_servo);  // attache le servo au pin spécifié sur l'objet myservo
  pinMode (laser, OUTPUT);
}


void loop() {

  ////strob-led/////

  STROBLED = analogRead(A1);
  long interval = STROBLED * 3;         //intervalle de clignotement de la LED (en millisecondes)


  unsigned long currentMillis = millis(); // stocke la valeur courante de la fonction millis()

  if (currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;

    // inverse la variable d''état de la LED
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // modifie l'état de la LED
    digitalWrite(laser, ledState);
  }



  /////////////////////

  val = analogRead(A0);

  for (pos = angle_initial; pos <= angle_final; pos += increment) {
    myservo.write(pos);
    val = analogRead(A0);
    delay(val);
    if (angle_actuel) {
      Serial.println(myservo.read());
    }
  }
  delay(4000);



  for (pos = angle_final; pos >= angle_initial; pos -= increment) { // Fait le chemin inverse
    myservo.write(pos);
    val = analogRead(A0);
    delay(val);
    if (angle_actuel) {
      Serial.println(myservo.read());
    }
  }
  delay(4000);
}













J-M-L

il faut virer le delay(4000) sinon ça bloque tout alors que vous voulez faire plusieurs chose en (à peu près) même temps et il faut que vous décomposiez votre boucle for sur le servo en petites étapes comme vous l'avez fait pour le clignotement de la LED en utilisant un top sur millis() pour passer à l'angle suivant et laisser la boucle tourner sans la bloquer (le val de delay(val); est ce que vous devez utiliser pour gérer le temps entre 2 actions avec millis() - mais faut virer ce delay)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

lesept

Je n'ai pas l'habitude des servo mais je pense que tu devrais écrire ton code autour de tes boucles de gestion des servos et inclure dans ces boucles tes tests de gestion du temps qui s'occupent des leds.

Si tu arrives, sans les leds, à avoir un mouvement fluide pour tes servos, l'ajout des leds ne le dégagera pas
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

electronique

Bonjour, merci pour votre aide
Mais je ne voit pas trop
Faut il faire comme cela ?:
Code: [Select]
#include <Servo.h>

Servo myservo;

int pin_servo = 8;       // Pin sur lequel est branché le servo
int pos = 0;             // variable permettant de conserver la position du servo
int angle_initial = 5;   //angle initial
int angle_final = 90;   //angle final
int increment = 1;       //incrément entre chaque position
bool angle_actuel = false;//Envoi sur le port série la position courante du servomoteur
int val;
int STROBLED;

const int laser = 3;
int ledState = LOW;
long previousMillis = 0;
long previousMillisservo = 0; // variable pour mémoriser le temps écoulé depuis le dernier changement de la LED





void setup() {
  Serial.begin(9600);
  myservo.attach(pin_servo);  // attache le servo au pin spécifié sur l'objet myservo
  pinMode (laser, OUTPUT);
}


void loop() {

  STROBLED = analogRead(A1);
  long interval = STROBLED * 3;         //intervalle de clignotement de la LED (en millisecondes)
  unsigned long currentMillis = millis(); // stocke la valeur courante de la fonction millis()
  long intervalsservo = val;
  val = analogRead(A0);

  for (pos = angle_initial; pos <= angle_final; pos += increment) {
    if (currentMillis - previousMillisservo > intervalsservo) {
      previousMillisservo = currentMillis;
      myservo.write(pos);
    }

    if (currentMillis - previousMillis > interval) {
      previousMillis = currentMillis;

      // inverse la variable d''état de la LED
      if (ledState == LOW)
        ledState = HIGH;
      else
        ledState = LOW;

      // modifie l'état de la LED
      digitalWrite(laser, ledState);
    }

  }




  for (pos = angle_final; pos >= angle_initial; pos -= increment) { // Fait le chemin inverse
    if (currentMillis - previousMillisservo > intervalsservo) {
      previousMillisservo = currentMillis;
      myservo.write(pos);
    }
    if (currentMillis - previousMillis > interval) {
      previousMillis = currentMillis;

      // inverse la variable d''état de la LED
      if (ledState == LOW)
        ledState = HIGH;
      else
        ledState = LOW;

      // modifie l'état de la LED
      digitalWrite(laser, ledState);
    }
  }






}
















J-M-L

Non il faut virer la boucle for. c'est la loop() qui va vous servir de boucle et vous décidez en fonction de millis() si vous déclenchez un pas du moteur
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

electronique

#5
Nov 25, 2018, 02:30 pm Last Edit: Nov 25, 2018, 02:52 pm by electronique
Faut il faire comme ceci ?
Code: [Select]
#include <Servo.h>
///t/est///
Servo myservo;

int pin_servo = 8;       // Pin sur lequel est branché le servo
int pos = 0;             // variable permettant de conserver la position du servo
int angle_initial = 5;   //angle initial
int angle_final = 90;   //angle final
int increment = 1;       //incrément entre chaque position
int val;
int STROBLED;

const int laser = 3;
int ledState = LOW;
long previousMillis = 0;
long previousMillisservo = 0; // variable pour mémoriser le temps écoulé depuis le dernier changement de la LED







void setup() {
  Serial.begin(9600);
  myservo.attach(pin_servo);  // attache le servo au pin spécifié sur l'objet myservo
  pinMode (laser, OUTPUT);
}


void loop() {

  STROBLED = analogRead(A1);
  val = analogRead(A0);
  long interval = STROBLED * 3;         //intervalle de clignotement de la LED (en millisecondes)
  long intervalsservo = val;
  unsigned long currentMillis = millis(); // stocke la valeur courante de la fonction millis()


  if (pos <= angle_final) {

    if (currentMillis - previousMillisservo > intervalsservo) {
      previousMillisservo = currentMillis;
      pos += increment;
      myservo.write(pos);
    }
  }

  if (currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;

    // inverse la variable d''état de la LED
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // modifie l'état de la LED
    digitalWrite(laser, ledState);
  }



  if (pos >= angle_initial) { // Fait le chemin inverse


    if (currentMillis - previousMillisservo > intervalsservo) {
      previousMillisservo = currentMillis;
      pos -= increment;
      myservo.write(pos);
    }
  }


}















electronique

#6
Nov 25, 2018, 03:29 pm Last Edit: Nov 25, 2018, 03:30 pm by electronique
je ne voit pas comment transformer cette ligne
Code: [Select]
for (pos = angle_initial; pos <= angle_final; pos += increment)
sans mettre de for

J-M-L

je ne voit pas comment transformer cette ligne
Code: [Select]
for (pos = angle_initial; pos <= angle_final; pos += increment)
sans mettre de for
c'est la loop() qui tourne qui fait le for

regardez ce code par exemple:
Code: [Select]
int pos = 0;                  // variable permettant de conserver la position du servo
const int angle_initial = 5;  //angle initial
const int angle_final = 90;   //angle final
int increment = 1;            //incrément entre chaque position
int val;

unsigned long topServo = 0;

void setup() {
  Serial.begin(115200);
  pos = angle_initial;
  Serial.print(F("Servo en angle=")); Serial.println(pos);
}

void loop() {
  val = 100; // utilisez analogRead(A0) pour faire varier la vitesse entre 2 pas, ici je fixe à 0,1s
  if (millis() - topServo >= val) {
    pos += increment;
    Serial.print(F("Servo en angle=")); Serial.println(pos);
    if ((pos >= angle_final) || (pos <= angle_initial)) increment = -increment;
    topServo += val;
  }
}
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

electronique


Go Up