Il controllo automatico libera l’uomo dai compiti ... · tempo per attività più gratificanti e...

39
Istituto Professionale di Stato per l’Industria e l’Artigianato MORETTO Via Luigi Apollonio,21 BRESCIA La ROBOTICA Curato dagli alunni: GAMBA ANDREA ROSSI MIRCO Classe 5BZ TIEE Corso per Tecnici delle Industrie Elettriche ed Elettroniche Anno Scolastico 2003-2004 1

Transcript of Il controllo automatico libera l’uomo dai compiti ... · tempo per attività più gratificanti e...

Istituto Professionale di Stato per l’Industria e l’Artigianato MORETTO

Via Luigi Apollonio,21 BRESCIA

La ROBOTICA Curato dagli alunni: GAMBA ANDREA ROSSI MIRCO Classe 5BZ TIEE

Corso per Tecnici delle Industrie Elettriche ed Elettroniche

Anno Scolastico 2003-2004

1

Il controllo automatico libera l’uomo dai compiti ripetitivi e lascia spazio alla creatività. Nella vita che conduciamo normalmente usufruiamo della collaborazione di tanti servitori silenziosi, ubbidienti e instancabili. Attiviamo i riscaldamenti predisponendo una manopola e sappiamo che la temperatura dei locali si manterrà in un intervallo predefinito senza alcuna sorveglianza.Non solo, installando un’opportuna centralina di controllo, tra le tante diffuse sul mercato, possiamo programmare l’accensione ad intervalli prefissati della giornata e anche della settimana. Selezioniamo un ciclo di lavaggio nella lavatrice in base al tipo di biancheria e passiamo, con tranquillità, ad assolvere altri impegni, perché le attività programmate sono eseguite con rigore ed il risultato è assolutamente garantito se sono rispettate delle regole elementari previste in fase di progettazione della macchina. Il frigorifero ci assicura al temperatura da noi selezionata indipendentemente dal fatto che quella esterna vari durante la giornata. Premiamo un pulsante e selezioniamo il caricamento di un CD, ancora un altro comando e il lettore va in esecuzione riproducendo i brani musicali registrati per staccarsi automaticamente quando sarà finito l’ultimo brano.Molti momenti del nostro operare quotidiano sono caratterizzati dall’utilizzo di sistemi che, in modo automatico, possiamo dire sanno badare a se stessi (si autogovernano) liberandoci del tempo per attività più gratificanti e creative. La diffusione di sistemi con controllo automatico è sempre più in crescita e non riguarda solo gli accessori domestici, ma tutte le strutture e distributive. La nostra epoca è caratterizzata da automazione sempre più avanzata che necessita un profondo cambiamento del nostro modo di vivere ed anche di pensare. Si rende indispensabile una mentalità nuova caratterizzata da una grande flessibilità ai cambiamenti.

2

Le idee e le tecnologie Il modo di vivere dell’uomo è molto legato alla tecnologia del suo tempo, così pure la cultura e il modo di pensare risentono dei mezzi disponibili in quel determinato periodo storico. Nuove tecnologie fanno sorgere altre idee su come risolvere i problemi e, in conformità ad una logica di mercato, sono avviate ricerche per la creazione di nuovi prodotti. Leonardo da Vinci ha avuto idee molto chiare sui principi fisici attraverso cui era possibile realizzare il sogno del volo umano, ma non disponeva di una macchina motrice idonea a sviluppare energia. Le sue idee saranno riprese secoli dopo con l’invenzione del motore a scoppio. L’automazione moderna ha ricevuto un forte impulso in avanti dalla realizzazione dei componenti elettronici a semiconduttore: Con lo sviluppo della tecnologia integrata si sono resi disponibili, per i progettisti di controlli, dispositivi elettronici molto affidabili per implementare ( realizzare mettendo insieme delle parti secondo una logica ) sistemi d’automazione sempre più elaborati. Soprattutto con la realizzazione dei microprocessori, intorno all’inizio degli anni settanta, si è avuta la possibilità di usufruire della tecnologia programmabile la quale, insieme all’affidabilità, consentiva un’alta flessibilità e apriva spazi ad implementazioni di sistemi automatici prima impensabili in termini di prezzi di mercato e di prestazioni offerte. Tanti di quei servitori ubbidienti si potevano pure immaginare come facevano tanti autori di fantascienza, ma non era possibile tradurre le idee in prodotti reali senza la disponibilità di questi nuovi dispositivi. Nuove tecnologie, idee alternative e moderni prodotti che maturino nuove tecnologie, per tradursi in fatti. Ogni tecnologia pone alla realizzazione dei limiti, il cui superamento spinge i centri di ricerca ad indirizzare gli studi verso nuovi campi d’ indagine. Il periodo storico in cui viviamo è fortemente caratterizzato da tali meccanismi, essi creano sviluppo ma allo stesso tempo disagio: i rapidi cambiamenti in atto determinano problemi di natura sociale e sconvolgono le nostre abitudini di lavoro e di vita. Da qui l’esigenza di una mentalità più disponibile ad accogliere il nuovo sia come utenti, sia come lavoratori; soprattutto questi ultimi devono aggiornarsi in sintonia con i cambiamenti imposti dalle leggi del mercato e della concorrenza.

3

Cos’è l’automazione

Sistema di produzione progettato per affidare direttamente alle macchine una serie di funzioni che prima richiedevano l’intervento di operatori umani, e per effettuare il controllo di vari processi. Il termine automazione è stato usato anche per indicare sistemi non destinati alla produzione, nei quali dispositivi programmati o automatici operano in assenza, o quasi, di controllo umano. Nel campo delle comunicazioni, dell’aviazione e dell’astronautica, ad esempio, dispositivi come gli apparati automatici di commutazione telefonica, i piloti automatici e i sistemi automatizzati di guida e controllo sono impiegati per compiere varie operazioni in modo molto più rapido ed efficiente rispetto a quanto non sia possibile per un essere umano.

Gli elementi dell’automazione La produzione automatizzata nacque dal concorso di innovazioni organizzative e tecniche quali la divisione “scientifica” del lavoro, la trasformazione delle varie forme di energia, la meccanizzazione delle fabbriche, lo sviluppo delle macchine trasportatrici e dei sistemi di controllo a retroazione. La divisione “scientifica” del lavoro, cioè la riduzione di un processo di lavorazione o di un servizio in piccoli passi indipendenti, fu sviluppata nella seconda metà del XVIII secolo, inizialmente a opera dell’economista britannico Adam Smith il quale ne discusse i concetti basilari nel libro Ricerche sopra la natura e le cause della ricchezza delle nazioni (1776). Nei processi di lavorazione, la divisione del lavoro portò a un aumento della produzione e a una riduzione delle competenze richieste ai lavoratori. La meccanizzazione fu il passo successivo: la riduzione di ogni attività in operazioni semplici, determinata dalla divisione scientifica del lavoro, rese possibile la progettazione e la realizzazione di macchine specializzate in grado di eseguire in modo autonomo le medesime operazioni. Con l’evoluzione delle tecnologie per la trasformazione dell’energia nelle varie forme disponibili o utili, le macchine furono motorizzate, e ciò potenziò in modo considerevole l’efficienza produttiva. Lo sviluppo delle tecniche di produzione dell’energia portò inoltre alla nascita della fabbrica, cioè di un luogo centralizzato di produzione in cui lavoratori e macchine erano concentrati in edifici, o strutture, situati nei pressi delle fonti energetiche. Fu nelle fabbriche che si svilupparono le prime forme di automazione, come le macchine trasportatrici, dispositivi in grado di spostare un pezzo in lavorazione da una macchina utensile a un’altra, in modo che esso venisse correttamente posizionato per la fase di lavorazione successiva. I robot industriali, progettati in origine soltanto per svolgere funzioni semplici in ambienti dannosi per i lavoratori, sono ora assai evoluti e vengono usati per spostare, manipolare e posizionare pezzi, leggeri e pesanti, realizzando tutte le funzioni di una macchina trasportatrice. Nella pratica attuale, un gran numero di macchinari distinti è integrato in un sistema che può essere pensato come un’unica grande macchina. Negli anni Venti, l’industria automobilistica mise in pratica questi concetti per realizzare un sistema di produzione a catena di montaggio che aveva l’obiettivo di ridurre il costo delle automobili, rendendo questi mezzi accessibili anche a persone che difficilmente avrebbero potuto disporne.

4

L’automazione nell’industria

Alcune industrie sono altamente automatizzate, altre adottano specifiche tecniche di automazione in alcuni settori operativi. Nelle telecomunicazioni, e in particolar modo nel settore dei telefoni, la selezione, la trasmissione e la tariffazione sono ormai completamente automatizzati. Il traffico ferroviario è controllato da dispositivi automatici di segnalazione, dotati di sensori che rilevano il passaggio dei convogli, in modo da controllare il movimento e la posizione dei treni. Non tutti i settori richiedono lo stesso grado di automazione e in alcuni l’intervento umano resta comunque determinante. L’agricoltura, il commercio e la produzione di alcuni servizi sono molto difficili da automatizzare; al contrario l’industria alimentare può essere ampiamente meccanizzata, specialmente per i processi di confezionamento; in molti servizi di distribuzione, ad esempio i supermercati, le casse possono essere rese automatiche, così come sarebbe possibile automatizzare i processi di riempimento degli scaffali e dei magazzini. Iniziative simili, tuttavia, avrebbero pesanti conseguenze sul piano sociale. Il concetto di automazione è in rapida evoluzione, anche perché le applicazioni di questa tecnica variano sia all’interno di un’azienda o di un settore, sia da un’azienda all’altra. Le industrie chimiche e petrolifere, ad esempio, hanno sviluppato metodi di produzione a flusso continuo, adatti alla natura del materiale trattato. In una raffineria, il petrolio grezzo entra nell’impianto e scorre con continuità attraverso i condotti, verso dispositivi di cracking, distillazione e altre reazioni, fino alla trasformazione in prodotti quali gasolio e benzine. Una rete di dispositivi di controllo automatico, governati da microprocessori e coordinati da un elaboratore centrale, comanda valvole, riscaldatori e altri elementi attraverso i quali vengono regolati i flussi e le velocità di reazione. Nelle industrie siderurgiche, o delle bevande o dei cibi in scatola, d’altra parte, spesso la produzione è organizzata a lotti. Un altoforno, ad esempio, dopo essere stato caricato con i minerali e il combustibile e riscaldato, viene utilizzato per produrre un lotto di pani di acciaio; in questa fase, è possibile solo una modesta possibilità di automazione. I pani, tuttavia, possono essere lavorati in modo automatico in lastre o altri elementi strutturali con operazioni di laminazione e trafilazione, fino al raggiungimento delle forme desiderate. L’industria automobilistica e altre industrie di prodotti di largo consumo adottano tecniche di produzione in serie che implicano lavorazioni e montaggio passo-passo e che si avvicinano al concetto di produzione a flusso continuo, pur utilizzando macchine trasportatrici; queste ultime sono quindi indispensabili per la realizzazione dell’automazione. Ciascun settore industriale usa macchine automatiche nell’intero processo produttivo oppure in parte di esso: ne risulta che ogni settore ha sviluppato un concetto di automazione adeguato alle proprie esigenze di produzione. Ulteriori esempi si possono individuare in quasi ogni fase del commercio e dell’attività finanziaria. L’uso generalizzato dell’automazione e la sua influenza sulla vita quotidiana hanno dato adito a non poche preoccupazioni, dovute soprattutto alla riduzione, almeno temporanea, delle possibilità d’impiego.

5

Automazione e società L’automazione ha fornito un contributo primario all’aumento del tempo libero e dei salari reali di cui ha goduto la maggior parte dei lavoratori dei paesi industrializzati, e ha determinato una sensibile crescita della produzione che, accompagnata da una riduzione dei costi, ha reso accessibili a un gran numero di persone automobili, frigoriferi, televisori, telefoni e altri beni. Tuttavia non tutte le conseguenze dell’automazione sono risultate positive. Secondo alcune teorie essa ha creato sovra produzione e spreco, ha prodotto alienazione tra i lavoratori e ha determinato una crescita della disoccupazione. Tra questi problemi, particolare attenzione viene posta alla relazione tra automazione e disoccupazione. Alcuni studiosi affermano che lo sviluppo di sistemi d’automazione genera più lavoro di quanto ne sottragga ed evidenziano come, benché alcuni settori possano risentire di una crescita temporanea della disoccupazione, l’industria per la produzione di macchinari automatizzati determini in realtà un aumento delle possibilità di lavoro: il settore dei computer è spesso citato a sostegno di questa tesi. Altri esperti contestano le affermazioni di coloro che sostengono che i lavoratori che hanno perso l’impiego a causa dello sviluppo dei processi di automazione siano stati interamente assorbiti dalla crescita di attività nel pubblico impiego e nei servizi, e sottolineano che non appena queste aree saranno saturate, come già accade in alcuni paesi, o i programmi di occupazione verranno ridotti, il legame tra automazione e disoccupazione sarà drammaticamente evidente. Automazione e persona Gli effetti dell’automazione sui singoli individui sono stati più drastici. Parte dei lavoratori manuali ha, di fatto, perso l’impiego; altri devono essere in grado di azionare o mantenere in efficienza macchine tecnologicamente avanzate, effettuare la supervisione di molte operazioni dell’impianto, e svolgere rapidamente un gran numero di funzioni. Di conseguenza il livello d’istruzione e di esperienza richiesto a questi operatori è estremamente alto. Molti ricercatori hanno descritto gli effetti dell’“automazione di Detroit” sui singoli lavoratori come alienazione. Assenteismo, scarsa abilità professionale, problemi di alcolismo, dedizione alla droga e sabotaggio delle linee di produzione sono sintomi ben documentati di tale alienazione. Studi condotti nel corso degli anni Trenta portarono alla conclusione che molta parte dell’alienazione è dovuta alla sensazione, da parte dei lavoratori che devono tenere il passo con la catena di montaggio, di essere controllati dalla macchina, oppure alla noia per la ripetitività del lavoro e alla natura poco stimolante delle attività, che richiedono solo abilità minime. Nei settori più automatizzati, in particolare in quelli che producono a flusso continuo, l’investimento di capitale in apparecchiature, rapportato al numero di lavoratori, è alto; ciò implica una drastica riduzione del personale di livello medio. È evidente, infatti, che un ambiente automatizzato ha scarsa necessità di tale personale, dal momento che un gran numero di funzioni è eseguibile da dispositivi automatici. La forza-lavoro richiesta in impianti automatizzati è costituita soprattutto da operatori specializzati, come tecnici di manutenzione, elettricisti, attrezzisti, ciascuno dei quali ha il compito di conservare in buone condizioni di funzionamento le macchine automatiche.

6

7

I sensori di contatto Data la loro forma e la funzione che svolgono, tali sensori sono detti ‘baffi’: similmente alle vibrisse (baffi) di un gatto, infatti, questi sensori permettono al robot di avvertire la presenza di eventuali ostacoli sul suo percorso. I baffi sono costituiti da due estremità di plastica collegate a una lamina flessibile d’acciaio. Questa lamina, montata su un distanziale cilindrico di plastica, è fissata per mazzo di una vite alla scheda madre del robot così da essere inserita tra due contatti di ciascun connettore (che sono indicati sulla scheda madre dalle diciture X5 e X6) e in modo da non toccare quello posteriore. Quando uno dei due baffi incontra un ostacolo, la lamina, grazie alla sua flessibilità, si piega, toccando così il contatto posteriore di ciascun connettore, Ciascuno dei due contatti posteriori è collegato a un circuito della scheda madre: il movimento dei baffi e la conseguente aderenza tra il contatto e la lamina d’acciaio determinano un cambiamento in tale circuito. I due connettori per i sensori di contatto sono collegati alla tensione Vdd e alle due porte P4 e P6 del microcontrollore. I baffi hanno la funzione degli interruttori: quando la lamina è in posizione ‘di riposo’ il ramo circuitale destro risulta aperto e la tensione alla porta del microcontrollore è di 5V, un valore logico alto. Quando invece la lamina d’acciaio si appoggia ad almeno uno dei due contatti posteriori dei connettori, il ramo circuitale destro viene chiuso, portando così l’anello metallico presente sulla scheda madre (che è in contatto con la lamina tramite la rondella e la vite a fissaggio) alla tensione di massa: si realizza così un corto circuito che porta a zero, cioè al valore logico basso, la tensione alla porta del microcontrollore.

8

La Scheda Madre

9

Nel robot la scheda madre BASIC Stamp Board svolge un ruolo fondamentale. Su questa scheda sono infatti raccolti gli elementi che costituiscono il “cervello elettronico” del robot. In particolare il chip della memoria, che immagazzina i programmi PBASIC, e il microcontrollore BS/2, che permette al robot di elaborare le informazioni ed eseguire i programmi presenti in memoria. La scheda madre inoltre, è predisposta per ospitare i sensori (a infrarossi e di contatto), che consentono al robot di interagire con l’ambiente circostante, e la breadboard, una piattaforma di sperimentazione che offre la possibilità di realizzare piccoli circuiti per lo svolgimento di svariati esperimenti di elettronica. La BASIC Stamp Board rappresenta quindi l’indispensabile base per il funzionamento di tutti gli altri componenti elettronici del robot e per lo sviluppo delle sue potenzialità. La scheda madre in dettaglio La scheda può essere suddivisa idealmente in due parti: la parte contenente gli elementi di controllo e di comunicazione (elencati nella foto con i numeri da 1 a 7) e la parte contenente gli elementi che consentono l’ espansione e lo sviluppo dei circuiti (da 8 a 17). La scheda può comunicare con il computer grazie alla porta seirale DB9 a 9 pin (ossia piedini) posta in basso a sinistra (con il numero 1): questa consente di scaricare dal PC al chip di memoria del robot i programmi che successivamente il microcontrollore eseguirà. A destra della porta seriale sono collocati i due zoccoli (numeri 2 e 3) che ospiteranno la memoria e il microcontrollore. Sotto i due zoccoli si trova il tasto start/stop (numero 4) che controlla il programma presente nella memoria del robot. Questo pulsante permette infatti di attivare o di interrompere l’esecuzione di un programma, senza però che tali operazioni di controllo comportino la cancellazione del programma della memoria. Sopra la porta seriale, invece, si trova il morsetto di alimentazione (numero 5), attraverso il quale la scheda viene alimentata. Per verificare che la scheda madre sia alimentata è stato inserito un led (numero 6) di colore verde. Al centro della scheda madre, invece, è posto il bus di espansione (numero 8) contrassegnato dalla sigla X7. Il bus è realizzato con uno slot “fessura” con 20 socket (cavità in cui possono entrare dei pin o cavi). Nel bus si innesta la scheda di controllo motori, che permetterà al microcontrollore di governare i due motori a spazzola. Immediatamente alla destra del bus di espansione X7, si trova uno slot con 16 socket (numero 9), contrassegnato con la sigla X1. Ogni socket è identificato con una P, seguita da un numero progressivo, da 0 a 15. Più in alto disposto in orizzontale e contrassegnato con X2, si trova uno slot con 13 socket (numero 10), suddivisi in più gruppi: 5 socket Vdd, 2 Vin, 1 Vm e altri 5 Vss. Queste sigle indicano l’alimentazione dei socket: i Vin sono collegati alla tensione di alimentazione, i Vss sono collegati a massa (e hanno quindi tensione zero) e i Vdd sono collegati alla tensione controllata dal regolatore di tensione; Il socket Vm si occupa invece di alimentare i servomotori. All’interno del profilo rettangolare bianco (numero 11), delimitato dai due slot X1 e X2, è situata la breadboard, un supporto in plastica che ospita tanti socket collegati tra loro da sottili piste in rame, presenti nella parte inferiore del supporto. Combinando la breadboard con la scheda madre si realizzerà una sorta di “piano di lavoro” su cui creare piccoli circuiti elettrici per potenziare e sviluppare ulteriormente le risorse del robot. Infatti, lo a 16 socket X1 (numero 9) è collegato al microcontrollore attraverso la scheda madre e consentirà di fare interagire il microcontrollore con gli elementi circuitali di volta in volta inseriti sulla breadboard. Lo slot a 13 socket X2 (numero 10), invece, permetterà di alimentare gli elementi già presenti sulla breadboard o di completare i circuiti elettronici realizzati. Contrassegnati con le sigle X3 e X4, si trovano i due connettori (numeri 12 e 13) per i servomotori.

10

Destinati a sostituire i motori a spazzola, i due servomotori permetteranno al robot di compiere movimenti più precisi e complessi. Sul lato destro della scheda ci sono i due slot (numeri 14 e 15), contrassegnati dalla dicitura LEFT e RIGHT, con 5 socket ciascuno. Ogni slot è composto da un gruppo di 3 socket (indicato con DETECT) e da uno di 2 socket (denominato LED). In questi slot verranno alloggiati i sensori a infrarossi: un LED emettitore del segnale a infrarossi e un diodo ricevitore (il vero e proprio sensore) che, in presenza di ostacoli, riceve il segnale riflesso. Vicino ai sensori a infrarossi si trovano i due connettori (numeri 16 e 17), siglati X5 e X6, per i sensori di contatto (detti baffi): a ogni connettore verrà associato un filo in acciaio che, fuoriuscendo dalla parte anteriore del robot, potrà rilevare la presenza di ostacoli, semplicemente tramite il contatto fisico con essi. Gli schemi circuitali Abbiamo visto l’importanza della scheda madre per il robot e le tre funzionalità che offre: alloggio per i microchip di elaborazione (microcontrollore e memoria), piattaforma di sviluppo e sperimentazione (breadboard), connettività per l’aggiunta di nuovi dispositivi e l’ampliamento delle funzionalità (bus di espansione). Nella figura A è rappresentato lo schema circuitale della scheda madre. Il microcontrollore ha 28 piedini, disposti 14 per lato. Di questi, 16 sono contrassegnati da una P (che sta per ‘porta’), seguita dal numero identificativo del singolo piedino: sono quelli impiegati per gestire i sensori e gli attuatori del robot (baffi, sensori a infrarossi, servomotori ed eventuali altri elementi presenti sulla breadboard). Inoltre le porte del microcontrollore sono collegate anche al bus di espansione X7. Tale bus è inoltre connesso alla tensione di alimentazione. Nella figura B (in basso) è mostrato invece lo schema circuitale della scheda di controllo motori: una volta collegato il bus di espansione X1 al bus X7 della scheda madre, si possono comandare i due driver L293DNE, tramite quattro segnali inviati dal microcontrollore ai rispettivi ingressi del driver. La scheda di controllo motori, equipaggiata con i due driver L293DNE, serve per il controllo dei motori a spazzola. In particolare, nello schema della scheda di controllo motori si nota che le porte P3 e P5 collegano il microcontrollore a due piedini del driver (indicato nello schema con la sigla U2) che controlla il motore di sinistra; le porte P14 e P15 sono invece collegate al driver (indicato con la sigla U1) che controlla il motore di destra. I due driver hanno ciascuno 16 piedini, di cui 4 per i segnali in ingresso (provenienti dal microcontrollore tramite la parte di cui sopra) e altrettanti per le uscite (verso i morsetti della scheda e, quindi, i motori); i rimanenti piedini sono invece collegati all’alimentazione. Attraverso le porte P3, P5, P14 e P15, il microcontrollore invia i segnali logici, cioè i valori 0 oppure 1, per comandare ai driver la polarità da applicare ai rispettivi motori che, utilizzando la tensione di alimentazione, generano la corrispondente configurazione di tensione e polarità ai rispettivi motori tramite i morsetti della scheda.

11

12

Come funzionano i driver L293DNE Entriamo ora nel dettaglio della spiegazione del funzionamento dei driver L293DNE. Invertendo la polarità della tensione applicata a un motore si inverte il verso di rotazione del motore stesso. Il driver è in grado di eseguire la stessa operazione, tramite impulsi elettronici. Nella figura C sono schematizzati due possibili circuiti di alimentazione di un motore a spazzola. Introducendo in entrambi i circuiti un interruttore comandato da un valore logico (A e B) , come in figura D, in base al valore logico che viene applicato in ingresso, quest’ultimo risulterà aperto o chiuso: se l’ingresso è alto (1) l’interruttore chiude il circuito; viceversa, con un ingresso basso (0) , l’interruttore è aperto e il circuito risulta interrotto. Combinando insieme i circuiti della figura D, per ottenerne uno solo grazie al quale sia anche possibile invertire il senso di rotazione di uno stesso motore. Quello che si ottiene è il circuito in figura E, che ha quattro interruttori comandati, disposti a formare la lettera H : per questo tale configurazione viene detta “a ponte H”. Il funzionamento del motore dipende ora da quattro valori logici (A, B, C e D). La tabella dello schema riassume i possibili comportamenti del motore, se si attivano (ponendo il valore 1) copie di ingressi incrociati (A e D oppure B e C), si realizza una delle due situazioni rappresentate in figura C, in cui il motore gira in senso orario oppure antiorario. Quando si attivano gli ingressi allineati il motore resta fermo poiché scollegato dall’alimentazione (V) o dalla terra (Gnd). Infine, le configurazioni che attivano le copie di ingressi dello stesso lato determinano, nello stesso punto del circuito, valori di tensione diversi, che provocano un cortocircuito molto dannoso per il circuito. Per evitare tali configurazioni pericolose, dette di “fuse test”, il circuito deve essere modificato ulteriormente, riducendo i valori logici di comando del ponte H da quattro a due. Nella figura F è stato inserito un nuovo componente chiamato porta not. Si tratta di una porta logica con funzione di negazione, in grado di garantire che gli ingressi degli interruttori posti sullo stesso lato abbiano sempre e solo valori opposti proprio come avviene con il driver L293DNE, un tale motore è ora controllato da due soli valori logici (A e B) . Se torniamo alla figura B, si nota che, dei quattro ingressi corrispondenti ai rispettivi piedini di ogni driver, solo due sono controllati in modo diretto dal microcontrollore; gli altri, protetti da una porta NOT, non possono che assumere il valore logico negato dai primi.

13

14

La scheda di controllo motori La scheda di controllo motori ( DC Motor Board) è il componente elettronico del robot che consente di controllare i motori a spazzola attraverso il microcontrollore. Nella scheda sono individuabili tre elementi principali: gli zoccoli per i driver L293DNE, i morsetti e il bus (connettore) di espansione, i due driver sono una parte integrante della scheda di controllo. La loro funzione, è quella di intermediari: ricevono in ingresso i valori logici del controllore e restituiscono in uscita un opportuno valore di tensione con una determinata polarità, in modo da controllare il verso della rotazione del motore. Il bus di espansione, invece, è il componente che consente alla scheda di comunicare con il microcontrollore del robot: in particolare, attraverso il bus vengono trasmessi la tensione di alimentazione necessaria al funzionamento dei motori e i segnali logici per i driver di controllo. Il bus può inoltre essere utilizzato per espandere le funzionalità del robot, inserendo una nuova scheda per il controllo e lo sviluppo di nuovi dispositivi. Infine, i morsetti servono per collegare la scheda ai due motori a spazzola.

15

Il motoriduttore Il sistema di locomozione del robot, dispone di due ruote motrici e di un ruotino posteriore che, non ricevendo forza motrice, viene definito neutro. Il ruotino è formato da una piccola sfera imperniata su una forcella. Quest’ultima, essendo mobile, è libera di ruotare su se stessa offrendo così al robot la possibilità di sterzare in ogni direzione. Al contrario le due ruote motrici, alimentate dai motori a spazzola, hanno una direzione obbligata, imposta loro dall’asse che le sostiene e le collega all’insieme del blocco motore; dunque, possono muoversi solo avanti o indietro. In generale, un motoriduttore è un insieme (sistema) composto da più elementi in collaborazione reciproca. Il più semplice di questi sistemi è una coppia di ruote dentate che ingranano tra loro, ossia un ingranaggio. L’insieme di più ingranaggi connessi tra loro, invece, prende il nome di ‘ruotismo’ ed è un sistema più complesso ma anche più utile, poichè ‘amplifica’ le caratteristiche e i vantaggi del singolo ingranaggio. In quest’ultimo, quando la ruota dentata connessa a un motore (detta conduttrice) viene azionata, l’altra (detta condotta) viene trascinata nel moto e procede nel verso opposto alla conduttrice e, di solito, con una velocità di rotazione diversa. Tale variazione di velocità dipende dal numero dei denti delle ruote (o, il che equivale, dal loro diametro). Se due ruote ingranano, la ruota con più denti gira alla velocità minore; dunque, quanto più grande è il numero dei denti di una ruota, tanto più piccola sarà la sua velocità. Di conseguenza ci sono ingranaggi riduttori (con la ruota conduttrice più piccola della condotta) e moltiplicatori (con la ruota conduttrice più grande). Se però volessimo ridurre la velocità di una ruota notevolmente, dovremmo costruire un ingranaggio ‘sproporzionato’, dotato di ruote con numero di denti molto differente l’una rispetto all’altra. La questione poi potrebbe farsi più complicata per il robot, il cui motore ha una velocità nominale di 7000 giri al minuto circa, mentre le ruote dovranno girare a una velocità molto, molto più piccola. Ecco allora che interviene il ruotismo, cioè l’insieme dei due ingranaggi connessi fra loro, entrambi riduttori. C’è un dettaglio ancora da considerare, ossia la vite senza fine collegata all’alberino del motore. Ha l’aspetto di una normale vite ma è priva di testa e, inoltre, ha un filetto sagomato per ingranare perfettamente con la ruota dentata sottostante. Nel nostro ruotismo, la vite senza fine svolge la funzione della ruota conduttrice, connessa al motore. Avendo un numero di denti molto piccolo, inoltre, consente una riduzione molto alta della velocità; inoltre permette la trasmissione del moto su assi con direzioni diverse. Nel nostro caso, i due assi (della vite senza fine e della prima ruota condotta) sono perpendicolari.

16

Il Microcontrollore Il Microcontrollore come un piccolo computer gestisce tutto l’apparato elettronico del robot. Questo circuito si compone di un chip, il PIC16C57C (di cui è proprietaria la Microchip), che è il vero e proprio controllore, sul quale è stato integrato l’interprete del linguaggio PBASIC (ossia un’estensione del linguaggio BASIC realizzata dalla Parallax): chip e interprete, insieme, formano il circuito proprietario BASIC STAMP 2 di Parallax. L’interprete opera da interfaccia tra il programma PBASIC, memorizzato nella EPROM, e il microcontrollore. L’interprete riceve, in ingresso, le istruzioni PBASIC e le traduce in una sequenza di istruzioni elementari da fornire, in uscita, al microcontrollore. Ogni microcontrollore possiede, infatti, un insieme di istruzioni elementari, detto instruction set, con cui è possibile programmarlo. Il linguaggio di tali istruzioni, il cosiddetto “linguaggio macchina”, tuttavia, è un linguaggio di basso livello, complesso e poco intuitivo. Programmare il robot fornendo direttamente al microcontrollore le istruzioni elementari, quindi, sarebbe molto difficoltoso. Grazie all’interprete, invece, si può “dialogare” con il microcontrollore in un linguaggio ad alto livello come il BASIC, che utilizza istruzioni più vicine alla logica del linguaggio umano, in modo da ottenere programmi di più facile comprensione. Ogni istruzione PBASIC sarà poi tradotta dall’interprete in una sequenza più o meno lunga di istruzioni elementari, comprensibili al microcontrollore. Si può immaginare che un istruzione ad alto livello,come “apri la porta”, sia tradotta in una sequenza di istruzioni elementari di basso livello, quali “inserisci la chiave, poi girala, ora abbassa la maniglia e spingi la porta”. In realtà, il linguaggio PBASIC è un linguaggio ibrido, in quanto Parallax ha apportato al BASIC standard una serie di modifiche che riguardano principalmente una gestione a più basso livello delle porte di I/O (corrispondenti ad alcuni dei 28 piedini del microcontrollore), rendendo in questo modo possibili anche una gestione più efficiente di sensori e attuatori. Generalmente all’interno di un microcontrollore si trovano una memoria volatile riservata all’esecuzione dei programmi (RAM, Random Access Memory), un’unità che realizza le operazioni aritmetiche e logiche sui dati (ALU, Aritmethic Logic Unit) e un clock (“orologio”), cioè il sequenziatore che fornisce la scansione temporale per l’esecuzione delle diverse istruzioni e che, di fatto, esprime la velocità di calcolo del chip. Nel caso del robot, a seguito della modifica introdotta al microchip, il clock è stato posizionato all’esterno del microcontrollore e corrisponde sulla scheda madre, al dispositivo contrassegnato dalla sigla Y1. In particolare il microcontrollore BASIC STAMP 2 ha una velocità di calcolo di 20MHz, in altre parole è in grado di eseguire operazioni matematiche, operazioni di lettura e scrittura della memoria, generazione di segnali di comando dei dispositivi presenti sul robot alla velocità di 20 milioni di operazioni al secondo.

17

18

Che cosa sono i PIC? I PIC sono dei circuiti integrati prodotti dalla Microchip Technology Inc., che appartengono alla categoria dei microcontroller, ovvero quei componenti che integrano in un unico dispositivo tutti i circuiti necessari a realizzare un completo sistema digitale programmabile. i PIC (in questo caso un PIC16C84) si presentano esternamente come dei normali circuiti integrati TTL o CMOS, ma internamente dispongono di tutti dispositivi tipici di un sistema a microprocessore, ovvero:

• Una CPU (Central Processor Unit ovvero unità centrale di elaborazione) il cui scopo è interpretare le istruzionidi programma.

• Una memoria PROM (Programmable Read Only Memory ovvero memoria programmabile a sola lettura) in cui sono memorizzate in maniera permanente le istruzioni del programma da eseguire.

• Una memoria RAM (Random Access Memory ovvero memoria ad accesso casuale) utilizzata per memorizzare le variabili utilizzate dal programma.

• Una serie di LINEE DI I/O per pilotare dispositivi esterni o ricevere impulsi da sensori,

pulsanti, ecc.

• Una serie di dispositivi ausiliari al funzionamento quali generatori di clock, bus,

contatori, ecc.

La presenza di tutti questi dispositivi in uno spazio estremamente contenuto, consente al progettista di avvalersi degli enormi vantaggi derivanti dall'uso di un sistema a microprocessore, anche in quei circuiti che fino a poco tempo fa erano destinati ad essere realizzati con circuiterie tradizionali. I PIC sono disponibili in un'ampia gamma di modelli per meglio adattarsi alle esigenze di progetto specifiche, differenziandosi per numero di linee di I/O e per dotazione di dispositivi. Si parte dai modelli più piccoli identificati dalla sigla PIC12C5xx dotati di soli 8 pin, fino ad arrivare ai modelli più grandi con sigla PIC17Cxx dotati di 40 pin. L'area di programma e il Register File Dopo aver fatto un pò di pratica, passiamo ora alla teoria. Iniziamo a vedere com'è fatto internamente un PIC, quali dispositivi contiene e come interagiscono tra loro. Nella figura seguente viene riprodotto lo schema a blocchi semplificato dell'architettura interna del PIC16C57C che ci aiuterà a seguire meglio quanto verrà spiegato. Le parti evidenziate in giallo, sono le componenti che di volta in volta andremo ad analizzare.

19

Iniziamo dalla memoria EEPROM e dal REGISTER FILE.

Il REGISTER FILE è un'insieme di locazioni di memoria RAM denominate REGISTRI. Contrariamente alla memoria EEPROM destinata a contenere il programma, l'area di memoria RAM è direttamente visibile dal programma stesso. Quindi potremo scrivere, leggere e modificare tranquillamente ogni locazione del REGISTER FILE nel nostro programma ogni volta che se ne presenti la necessità. L'unica limitazione consiste nel fatto che alcuni di questi registri svolgono una funzione speciale per il PIC e non possono essere utilizzati per scopi diversi da quelli per cui sono stati riservati. Questi registri speciali si trovano nelle locazioni più basse dell'area di memoria RAM secondo quanto illustrato di seguito.

20

Le locazioni di memoria presenti nel REGISTER FILE sono indirizzabili direttamente in uno spazio di memoria che va da 00H a 2FH per un totale di 48 byte, denominato pagina 0. Un secondo spazio di indirizzamento denominato pagina 1 che va da 80H a AFH. Per accedere a questo secondo spazio è necessario ricorrere ai due bit ausiliari RP0 e RP1 secondo le modalità che andremo a spiegare più avanti. Le prime 12 locazioni della pagina 0 (da 00H a 0BH) e della pagina 1 (da 80H a 8BH) sono quelle riservate alle funzioni speciali per il funzionamento del PIC e, come già detto, non possono essere utilizzate per altri scopi. Le 36 locazioni in pagina 0 indirizzate da 0CH a 2FH possono essere utilizzate liberamente dai nostri programmi per memorizzare variabili, contatori, ecc.

I registri specializzati del PIC vengono utilizzati molto di frequente nei programmi. Ad esempio, si ricorre alla coppia di registri specializzati TRISA e TRISB, per definire quali linee di I/O sono in ingresso e quali in uscita. Lo stesso stato logico delle linee di I/O dipende dal valore dei due registri PORTA e PORTB. Alcuni registri riportano lo stato di funzionamento dei dispositivi interni al PIC o il risultato di operazioni aritmetiche e logiche.

21

E' necessario conoscere quindi esattamente quale funzione svolge ciascun registro specializzato e quali effetti si ottengono nel manipolarne il contenuto. Per facilitare le operazioni sui registri specializzati, nel file P16C57.INC la Microchip ha inserito una lista di nomi che identificano univocamente ciascun registro specializzato e a cui sono associati gli indirizzi corrispondenti nell'area dei REGISTER FILE. Se, ad esempio, volessimo definire tutte le linee della porta B del PIC in uscita agendo sul registro TRISB, potremmo scegliere di referenziare direttamente il registro con il suo indirizzo: movlw B'00000000' movwf 06H oppure, referenziare lo stesso registro con il suo nome simbolico: movlw B'00000000' movwf TRISB avendo però l'accortezza di inserire la direttiva INCLUDE "P16C57C.INC" nel nostro source. La EEPROM è una memoria speciale, non cancellabile elettricamente, utilizzata nel PIC per memorizzare il programma da eseguire. La sua capacità di memorizzazione è di 1024 locazioni ognuna in grado di contenere un opcode a 14 bit ovvero una istruzione base del PIC. Il programma più complesso che potremo realizzare non potrà essere quindi più lungo di 1024 istruzioni. Gli indirizzi riservati alla EEPROM vanno da 0000H a 03FFH. Il PIC può solamente eseguire le istruzioni memorizzate in queste locazioni. Non può in alcun modo leggere, scrivere o cancellare quanto in esse contenuto. Per scrivere, leggere e cancellare queste locazioni è necessario un dispositivo esterno denominato programmatore. Un esempio di programmatore è il nostro YAPP! o il PICSTART-16+© prodotto dalla Microchip o molti altri ancora disponibili in commercio. La prima locazione di memoria, all'indirizzo 0000H, deve contenere la prima istruzione che il PIC dovrà eseguire al reset e per questo viene nominata Reset Vector.

22

L'ALU ed il registro W Andiamo ora ad illustrare altre due componenti fondamentali nell'architettura del PIC, la ALU ed il registro W o accumulatore.

+

La ALU (acronimo di Arithmetic and Logic Unit ovvero unità aritmentica e logica) è la componente più complessa del PIC in quanto contiene tutta la circuiteria delegata a svolgere le funzioni di calcolo e manipolazione dei dati durante l'esecuzione di un programma. La ALU è una componente presente in tutti i microprocessori e da essa dipende direttamente la potenza di calcolo del micro stesso. La ALU del PIC16C57C è in grado di operare su valori ad 8 bit, ovvero valori numerici non più grandi di 255. Esistono microprocessori con ALU a 16, 32, 64 bit e oltre. La famiglia Intel© 80386©, 486© e Pentium© ad esempio dispone di una ALU a 32 bit. Le potenze di calcolo raggiunte da questi micro sono notevolmente superiori a scapito della complessità della circuiteria interna ed accessoria e conseguentemente dello spazio occupato. Direttamente connesso con la ALU c'è il registro W denominato anche accumulatore. Questo registro consiste di una semplice locazione di memoria in grado di contenere un solo valore a 8 bit.

23

La differenza sostanziale tra il registro W e le altre locazioni di memoria consiste proprio nel fatto che, per referenziare il registro W, la ALU non deve fornire nessun indirizzo di memoria, ma può accedere direttamente. Il registro W viene utilizzato spessissimo nei programmi per PIC. Facciamo un esempio pratico. Supponiamo di voler inserire nella locazione di memoria 0CH del REGISTER FILE il valore 01H. Cercando tra le istruzioni del PIC ci accorgiamo subito che non esiste un'unica istruzione in grado di effettuare questa operazione ma dobbiamo necessariamente ricorrere all'accumulatore ed usare due istruzioni in sequenza. Vediamo perché: Come già detto, l'opcode di una istruzione non può essere più grande di 14 bit mentre a noi ne servirebbero:

• 8 bit per specificare il valore che intendiamo inserire nella locazione di memoria, • 7 bit per specificare in quale locazione di memoria vogliamo inserire il nostro valore, • 6 bit per spcificare quale istruzione intendiamo utilizzare.

per un totale di 8 + 7 + 6 = 21 bit. Dobbiamo quindi ricorrere a due istruzioni, ovvero: movlw 01H movwf 0CH che prima inseriscono nel registro W il valore 01H con l'istruzione MOVe Literal to W e poi lo "muovono" nella locazione 0CH con l'istruzione MOVe W to F.

24

Il Program Counter e lo Stack In questo passo analizzeremo il funzionamento del Program Counter e dello Stack due componenti importanti per la comprensione delle istruzioni di salto e chiamata a subroutine.

Come abbiamo già visto nei passi precedenti, il PIC16C57C inizia l'esecuzione del programma a partire dal vettore di reset (Reset Vector) ovvero dall'istruzione memorizzata nella prima locazione di memoria (indirizzo 0000H). Dopo aver eseguito questa prima istruzione passa quindi all'istruzione successiva memorizzata nella locazione 0001H e così via. Se non esistesse nessuna istruzione in grado di influenzare in qualche modo l'esecuzione del programma, il PIC arriverebbe presto ad eseguire tutte le istruzione presenti nella sua memoria fino all'ultima locazione disponibile. Sappiamo ovviamente che non è così e che qualsiasi microprocessore o linguaggio di programmazione dispone di istruzioni di salto, ovvero di istruzioni in grado di modificare il flusso di esecuzione del programma in base alle esigenze del programmatore. Una di queste istruzioni è la GOTO (dall'inglese GO TO, vai a) che ci permette di cambiare la sequenza di esecuzione e di "saltare" direttamente ad un qualsiasi punto, all'interno della memoria programma, e di continuare quindi l'esecuzione a partire da quel punto.

25

Facciamo un esempio: ORG 00H Point1 movlw 10 goto Point1 Al reset il PIC eseguirà l'istruzione MOVLW 10 memorizzata alla locazione 0000H, la quale inserirà nell'accumulatore il valore decimale 10, quindi passerà ad eseguire l'istruzione successiva GOTO Point1. Questa istruzione determinerà un salto incondizionato alla locazione di memoria puntata dalla label Point1 ovvero di nuovo alla locazione 0000H. Nel suo insieme quindi, questo programma non farà altro che eseguire continuamente le due istruzioni elencate. Durante questo ciclo (o loop), per determinare quale sarà l'istruzione successiva da eseguire, il PIC utilizza uno speciale registro denominato PROGRAM COUNTER (dall'inglese contatore di programma) la cui funzione è proprio quella di mantenere traccia dell'indirizzo che contiene la prossima istruzione da eseguire. Questo registro viene incrementato automaticamente ad ogni istruzione eseguita per determinare il passaggio all'istruzione successiva. Al momento del RESET del PIC il PROGRAM COUNTER viene azzerato, determinando così l'inizio dell'esecuzione a partire dall'indirizzo 0000H. L'istruzione GOTO consente l'inserimento a programma di un nuovo valore nel PROGRAM COUNTER ed il di conseguente salto ad una locazione qualsiasi dell'area programma del PIC. Un'altra istruzione molto utile, che influenza il valore del PROGRAM COUNTER è la CALL (dall'inglese chiamata) con la quale è possibile effettuare delle CHIAMATE A SUBROUTINE. Questa istruzione funziona in maniera molto simile alla GOTO. Come la GOTO infatti permette di scrivere nel PROGRAM COUNTER un nuovo indirizzo di esecuzione del programma. La differenza sostanziale consiste però nel fatto che prima di eseguire il salto,. il PIC memorizza, in un altro registro speciale, denominato STACK, l'indirizzo di quella che sarebbe dovuta essere la successiva istruzione da eseguire se non si fosse incontrata la CALL. Vediamo meglio con un esempio: ORG 00H Point1 movlw 10 call Point2 goto Point1 Point2 movlw 11 return In questo caso il PIC, dopo aver eseguito la MOVLW 10 passa ad eseguire listruzione CALL Point2. Prima di saltare però, memorizza nello STACK l'indirizzo 0002H, ovvero l'indirizzo della locazione successiva alla CALL. L'esecuzione passa quindi all'istruzione MOVLW 11 e quindi alla istruzione RETURN (dall'inglese ritorno). Questa istruzione, come dice il suo nome, consente di "ritornare", ovvero di riprendere l'esecuzione a partire dall'istruzione successiva alla CALL che aveva determinato l'abbandono del flusso principale del programma utilizzando il valore memorizzato nel registro di STACK. Come detto l'operazione appena effettuata viene denominata CHIAMATA A SUBROUTINE, ovvero una interruzione momentanea del normale flusso di programma per “chiamare” in esecuzione una serie di istruzioni per poi ritornare al normale flusso di esecuzione. La parola STACK in inglese significa "catasta" ed infatti su questa catasta è possibile depositare, uno sull'altro, più indirizzi per recuperarli quando servono. Questo tipo di memorizzazione viene anche denominata LIFO dall'inglese Last In First Out, in cui l'ultimo elemento inserito (last in) deve necessariamente essere il primo ad uscire (first out). Grazie a questa caratteristica è possibile effettuare più CALL annidate ovvero l'una nell'altra e mantenere sempre traccia del punto in cui riprendere il flusso al momento che si incontra una istruzione RETURN.

26

Le porte A e B Il PIC16F84 dispone di un totale di 13 linee di I/O organizzate in due porte denominate PORTA A e PORTA B.

• La PORTA A dispone di 5 linee configurabili sia in ingresso che in uscita identificate dalle sigle RA0, RA1, RA2, RA3 ed RA4.

• La PORTA B dispone di 8 linee anch'esse configurabili sia in ingresso che in uscita identificate dalle sigle RB0, RB1, RB2, RB3, RB4, RB5, RB6 ed RB7.

La suddivisione delle linee in due porte distinte è dettata dai vincoli dell'architettura interna del PIC16C57 che prevede la gestione di dati di lunghezza massima pari a 8 bit. Per la gestione delle linee di I/O da programma, il PIC dispone di due registri interni per ogni porta denominati TRISA e PORTA per la porta A e TRISB e PORTB per la porta B. I registri TRIS A e B, determinano il funzionamento in ingresso o in uscita di ogni singola linea, i registri PORT A e B determinano lo stato delle linee in uscita o riportano lo lo stato delle linee in ingresso.

27

Ognuno dei bit contenuti nei registri menzionati corrisponde univocamente ad una linea di I/O. Ad esempio il bit 0 del registro PORTA e del registro TRIS A corrispondono alla linea RA0 , il bit 1 alla linea RA1 e così via. Se il bit 0 del registro TRISA viene messo a zero, la linea RA0 verrà configurata come linea in uscita, quindi il valore a cui verrà messo il bit 0 del registro PORTA determinerà lo stato logico di tale linea (0 = 0 volt, 1 = 5 volt). Se il bit 0 del registro TRISA viene messo a uno, la linea RA0 verrà configurata come linea in ingresso, quindi lo stato logico in cui verrà posta dalla circuiteria esterna la linea RA0 si rifletterà sullo stato del bit 0 del registro PORTA. Facciamo un esempio pratico, ipotizziamo di voler collegare un led sulla linea RB0 ed uno switch sulla linea RB4, il codice da scrivere sarà il seguente: movlw 00010000B tris B in cui viene messo a 0 il bit 0 (linea RB0 in uscita) e a 1 il bit 4 (linea RB4) in ingresso. Si ricorda a tale proposito che nella notazione binaria dell'assembler il bit più a destra corrisponde con il bit meno significativo quindi il bit 0. Per accendere il led dovremo scrivere il seguente codice: bsf PORTB,0 Per spegnerlo: bcf PORTB,0 Per leggere lo stato dello switch collegato alla linea RB4, il codice sarà: btfss PORTB,4 goto SwitchAMassa goto SwitchAlPositivo Interrupt L'interrupt è una particolare caratteristica dei PIC (e dei microprocessori in generale) che consente di intercettare un evento esterno, interrompere momentaneamente il programma in corso, eseguire una porzione di programma specializzata per la gestione dell'evento verificatosi e riprendere l'esecuzione del programma principale. Volendo fare un paragone con il mondo reale possiamo dire che l'interrupt rappresenta per il PIC quello che per noi rappresenta ad esempio la suoneria del telefono. Per poter ricevere telefonate non dobbiamo preoccuparci di alzare continuamente la cornetta per vedere se c'é qualcuno che vuol parlare con noi, ma, grazie alla suoneria, possiamo continuare tranquillamente a fare le nostre faccende in quanto saremo avvisati dà questa ogni volta che qualcuno ci sta chiamando. Appena sentiamo lo squillo, possiamo decidere di interrompere momentaneamente le nostre faccende, rispondere e, una volta terminata la conversazione, riprendere dal punto in cui avevamo interrotto. Riportando i termini di questo paragone al PIC abbiamo che:

• le nostre faccende corrispondono al programma in esecuzione;

• la chiamata da parte di qualcuno corrisponde all'evento da gestire;

• lo squillo del telefono corrisponde alla richiesta di interrupt;

• la nostra risposta al telefono corrisponde alla subroutine di gestione dell'interrupt.

28

Tipi di evento e bit di abilitazione Il PIC16C57c è in grado di gestire in interrupt quattro eventi diversi, vediamo quali sono:

1. Il cambiamento di stato sulla linea RB0 (External interrupt RB0/INT pin). 2. La fine del conteggio del registro TMR0 (TMR0 overflow interrupt). 3. Il cambiamento di stato su una delle linee da RB4 ad RB7 (PORTB change interrupts). 4. La fine della scrittura su una locazione EEPROM (EEPROM write complete interrupt).

L'interrupt su ognuno di questi eventi può essere abilitato o disabilitato indipendentemente dagli altri agendo sui seguenti bit del registro INTCON:

• INTE (bit 4) se questo bit viene messo a 1 viene abilitato l'interrupt sul cambiamento di stato sulla linea RB0

• T0IE (bit 5) se questo bit viene messo a 1 viene abilitato l'interrupt sulla fine del conteggio del registro TMR0

• RBIE (bit 3) se questo bit viene messo a 1 viene abilitato l'interrupt sul cambiamento di stato su una delle linee da RB4 ad RB7

• EEIE (bit 6) se questo bit viene messo a 1 viene abilitato l'interrupt sulla fine della scrittura su una locazione EEPROM

Esiste inoltre un bit di abilitazione generale degli interrupt che deve essere settato anch'esso ad uno ovvero il bit GIE (Global Interrupt Enable bit) posto sul bit 7 del registro INTCON. Interrupt vector ed Interrupt handler Qualunque sia l'evento abilitato, al suo manifestarsi il PIC interrompe l'esecuzione del programma in corso, memorizza automaticamente nello STACK il valore corrente del PROGRAM COUNTER e salta all'istruzione presente nella locazione di memoria 0004H denominata Interrupt vector (vettore di interrupt). E' da questo punto che dobbiamo inserire la nostra subroutine di gestione dell'interrupt denominata Interrupt Handler (gestore di interrupt). Potendo abilitare più interrupt, tra i primi compiti dell'interrupt handler è la verifica di quale, tra gli eventi abilitati, ha generato l'interrupt e l'esecuzione della parte di programma relativo. Questo controllo può essere effettuato utilizzando gli Interrupt flag. Interrupt flag Dato che qualunque interrupt genera una chiamata alla locazione 04H, nel registro INTCON sono presenti dei flag che indicano quale è l'evento che ha generato l'interrupt, vediamoli:

• INTF (bit 1) Se vale 1 l'interrupt è stato generato dal cambiamento di stato sulla linea RB0.

• T0IF (bit 2) Se vale 1 l'interrupt è stato generato al termine del conteggio del timer TMR0.

• RBIF (bit 0) Se vale 1 l'interrupt è stato generato dal cambiamento di stato di una delle linee da RB4 a RB7.

29

Come si vede per l'interrupt sul fine scrittura in EEPROM non è previsto alcun flag di segnalazione per cui l'interrupt handler dovrà considerare che l'interrupt è stato generato da questo evento quando tutti e tre i flag sopra citati valgono 0. Importante: Una volta rilevato quale flag è attivo, l'interrupt handler deve azzerarlo altrimenti non verrà più generato l'interrupt corrispondente. Ritorno da un interrupt handler Quando viene generato un interrupt il PIC disabilita automaticamente il bit GIE (Global Interrupt Enable) del registro INTCON in modo da disabilitare tutti gli interrupt mentre è già in esecuzione un interrupt handler. Per poter ritornare al programma principale e reinizializzare a 1 questo bit occorre utilizzare l'istruzione: RETFIE

L'interfaccia RS232 Cos'é e a cosa serve Lo standard RS232 definisce una serie di specifiche per la trasmissione seriale di dati tra due dispositivi denominati DTE (Data Terminal Equipment) e DCE (Data Communication Equipment). Come si può vagamente intuire dal nome, il Data Communication Equipment è un dispositivo che si occupa di gestire una comunicazione dati mentre il Data Terminal Equipment è un dispositivo che si occupa di generare o ricevere dati. In pratica l'RS232 è stata creata per connettere tra loro un terminale dati (nel nostro caso un computer) con un modem per la trasmissione a distanza dei dati generati. Per avere una connessione tra due computer è quindi necessario disporre di quattro dispositivi come visibile in figura: un computer (DTE) collegato al suo modem (DCE) ed un altro modem (DCE) collegato al suo computer (DTE). In questo modo qualsiasi dato generato dal primo computer e trasmesso tramite RS232 al relativo modem verrà trasmesso da questo al modem remoto che a sua volta provvederà ad inviarlo al suo computer tramite RS232. Lo stesso vale per il percorso a ritroso.

Per usare la RS232 per collegare tra loro due computer vicini senza interporre tra loro alcun modem dobbiamo simulare in qualche modo le connessioni intermedie realizzando un cavo NULL MODEM o cavo invertente, ovvero un cavo in grado di far scambiare direttamente tra loro i segnali dai due DTE come se tra loro ci fossero effettivamente i DCE. Per connettere il PC al nostro circuito simuleremo invece direttamente un DCE facendo credere al PC di essere collegato ad un modem. Prima di fare questo diamo uno sguardo in dettaglio al principio di funzionamento di una comunicazione seriale.

30

La comunicazione seriale asincrona Per consentire la trasmissione di dati tra il PC ed il modem, lo standard RS232 definisce una serie di specifiche elettriche e meccaniche. Una di queste riguarda il tipo di comunicazione seriale che si vuole implementare che può essere sincrona o asincrona. Nel nostro caso analizzeremo solo la comunicazione seriale asincrona ignorando completamente quella sincrona in quanto più complessa e non disponibile sui normali PC. Una comunicazione seriale consiste in genere nella trasmissione e ricezione di dati da un punto ad un altro usando una sola linea elettrica. In pratica se desideriamo trasmettere un intero byte dobbiamo prendere ogni singolo bit in esso contenuto ed inviarlo in sequenza sulla stessa linea elettrica, un pò come avviene per la trasmissione in codice morse. La differenza sostanziale stà nel fatto che a generare e ricevere dati non c'é il telegrafista ma un computer per cui le velocità di trasmissione raggiungibili sono molto superiori. Facciamo subito un esempio pratico e vediamo come fa un PC a trasmettere, ad esempio, il carattere A usando la RS232. Non è necessario ovviamente realizzare gli esempi riportati di seguito in quanto presuppongono l'uso di una coppia di PC ed un oscilloscopio non sempre disponibili nei nostri mini-laboratori da hobbysta. Per comprendere il funzionamento di quanto esposto è sufficiente fare riferimento alle figure a corredo. Se prendiamo una coppia di fili e colleghiamo tra loro le porte seriali di due PC (che denomineremo PC trasmittente e PC ricevente) secondo lo schema riportato in figura:

otterremo la più semplice delle connessioni in RS232. La linea Transmit Data (TXD) presente sul pin 3 del connettore DB9 maschio di cui il vostro PC è dotato è connessa alla linea Receive Data (RXD) presente sul pin 2 del secondo PC. Le masse (GND) presenti sul pin 5 di entrambe i PC sono connesse tra loro. Per osservare i segnali generati dal PC trasmittente durante la trasmissione seriale colleghiamo tra la linea TXD e la linea GND un oscilloscopio e lanciamo in esecuzione su entrambe i PC un programma di emulazione terminale (tipo Hyperterminal o simili). Configuriamo le porte seriali di entrambe i PC a 9600 baud, 8 data bit, 1 stop bit, no parity e disabilitiamo il controllo di flusso (handshake) sia hardware che xon/xoff. In questo stato qualsiasi cosa digiteremo sul PC trasmittente verrà inviata immediatamente sulla porta seriale. Assicuriamoci inoltre che il programma di emulazione terminale scelto sia opportunamente configurato per usare la porta seriale su cui siamo connessi (COM1 o COM2).

31

Proviamo a digitare la lettera A maiuscola e verifichiamo se è stata correttamente ricevuta sul PC ricevente. Fatto questocontrollo andiamo a vedere sull'oscilloscopio che tipo di segnali sono stati generati per effettuare la trasmissione. Quando non c'é nessuna trasmissione in corso la tensione sulla linea TXD è di -12 volt corrispondente alla condizione logica 1. Per indicare al PC ricevente che la trasmissione ha inizio, il PC trasmittente porta a +12 volt la linea TXD per un tempo pari all'inverso della frequenza di trasmissione ovvero al tempo di trasmissione di un singolo bit. Nel nostro caso, avendo scelto di trasmettere a 9600 bit per secondo, la tensione di alimentazione rimarà a +12 volt per: 1/9600=0.104 mS. Questo segnale viene denominato START BIT ed è sempre presente all'inizio di trasmissione di ogni singolo byte. Dopo lo start bit vengono trasmessi in sequenza gli otto bit componenti il codice ASCII del carattere trasmesso partendo dal bit meno significativo. Nel nostro caso la lettera A maiuscola corrisponde al valore binario 01000001 per cui la sequenza di trasmissione sarà la seguente:

Una volta trasmesso l'ottavo bit (bit 7), il PC aggiunge automaticamente un ultimo bit a 1 denominato STOP BIT ad indicare l'avvenuta trasmissione dell'intero byte. La stessa sequenza viene ripetuta per ogni byte trasmesso sulla linea. Aggiungendo al nostro cavo seriale una connessione tra il pin TXD (pin 3) del PC ricevente con il pin RXD (pin 2) del PC trasmittente, potremo effettuare una trasmissione RS232 bidirezionale. Il cavo che abbiamo ottenuto è il più semplice cavo NULL MODEM in grado di mettere in collegamento tra loro due DTE.

32

33

34

Le fasi di programmazione Utilizzando la funzione Identify del software, il PC potrà riconoscere il robot e testare il canale di comunicazione. Dopo aver avviato il programma e acceso il robot, premendo il pulsante Identify dalla barra degli strumenti: apparirà una finestra denominata Identification che riporta alcune informazioni (Port Status) relative allo stato di ogni porta seriale del PC. Nel caso in figura il computer rileva la presenza del robot, individuato dalla scritta BASIC Stamp2, collegato alla porta seriale COM1. Per capire come il robot e il PC interagiscono tra di loro, scriveremo un programma molto semplice, per fare in modo che il robot comunichi al computer un messaggio di testo. Dopo aver acceso il robot e scritto nell’area di editing quanto mostrato nella figura B, andremo a premer il pulsante di start/stop del robot, questo farà eseguire il programma; apparirà la finestra intitolata Debug Terminal #1 (figura C), che contiene i messaggi che il robot manda al computer. Nel nostro caso sarà visualizzata la scritta “Hello World!” che attesta l’avvenuta esecuzione del programma. Questa finestra è molto importante: in base ai messaggi che visualizza,è infatti possibile verificare lo stato del robot e quale parte di un codice di un programma è in esecuzione. Facciamo ora un passo indietro e analizziamo il listato (ossia il testo o codice) che abbiamo scritto; la prima riga contiene una direttiva, cioè un’istruzione che viene fornita al BASIC Stamp editor come informazione sul programma; in particolare, la direttiva {$STAMP BS2} indica all’editor che il programma scritto in seguito andrà caricato su un modulo BASIC Stamp2. La seconda riga è invece un commento, una frase che descrive il funzionamento del programma o un determinato frammento di codice; è una ‘nota a margine’ a uso e consumo del programmatore, utile soprattutto quando si torna ad un programma scritto in precedenza e se ne voglia ricostruire la storia, i commenti devono essere sempre preceduti da un apice (‘). Anche la direttiva vista in precedenza era preceduta da un apice e, per questo, può essere considerata come un particolare tipo di commento; tuttavia, mentre la direttiva viene letta dall’editor e utilizzata per definire una particolare configurazione di utilizzo, i commenti vengono ignorati dall’editore, dunque, possono comparire lungo tutto il codice del programma. L’ultima riga del programma contiene l’unica vera istruzione in linguaggio PBASIC. Questa istruzione (debug) serve per aprire la finestra Debug Terminal #1 che, durante l’esecuzione di un programma, visualizza i messaggi; se tale istruzione appare almeno una volta all’interno di un listato, la corrispondente finestra di debug si aprirà automaticamente. Il comando debug viene quindi utilizzato per far comunicare il robot con il computer attraverso il cavo seriale e inviare messaggi nella finestra di debug dell’editor. L’istruzione debug, infatti, è seguita da una stringa, ossia una sequenza di caratteri racchiusi tra virgolette ( “Hello World!”), che corrisponde al testo del messaggio da visualizzare; di fatto, si possono utilizzare più stringhe, a patto che siano separate da virgole. Ad esempio, sostituendo l’ultima riga del programma che abbiamo scritto (debug “Hello World!”, CR) con il comando debug “Hello World!”, CR, “I’m happy to see you”, il robot comunica al PC il messaggio mostrato nella figura D. CR (ossia Carriage Return, ritorno del carrello) è un carattere speciale PBASIC che corrisponde all’istruzione di fine riga; inserendo questo carattere tra due stringhe si fa in modo che queste vengano visualizzate sullo schermo su due righe distinte. Dopo aver visto come funziona lo scambio di messaggi tra il PC e il robot, vediamo ora un primo, semplice programma per il movimento del robot; dopo ogni pressione del tasto start\stop,questo programma farà muovere in avanti il robot per 5 secondi. Digitiamo dunque nell’area di editino il listato del programma come in figura E. Tralasciando per il momento la descrizione del programma, soffermiamoci sul frammento del listato che si occupa del movimento del robot (riquadro in rosso), in cui compaiono tre comandi PBASIC: high, low e pause.

35

I primi due comandi regolano il valore in uscita sulla porta logica del microcontrollore corrispondente al numero che li segue; in particolare, high setta il valore alto (1), mentre low setta il valore basso (0). Ad esempio, l’istruzione high 15 setta il valore logico alto alla porta P15, i due punti (:) inseriti al termine dell’istruzione separano due istruzioni diverse, quando vengono scritte sulla stessa riga. Le porte 15 e 14 sono collegate al driver che comanda il motore sinistro, mentre le porte 5 e 3 a quello che comanda il destro. Infine il comando pause serve per introdurre un ritardo tra due operazioni consecutive; il numero che lo segue esprime tale ritardo in millisecondi (ms). Tra le istruzioni che governano il primo e il secondo motore, è buona norma inserire un ritardo di 50 ms, perché nel circuito, all’attivazione dei motori, si verifica sempre una caduta di tensione. Immagine A

Immagine B

Immagine C

36

Immagine D

Immagine E

37

Quello di variabile è sicuramente uno dei concetti fondamentali per la programmazione. All’interno di un programma le variabili hanno lo stesso ruolo che rivestono in un’espressione algebrica; sono cioè nomi simbolici che rappresentano determinati valori, solitamente numerici. In particolare, però, nella programmazione, una variabile fa riferimento a una determinata zona della memoria centrale (RAM del microcontrollore), contenente una sequenza di bit che viene letta e che può essere modificata durante l’esecuzione del programma. Per capire il funzionamento delle variabili, digitiamo nell’area di editing il listato del programma riportato in figura A. Quindi colleghiamo il robot al PC e lo accendiamo, poi premiamo il tasto start/stop perché il programma venga eseguito. Questo programma apre una finestra di debug (figura C) che visualizza le variabili e le operazioni effettuate con esse. Osservando il listato, noteremo che, dopo la direttiva iniziale PBASIC, il programma è stato diviso in tre parti, ciascuna contrassegnata da un commento tra alcuni trattini (‘-------commento-------); questa struttura non è obbligatoria, ma caratterizza un programma ben scritto, è dunque buona norma utilizzarlo. Anche la spaziatura multipla tra istruzioni è una norma di buona scrittura; per programmare correttamente, infatti, sarebbe sufficiente un solo spazio tra le istruzioni; inserirne di più, però, permette di ‘indentare’ il listato (disporlo con ordine nell’area di editing). Torniamo al listato: La prima parte riguarda la dichiarazione delle variabili che saranno usate. La sintassi della dichiarazione esige il nome con cui si intende identificare e richiamare la variabile nel programma (variabile_1,x, y e risultato), seguito da var (che, in PBASIC, caratterizza la dichiarazione di variabili) e dalla dimensione (bit, nib ecc.), in termini di memoria occupata, che si intende adottare. E’ necessario che il nome scelto sia costituito da una serie di caratteri alfabetici e/o numerici (e nono simbolici, come $, %, +, *, &, riservate ad altre funzioni) e il primo deve essere alfabetico. Buona norma è che il nome abbia un legame di senso con il ruolo svolto dalla variabile. La dimensione riguarda il numero di bit e, dunque, lo spazio di memoria che deve essere riservato al contenuto di una variabile; maggiore è il numero che vogliamo rappresentare, maggiore deve essere il numero di bit a disposizione. Le possibili dimensioni (in figura B) sono bit, nib, byte e word. La dimensione word, oltre ad essere la maggiore (fino a 65535), permette anche di rappresentare numeri negativi (nel qual caso, però, si dimezza il valore massimo memorizzabile, riducendolo a 32767); si potrebbe utilizzare sempre questa dimensione ma, per non sprecare memoria utile, conviene scegliere sempre la minima dimensione possibile. Procedendo nel listato, la seconda parte riguarda l’inizializzazione delle variabili, cioè l’assegnazione dei rispettivi valori iniziali, tramite l’operatore = preceduto dal nome della variabile e seguito dal valore da assegnare. Quest’ultimo può essere un numero o un espressione numerica che contenga, a sua volta, altre variabili (è il caso di variabile_1, che contiene la x). Nel caso in cui il valore iniziale di una variabile non venga specificato, tale valore viene automaticamente inizializzato a 0. La terza sezione del listato, infine, contiene il programma principale. L’istruzione debug DEC x, CR, CR visualizza nell’apposita finestra (debug) il valore decimale (DEC) della variabile x, andando poi a capo (CR) due volte (prima riga nella figura C). Ogni volta che nel programma (figura A) ricorre l’istruzione debug, la finestra corrispondente (figura C) visualizza ciò che segue tale istruzione, ossia una stringa di testo o il contenuto numerico di variabili, di cui però verrà specificato il formato (in questo caso decimale). Nella seconda istruzione del programma principale, premettendo il carattere ? ai nomi delle variabili (x, y, variabile_1 e risultato), si visualizzano anch’essi, oltre al loro valore (nella figura C, dalla riga in cui compare x = 127 a quella con risultato = 0). Non essendo stata espressamente inizializzata, la variabile risultato vale 0. Nella successiva istruzione del listato, invece, alla variabile risultato viene assegnato, tramite l’operatore = il valore (y / 3) * x. L’ultima istruzione visualizza nome (?) e valore, in forma decimale (DEC), di risultato (ultima riga figura C). 38

Immagine A

Immagine B

Immagine C

39