Problema con software robot rescue

Ciao a tutti!
Ho un problema con la programmazione del mio robot,
che dovrà gareggiare a delle competizioni di robotica per le superiori,
nella categoria Rescue (non so quanti siano familiari con questo ambiente! :slight_smile: ).
Vi spiego brevemente in cosa consiste la gara:
Il campo di gara del robot è diviso in due zone.

  • Nella prima zona, il robot deve seguire una linea nera,
    ed aggirare degli ostacoli, detto in modo molto riassuntivo.
  • Mentre nella seconda zona (dove il robot entra nella cosiddetta "stanza")
    il robot deve individuare una lattina, prenderla, e portarla in un luogo prefissato.

Ora, il mio problema è questo:

Quando il robot sta nella prima fase (seguire linea, e aggirare gli ostacoli) gli dovrei mettere una programmazione... mentre quando entra nella "Stanza" dovrei dargli altre istruzioni! E non dovrebbe leggere più le istruzioni precedenti...
E' come se dovessi dividere in due il VOID LOOP (ovviamente il VOID SETUP e le dichiarazioni rimarrebbero per tutto il gioco)... è possibile?

spero di aver reso l'idea! :slight_smile:
Grazie Mille in anticipo,

Dario

Una semplice variabile Stato intera che assumerà solo due valori: 0 (non in stanza) oppure 1 (entrato in stanza)
Con un if( Stato==0) else discrimini le due parti del codice
Logicamente nella parte Stato==0 devi anche avere una parte di codice che capisce quando entra in stanza e che mette Stato=1

Giusto! Non ci avevo pensato...
Ma quindi come la dichiaro la variabile?
Grazie mille :slight_smile:

Ampere98:
Giusto! Non ci avevo pensato...
Ma quindi come la dichiaro la variabile?
Grazie mille :slight_smile:

Visto che deve assumere volori 1 o 0 e quindi inferiori a 255 la dichiari così:

byte Stato = 0;

Risparmi memoria (occupa solo 1 byte invece dei 2 che occuperesti dichiarandola come "int").

Ciao

Attilio

Esatto. Se poi vuoi fare il figo:

#define STATO_NOTIN 0
#define STATO_IN 1
byte Stato=STATO_NOTIN;

nid69ita:
Esatto. Se poi vuoi fare il figo:

Se vuoi fare il figo usi una bool :slight_smile:

Dato che qui son tutti "fichi", se invece vuoi fare il ganzo non usi nessuna variabile, ti crei due funzioni, una per l'inseguimento e una per il rescue, entrambe usciranno solo a lavoro completato.

void inseguimento(void)
{
    while( linea_e_ancora_nera() )
    {
        muovitimuoviti();
    }
}

void rescue(void)
{
    while( non_ho_il_gatto_nel_sacco() )
    {
        acquaacquafuoco();
    }
}

void loop(void)
{
    inseguimento();
    rescue();
}

Un'ultima cosa.
Come faccio a tramutare la variabile da 0 ad 1,
quando deve entrare nella stanza?

?? semplice assegnazione. Stato=1;
o la domanda è il quando e quindi dove mettere questa assegnazione nel codice ?

I problemi da risolvere nei compiti del robot, possono essere molto complessi o risolvibili in modo elementare, a seconda dell'approccio e da cosa si vuole ottenere.

Ad esempio, elementare, è aggiungere un pulsante che cambia lo stato di una variabile, in questo modo selezioni manualmente uno dei due programmi esecutivi.

Un approccio più complesso, se nella prima prova hai qualcosa che possa indicare il termine della prova, cambiare lo stato via programma, esempio sai il numero di ostacoli da evitare, con una variabile contatore, li conti :wink: una volta superati cambi stato.

Inutile fare cose complesse, con possibili bug, se poi nessuno terra conto della complessità del programma e o del robot, ma si limiteranno a guardare come si muove :wink: