Brevi cenni sul linguaggio di programmazione
Riportiamo qui un estratto della documentazione preliminare relativa al compilatore sygen.exe scritto per il predecessore di Wirobo. Il testo contiene anche riferimenti a parti hardware previste ma non ancora realizzate. E’ stato scritto in Basic Microsoft e gira sotto Windows Xp.
Per facilitare le connessioni della matrice sinaptica anche da parte di chi preferisce la programmazione software a quella hardware, è stato creato questo piccolo linguaggio di programmazione prendendo spunto dal BASIC che è il linguaggio di programmazione più semplice esistente. Il programma va scritto su una applicazione standard come il Notepad di Windows o qualsiasi altro editor di testo che non aggiunga formattazione supplementare (non vanno bene Word e simili).
Il testo poi verrà compilato con sygen.exe che avrà come uscita un file di testo chiamato <nomeprogramma>.obj dovre verranno scritte le connessioni da effettuare con le sinapsi. Questo esempio serve per chiarire il concetto:
Programma sorgente:
I1 = bumper_sx IF bumper_sx THEN motore_sx : REM inverte il motore di sinistra END
Programma compilato:
S1 > B4
dove S1 è l’ingresso della matrice e B4 è l’uscita. Notare che il segno > indica che il diodo va collegato con anodo su S1 e catodo su B4. Attenzione che se il segno è < allora il diodo va collegato inversamente!
Istruzioni
Ingressi
Gli ingressi fanno capo al connettore Input Bus ed Extended Input Bus che sono i connettori di ingresso della Matrice Sinaptica. I primi sono denominati con la lettera “I” seguiti da un numero (I1, I2, …) mentre gli altri sono seguiti da un’altra lettera in minuscolo (Ia, Ib, …)
I1
I2
I3
…
I9
Ia
Ib
Ic
SEQUENCER1
…
SEQUENCERn
Assegnazioni
Servono per personalizzare le label standard con un nome che esplica la funzione di quell’ingresso o il tipo di sensore a cui viene attaccato. Ogni etichetta non può contenere spazi ma può contenere questi simboli tra parentesi ( _ – )
<ingresso> = <Label>
es:
I1 = Bumper_Sx
<Nx> = <label>
es:
Na = Allarme
Funzioni Logiche
Le funzioni logiche sono solo due
AND
OR
Statements
REM <commento> (documentazione del listato)
; (salto riga per aumentare la leggibilità. Può servire per aggiungere un remark sulla stessa linea. Tutto quello che segue viene ignorato fino al prossimo Line Feed)
IF [<ingresso> | <Label>] THEN [<neurone>|<Label>]
IF [<neurone> | <Label>] THEN [<ingresso>|<Label>]
DELAY<n> (n = 1,2,3 inteso come sequenze di tempo)
SOUND<n> (n = 1,2,3 tipo di suono da generare)
END (fine programma)
Azioni
Le Azioni fanno capo al Functions Bus e all’ Extended Function Bus che sono i connettori di uscita della Matrice Sinaptica. I primi sono denominati con la lettera “U” seguiti da un numero (U1, U2, …) mentre gli altri sono seguiti da un’altra lettera in minuscolo (Ua, Ub, …). Di questi soltato le label dell’ Extended Function Bus possono essere assegnate a delle label personalizzate come per gli Ingressi.
START (motori)
STOP (motori)
Inv_sx_short (N1 – Inversione motore sx temporizzata)
Inv_sx_long (N2 -Inversione motore sx temporizzata)
Inv_msx (N3 – Inversione motore sinistro)
Inib_sx (N4 – Inibizione motore sinistro)
Dis_sx (N5 – Disimpegno verso sinistra)
Dis_dx (N6 – Disimpegno verso destra)
Inib_dx (N7 – Inibizione motore destro)
Inv_dx_long (N8 – Inversione motore dx temporizzata)
Inv_dx_short (N9 – Inversione motore dx temporizzata)
Inv_mdx (N10 – Inversione motore destro)
Na (funzione a)
Nb (funzione b)
Nc (funzione c)
Nd (funzione d)
SOUND1 (suono n°1 – SG1)
SOUND2 (suono n°2 – SG2)
SOUND3 (suono n°3 – SG3)
DELAY1 (uscita sequencer n°1 – SU1)
DELAY2 (uscita sequencer n°2 – SU2)
DELAY3 (uscita sequencer n°3 – SU3)
Esempio di programma
Programma sorgente:
REM Dichiarazione risorse hardware ; MATRIX (matrice sinaptica) SEQUENCER1 (sequencer n°1) SOUND (generatore di suoni) ; REM assegnazione di ingressi e neuroni ; S1 = bumper_sx S2 = bumper_dx S3 = bumper_centrale S4 = sens_scale S5 = suono Sa = Low_Battery Na = Alarm ; REM programma ; IF bumper_sx THEN motore_sx ; REM inverte il motore di sinistra IF bumper_dx THEN motore_dx ; REM inverte il motore di destra IF bumper_centrale THEN Inv_sx_short AND Inv_dx_long IF sens_scale THEN Inv_dx_long ; IF suono THEN STOP AND SEQUENCER1; REM si ferma e genera una seq. di toni DELAY1.1 = SOUND1 DELAY1.2 = SOUND2 DELAY1.3 = SOUND3 ; REM Con il segnale di batteria scarica ferma i motori e attiva REM l'allarme collegato al morsetto Na (extended output bus) ; IF Low_Battery THEN STOP AND Alarm ; END
Programma compilato:
Inizio compilazione del 03.07.2006 Disposizione delle sinapsi sulla matrice. Il segno > determina il verso del diodo. S1 > N3 S2 > N10 S3 > N1 S3 > N8 S4 > N8 S5 > X1 S5 > SI1 SU1 > SG1 SU2 > SG2 SU3 > SG3 Sa > stop Sa > Na Fine compilazione
Limitazioni attuali e caratteristiche della programmazione
La programmazione del robot ha delle limitazioni dovute alla sua struttura parallela particolare. Alcune di queste sono:
-
Non ci sono for-next perche non ci sono operazioni cicliche.
-
Le istruzioni AND e OR non sono “operatori booleani”. L’istruzione AND è applicabile solo in uscita mentre l’istruzione OR è applicabile solo in ingresso. Questa limitazione è legata alla logica DRL (Diode Resistor Logic).
-
Non possono essere messe istruzioni in sequenza perchè non è ancora disponibile il “sequencer”. In realtà anche se le istruzioni vengono scritte sequenzialmente nel listato, queste vengono eseguite in parallelo. Se non correttamente scritte potrebbero aversi dei funzionamenti inattesi a causa della sovrapposizione degli effetti, anche se il compilatore dovrebbe trovare gli errori più comuni.
-
Ogni riga di programma può finire con un LF+CR (return) o con un punto e virgola se è presente successivamente una riga di commento.
-
Spazi e TAB nelle righe di programma vengono ignorati durante la compilazione.
-
Le etichette (label) non possono contenere al loro interno gli spazi, ma possono contenere il segno meno (-) o il segno di sottolineatura (_). Es: etichetta_1 , label-2 .