IL ROBOT LEGO NXT

Il “mattoncino” (NXT Brick)


Per iniziare a conoscere l’hardware che utilizzeremo, partiamo dal cervello: Il mattoncino NXT
Il microprocessore e tutta la componentistica accessoria sono racchiuse nell’NXT brick, (mattoncino). Vediamo una foto del brick ed iniziamo a capirlo:

nxtimmaginedibase

Le porte con cui il mattoncino è connesso al mondo sono 8:

1 USB per il caricamento dei programmi che noi scriveremo.
3 Porte per il pilotaggio di motori (che però non sono solo porte di output ma possono anche leggere dei dati)
4 Porte per i sensori, che però non sono solo porte di output ma possono anche essere usate in OUTPUT per mandare dei messaggi al mondo esterno

Oltre alle porte, il mattoncino accetta comandi tramite una piccola pulsantiera, può visualizzare scritte o grafici
su un Display LCD con matrice da 100×64 pixel. Può inoltre produrre suoni a mezzo di un piccolo altoparlante entrocontenuto.

Ma cosa contiene il mattoncino? Come è fatto il “cervello” che elabora i dati?
Ecco una breve descrizione:

Micoroprocessore
Atmel 48 Mhz a 32 Bit 64 Kb RAM 256 Kb Flash Memory
Secondo Microprocessore:
Microcontrollore Atmel 4 Mhz a 8 Bit 4 KB flash memory, 512 Bytes RAM
Bluetooth controller
Porta USB

Maggiori informazioni tecniche sull’hardware le trovate su questa pagina di wikipedia: [1]

Detta così la cosa è molto asettica e molto ostica. Dobbiamo capire che cosa significano quelle sigle, capire in pieno come funziona il robot dal punto di vista hardware, per poi sviluppare dei programmi pienamente funzionali ed efficienti.

Il micrprocessore


Vediamo, per iniziare, che cos’è un microprocessore [2] o ALU  (Arithmetic Logic Unit).
Come dice la descrizione, la ALU si incarica di fare le operazioni aritmetiche e logiche di cui il robot o il dispositivo elettronico ha bisogno.
Riporto qui una frase dalla pagina di wikipedia in cui si parla del microprocessore di cui è dotato il nostro NXT:

I prodotti più famosi che usano microcontrollori o sistemi on chip basati su questa CPU sono l’iPod di Apple, il Game Boy Advance e il Nintendo DS della Nintendo, la maggior parte dei telefoni Nokia e il Lego Mindstorms NXT

Come vedete, i microprocessori sono ormai dappertutto, e servono a far funzionare qualsiasi dispositivo elettronico ci sia familiare.
Ecco perché conoscere come sono fatti può essere un sapere spendibile in ogni momento ed in ogni condizione, al presente ma soprattutto nel futuro, di semplici cittadini o di uomini di scienza.
Un microprocessore dunque si occupa di fare operazioni logiche e matematiche necessarie ad un qualunque apparato elettronico moderno e quindi anche ad un robot, al quale la funzionalità di effettuare operazioni matematiche è ovviamente indispensabile.

Alcuni esempi banali: sommare due angoli per sapere di quanto devo muovere un braccio meccanico, sottrarre tot giri di ruota dal totale, qualora si accorga che ha compiuto un tragitto troppo lungo e voglia farlo più breve la prossima volta.

Meno banale, e più affascinante, la potenzialità offerta dal poter realizzare operazioni logiche.

If (se è valida una certa condizione) (Esempio: se il motore è spento)
And (se è valida la prima condizione ed anche la seconda)
Or (se è valida la prima o la seconda condizione)

Questi sono esempi di condizioni logiche in base a cui il robot può prendere decisioni. Sono condizioni semplici, ma la velocità estrema a cui il microprocessore lavora permette, combinando una grande quantità di operazioni logiche in poco tempo, di effettuare operazioni anche molto complesse,simulando e superando in certe operazioni anche la capacità di apparati molto molto più complessi, come il cervello umano. Perciò si parla comunemente di “intelligenza artificiale”. Ultimamente si sta cercando di potenziare le capacità elaborative e logiche dei microprocessori connettendone un certo numero “in rete”, e suddividendo i compiti da assegnare a ciascuno dei componenti della rete.
A proposito di velocità di effettuazione delle operazioni, il microprocessore principale dell’ NXT lavora a 48 MHZ (48 milioni di potenziali operazioni logico aritmetiche al secondo).
Una bella velocità come vedete, su cui si basa la potenza dei “cervelli elettronici” moderni.

Logica binaria


Il microprocessore, come tutta l’elettronica logica, lavora utilizzando 2 soli “numeri”, i soli che può capire:

presenza di tensione elettrica = numero 1
assenza di tensione elettrica  = numero 0

con queste due sole cifre si possono rappresentare tutti i numeri, semplicemente usando molte cifre simultaneamente.

Ecco qui di seguito la codifica binaria di alcuni numeri

Decimale  Binario
   0         0
   1         1
   2         10
   3         11
   4         100
   5         101
   6         110
   7         111
   8         1000

Così proseguendo,ci si accorge che possiamo rappresentare qualsiasi numero. L’unico inconveniente è che ,lo si nota a prima vista, rappresentare un numero con 2 sole cifre implica l’utilizzo di molte cifre in parallelo.

Già per rappresentare il numero 8 ho necessità di usare 4 cifre affiancate. Il nostro processore, quello dell’NXT, è un processore a 32 bit. Vuol dire che accetta ed elabora numeri lunghi fino a 32 cifre binarie, e cioè, espresso in base decimale, il massimo numero processabile da parte di un processore simile è 4 294 967 296. Niente paura, il processore gestisce anche numeri più complessi, ma ha bisogno di farlo in successive fasi di elaborazione, non in un passaggio solo. Si comprende però che un numero superiore a 4 miliardi è ben raro utilizzarlo durante il funzionamento del nostro robottino, e che quindi la potenza di calcolo che ci viene messa a disposizione è davvero tanta.

Immagazzinamento dei dati


Ok per il calcolo. Abbiamo capito che se ne occupa la ALU, l’unità aritmetico-logica del microprocessore, e che lo fa velocemente e gestendo ogni dato, anche i più grandi, ma come tenere in memoria i risultati ottenuti durante l’elaborazione, o i valori che ci restuisce un sensore, oppure i programmi stessi, che noi scriviamo?

Esistono dei dispositivi appositi:

RAM (random access memory)
FLASH MEMORY

Entrambe queste memorie sono memorie digitali, memorizzano infatti degli stati logici, presenza od assenza di tensione , quindi i le cifre binarie 0 o 1.
Salvare, congelare queste informazioni pur semplici, ci permette come abbiamo visto di “ricordare” numeri o dati anche molto complessi, usando la logica binaria.
Ecco un’altra potenzialità degli apparati elettronici che abbiamo a disposizione: l’enorme facilità e l’enorme capienza che ci è data per il salvataggio delle informazioni.
La differenza tra i 2 tipi di memoria, RAM o Flash, è minima: la RAM ha bisogno di una fonte di energia elettrica costante per mantenere i dati, la FLASH invece può prescinderne, e quindi mantenere i nostri dati anche se la batteria del robottino è totalmente esaurita. Per il resto però, la funzionalità di entrambe le memorie è la stessa, e la sua capienza sufficiente per contenere programmi e dati ben complessi.
Ricordiamoci che il brick può anche salvare dati ricevuti dai sensori e ricuperare dati dalla memoria per capire quali sono state le condizioni in passato. Possiamo insomma usare la memoria del robot come fosse la nostra: immagazzinare e prelevare le informazioni (molti tipi di informazioni) a nostro piacimento.

I motori


Finora abbiamo parlato delle componenti del robot che fanno parte anche dei computer.
Vi ricordate? I processori li trovate anche nei telefonini, le memorie pure. Ma un robot è ben diverso da un telefonino: agisce, e “capisce il mondo”. Agisce fisicamente nel mondo e sul mondo, e quindi ha bisogno di “braccia e gambe”. Come sono fatte? Beh la risposta è elementare: ingranaggi, leve, e motori elettrici. i motori elettrici sono quelli che danno al robot velocità, forza e resistenza enormi, rispetto al motore muscolare/biologico. Ma (come dice la pubblicità), la potenza è nulla , senza controllo. C’è bisogno di forza e velocità , ma anche di precisione, delicatezza, misura. In questo i robot non sono in vantaggio rispetto alle macchine biologiche, tutt’altro. Ogni motore comandato da un robot ha un enorme problema:dosare la forza e ottenere precisione.

I motori elettrici devono girare velocemente per funzionare bene. Questa esigenza si oppone a quella di dell’NXT di muoversi e “lavorare” lentamente.
Come si può ovviare a questo problema? Con degli ingranaggi meccanici che diminuiscono la velocità di rotazione a valle del motore.
Ecco un’ immagine di un motore sezionato, dalla quale possiamo capire molto bene questo concetto: ogni ingranaggio di plastica diminuisce la velocità di rotazione:

350px-nxt_motor

350px-nxtmotorcutaway

 

nxtmotoreesploso1

Ingranaggi e motore

nxtmotoreesploso

Dettaglio degli ingranaggi

Rapporti di riduzione dei singoli ingranaggi:

10:30:40 =1:4
9:27 = 1:3
10:20 = 1:2
10:13:20 = 1:2

Rapporto totale di riduzione 1:48

I  motori dell’NXT sono inoltre dotati di un dispositivo, l’encoder, che si accorge e tiene nota della rotazione dei motori.

Ecco qui sotto un’ immagine illustrativa:

encoder

Schema di encoder

Ad un lato del dischetto c’è una sorgente di luce sempre accesa (un diodo LED ad esempio), dall’altro lato c’è un ricettore di luce, un fotodiodo, che si commuta sullo stato logico 1 se vede la luce, e sullo stato logico 0 se vede buio. Ecco allora: se il disco ha 100 fori,l’encoder vedrà cento volte lo stato logico ogni giro. Di conseguenza il processore, che legge questi stati logici  in continuazione, saprà che l’asse del motore si è mosso e soprattutto come.
In conclusione: grazie agli encoder il processore sa di quanto si è mosso ogni motore, sia che il motore abbia girato perché mosso dall’elettricità e cioè volutamente azionato dal processore, sia che invece sia stato mosso da un  intervento non dettato dal processore, come ad esempio un umano che abbia spostato il robot spingendolo e facendo girare le ruote.

(Questa considerazione ci fa pensare ad una idea nuova e strana: possiamo usare un motore come se fosse un sensore di movimento).
Gli encoder dei motori dell’NXT ci forniscono una precisione di 1 grado (cioè hanno 360 “buchetti” sul disco solidale all’asse del motore.

Mica male vero? C’è un corollario a questa affermazione: allora le 3 porte che comandano i motori non sono solo porte di output, ma anche di input, perché deve uscire dal processore verso i motori un segnale di alimentazione dei motori,ma deve anche entrare verso il processore un segnale proveniente dagli encoder, per dire al processore che il motore è ruotato.

Altri tipi di Output


Il brick può “comunicare” col mondo non solo usando i motori, per muoversi o interagire con le cose, ma può anche usare un output visivo o sonoro.

Il display


Il brick è dotato di un display LCD grafico. Può scrivere valori, può creare dei grafici, può disegnare dei simboli o dei “personaggi” animati. E’ uno schermo grafico a tutti gli effetti e come tale può essere usato.

L’altoparlante


L’altoparlante può produrre dei suoni semplici ma può anche eseguire dei file “musicali”, riproducendo musiche o anche simulando il suono del linguaggio umano.

 

Sensori


Il robot agisce nel mondo e sul mondo, dicevamo. Ma il robot è anche dotato di sensi: percepisce quello che avviene. Come fa a capire il mondo, a misurare, a sentire?
Ovviamente per mezzo dei sensori, leggendo i dati che questi forniscono. I sensori sono molti, e di vari tipi. Le due classi di sensori che maggiormente ci interessano sono: analogici e digitali. Per quanto concerne i sensori analogici, essi forniscono in uscita dal sensore,(quindi in ingresso per il mattoncino NXT), una tensione variabile da un minimo ad un massimo. Questa tensione viene rilevata dal mattoncino, e trasformata internamente al brick in un valore digitale tramite un convertitore analogico/digitale.
La lettura di un sensore analogico è molto veloce: non serve fare altro che rilevare un valore di tensione, poi il convertitore penserà a trasformarla in un valore digitale (fatto di una sequenza di 0 e di 1), che il microprocessore potrà elaborare efficacemente.

Sensori analogici


nxtlightsensor

Sensore di luce

Nel caso del sensore di luce, un elemento fotosensibile (fototransistor) converte la luce che “vede” in una tensione.
Se la luce ambientale non è sufficiente, esiste un diodo led che affianca il fototransistor.
Se accendo il diodo, posso rilevare la porzione di luce emessa dal LED e riflessa da una superficie antistante.
Il sensore può dunque funzionare in due modi: senza diodo LED acceso, nel caso la luce ambientale sia sufficiente, e col diodo LED acceso nel caso sia buio.

 

nxt-sound-sensor

Sensore di suoni

Il sensore di suono è costituito essenzialmente da un microfono. Ogni tipo di microfono traduce i segnali sonori in segnali elettrici.
Il segnale elettrico viene poi amplificato e trasferito al brick NXT.

Sensori digitali.


Una seconda categoria di sensori è quella dei sensori digitali. Essi si dividono in due categorie: sensori digitali semplici e sensori I2C (non approfondiremo in questa fase il significato di questa sigla:non è importante).

Sensori digitali semplici


Un esempio di sensore digitale semplice è il sensore di tocco. Non produce un segnale di intensità variabile, ma un segnale che è semplicemente presente o non presente.

350px-nxttouchsensor

Sensore di tocco

Il sensore di tocco altro non è che un interruttore. Se l’interruttore è premuto , ci sarà tensione su di un filo, mentre se non è premuto semplicemente non ci sarà tensione.Il brick è molto felice di ricevere un dato di questo tipo: non ha nemmeno bisogno di convertirlo per poterlo elaborare.
Lo passa direttamente al processore: è scritto nella sua lingua: come abbiamo detto sopra , lui interpreta la presenza di tensione come cifra binaria 1, e l’assenza come cifra binaria 0.

Sensori digitali I2C


Questi sensori non scambiano semplicemente un valore di tensione con il mattoncino brick, ma dialogano fornendo dei valori già in formato digitale.
Vengono “interrogati” dal brick e rispondono fornendo delle informazioni.
In qualche modo dunque contengono essi stessi un’ intelligenza, e forniscono al brick dati già in formato digitale pronti da essere elaborati.
Un esempio di sensori di questo tipo è il misuratore di distanza ad ultrasuoni, che funziona in questo modo: emette tramite un piccolo altoparlante un ultrasuono, e contemporaneamente inizia a calcolare un tempo.
Il suono viaggia in avanti, e quando incontra un ostacolo viene riflesso. Un microfono, sempre posizionato sul sensore, lo capta e interrompe immediatamente il conteggio del tempo.
Ora come si trasforma il tempo trascorso in una distanza? Sappiamo che il suono si propaga a 330 metri al secondo circa,e quindi moltiplicando il tempo per la velocità trovo lo spazio.Quando il brick vuole conoscere la distanza da un ostacolo, interroga il sensore. Il sensore si occupa di tutte queste operazioni, e fornisce al brick una risposta che è già uno spazio.

nxtultrasonicsensor

Sensore ad ultrasuoni

A proposito dei sensori è da notare una ultima cosa: le porte del brick che leggono i sensori non sono soltanto porte di input, ma fanno anche output. C’è da alimentare i sensori in corrente continua, e le porte dei sensori portano un filo positivo ed un negativo. C’è in alcuni casi, (come nel caso del sensore di luce quando utilizzato in modo attivo), da alimentare un diodo LED che emette luce, la quale luce poi, riflessa da un oggetto, verrà rilevata da un fotodiodo e verrà letta come valore fornito dal sensore. C’è, soprattutto, da scambiare dei dati in formato digitale nel caso si utilizzino sensori digitali, quindi in questo caso bisogna davvero comunicare bidirezionalmente col sensore (tramite il protocollo I2C). Questa funzionalità, di usare le porte di input anche per l’output di segnali analogici e digitali, può essere sfruttata per dare dei comandi dal brick verso l’esterno a dei dispositivi tramite il protocollo I2C.

Programmazione


Veniamo, ora che avete capito il funzionamento dell’ hardware del robot, e le sue componenti più interessanti e significative, a capire quale sarò il modo di fornire istruzioni e “intelligenza” alla macchina, ovvero come si “parla” tra l’Uomo e il Robot.
Il microprocessore, che è la componente del robot a cui “parlerete”, accetta istruzioni in assembler: un linguaggio specifico del singolo processore, molto astruso da comprendere per noi umani.
L’uso di questo linguaggio permette di scrivere dei programmi piccoli, veloci, e davvero funzionali, ma richiede moltissimo tempo di apprendimento, e soprattutto è legato al singolo processore.
Una volta che quel processore diverrà obsoleto ed andrà fuori dal mercato, ogni vostro sforzo di apprendimento verrà cancellato, e dovrete ricominciare ad imparare un altro assembler, che vada bene sul nuovo processore.
Vi è un’ altra possibilità però, che è quella che seguiremo noi durante il nostro corso: programmare in un linguaggio evoluto, che verrà poi trasformato in assembler da un programma apposito, che si chiama compilatore.
Nella “traduzione” fatta dal compilatore, si introduce una qualche mancanza di funzionalità: i programmi risulteranno più lunghi e meno ottimizzati, quindi più lenti nell’esecuzione, ma il vantaggio enorme è che programmerete sempre in un linguaggio (il “C”) che è valido per ogni processore e rimarrà invariato nel tempo, e utilizzabile  in moltissime applicazioni diverse da questa.
Quindi all’atto pratico nel nostro corso noi apprenderemo ed utilizzeremo il “C”, useremo un IDE (integrated developement environment), che ci farà al tempo stesso da

editor (quel software che serve per scrivere materialmente i programmi) , da

debugger (il software che individua e ci aiuta a correggere molti errori di programmazione), e infine da

compilatore e cioè tradurrà il codice scritto da noi in “C” nell’ assembler del processore, e lo trasferirà ad esso tramite il collegamento USB.

Nella seguente sezione del corso impareremo a conoscere la nostra IDE, e impareremo un linguaggio di programmazione in modo da essere in grado di impartire al robot i comandi e dotarlo persino di una sua capacità autonoma di interagire col mondo che lo circonda.