Go Down

Topic: [Risolto] Gestire velocità motori in modo indipendente. (Read 1 time) previous topic - next topic

Bubz

Sep 29, 2012, 05:41 pm Last Edit: Sep 30, 2012, 02:02 pm by Bubz Reason: 1
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).

Code: [Select]

// 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


Bubz

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

tnx, Bubz

uwefed

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

Bubz

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

Grazie mille, Bubz

Bubz

#4
Sep 30, 2012, 02:03 pm Last Edit: Sep 30, 2012, 02:05 pm by Bubz Reason: 1
Ancora grazie Uwe,
la soluzione è stata semplice con la tua dritta (millis)!!!

Code: [Select]

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

Go Up