[Risolto] Gestire velocità motori in modo indipendente.

Ciao a tutti,
sono un super newbie come programmatore e utilizzatore di arduino. Sto facendo dei test con dei motori passo passo, però ho un dubbio: arduino può gestire in modo indipendente parti di programma? Mi spiego meglio: quello che sto tentando di fare è far muovere i motori a velocità diversa tra di loro ma come si può vedere nel listato sotto le velocità dei motori interferiscono tra loro (perchè il programma viene "letto" sequenzialmente).

// Stepper motor: random speed, direction & round. 3310 lcd display. 

int step_a_ = 5;
int step_b_ = 10;
int speed_a_;
int speed_b_;
int round_a_;
int round_b_;
int direction_a_;
int direction_b_;
int a = 1000;
int b = 1000;




void setup(void)
{
  pinMode(step_a_, OUTPUT); 
  pinMode(step_a_ + 1, OUTPUT); 
  pinMode(step_a_ + 2, OUTPUT); 
  pinMode(step_a_ + 3, OUTPUT);
  pinMode(step_b_, OUTPUT); 
  pinMode(step_b_ + 1, OUTPUT); 
  pinMode(step_b_ + 2, OUTPUT); 
  pinMode(step_b_ + 3, OUTPUT);
  randomSeed(analogRead(0));
}



void loop(void)
{
  
  if (a >= (round_a_ * 200) ) {
    speed_a_ = random (1, 6); round_a_ = random (1, 6); direction_a_ = random (1,3); if (direction_a_ == 2) direction_a_ = -1; a = 0; 
  }
  
    if (b >= (round_b_ * 48) ) {
    speed_b_ = random (4, 9); round_b_ = random (1, 6); direction_b_ = random (1,3); if (direction_b_ == 2) direction_b_ = -1; b = 0; 
  }
 
    digitalWrite(step_a_, LOW);
    step_a_ = step_a_ + direction_a_;
    a++;
    if (step_a_ < 5) step_a_ = 8; 
    if (step_a_ > 8) step_a_ = 5; 
    digitalWrite(step_a_,HIGH);

    
    digitalWrite(step_b_, LOW);
    step_b_ = step_b_ + direction_b_;
    b++;
    if (step_b_ < 10) step_b_ = 13; 
    if (step_b_ > 13) step_b_ = 10; 
    digitalWrite(step_b_,HIGH);
    delay(speed_b_); 
    digitalWrite(step_a_, LOW);

Bubz

Spero di non scrivere bestialità, per far capire la mia domanda: posso far "funzionare" autonomamente (si dice multitask???) parti di programma?

tnx, Bubz

Multitasking significa che 2 o piú programmi vengano eseguiti in quasiparalello perché si da a ognuno una parte del tempo e tutte le risorse del Computer. Processori possono essere ottimizzati per questo e il sistema operativo deve prevederlo perché a ogni cambio devono essere memorizzate lo stato del programma da fermare e ricaricato lo stato di esecuzione di quello che incomincia. NElle proprietá condivise si chaiama questo "time sharing".

Arduino non ha un sistema operativo. Non é costruito per un multitasking.
La risposta é nó. Non puoi fare eseguire 2 sketch in quasi-contemporanea.

Devi Tu programmare lo sketch in modo che le 2 cose possano funzionare entrambe e non essere disturbate dal altra funzione.
Non devi usare delay per i ritardi ma millis come descritto nel sketch http://arduino.cc/en/Tutorial/BlinkWithoutDelay

Ciao Uwe

Very Tnx Uwe,
domani, mi studio bene l'esempio che mi hai segnalato e l'istruzione millis.

Grazie mille, Bubz

Ancora grazie Uwe,
la soluzione è stata semplice con la tua dritta (millis)!!!

int step_a_ = 8, off_a_, round_a_, direction_a_, speed_a_;
int step_b_ = 4, off_b_, round_b_, direction_b_, speed_b_;

int a = 10000;
int b = 10000;
unsigned long time=0;
unsigned long stepper_1 =0;
unsigned long stepper_2 =0;

void setup(void)
{

  pinMode(step_a_, OUTPUT); 
  pinMode(step_a_ + 1, OUTPUT); 
  pinMode(step_a_ + 2, OUTPUT); 
  pinMode(step_a_ + 3, OUTPUT);
  pinMode(step_b_, OUTPUT); 
  pinMode(step_b_ + 1, OUTPUT); 
  pinMode(step_b_ + 2, OUTPUT); 
  pinMode(step_b_ + 3, OUTPUT);
  randomSeed(analogRead(0));

}
void loop(void){
  

  if (a > (round_a_ * 200)) { 
    a = 0, round_a_ = random (1,5), speed_a_ = random(1,5), direction_a_ = random (1,3);
    if (direction_a_ == 2) { 
      direction_a_ = -1;
    }
  }
  if (b > (round_b_ * 48)) { 
    b = 0, round_b_ = random (1,5), speed_b_ = random(5,8), direction_b_ = random (1,3);
    if (direction_b_ == 2) { 
      direction_b_ = -1;
    }
  }

  time = millis(); 
  stepper_1_treadh(); 
  stepper_2_treadh();
}



void stepper_1_treadh() {  
  if((stepper_1+speed_a_)<time){
    digitalWrite(off_a_,LOW);
    step_a_ = step_a_ + direction_a_; 
    if (step_a_ < 8) step_a_ = 11; 
    if (step_a_ > 11) step_a_ = 8; 
    off_a_ = step_a_;
    digitalWrite(step_a_,HIGH);
    a = a + 1;
    stepper_1 = millis();
  }
}

void stepper_2_treadh() {  
  if((stepper_2+speed_b_)<time){
    digitalWrite(off_b_,LOW);
    step_b_ = step_b_ + direction_b_; 
    if (step_b_ < 4) step_b_ = 7; 
    if (step_b_ > 7) step_b_ = 4; 
    off_b_ = step_b_;
    digitalWrite(step_b_,HIGH);
    b = b + 1;
    stepper_2 = millis();
  }
}

Bubz