Il software

Condividi

Per le gestione e organizzazione del software abbiamo utilizzato il classico modo di operare nel linguaggio C. Abbiamo prima di tutto impiegato del tempo per capire il software precedentemente utilizzato. Ci siamo organizzati dividendoci per di migliorare le singole routine, ognuno di noi adoperava su una singola.
Il main(o programma principale) viene riordinato compreso e modificato. Il main è strutturato in diverse fasi:
- Fase di POST (Power On Self Test) in cui si effettua un test delle risorse fondamentali (Dip Switch, LED, Display, Timer, UART, Memoria) per avere una indicazione sulla corretta configurazione della FPGA tramite la bitstream contenuta nella memoria flash e di una altrettanto buona partenza del main;
- Fase di inizializzazione: nella fase di inizializzazione(oppure fase di INIT) vengono inserite tutte le inizializzazione dell'hardware: inizializzazione delle porte di IO standard presenti sulla Nexys2; inizializzazione del controllo dei motori; assegna i valori di default al controllo di luminosità;
- Fase di taratura: determina le soglie di riferimento dei livelli di riflessione dei sensori di luminosità inferiori e frontali. In questa fase si determina anche la sensibilità, il divisore di frequenza del post-scaler e la base tempi di misura da impostare sui sensori;
- Loop principale: nel loop principale vengono chiamate ed eseguite le routine inserite in un ciclo infinito. Nel nostro caso,abbiamo preferito suddividere il loop principale in un "Grande" CASE( istruzione del linguaggio C) nel quale vengono rappresentate le situazioni in cui si potrà trovare il robot durante lo svolgimento del tragitto, però questa volta anche i case precedenti vengono tenuti da conto per avere una memoria passata.
Il "Grande Case" è strutturato in quattro stati differenti e rappresenta un automa a stati finiti, le cui transizioni di stato indicano i diversi contesti operativi di Nessie:

  1. Percorso con inseguimento della traccia: caso in cui il robot sta seguendo la linea nera tracciata sulla pista. Dalla partenza, il robot dovrà superare varie stanze seguendo solamente una linea nera tracciata sulla superficie utilizzando i sensori di luminosità posti nella parte inferiore del robot.
  2. Ostacolo: durante il percorso, è necessaria una routine che permetta il superamento di un eventuale ostacolo presente sul tracciato. Siccome l'ostacolo, in base al regolamento, si potrà trovare solamente nella "Seconda stanza" mentre la vittima sarà sicuramente nella "Terza", in questa fase non sarà necessario tentare di identificare l'ostacolo per discernerlo dalla vittima.
  3. Rampa: all'uscita della Seconda stanza,il robot, per accedere alla successiva,dovrà necessariamente superare una rampa con inclinazione nota. Nel nostro caso, per identificare la presenza della rampa, utilizziamo un circuito di "tilting" in grado di rilevare l'inclinazione del piano di avanzamento del robot. Alla fine della rampa, sulla superficie sarà posta una striscia trasversale di materiale riflettente che identificherà l'inizio della Terza e ultima stanza e, quindi, il passaggio allo stato finale.
  4. Cerca vittima: fase di ricerca della vittima nell'ultima stanza. Il robot dovrà localizzare la "vittima" all'interno del piano senza nessun tracciato da seguire; dovrà, attraverso la pinza, sollevare la vittima e portarla "al sicuro" su una specifica piattaforma identificata da un triangolo colorato di nero rialzato dalla superficie.

Alla fine di ogni blocco di istruzioni del Case , cioè al termine di ognuno dei singoli segmenti di codice che gestiscono i vari stati, viene utilizzata una "Condizione di transizione" la quale segna il passaggio da uno stato all'altro del robot e determina i parametri di comportamento da tenere in conto all'interno di ogni specifico segmento di programma.

Nel nostro caso,le condizione di transizione tra uno stato e l'altro sono le seguenti:
- da "Stato percorso" a " Stato ostacolo": la condizione di transizione è stabilita utilizzando i sensori a ultrasuoni posti nella parte frontale del robot. Infatti, tale condizione sarà vera solo se il robot troverà un ostacolo entro una determinata misura minima in centimetri;
- da "Stato ostacolo" a " Stato percorso": il superamento dell'ostacolo riporta sempre il sistema nello stato precedente;
- da "Stato ostacolo" a " Stato rampa": come detto precedentemente, utilizziamo un sensore di "tilting" per rilevare le inclinazioni del robot. Quindi, una volta iniziata la rampa e quindi rilevata la diversa inclinazione del robot, siamo in grado di stabilire che la Seconda stanza è terminata e quindi ogni ostacolo che troverà successivamente sarà da analizzare, in relazione alla sua riflettenza, in quanto non costituirà più un elemento da superare bensì un possibile oggetto che rappresenterà la vittima;
- da "Stato rampa" a "Stato cerca vittima": la condizione di fine rampa sarà data dal fatto che, il robot, dopo un certo periodo di permanenza su una determinata pendenza, tornerà in posizione orizzontale per predisporsi all'accesso dell'ultima stanza.


Oltre al main, il programma è composto da due file "header" chiamati rispettivamente TypeDef.h e DefAlloc.h.