Buonasera a tutti, ho 2 cicli: void raccolta_rifiuti_speciali() { distanza_ultrasuoni(); while (i=0 && i <= 3) { if (distanza <= distanza_raccolta) { muovi_destra(100); muovi_braccio1("giù"); muovi_pinza1("apri"); muovi_avanti(100); muovi_pinza1("chiudi"); muovi_indietro(100); muovi_braccio1("su"); muovi_destra(750); } else if (distanza >= distanza_raccolta) { muovi_destra(780); } i++; } }
e l'altro è: void raccolta_rifiuti_speciali_secondo_giro() { distanza_ultrasuoni(); while (i=0 && i <= 3) { if (distanza <= distanza_raccolta) { muovi_destra(100); muovi_braccio2("giù"); muovi_pinza2("apri"); muovi_avanti(100); muovi_pinza2("chiudi"); muovi_indietro(100); muovi_braccio2("su"); muovi_destra(750); } else if (distanza >= distanza_raccolta) { muovi_destra(780); } i++; } }
questi cicli sono principalmente composti da funzioni ad esempio "muovi_destra" "muovi_braccio1/2" e così anche gli altri. Il mio problema è il seguente, devo far muovere 2 bracci per raccogliere 2 oggetti in 3 posizioni prestabilite, ma non so in quale di queste tre case troverò gli oggetti, quindi verifico la presenza con la funzione "ultrasuoni", se vede una distanza minore raccoglie, sennò passa alla prossima area. Pensavo di raccogliere un oggetto abbassando prima il braccio 1 e poi il braccio 2 ma non so come dire all'arduino "se hai raccolto il primo pezzo con il braccio 1, raccogli il secondo con il braccio 2" avrei pensato a scrivere nel monitor seriale "raccolto braccio 1" e con un ciclo simile: if (serial.Read == raccolto braccio 1) { /faccio muovere il secondo braccio per raccogliere il secondo oggetto/} ma chiedo a voi per sapere se c'è un opzione migliore e più veloce.
Per postare il codice in modo che risulti comprensibile devi usare il tag code, il pulsante al centro con la scritta CODE.
Ad esempio per renderlo leggibile io ho usato il simulatore online wokwi, qui di seguito le tue due funzioni:
void raccolta_rifiuti_speciali() {
distanza_ultrasuoni();
while (i == 0 && i <= 3) {
if (distanza <= distanza_raccolta) {
muovi_destra(100);
muovi_braccio1("giù");
muovi_pinza1("apri");
muovi_avanti(100);
muovi_pinza1("chiudi");
muovi_indietro(100);
muovi_braccio1("su");
muovi_destra(750);
} else if (distanza >= distanza_raccolta) {
muovi_destra(780);
}
i++;
}
}
void raccolta_rifiuti_speciali_secondo_giro() {
distanza_ultrasuoni();
while (i == 0 && i <= 3) {
if (distanza <= distanza_raccolta) {
muovi_destra(100);
muovi_braccio2("giù");
muovi_pinza2("apri");
muovi_avanti(100);
muovi_pinza2("chiudi");
muovi_indietro(100);
muovi_braccio2("su");
muovi_destra(750);
} else if (distanza >= distanza_raccolta) {
muovi_destra(780);
}
i++;
}
}
Ci sarebbe da vedere il codice di una delle funzioni che chiami nel while, ad esempio muovi_braccio2("giu"), ad esempio perché passi una literal string?
Per questo tipo di applicazioni occorre uno o più macchine a stati avendo cura che ogni funzioni esegua le operazioni nel più breve tempo possibile e restituisca il controllo alla funzione loop(). Non ci devono essere cicli innestati all'interno della funzione loop. Non ci deve essere alcun delay ma al suo posto si usa millis() come più o meno puoi vedere seguendo questi link.
Ovviamente penso ci sia il modo di verificare che il primo braccio ha raccolto qualcosa almeno con una if. Bisognerebbe vedere tutto il codice, solitamente si usano le classi, ad esempio ti scrivi la classe Braccio e poi ne crei due istanze, passando i parametri al costruttore oppure usando un metodo begin().
Ho il sospetto che quella condizione abbia poco senso in entrambe le forme...
La condizione i <= 3 soddisfa già il caso di i == 0...
Forse voleva essere una inizializzazione prima del ciclo (in stile for).
Sembra proprio che il comportamento che desideri in questo modo non lo puoi ottenere.
Sarebbe pure utile sapere quale arduino stai usando, ad esempio su una Mega c'è sufficiente memoria ram e flash per potere usare un RTOS.
Cerco di capire per indirizzarti. Chiedo ma a te sta bene che esegue prima il ciclo 3 volte di questa funzione void raccolta_rifiuti_speciali()?
Penso di no perché basterebbe chiamare le due funzioni una dietro l'altra. Noto adesso che la chiamata a *distanza_ultrasuoni() non è dentro il ciclo e allora forse questa if:
if (distanza <= distanza_raccolta)
viene valutata 3 volte con i stessi dati non aggiornati.
Puoi allegare tutto lo sketch con il pulsante Upload.
Mi dispiace al momento ne so troppo poco di questo codice e non riesco ad immaginare un suggerimento risolutivo.