ciao a tutti
scusate ma ricordo di averlo letto, ma non riesco più a trovare una cosa.
come far partire una funzione e mentre la prima fa alcune cose per esempio per 10 secondi ne faccio partire un' altra?
quindi:
tempo -->---------------------------
f1 |-----------------|
f2 |--------------|
ciao, non è possibile che girino contemporaneamente, quello che puoi fare è
tempo -->---------------------------
f1 |-----/pausa/pausa/------------|
f2 |--------------|
esisterebbe un sistema si basa sulla funzione millis() dell'arduino, se cerchi arduino multitasking trovi qualcosa... ma dicci con precisione cosa devi fare: se è per accendere 2 relè dai l'impulso di accenderne uno, metti un delay e accendi l'altro, poi altro delay e spegni il secondo altro delay e spegni il primo
allora
ho collegato alcuni shiftregister (sh) e alcuni tlc5940 (tl) per animare dei led.(accendere in sequenze).
forse ho una visione troppo orientata agli oggetti e quindi per ciclare loop per ogni ic folevo fare con cicli separati , forse li devo unire e fare un po' tutto 'a mano'. :o
mentre gli shift register mandano a tempi casuali un 'animazione tipo scia , i tlc mandano effetti di fading o rimangono accesi. il tutto intersecandosi nel tempo.
a mano sarebbe
loop(){
imposta_shiftregisterS ( valore_nuovo_sh )
imposta_tlcS (valore_nuovo_tlc)
imposta_shiftregisterS ( valore_nuovo_sh )
delay(1000) // lo faccio per il tlc
imposta_tlcS (valore_nuovo_tlc)
[TEMPO SBAGLIATO] imposta_shiftregisterS ( valore_nuovo_sh ) // qui mi ha fatto aspettare troppo per il tempo suo
imposta_tlcS (valore_nuovo_tlc)
...
}
ma le due funzioni le vorrei indipendenti dato che gli sh comandano led [ che sono indipendenti dagli altri sui tlc (cioè con ritmi diversi)] e dei chip audio . e i tlc comandano led che fanno delle cose a intervalli regolari e precisi.
esisterebbe un sistema si basa sulla funzione millis() dell'arduino, se cerchi arduino multitasking trovi qualcosa... ma dicci con precisione cosa devi fare: se è per accendere 2 relè dai l'impulso di accenderne uno, metti un delay e accendi l'altro, poi altro delay e spegni il secondo altro delay e spegni il primo
Quello di cui parli è finto parallelismo, basato sul fatto che se esegui le due funzioni smontandole a blocchi da eseguire abbastanza velocemente SEMBRANO eseguite in parallelo... Ed ecco il parallelismo pre multi-core e multi-processore (leggi fino al pentium4 per gli utenti normali).
Il finto parallelismo funziona come descritto da frog
stefanosky Il vero segreto per quello che vuoi fare è NON usare funzioni dette bloccanti come il delay(che impallano il codice per X milli/micro secondi) ma usare funzioni non bloccanti tipo micro() o millis().
esempio:
/*accendo/spengo un led per 1000 millisecondi e poi lo spengo, nel frattempo continuo a leggere dati dal pin analogico 1--codice scritto al volo, non testato nè ricontrollato*/
long lastReadMillis = millis();
int ledAcceso=0;
void loop(){
if (lastReadMillis+1000<millis(){
if (ledAcceso){
spegniLed();
ledAcceso=0;
}else{
accendiLed();
ledAcceso=1;
}
lastReadMillis=millis();
}
int valoreAnalogico=analogRead(1);
}
quindi il tempo lo dovrei gestire tutto nell'if con millis?
si. delay funziona così (poi non so se il codice è giusto)
long inizio = millis();
while(inizio+delay<millis){}
se tu al posto del while metti l'if, e rendi inizio una variabile globale in modo da sopravvivere alla "morte & rinascita" della funzione loop, il while viene sostituito dal loop(), ma tu puoi continuare a eseguire il tuo codice come se nulla fosse
cmq se programmi ad oggetti potresti usare il c++, magari ti viene più facile
Vi ringrazio tantissimo per aver avviato questa discussione,
stavo giusto tentando di eseguire 4 funzioni (cicliche) in contemporanea, al fine di controllare altrettandi motori passo passo per una mini-fresa cnc che stò costruendo.
Volendo evitare di aquistare quattro Arduini+schede motori passo passo stò scrivendo il codice per poter eseguire il tutto con un solo Arduino mega.
Mi ero appunto "impallato" sul controllo contemporaneo dei quattro assi, quando ho trovato questa discussione.
C'è magari qualcuno che ha precedentemente tentato di risolvere un problema simile con i motori passo passo e che può aiutarmi in qualche modo sull'esecuzione contemporanea dei quattro cicli?
Grazie, Eureka
int inizio1 = 1000;
int passo1 = 2000;
setup(){
tempo = millis();
tempoFunzione=millis()
}
loop(){
// riprendo il tempo
tempo = millis();
// controllo per l'inizio
if(tempo>tempoFunzione+inizio1){
lanciaFunzione();
// controllo per l'azzeramento del tempoFunzione
if(tempo>(tempoFunzione+inizio1+passo1)){
tempoFunzione=millis();
}
}
}
spero di essere stato utile per qualcun'altro
o se avete migliorie da consigliare
ciao
dunque, se non erro succede questo:
per 1000 millis non fai nulla, poi per 2000 continui a lanciare la funzione (una volta ogni loop), e poi ritorni al principio a far niente per 1000... esatto?
la notte porta consiglio
io preferisco scrivere codice la notte, c'è più silenzio per concentrarsi e praticamente nessuna distrazione. In quei momenti di ispirazione ti accorgi che le dita son troppo lente