Sei sulla pagina 1di 48

ISTITUTO TECNICO INDUSTRIALE Arturo Malignani

33100 UDINE
V.le L. da Vinci 10 tel. 0432-46361 fax 0432-545420

a.s. 2009-2010

Il Boe-Bot
Corso introduttivo di Robotica

2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine

Indice
1.1 1.2 2.1 2.2 2.3 2.4 3.1 3.2 3.3 3.4 3.5 3.6 4.1 4.2 4.3 5.1 5.2 6.1 6.2 6.3 7.1 7.2 Introduzione Link utili Il Basic Stamp Editor La scrittura del software Hello, world I cicli I motori La movimentazione dei motori Un semplice programma Le Subroutine Disegnare con il Boe-Bot Il cammino chiuso Il tatto La movimentazione in presenza di ostacoli La mappatura del piano La vista ad ultrasuoni L'algoritmo di Pledge La vista ad infrarossi Tecniche di modulazione L'istruzione FreqOut I sensori di luminosit Un problema 3 3 4 5 7 8 10 12 12 13 15 16 18 20 21 28 31 40 41 43 44 46

2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine

1.1 - Introduzione
Le presenti pagine illustrano brevemente il corso di robotica organizzato dall'Istituto Tecnico Industriale A. Malignani di Udine per l'a.s. 2009-2010. Esso basato sull'uso del robot della Parallax denominato Boe-Bot e degli accessori ad esso acclusi. Il corso permetter anche di introdurre argomenti non esplicitamente trattati nel corso ufficiale Parallax (Robotics with the Boe-Bot) o nella sua traduzione italiana (Robotica con il Boe-Bot), curata da Stefano Caruso. Terr conto anche di quanto svolto nelle materie curricolari del corso di Elettronica e Telecomunicazione del nostro Istituto e delle esperienze maturate da insegnanti e studenti in corsi similari a quello presente. L'esperienza che lo studente maturer durante il corso sar, infine, direttamente spendibile durante il torneo ufficiale che l'I.T.I. A. Malignani organizza nelle giornate del 20-21 febbraio 2010. Buon lavoro.

1.2 - Link utili


I seguenti link sono di indubbio interesse per lo studente che intenda utilizzare la documentazione ufficiale della Parallax: www.parallax.com www.parallax.com/html_pages/products/robo/robotics.asp www.parallax.com/htlm_pages/products/basicstamps/basic_stamps.asp www.parallax.com/dl/docs/books/edu/roboticsv2_2.pdf Nel sito ufficiale Parallax e nei link che ivi possibile trovare, si pu eseguire il download di documentazione estremamente utile durante il presente corso.

2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine

2.1 - Il Basic Stamp Editor


Lo strumento di sviluppo che permette la scrittura, il debugging e lo scarico del software verso il Boe-Bot il Basic Stamp Editor. Una volta installato e lanciato, appare come nella finestra di fig. 2.1.1. Le prime 10 icone poste sulla sinistra sono standard e ben note a tutti gli utilizzatori di software applicativi per sistemi operativi Windows. Le icone seguenti hanno invece dei significati meno evidenti. L'icona Split serve a dividere in due la finestra di editing del programma, in modo da poter visualizzare contemporaneamente due sorgenti separati, ad esempio un programma principale ed una libreria. L'icona Preferences serve a settare le preferenze dell'ambiente di sviluppo: preferenze dell'editor (colori, indentazione, font, ecc.), del debugger (colori, font, tabulatori, ecc.), dei port di I/O (baud rate, data bit, ecc.), delle directory e dei file. Le icone di Stamp Mode servono a selezionare il modulo Basic Stamp presente sul Boe-Bot. Ciascun modulo ha caratteristiche diverse per potenza, memoria, flessibilit, ecc.

fig. 2.1.1 2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine 4

Le icone Languages permettono la scelta della versione del linguaggio PBasic utilizzata: dalla 1.0 all'ultima versione. Premendo Identify dopo aver connesso il Boe-Bot al calcolatore permette il collegamento e relativo riconoscimento del PC al Robot. In tal modo possibile verificare la corretta selezione della porta seriale ed il funzionamento del sistema. Syntax Check permette la verifica sintattica del programma scritto, senza il successivo scarico verso il Boe-Bot. Memory Map permette di verificare l'occupazione in memoria del programma e delle variabili allocate. In tal modo possibile sapere a quanto ammonta la percentuale di memoria usata. L'icona Run abilita lo scarico del programma verso il robot. In tal modo si pu trasferire il programma scritto dal PC al Boe-Bot e, successivamente, verificarlo operativamente. New Debug apre sul PC una finestra di debug, utilizzabile solamente, per, se il cavo seriale rimane collegato. L'utente scrive dunque il programma nella edit area, dopo aver scelto mediante le apposite icone sia il modulo utilizzato dal Boe-Bot (Stamp Mode) che la versione del linguaggio (Language), esegue il check (Syntax Check) e, se tutto a posto, scarica il programma (Run) verso il robot mediante l'apposito cavetto. Infine, tolto il cavetto, si pone l'interruttore a slitta di accensione del Boe-Bot in posizione due e si verifica l'esito delle azioni fatte.

2.2 - La scrittura del software


Ogni buon software scritto utilizzando il Basic Stamp inizia sempre con un commento che introduce e spiega il funzionamento e gli obiettivi del programma. Un esempio di quanto detto il seguente:
'************************************************************************************** '************************************************************************************** '********** Program: YoungSpeech ************************************ '********** Author: Bandiziol Santino ************************************ '********** Date: 10/02/07 ************************************ '********** Version: 1V00 ************************************ '************************************************************************************** '**************************************************************************************

2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine

'************************************************************************************** '********** Functional Description **************************************************** '************************************************************************************** 'Il presente programma relativo alla gestione della movimentazione di un Boe-Bot 'munito di baffi. Il robot si muove in linea retta finch sente un ostacolo, arretra, 'compie una rotazione con angolo random e riparte finch trova un nuovo ostacolo. 'Ogni qualvolta i baffi vengono toccati, viene posto sulle linee di I/O del Basic 'Stamp un codice di 5, insieme ad uno strobe, attivo alto, di 10mS. Tale codice viene 'letto da una Evaluation Board della Sensory che implementa dei messaggi in sintesi 'vocale. Maggiori informazioni su detto codice alla sezione Protocollo di Trasferimento 'posta di seguito. 'Protocollo di Trasferimento 'Il codice da trasferire verso la scheda Sensory di 5 pi uno strobe. I 6 bit sono 'mappati in I/O come di seguito indicato: ' ' Descrizione I/O ' Bit 0 del codice P0 ' Bit 1 del codice P1 ' Bit 2 del codice P2 ' Bit 3 del codice P3 ' Bit 4 del codice P4 ' Strobe P6 ' 'Quando un nuovo codice pronto sulle linee P0-P4, viene posto a 1 lo strobe per 10mS 'e poi viene nuovamente disattivato fino a che un nuovo codice deve essere trasmesso.

La scrittura di un commento inizia sempre con il simbolo ' (apostrofo). Il termine del commento si ha con il primo CR (ritorno di carrello, oppure, in termini pi moderni Invio). Dopo le note introduttive devono essere poste due direttive per il compilatore:
' {$STAMP BS2} ' {$PBASIC 2.5}

La prima indica il modulo Basic Stamp utilizzato, mentre la seconda indica la versione del PBasic. Si noti che la prima direttiva pu essere anche scritta premendo semplicemente l'icona relativa del gruppo Stamp Mode e la seconda mediante la relativa icona del gruppo Language. Si noti anche che la direttiva preceduta dal simbolo ', come se fosse un commento. Tipicamente, in un software PBasic, segue la sezione dichiarativa delle costanti e delle variabili, come di seguito indicato:
'************************************************************************************** '********** Const Declaration ********************************************************* '************************************************************************************** kLeft kRight kBoth CON CON CON 1 2 3 '1 = baffo sinistro '2 = baffo destro '3 = entrambi

'************************************************************************************** '********** Var Declaration *********************************************************** '**************************************************************************************

2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine

Rnd Mask Cnt PulseCnt Whisker

VAR VAR VAR VAR VAR

Word Word Word Word Word

'Seme e variabile di generazione casuale di numeri interi 'Maschera di troncamento dei numeri casuali 'Contatore passi di movimentazione 'Indice cicli for di movimentazione '1 = baffo sx; 2 = baffo dx; 3 = entrambi; 0 = nessuno

La dichiarazione di costante utilizza la parola chiave CON e avviene secondo la regola <etichetta> CON <costante>. E' utile commentare l'uso ed il significato delle singole costanti. Le costanti possono appartenere ad uno dei seguenti tipi: Tipo costante
decimale binario esadecimale carattere stringa

Esempio
123 %100101 $A3 B Ciao

La dichiarazione di variabile utilizza la parola chiave VAR e avviene secondo la regola <etichetta> VAR <tipo variabile>. Anche in questo caso utile commentare il significato e la destinazione d'uso della variabile. Le variabili possono appartenere ad uno dei seguenti tipi: Tipo varibile
Bit Nib Byte Word

Campo esistenza
Da Da Da Da 0 0 0 0 a a a a 1 15 255 65535

Esiste anche la possibilit di dichiarare dei vettori, come nei seguenti esempi:
tenbits fivenibbles twoBytes fourWords VAR VAR VAR VAR Bit (10) Nib (5) Byte (2) Word (4)

Al termine della sezione dichiarativa, tipicamente, inizia il programma principale, a seguire le subroutine ed, al termine del programma, la parola chiave END.

2.3 - Hello, world


Solitamente il primo programma si chiama sempre Hello, world. In PBasic assume la seguente forma:
2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine 7

' {$STAMP BS2} ' {$PBASIC 2.5} DEBUG Hello, world END

L'istruzione DEBUG permette all'utente di verificare il buon andamento del programma durante il run time, a patto di mantenere il collegamento fra Boe-Bot e PC. Mediante tale istruzione si pu visualizzare sulla finestra di debug lo stato delle varibili e semplici messaggi. Dopo l'istruzione DEBUG e prima della costante/variabile di cui si vuole visualizzare il valore possibile porre un formattatore, come illustrato nella seguente tabella: Formattatore
DEC SDEC HEX SHEX IHEX ISHEX BIN SBIN IBIN ISBIN STR STR\n CR ? ASC ?

Esempio
Debug Debug Debug Debug Debug Debug Debug Debug Debug Debug Debug Debug Debug Debug Debug DEC x SDEC x HEX x SHEX x IHEX x ISHEX x BIN x SBIN x IBIN x ISBIN x STR x STR\n x DEC x,CR DEC ? x STR ? x

Descrizione
Visualizza x in decimale Visualizza x in decimale con segno Visualizza x in esadecimale Visualizza x in esadecimale con segno Visualizza x in esadecimale* Visualizza x in esadecimale con segno* Visualizza x in binario Visualizza x in binario con segno Visualizza x in binario* Visualizza x in binario con segno* Visualizza x in formato stringa Visualizza n caratteri di x in formato stringa Esegue un CR dopo la visualizzazione Visualizza x = ... Esegue un CR dopo la visualizzazione x = ..

*Il carattere I indica che la variabile preceduta dal simbolo $ oppure % a seconda della base numerica.

2.4 I cicli
Il PBasic, come tutti i linguaggi di programmazione, possiede, oltre al ciclo FOR che verr analizzato tra breve, altri due cicli, paragonabili al REPEAT .. UNTIL ed al WHILE .. DO del Pascal. Entrambi possono formati partendo da un'unica struttura DO .. LOOP, avente la seguente forma:

2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine

DO {WHILE | UNTIL <espressione booleana>}

Istruzioni
LOOP {WHILE | UNTIL <espressione booleana>}

Se vengono utilizzate solamente le parole chiave DO .. LOOP, il ciclo che si viene a formare un ciclo infinito. Se dopo il DO oppure dopo il LOOP viene utilizzata la parola chiave WHILE, il ciclo viene eseguito finch l'espressione booleana risulta essere vera. Se dopo il DO oppure dopo il LOOP viene utilizzata la parola chiave UNTIL, il ciclo termina quando l'espressione booleana risulta essere vera. Il ciclo FOR, invece, ha la seguente struttura:
FOR contatore = valoreiniziale TO valorefinale

Istruzioni
NEXT

Un esempio di utilizzo dei due cicli potrebbe essere il seguente:


DO FOR x = 1 TO 10 DEBUG DEC2 X, PAUSE 1000 NEXT DEBUG CR LOOP 'Ciclo infinito 'Esegue il ciclo 10 volte 'Visualizza X 'Pausa di 1 secondo 'Ritorno di carrello

Le suindicate istruzioni visualizzano nella finestra di debug quanto segue all'infinito: 01 02 03 04 05 06 07 08 09 10 01 02 03 04 05 06 07 08 09 10 01 02 03 04 05 06 07 08 09 10 ...

2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine

3.1 - I motori
Il Boe-Bot utilizza due servomotori a rotazione continua, indicati in figura 3.1.1.

fig. 3.1.1

I servomotori standard si differenziano dai motori tradizionali dal fatto che sono progettati per raggiungere una determinata posizione e non per la rotazione fine a se stessa. Normalmente hanno un grado di libert nella rotazione piuttosto limitato e comunque inferiore ai 360. I servomotori a rotazione continua, invece, utilizzano la tecnologia dei servomotori per ottenere una movimentazione pi classica, ossia la normale rotazione libera. Come si evince dalla fig. 3.1.1, ciascun motore pilotato attraverso tre fili: uno rosso, uno nero ed uno bianco. I rispettivi plug vanno collegati nei connettori contrassegnati con X5/12 e X5/13, come indicato in fig. 3.1.2.

fig. 3.1.2 2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine 10

I servomotori vanno pilotati in maniera alquanto insolita rispetto agli altri tipi di motori: se si invia ai motori un treno di impulsi simile a quello indicato in fig. 3.1.3, i motori rimangono immobili.

fig. 3.1.3

Se si invia, invece, il treno di impulsi indicato in fig. 3.1.4, i motori girano alla massima velocit in senso orario.

fig. 3.1.4

Se si invia, infine, il treno di impulsi indicato in fig. 3.1.5, i motori girano alla massima velocit in senso antiorario.

fig. 3.1.5 2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine 11

In realt per, affinch si possa ottenere effettivamente quanto appena esposto necessario che i due motori siano sottoposti ad un'azione di taratura. Ci viene effettuato inviando al singolo motore un treno di impulsi di larghezza 1.5 ms e agendo successivamente sulla vite indicata in fig. 3.1.1 finch esso non rimanga effettivamente immobile.

3.2 - La movimentazione dei motori


Abbiamo visto nel cap. 3.1 in quale modo i due motori vadano pilotati. Per inviare sulle linee di uscita 12 e 13 del microcontrollore gli impulsi necessari, comodo utilizzare la funzione PULSOUT. Essa ha la seguente sintassi:
PULSOUT Pin, Durata

Dove Pin , appunto, una linea del micro. Essa viene settata automaticamente come uscita. Durata deve essere un numero intero compreso fra 1 e 65535. Ciascuna unit corrisponde a 2S. Se si vogliono mantenere fermi i due motori, si possono scrivere le seguenti istruzioni:
DO PULSOUT 12, 750 PULSOUT 13, 750 PAUSE 20 LOOP 'Impulso di 1,5ms 'Impulso di 1,5ms 'Pausa di 20ms

Il suddetto codice pu essere utilizzato per eseguire la taratura dei due motori. Si fa notare che queste istruzioni sono le uniche che, una volta alimentati i motori, li pongono in stato di quiete.

3.3 - Un semplice programma


Se si volesse scrivere un semplice programma che movimenta il Boe-Bot in avanti all'infinito, si potrebbero scrivere le seguenti istruzioni:
DO PULSOUT 12, 650 PULSOUT 13, 850 PAUSE 20 LOOP 'Impulso di 1,3ms 'Impulso di 1,7ms 'Pausa di 20ms

Si noti come la durata dell'impulso sulla linea 12 sia di 1,3mS (rotazione destrosa), mentre quella sulla linea 13 di 1,7mS (rotazione sinistrosa). Ci si rende necessario perch i motori sono montati in direzioni opposte.
2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine 12

Se volessimo far indietreggiare il Boe-Bot, dovremmo scrivere:


DO PULSOUT 12, 850 PULSOUT 13, 650 PAUSE 20 LOOP 'Impulso di 1,7ms 'Impulso di 1,3ms 'Pausa di 20ms

Se volessimo, invece, ruotarlo di 90 a destra, dovremmo scrivere:


FOR rstep = 1 TO 24 PULSOUT 12, 850 PULSOUT 13, 850 PAUSE 20 NEXT 'Impulso di 1,7ms 'Impulso di 1,7ms 'Pausa di 20ms

In tal caso, entrambe le ruote gireranno in senso antiorario, facendo compiere al Boe-Bot una rotazione di circa 90. Una rotazione di 90 a sinistra si ottiene con le seguenti istruzioni:
FOR rstep = 1 TO 24 PULSOUT 12, 650 PULSOUT 13, 650 PAUSE 20 NEXT 'Impulso di 1,3ms 'Impulso di 1,3ms 'Pausa di 20ms

Se, infine, volessimo far tracciare al Boe-Bot una serie infinita di quadrati, potremmo scrivere quanto segue:
DO FOR side = 1 TO 4 'Avanza di 100 FOR rstep = 1 TO 100 PULSOUT 12, 650 PULSOUT 13, 850 PAUSE 20 NEXT

'Impulso di 1,3ms 'Impulso di 1,7ms 'Pausa di 20ms

'Ruota Arturo di 90 a sinistra FOR rstep = 1 TO 24 PULSOUT 12, 650 'Impulso di 1,3ms PULSOUT 13, 650 'Impulso di 1,3ms PAUSE 20 'Pausa di 20ms NEXT NEXT PAUSE 1000 'Pausa di 1 secondo LOOP

3.4 - Le Subroutine
I linguaggi di programmazione hanno tutti la possibilit di gestire funzioni o procedure. Nel PBasic tale possibilit gestita dalle subroutine. Esse hanno la
2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine 13

seguente sintassi: Etichetta: Istruzioni


RETURN

La subroutine va poi richiamata secondo la seguente sintassi:


GOSUB Etichetta

Si noti che a differenza del Pascal e del C, le subroutine vanno dichiarate dopo il programma principale e non prima. Il precedente programma potrebbe quindi essere riscritto in altra forma, utilizzando le subroutine:
'Direttive ' {$STAMP BS2} ' {$PBASIC 2.5} 'Dichiarazione di variabili side VAR Nib rstep VAR Byte 'Programma principale DO FOR side = 1 TO 4 GOSUB Forward GOSUB Right NEXT PAUSE 1000 LOOP END 'Subroutines Forward: FOR rstep = 1 TO 24 PULSOUT 12, 650 PULSOUT 13, 850 PAUSE 20 NEXT RETURN Right: FOR rstep = 1 TO 24 PULSOUT 12, 650 PULSOUT 13, 650 PAUSE 20 NEXT RETURN 'Impulso di 1,3ms 'Impulso di 1,3ms 'Pausa di 20ms

'Impulso di 1,3ms 'Impulso di 1,3ms 'Pausa di 20ms

L'uso delle subroutine rende il programma pi leggibile ed il suo sviluppo pi semplice.

2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine

14

3.5 - Disegnare con il Boe-Bot


Con il robot non si possono tracciare solamente quadrati ma, ovviamente, un'infinit di figure geometriche. L'esplorazione del piano da parte dello studente pu diventare estremamente stimolante. Si supponga di scrivere due semplici subroutine, Avanti e Destra, che permettano rispettivamente di movimentare in avanti il robot di un certo numero di passi e di farlo ruotare di un certo numero di gradi a destra. Si veda l'esempio sottostante:
'Avanti movimenta il robot in avanti di steps passi. La variabile steps deve 'esere settata prima della chiamata alla subroutine. Avanti: FOR x = 1 TO steps PULSOUT 12, 650 'Impulso di 1,3ms PULSOUT 13, 850 'Impulso di 1,7ms PAUSE 20 'Pausa di 20ms NEXT RETURN 'Destra ruota il robot a destra di angle passi. La variabile angle deve essere 'settata prima della chiamata alla subroutine. La singola unit di angle non 'corrisponde ad 1, anche se possibile eseguire una taratura in tal senso 'relativamente precisa. Destra: FOR x = 1 TO angle PULSOUT 12, 650 'Impulso di 1,3ms PULSOUT 13, 650 'Impulso di 1,3ms PAUSE 20 'Pausa di 20ms NEXT RETURN

Si pu ora immaginare di scrivere un terzo programma, Poli, atto a tracciare dei poligoni generici, sfruttando le due subroutine appena descritte:
'Poli permette di tracciare sul piano dei poligoni in base alle variabili 'sides (numero di lati), steps (lunghezza del singolo lato) e angle (angolo 'di rotazione del robot, corrispondente ad un angolo interno del poligono 'pari a 180-<angle>). Si ricordi a tal proposito che il valore di angle NON 'rappresenta l'angolo Poli: FOR y = 1 TO sides GOSUB Avanti GOSUB Destra NEXT

Mediante questo semplice programma, impostando in modo coerente il numero di lati (sides), la rotazione (angle) e la lunghezza del lato (steps), si possono tracciare molteplici figure, quali ad esempio quelle indicate di seguito:

2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine

15

Si noti che dopo sides lati, il robot posizionato nella stessa posizione e direzione che aveva in partenza. Questa riflessione conduce all'introduzione di due teoremi formulati da Abelson e Disessa ne La geometria della tartaruga (1986 Franco Muzzio Editore): i teoremi del cammino chiuso e del cammino chiuso semplice.

3.6 - Il cammino chiuso


Per cammino chiuso si intende quel percorso effettuato dal robot che, dopo una serie di rotazioni, eseguite sia a destra che a sinistra, e avanzamenti, eseguiti sempre dello stesso numero di passi, lo porta a ritrovarsi nella stessa posizione e direzione di partenza, come visualizzato a mo' d'esempio nella figura sottostante.

fig. 3.6.1

Nella figura si nota che il robot incrocia due volte la propria traiettoria. Se non lo facesse, come nella figura sottostante, darebbe luogo ad un cammino chiuso semplice.

fig. 3.6.2

I due ricercatori del MIT hanno quindi formulato i seguenti teoremi:

2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine

16

Teorema del cammino chiuso: La rotazione totale lungo qualsiasi cammino chiuso un numero intero multiplo di 360. Teorema del cammino chiuso semplice: La rotazione totale di un cammino chiuso semplice di 360 (a destra o a sinistra). Quindi se il cammino si chiude, la rotazione totale effettuata dal robot sicuramente un intero multiplo di 360. Si affermare anche il contrario? Se il robot effettua gli avanzamenti sempre dello stesso numero di passi, dopo una rotazione totale pari ad un intero multiplo di 360, il cammino si chiude? Ci non vero per un cammino chiuso in generale, ma se i passi di avanzamento sono sempre uguali, la risposta si, con un'unica eccezione: se la singola rotazione un intero multiplo di 360 (compreso 0), il cammino pu non chiudersi.

2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine

17

4.1 - Il tatto
Il cammino del Boe-Bot potrebbe non essere sempre libero da ostacoli. Il robot potrebbe casualmente sbattere contro uno di essi e non saperlo. In tal caso, se lostacolo fosse sufficientemente pesante o ancorato da non spostarsi in seguito allazione del robot, le ruote del Boe-Bot inizierebbero a slittare fino ad un intervento umano o un programmato cambio di direzione. Certamente il robot non eseguirebbe la movimentazione attesa dal programmatore. In tali casi possono essere utili gli interruttori tattili evidenziati in figura 4.1.1, chiamati comunemente baffi. Essi vengono montati nella fig. 4.1.1 parte anteriore del robot come evidenziato in figura 4.1.2 e sono elettricamente connessi alla massa del circuito elettrico mediante i distanziatori metallici. Affinch i baffi siano utilizzabili essi devono fungere da interruttori e chiudere un circuito elettrico. Un possibile circuito funzionale allo scopo quello visualizzato in fig. 4.1.3 e montato sulla bread-board sperimentale della Education Board. In detto circuito una resistenza da fig. 4.1.2 10K connessa fra lalimentazione positiva ed un pin, rappresentante uno dei due poli dellinterruttore tattile. Laltro polo dellinterruttore connesso a massa attraverso il baffo. Quando il robot incontra un ostacolo, il baffo flette attorno al punto di fissaggio e tocca il pin posto sulla bread-board, chiudendo il contatto. Lo stato logico del pin viene inviato al microcontrollore mediante una resistenza da 220 e periodicamente letto. fig. 4.1.3
2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine 18

Una figura dinsieme del circuito relativo ai baffi visualizzato in figura 4.1.4.

fig. 4.1.4

Affinch i baffi possano dare una valida informazione direzionale importante che essi non si tocchino. Cos sar possibile determinare se lostacolo stato rilevato con il baffo di destra oppure con quello di sinistra. Un possibile programma che fa avanzare il robot e lo arresta quando trova un ostacolo il seguente:
'Direttive ' {$STAMP BS2} ' {$PBASIC 2.5}

'Programma principale DO PULSOUT 12, 650 'Impulso di 1,3mS PULSOUT 13, 850 'Impulso di 1,7mS PAUSE 20 'Pausa di 20mS LOOP UNTIL (IN5 = 0) OR (IN7 = 0) END

2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine

19

Quando uno dei due baffi, o entrambi, chiude il circuito toccando il pin connesso a Vdd mediante la resistenza da 10K , il microcontrollore rileva uno stato logico 0 allingresso 5 oppure allingresso 7 e termina il loop arrestandosi.

4.2 - La movimentazione in presenza di ostacoli


Il presente capitolo tratta di una possibile movimentazione del robot in un ambiente ove siano presenti degli ostacoli. Si supponga che si voglia far avanzare il robot fino a che incontra un ostacolo e quando lo incontra modificare la propria direzione e ripartire. Pi precisamente, quello che il Boe-Bot dovrebbe fare : a) avanzare finch trova un ostacolo; b) una volta trovato, fermarsi, indietreggiare di qualche centimetro in modo da potersi girare; c) ruotare a destra o a sinistra di un numero di gradi casuale; d) tornare al punto a). Un possibile programma che soddisfa i suddetti requisiti potrebbe essere il seguente:
'************************************************************************************** '********** Programma Principale ****************************************************** '************************************************************************************** 'Il presente programma fa avanzare il Boe-Bot finch non trova un ostacolo. Quando ci 'avviene si ferma, indietreggia di una ventina di passi, ruota di un numero di passi 'pseudo-casuale ed, infine, riprende ad avanzare finch incontra un nuovo ostacolo sul 'proprio cammino. 'Nel programma viene gestita la variabile rnd che assicura la pseudo-variabilit della 'rotazione. Si noti che il PBasic possiede comunque l'istruzione Random. 'Le variabili sono dichiarate nella relativa sezione dichiarativa. DO 'Il Boe-Bot avanza finch non trova un ostacolo DO GOSUB Avanti LOOP UNTIL (IN5 = 0) OR (IN7 = 0) 'Il Boe-Bot ha incontrato un ostacolo: lo fa indietreggiare di 20 passi 'in modo che possa ruotare senza sbattere da nessuna parte steps = 20 GOSUB Indietro 'Il Boe-Bot viene fatto ruotare di un numero di passi casuale, quale e' 'il valore di rnd. Se rnd pari il robot gira a destra, se dispari 'gira a sinistra. steps = rnd steps = steps&63 IF rnd&1=0 THEN GOSUB GiraDx ELSE GOSUB GiraSx ENDIF LOOP

2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine

20

'************************************************************************************** '********** Subroutines *************************************************************** '************************************************************************************** 'La routine Avanti fa eseguire un passo in avanti al Boe-Bot. Si noti che all'interno 'della subroutine viene anche aggiornato il valore di rnd che fornisce il vaore random 'al sistema. Avanti: PULSOUT 12, 650 PULSOUT 13, 850 PAUSE 20 rnd = rnd+1 RETURN 'Impulso di 1,3mS 'Impulso di 1,7mS 'Pausa di 20mS 'Aggiorna rnd

'La routine Indietro fa eseguire steps passi indietro al Boe-Bot Indietro: FOR i=1 TO steps PULSOUT 12, 850 PULSOUT 13, 650 PAUSE 20 NEXT RETURN 'Impulso di 1,7mS 'Impulso di 1,3mS 'Pausa di 20mS

'La routine GiraDx fa ruotare di steps passi a destra il Boe-Bot GiraDx: FOR i=1 TO steps PULSOUT 12, 650 PULSOUT 13, 650 PAUSE 20 NEXT RETURN 'Impulso di 1,3mS 'Impulso di 1,3mS 'Pausa di 20mS

'La routine GiraSx fa ruotare di steps passi a sinistra il Boe-Bot GiraSx: FOR i=1 TO steps PULSOUT 12, 850 PULSOUT 13, 850 PAUSE 20 NEXT RETURN 'Impulso di 1,7mS 'Impulso di 1,7mS 'Pausa di 20mS

4.3 - La mappatura del piano


Anche il presente capitolo presenta una possibile esercitazione. Viene presentata una soluzione all'esercitazione N04 allegata al presente documento che, per comodit, si ripresenta di seguito. Si immagini che Arturo si muova su un piano grigliato, suddiviso in reticoli di 10cm di lato, come indicato in fig. 4.3.1. Ciascun quadrato sia identificabile mediante mediante una lettera (riga) ed un numero (colonna), come indicato in figura. Naturalmente, se lo si ritiene preferibile, le coordinate possono essere fornite mediante due numero interi, anzich mediante il binomio lettera-numero. Si supponga, inoltre, che Arturo sia posto sopra il quadrato A1, e direzionato
2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine 21

parallelamente alle righe. Si scriva un programma in PBasic che, fornite le coordinate come costanti (ad es. D9), permetta ad Arturo di raggiungere il quadrato indicato.
J I H G F E D C B A 1 2 3 4 5 6 7 8 9 10 11 12 13 14
fig. 4.3.1

Una possibile soluzione del problema dato la seguente:


' {$STAMP BS2} ' {$PBASIC 2.5}

'***************************************************************************** '***************************************************************************** '*************** Programma di movimentazione ********************************* '***************************************************************************** '***************************************************************************** ' ' ' ' ' ' ' ' ' ' ' Il presente programma rappresenta una possibile soluzione dell'esercitazione 04 del corso di robotica 2007-2008. Si supponga un piano cartesiano un po' particolare, suddiviso in reticoli di 10cm di lato. Ciascun quadrato formato da detto reticolo sia identificabile mediante una lettera (riga) ed un numero (colonna). Naturalmente, se lo si ritiene preferibile,le coordinate possono essere fornite mediante due numeri interi, anzich mediante il binomio lettera-numero. Si supponga, inoltre, che il robot Arturo sia posto sopra il quadrato A1 e direzionato parallelamente alle righe. Si scriva un programma in PBasic che, fornite le coordinate come costanti all'interno del programma (ad es. D9), permetta ad Arturo di raggiungere il quadrato indicato da dette costanti.

'***************************************************************************** '*************** Costanti di destinazione ************************************ '***************************************************************************** 2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine 22

' Si opta per la rappresentazione numero-numero. Si decide che il primo numero ' rappresenta l'ascissa ed il secondo numero l'ordinata. Si suppone, inoltre, ' che Arturo sia posto inizialmente sulle coordinate 0,0. X Y CON CON 3 3

'***************************************************************************** '*************** Costanti di taratura **************************************** '***************************************************************************** kNoTrim kTrimMove kTrimRot CON CON CON 0 1 2 'Nessuna azione di taratura 'Azione di taratura movimentazione 'Azione di taratura rotazione

'*************** ATTENZIONE ************************************************** 'Settando la costante Trim opportunamente possibile eseguire la taratura di 'rotazione, di movimentazione o il programma principale. Trim CON kNoTrim '*****************************************************************************

kPO12Mov kPO13Mov kPO12Rot kPO13Rot

CON CON CON CON

669 831 720 720

'Larghezza impulso 'movimentazione 'Larghezza impulso 'movimentazione 'Larghezza impulso 'rotazione 'Larghezza impulso 'rotazione

P12 in fase di P13 in fase di P12 in fase di P13 in fase di

'***************************************************************************** '*************** Dichiarazione di costanti *********************************** '***************************************************************************** 'La taratura viene effettuata ipotizzando 240 passi pari a 720, ovvero 3 per 'ogni passo. k90 k45 k10cm CON CON CON 30 15 25 'Rotazione di 90 in passi 'Rotazione di 45 in passi 'Avanzamento di 10cm in passi

'***************************************************************************** '*************** Dichiarazione di variabili ********************************** '***************************************************************************** reached cm coeff steps i VAR VAR VAR VAR VAR Bit Word Word Word Word '1 = Destinazione raggiunta 'Avanzamento in centimetri 'Coefficiente angolare x100 'Passi di avanzamento o rotazione 'Indice cicli for 23

2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine

'***************************************************************************** '***************************************************************************** '*************** Programma principale **************************************** '***************************************************************************** '***************************************************************************** Main: GOSUB Init 'Inizializzazione di sistema

'Esegue la eventuale taratura di movimentazione. IF Trim=kTrimMove THEN GOSUB TrimMove ENDIF 'Esegue la eventuale taratura di rotazione. IF Trim=kTrimRot THEN GOSUB TrimRot ENDIF 'Esegue il programma vero e proprio. GOSUB CalcAngle 'Calcolo dell'angolo GOSUB Rotate 'Esecuzione della rotazione GOSUB CalcModule 'Calcolo del modulo GOSUB Go 'Esecuzione della movimentazione GOSUB WaitForEver

'***************************************************************************** '*************** Init ******************************************************** '***************************************************************************** ' Routine di inizializzazione delle variabili globali. Init: reached = 0 RETURN 'Destinazione ancora da raggiungere

'***************************************************************************** '*************** CalcAngle *************************************************** '***************************************************************************** 'Calcolo del coefficiente angolare della traiettoria di movimentazione. CalcAngle: 'Calcola il coefficiente angolare della futura traiettoria. A 'tal fine, identifica dapprima il valore di coordinata avente 'valore assoluto maggiore, in modo da calcolare sempre un 'coefficiente angolare compreso fra 0 e 1. Il valore di detto 'coefficiente viene moltiplicato x100 al fine di aumentare la 'precisione e convertito, mediante proporzione, in steps di 'rotazione a sinistra. IF X>Y THEN coeff = (Y*100)/X GOSUB CoeffToSteps ELSE IF Y=0 THEN reached=1 'Coordinate di destinazione 0,0 ELSE 24

2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine

coeff = (X*100)/Y GOSUB CoeffToSteps steps = k90-steps ENDIF ENDIF RETURN '***************************************************************************** '*************** CalcModule ************************************************** '***************************************************************************** 'Calcola la distaza della destinazione dall'origine, ossia l'ipotenusa del 'triangolo rettangolo posto sul piano cartesiano. Il risultato trovato (cm) 'espresso in centimetri. CalcModule: 'Calcola la distanza dall'origine in centimetri. cm = SQR(((X*X)+(Y*Y))*100) DEBUG "cm = ", DEC cm, CR 'Converte i centimetri in passi. A tal fine si ricorda che 'ogni passo equivale a 4mm. steps = (cm*10)/4 DEBUG "passi = ", DEC steps, CR RETURN

'***************************************************************************** '*************** CoeffToSteps ************************************************ '***************************************************************************** 'CoeffToSteps permette di calcolare il numero di passi necessari ad effettuare 'una rotazione pari al coefficiente angolare calcolato. Detto coefficiente 'sempre compreso fra 0 e 100 ( infatti moltiplicato per 100 per aumentare la 'precisione). Il calcolo viene effettuato attraverso la seguente proporzione: ' ' coeff : steps = 100 : k45 ' ' da cui si calcola agevolmente il numero di passi: ' ' steps = (coeff * k45) : 100 CoeffToSteps: steps = (coeff*k45)/100 DEBUG "rotazione (in passi) = ", DEC steps, " RETURN

"

'***************************************************************************** '*************** Rotate ****************************************************** '***************************************************************************** 'Rotazione a sinistra di steps passi.Una rotazione di 30 passi equivale a 90. 'Se la variabile reached vale 1, significa che la destinazione gi stata 'raggiunta. Rotate: IF reached=0 THEN FOR i=1 TO steps PULSOUT 12, kPO12Rot 25

2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine

PULSOUT 13, kPO13Rot PAUSE 20 'Pausa di 20mS NEXT ENDIF RETURN

'***************************************************************************** '*************** Go ********************************************************** '***************************************************************************** 'Avanzamento di steps passi. Ogni passo equivale a 4mm.Se la variabile reached 'vale 1, significa che la destinazione gi stata raggiunta. Go: IF reached=0 THEN FOR i=1 TO steps PULSOUT 12, kPO12Mov PULSOUT 13, kPO13Mov PAUSE 20 'Pausa di 20mS NEXT ENDIF RETURN

'***************************************************************************** '*************** TrimMove **************************************************** '***************************************************************************** 'La taratura viene effettuata al fine di ottenere che ogni passo corrsponda a '4mm esatti. Arturo avanza di 400mm TrimMove: DEBUG "Taratura di movimentazione" FOR i=1 TO 100 PULSOUT 12, kPO12Mov PULSOUT 13, kPO13Mov PAUSE 20 'Pausa di 20mS NEXT GOSUB WaitForEver RETURN

'***************************************************************************** '*************** TrimRot ***************************************************** '***************************************************************************** 'La taratura viene effettuata al fine di ottenere che ogni passo corrsponda a '3 esatti. Arturo ruota per 720. TrimRot: DEBUG "Taratura di rotazione" FOR i=1 TO 240 PULSOUT 12, kPO12Rot PULSOUT 13, kPO13Rot PAUSE 20 'Pausa di 20mS NEXT GOSUB WaitForEver RETURN

2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine

26

'***************************************************************************** '*************** WaitForEver ************************************************* '***************************************************************************** 'La presente subroutine si occupa di mantenere fermo Arturo mediante un loop 'infinito.Il return posto alla fine della routine quindi del tutto fittizio. WaitForEver: DO PULSOUT 12, 750 PULSOUT 13, 750 PAUSE 20 LOOP RETURN 'Impulso di 1,7mS 'Impulso di 1,7mS 'Pausa di 20mS

2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine

27

5.1 - La vista ad ultrasuoni


La Parallax fornisce diversi moduli gi pronti per la gestione degli ultrasuoni. Le figure sottostanti mostrano due moduli piuttosto diffusi: il Ping ed il SRF05.

fig. 5.1.1

Il modulo Ping ha sostanzialmente sostituito la famiglia SRFxx, e la documentazione seguente sar riferita soprattutto a questo secondo prodotto. In sostanza, comunque, hanno un funzionamento assolutamente simile e talora identico, per cui sar molto semplice migrare da un modulo all'altro. In fig. 5.1.2 evidenziato il pin out del modulo SRF05. Il pin 1 l'alimentazione (5V), il pin 2 l'uscita, il pin 3 l'ingresso di trigger, il pin 4 la modalit di funzionamento ed il pin 5 la massa.

fig. 5.1.2

In fig. 5.1.3, invece, evidenziato il pin out del modulo Ping. Appare evidente la principale differenza: il modulo Ping ha un solo pin di I/O, che accomuna l'ingresso di trigger e l'uscita del modulo precedente. Sostanzialmente, per, il funzionamento assolutamente identico:
2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine 28

al modulo deve essere fornito un impulso di trigger (vedi fig. 5.1.4) di larghezza minima di 10S per il modulo SRF05 oppure di 2S per il modulo Ping; il modulo provvede ad emettere un treno di impulsi simile a quello visualizzato in figura e dopo circa 750S dopo il termine dell'impulso di trigger viene fornito un impulso di larghezza proporzionale alla distanza rilevato. Sia il modulo SRF05 che il modulo Ping presentano la stessa relazione fra distanza e larghezza dell'impulso:

fig. 5.1.3

Si parlato del pin 4 del modulo SRF05: esso permette di selezionare fra due diverse modalit di funzionamento del modulo. Se il pin lasciato volante (non connesso) la modalit selezionata a due pin (vedi fig. 5.4.3): sul pin 3 deve essere fornito l'impulso di trigger e sul pin 2 si deve leggere il segnale fornito dal modulo.

fig. 5.1.4

Se, invece, il pin 4 viene collegato a massa, il funzionamento del modulo identico a quello del modulo Ping: viene utilizzato un unico pin per l'invio del segnale di trigger e per la lettura del segnale di eco, come visualizzato in fig. 5.1.5. Il programmatore deve fornire il segnale evidenziato in blu nella figura e verr ritornato il segnale evidenziato in rosso. Anche per questa periferica possibile utilizzare delle istruzioni di libreria del Boe-Bot: per la generazione dell'impulso di trigger si potr usare la PulsOut e per la lettura del segnale di eco la PulsIn.
2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine 29

fig. 5.1.5

Un esempio di rilevazione delle distanze mediante il modulo SRF05 il seguente:


'************************************************************************************** '********** Dichiarazione di I/O ****************************************************** '************************************************************************************** Ping PingIn PingOut PIN 15 PIN 9 PIN 8 'Linea di I/O 'Linea di ingresso 'Linea di uscita

'************************************************************************************** '********** Dichiarazione di costanti ************************************************* '************************************************************************************** IsLow IsHigh Scale Trigger CON CON CON CON 0 1 29 5 'Usato per la produzione dell'impulso di trigger 'Fattore di scala 'Larghezza impulso: 10uS

'************************************************************************************** '********** Dichiarazione di variabili ************************************************ '************************************************************************************** pulseWidth rawDist i VAR Word VAR Word VAR Byte 'Larghezza dell'impulso in microsecondi 'Distanza in cm 'Indice ciclo FOR

'************************************************************************************** '********** Programma principale ****************************************************** '**************************************************************************************

2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine

30

'Inizializzazione DEBUG CLS, TIME (uS) DISTANCE (cm) , CR, -------------------------- 'Loop infinito DO FOR i = 0 TO 10 PingIn = IsLow PULSOUT PingOut, Trigger PULSIN PingIn, IsHigh, pulseWidth rawDist = pulseWidth/Scale DEBUG CRSRXY, 4, (i + 2), DEC5 pulseWidth DEBUG CRSRXY, 11, (i + 2), DEC5 rawDist PAUSE 100 NEXT LOOP

5.2 - L'algoritmo di Pledge


Ponendo due sensori ad ultrasuoni in posizione ortogonale fra loro, in modo da poter esplorare la zona posta davanti e di fianco al robot, possibile esplorare un labirinto. Una volta scelta una direzione arbitraria, che chiameremo nord, istintivamente, il pi banale dei metodi consiglierebbe di: 1) procedere verso nord finch non si incontra un ostacolo; 2) girare a sinistra finch l'ostacolo non sia posto alla propria destra; 3) girare intorno all'ostacolo finch non sar possibile riprendere verso nord; 4) tornare al punto 1. Un esempio si superamento dell'ostacolo indicato in fig. 5.2.1.

fig. 5.2.1

2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine

31

Tale algoritmo non funziona per come dovrebbe. Un esempio di percorso che non viene superato, ma effettuato all'infinito quello indicato in fig. 5.2.2:

fig. 5.2.2

Si rende quindi necessario elaborare un metodo un po' pi elaborato per uscire da un ipotetico labirinto. A tal proposito si possono elencare molti algoritmi validi: esplorazione a matrice, metodo Tremaux, metodo di Ore, ecc. Tutti hanno per il difetto che necessitano di una marcatura dei percorsi gi eseguiti. L'algoritmo di Pledge non presenta questo difetto e pu essere benissimo utilizzato dal Boe-Bot. Esso funziona nel seguente modo: 1) si procede verso nord finch non si incontra un ostacolo; 2) si gira a sinistra finch l'ostacolo non sia posto alla propria destra; 3) si gira intorno all'ostacolo, tenendolo sempre sulla destra, finch la rotazione totale (compresa la rotazione di cui al punto 3) non sar pari a 0; 4)si ritorna al punto 1. L'ostacolo precedente viene superato come illustrato in fig. 5.2.3.

fig. 5.2.3

2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine

32

Un esempio di programma che implementa l'algoritmo di Pledge potrebbe essere il seguente:


' {$STAMP BS2} ' {$PBASIC 2.5} '************************************************************************************** '************************************************************************************** '*************** Algoritmo di Pledge ************************************************** '************************************************************************************** '************************************************************************************** '************************************************************************************** '*************** Costanti di taratura ************************************************* '************************************************************************************** kNoTrim kTrimMove kTrimRot kTrimUF kTrimUS CON CON CON CON CON 0 1 2 3 4 'Nessuna azione di taratura 'Azione di taratura movimentazione 'Azione di taratura rotazione 'Azione di taratura ultrasuoni frontali 'Azione di taratura ultrasuoni laterali

'************************************************************************************** ' Procedura di taratura ' ATTENZIONE 'Settando la costante Trim opportunamente possibile eseguire la taratura di rotazione 'di movimentazione o il programma principale. Trim CON kNoTrim '************************************************************************************** kPO12Mov 'Larghezza impulso P12 in fase di 'movimentazione kPO13Mov CON 831 'Larghezza impulso P13 in fase di 'movimentazione kPO12RotSx CON 720 'Larghezza impulso P12 in fase di 'rotazione kPO13RotSx CON 720 'Larghezza impulso P13 in fase di 'rotazione kPO12RotDx CON 780 'Larghezza impulso P12 in fase di 'rotazione kPO13RotDx CON 780 'Larghezza impulso P13 in fase di 'rotazione kPO12Stop CON 750 'Larghezza impulso P12 per motore fermo kPO13Stop CON 750 'Larghezza impulso P12 per motore fermo kPO12MovC CON 569 'Larghezza impulso P12 in fase di 'movimentazione (con correzione +100) kPO13MovC CON 731 'Larghezza impulso P13 in fase di 'movimentazione (con correzione +100) 'La taratura viene effettuata ipotizzando 240 passi pari a 720, ovvero 3 per ogni 'passo. k90 k45 k10cm kFScale kSScale CON CON CON CON CON 30 15 25 29 29 'Rotazione di 90 in passi 'Rotazione di 45 in passi 'Avanzamento di 10cm in passi 'Fattore di scala ultrasuoni frontali 'Fattore di scala ultrasuoni laterali CON 669

'************************************************************************************** '********** Dichiarazione di I/O ****************************************************** '************************************************************************************** PingFIn PingFOut PingSIn PingSOut PIN PIN PIN PIN 9 8 11 10 'Linea 'Linea 'Linea 'Linea di di di di ingresso uscita ingresso uscita

2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine

33

'************************************************************************************** '********** Dichiarazione di costanti ************************************************* '************************************************************************************** IsLow IsHigh Trigger kCorr kMaxCorrSx kMaxCorrDx CON CON CON CON CON CON 0 1 5 81 81 40 'Usato per la produzione dell'impulso di trigger 'Larghezza impulso: 10uS 'Massima correzione ammessa a sinistra 'Massima correzione ammessa a destra

'************************************************************************************** '********** Dichiarazione di variabili ************************************************ '************************************************************************************** pulseWidth frontDist sideDist oldDist fDist sDist corrSx corrDx corr steps angle i front side VAR VAR VAR VAR VAR VAR VAR VAR VAR VAR VAR VAR VAR VAR Word Word Word Word Word Word Word Word Word Word Word Word Bit Bit 'Larghezza dell'impulso in microsecondi 'Distanza dall'ostacolo frontale in cm 'Distanza dall'ostacolo laterale in cm 'Vecchia distanza 'Limite ostacolo frontale in cm 'Limite ostacolo laterale in cm 'Correzione motore Sx 'Correzione motore Dx 'Correzione calcolata 'Passi di Arturo 'Rotazione totale 'Indice ciclo FOR 'Ostacolo frontale? 'Ostacolo laterale mancante?

'************************************************************************************** '************************************************************************************** '*************** Programma principale ************************************************* '************************************************************************************** '************************************************************************************** Main: GOSUB Init 'Inizializzazione di sistema

'Esegue la taratura del sistema. E' possibile settare una 'sola variabile di taratura alla volta (vedi commento alla 'procedura di taratura). 'Esegue la eventuale taratura di movimentazione. GOSUB Trimming DO 'Programma principale. Il programma si svolge come spiegato 'nel commento introduttivo. 'La prima fase consiste nell'avanzamento di Arturo fino al 'raggiungimento dell'ostacolo. Il robot si ferma a circa '5cm dall'ostacolo, gira a sinistra di 90 e prosegue dritto. fDist = 12 'Avanza fino a 12cm dall'ostacolo (frontale) GOSUB GoFSniff '(Annusa di fronte) steps = k90 GOSUB RotateSx DO sDist = 8 fDist = 12 GOSUB GoDSniff 'Avanza tenendo l'ostacolo a 8cm dal fianco 'finch tale distanza cambia bruscamente o 'finch c' un ostacolo frontale a 12cm. '(Annusa sia di fronte che di lato) 'Ruota a sinistra di 90

'Si deve valutare se si uscita dalla GoDSniff perch si 'trovato un ostacolo di fronte o perch non c' pi l'ostacolo 'laterale.

2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine

34

IF (front=1) THEN steps = k90 'Ostacolo frontale GOSUB RotateSx'Ruota a sinistra di 90 ELSE steps = 10 'L'ostacolo laterale non c' pi: avanza GOSUB Go 'di 4cm e ... steps = k90 '... ruota a destra di 90 GOSUB RotateDx steps = 30 'Avanza di 12cm, in modo che si possa GOSUB Go 'sentire l'ostacolo laterale. ENDIF LOOP UNTIL angle=0 LOOP '************************************************************************************** '*************** Init ***************************************************************** '************************************************************************************** 'Routine di inizializzazione delle variabili globali. Init: corrSx = kCorr corrDx = kCorr angle = 0 RETURN 'Inizializza la correzione

'************************************************************************************** '*************** Go ******************************************************************* '************************************************************************************** 'Avanza di steps passi. Go: DEBUG "Avanza di ", DEC2 steps, " passi", CR FOR i=0 TO steps PULSOUT 12, kPO12Mov PULSOUT 13, kPO13Mov PAUSE 20 NEXT RETURN

'************************************************************************************** '*************** GoFSniff ************************************************************* '************************************************************************************** 'Avanzamento di Arturo finch non viene sentito un ostacolo frontale a fDist cm. Il 'sensore laterale non viene letto. Vengono eseguiti avanzamenti minimi di 12 mm. GoFSniff: DEBUG "Avanza fino ad incontrare un ostacolo frontale", CR fDist = fDist*kFScale front = 0 DO 'Avanza finch non incontra un ostacolo ad una distanza 'inferiore a fDist cm. FOR i=0 TO 3 PULSOUT 12, kPO12Mov PULSOUT 13, kPO13Mov PAUSE 20 NEXT 'Misura la distanza dall'ostacolo frontale. PingFIn = IsLow PULSOUT PingFOut, Trigger PULSIN PingFIn, IsHigh, pulseWidth frontDist = pulseWidth LOOP UNTIL frontDist<fDist 'Esce se l'ostacolo posto ad 'un distanza inferiore a 5cm.

2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine

35

DEBUG "Ostacolo frontale a meno di ", DEC2 fDist/kFScale, " cm", CR front = 1 RETURN '************************************************************************************** '*************** GoDSniff ************************************************************* '************************************************************************************** 'Avanzamento di Arturo cercando di mantenere l'ostacolo laterale alla distanza 'lDist. A tal fine viene utilizzata la variabile corr che viene incrementata o 'decrementata a seconda del caso che Arturo si allontani o si avvici dallo 'ostacolo laterale. 'Contemporaneamente viene verificata la presenza di ostacoli frontali posti a 'meno di fDist cm. 'Si esce dalla presente routine o per la presenza di un ostacolo frontale o per 'l'assenza di ostacolo laterale. ' 'La correzione 'Viene utilizzata la variabile corr per correggere la traiettoria di Arturo. 'Il valore che non introduce alcun tipo di correzione alla traiettoria (Arturo 'avanza in linea retta) 100. Valori minori di corr fanno sterzare Arturo a 'sinistra (allontanamento dall'ostacolo posto di fianco),mentre valori maggiori 'di 100 fanno sterzare Arturo a destra (avvicinamento all'ostacolo posto di 'fianco). GoDSniff: DEBUG "Avanza mantenendo l'ostacolo laterale a ", DEC2 sDist, " cm", CR corrSx = kCorr 'Inizializza la correzione corrDx = kCorr front = 0 side = 0 sDist = sDist*kSScale fDist = fDist*kFScale DO 'Avanza finch non incontra un ostacolo ad una distanza 'inferiore a fDist cm. Si noti l'effetto della correzione. FOR i=0 TO 1 PULSOUT 12, kPO12Stop-corrSx PULSOUT 13, kPO13Stop+corrDx PAUSE 20 NEXT 'Misura la distanza dall'ostacolo frontale. PingFIn = IsLow PULSOUT PingFOut, Trigger PULSIN PingFIn, IsHigh, pulseWidth frontDist = pulseWidth 'Cerca di mantenere costante la distanza dall'ostacolo 'laterale. PingSIn = IsLow PULSOUT PingSOut, Trigger PULSIN PingSIn, IsHigh, pulseWidth sideDist = pulseWidth 'Verifica la presenza di ostacoli frontali o l'assenza di 'ostacoli laterali. IF frontDist<fDist THEN front = 1 DEBUG "Ostacolo frontale!", CR ENDIF IF sideDist>sDist*2 THEN side = 1 DEBUG "Mancanza ostacolo laterale!", CR ENDIF 'Calcola la correzione da apportare ad Arturo

2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine

36

corrSx = kCorr corrDx = kCorr IF (sideDist>(sDist+2)) AND (front=0) AND (side=0) THEN corr = sideDist-sDist IF corr>kMaxCorrSx THEN corr = kMaxCorrSx ENDIF corrSx = kCorr-corr 'Arturo si avvicina all'ostacolo laterale ENDIF IF (sideDist<(sDist-2)) AND (front=0) AND (side=0) THEN corr = sDist-sideDist IF corr>kMaxCorrDx THEN corr = kMaxCorrDx ENDIF corrDx = kCorr-corr 'Arturo si allontana dall'ostacolo laterale ENDIF DEBUG "Correzione Sx = ", DEC3 kPO12Stop-corrSx, CR DEBUG "Correzione Dx = ", DEC3 kPO13Stop+corrDx, CR LOOP UNTIL front=1 OR side=1 RETURN '************************************************************************************** '*************** RotateSx ************************************************************* '************************************************************************************** 'Rotazione a sinistra di steps passi.Una rotazione di 30 passi equivale a 90. 'Se la variabile reached vale 1, significa che la destinazione gi stata 'raggiunta. RotateSx: DEBUG "Rotazione a sinistra di 90", CR FOR i=1 TO steps PULSOUT 12, kPO12RotSx PULSOUT 13, kPO13RotSx PAUSE 20 'Pausa di 20mS NEXT angle = angle+1 RETURN

'************************************************************************************** '*************** RotateDx ************************************************************* '************************************************************************************** 'Rotazione a destra di steps passi.Una rotazione di 30 passi equivale a 90. 'Se la variabile reached vale 1, significa che la destinazione gi stata 'raggiunta. RotateDx: DEBUG "Rotazione a destra di 90", CR FOR i=1 TO steps PULSOUT 12, kPO12RotDx PULSOUT 13, kPO13RotDx PAUSE 20 'Pausa di 20mS NEXT angle = angle-1 RETURN

'************************************************************************************** '*************** Trimming ************************************************************* '************************************************************************************** ' Routines di taratura. Trimming: 'Esegue la eventuale taratura di movimentazione. IF Trim=kTrimMove THEN GOSUB TrimMove ENDIF

2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine

37

'Esegue la eventuale taratura di rotazione. IF Trim=kTrimRot THEN GOSUB TrimRot ENDIF 'Esegue la eventuale taratura degli ultrasuoni frontali. IF Trim=kTrimUF THEN GOSUB TrimUF ENDIF 'Esegue la eventuale taratura degli ultrasuoni laterali. IF Trim=kTrimUS THEN GOSUB TrimUS ENDIF RETURN '************************************************************************************** '*************** TrimMove ************************************************************* '************************************************************************************** 'La taratura viene effettuata al fine di ottenere che ogni passo corrsponda a '4mm esatti. Arturo avanza di 400mm TrimMove: DEBUG "Taratura di movimentazione" FOR i=1 TO 100 PULSOUT 12, kPO12Mov PULSOUT 13, kPO13Mov PAUSE 20 'Pausa di 20mS NEXT GOSUB WaitForEver RETURN

'************************************************************************************** '*************** TrimRot ************************************************************** '************************************************************************************** 'La taratura viene effettuata al fine di ottenere che ogni passo corrsponda a '3 esatti. Arturo ruota per 720. TrimRot: DEBUG "Taratura di rotazione" FOR i=1 TO 240 PULSOUT 12, kPO12RotSx PULSOUT 13, kPO13RotSx PAUSE 20 'Pausa di 20mS NEXT GOSUB WaitForEver RETURN

'************************************************************************************** '*************** TrimUF *************************************************************** '************************************************************************************** 'La taratura viene effettuata al fine di ottenere una corrispondenza esatta 'fra larghezza dell'impulso e cm. Arturo va posto a 10 cm dall'ostacolo. La 'costante kFScale va modificata affinch frontDist valga 10. TrimUF: DEBUG "Taratura di ultrasuoni frontali" DEBUG CLS, " TIME (uS) DISTANCE (cm) ", CR, "-------------------------" i=0 DO PingFIn = IsLow PULSOUT PingFOut, Trigger

2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine

38

PULSIN PingFIn, IsHigh, pulseWidth frontDist = pulseWidth/kFScale DEBUG CRSRXY, 4, (i + 2), DEC5 pulseWidth DEBUG CRSRXY, 11, (i + 2), DEC5 frontDist PAUSE 1000 i = i+1 LOOP RETURN '************************************************************************************** '*************** TrimUS *************************************************************** '************************************************************************************** 'La taratura viene effettuata al fine di ottenere una corrispondenza esatta 'fra larghezza dell'impulso e cm. Arturo va posto a 10 cm dall'ostacolo. La 'costante kSScale va modificata affinch sideDist valga 10. TrimUS: DEBUG "Taratura di ultrasuoni laterali" DEBUG CLS, " TIME (uS) DISTANCE (cm) ", CR, "-------------------------" i=0 DO PingSIn = IsLow PULSOUT PingSOut, Trigger PULSIN PingSIn, IsHigh, pulseWidth sideDist = pulseWidth/kSScale DEBUG CRSRXY, 4, (i + 2), DEC5 pulseWidth DEBUG CRSRXY, 11, (i + 2), DEC5 sideDist PAUSE 1000 i = i+1 LOOP RETURN '************************************************************************************** '*************** WaitForEver ********************************************************** '************************************************************************************** 'La presente subroutine si occupa di mantenere fermo Arturo mediante un loop 'infinito.Il return posto alla fine della routine quindi del tutto fittizio. WaitForEver: DO PULSOUT 12, 750 PULSOUT 13, 750 PAUSE 20 LOOP RETURN 'Impulso di 1,7mS 'Impulso di 1,7mS 'Pausa di 20mS

2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine

39

6.1 - La vista ad infrarossi


La vista ad infrarossi rappresenta il secondo modo di vedere del Boe-Bot, in alternativa alla vista ad ultrasuoni. I due tipi di vista hanno entrambi preghi e difetti, ma si compensano a vicenda. La vista ad ultrasuoni permette di valutare con precisione la distanza che separa il Boe-Bot da un ostacolo. Ha per il difetto di essere poco direzionale e di portata piuttosto limitata. La vista ad infrarossi (vedi tab. 6.1.1), invece, assai poco indicata per valutare con precisione delle distanze, ma ha una portata maggiore della vista ad ultrasuoni e pu essere molto pi direzionale. Il kit del Boe-Bot ha in dotazione due coppie di diodi emettitori all'infrarosso e relativi rivelatori.

tab. 6.1.1

Quando un segnale luminoso viene emesso (vedi fig. 6.1.1) e colpisce un oggetto, esso viene riflesso e parte del segnale pu essere letto da un rilevatore posto nelle vicinanze della sorgente. Questo concetto pu essere applicato in varie forme per ottenere diversi risultati, tutti comunque utili alla visione. Certamente il segnale catturato dal rilevatore dipendente da molti fattori: distanza dell'ostacolo, superficie, colore, forma e dimensioni dell'ostacolo, presenza di luce bianca ambientale oppure presenza di lampade fluorescenti, angolo di emissione e di ricezione del segnale luminoso, dispersione delle
fig. 6.1.1 2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine 40

caratteristiche del diodo emettitore e del rilevatore, allineamento assiale della sorgente con il rilevatore, polarizzazione dell'emettitore, ecc. Ci non aiuta a capire quale possa essere la distanza di un ostacolo, per poter prendere delle decisioni in merito. Per poterlo fare sarebbe utile conoscere alcune delle variabili sopra citate, ad esempio tutti i parametri relativi all'ostacolo (colore, superficie, dimensioni, ecc.). In tal modo diventa molto pi facile fare delle valutazioni utili a determinare la vicinanza o meno di un oggetto sulla traiettoria del robot.

6.2 - Tecniche di modulazione


Il diodo emettitore un banale led infrarosso. Al fine di ridurre l'angolo di emissione esso viene montato all'interno di un cilindro di plastica nero. Aumentando l'affossamento del led nel cilindro (vedi fig. 6.2.1), si pu aumentare la direzionalit del fascio, ovvero ridurre l'angolo di emissione. Il led va fig. 6.2.1 pilotato come un qualsiasi altro diodo emettitore: nel nostro caso verr polarizzato mediante una resistenza da 1K collegata fra l'anodo del diodo e la linea P2 (occhio destro) oppure P8 (occhio sinistro). La piedinatura del diodo e lo schema elettrico di polarizzazione sono fig. 6.2.2 evidenziati nelle figure 6.2.2 e 6.2.3. Il rilevatore un dispositivo a tre pin (vedi fig. 6.2.2) e va polarizzato come in fig. 6.2.3. I due rilevatori, uno per occhio, vengono letti dalle linee P0 (occhio destro) e P9 (occhio sinistro) del Basic Stamp. La potenza del segnale luminoso data dalla corrente di polarizzazione del led, per cui, aumentando la corrente che scorre attraverso il led possibile aumentare la gittata del segnale e quindi anche, indirettamente, la sensibilit visiva del sistema. Un modo per modulare la corrente di polarizzazione senza stravolgere il circuito di fig. 6.2.3 consiste nell'utilizzare pi linee per fig. 6.2.3
2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine 41

generare detta corrente, come indicato in fig. 6.2.4. Quando si vuole avere una bassa sensibilit visiva, si attiva la linea Px e si programma la linea Py come ingresso, in modo che non assorba corrente. In tal modo la corrente di polarizzazione del diodo sar pari a: Iled = Vdd-Vled R1 (6.2.1)

La corrente risultante pari a circa 1,5mA. Se, invece, si desidera una sensibilit media, si attiva la linea Py e si programma la linea Px come ingresso. In questo caso la corrente superiore perch la resistenza minore. Si avr, infatti: Iled = Vdd-Vled R2 (6.2.2)

La corrente risultante di circa 5,15mA. Se si desidera, infine, una sensibilit elevata, si attivano entrambe le linee Px e Py, ottenendo in tal modo una corrente di polarizzazione pari alla somma delle due correnti, ossia di 8,65mA. Utilizzando tre o pi linee, possibile aumentare ulteriormente la modulabilit della sensibilit visiva del sistema. Esiste, per, un modo pi semplice ed altrettanto efficace per cambiare da software la sensibilit visiva del Boe-Bot. Il rilevatore utilizzato un dispositivo relativamente complesso, che ha al suo interno dei filtri sia fig. 6.2.4 ottici che elettronici. Il filtro elettronico dimensionato in modo tale da rilevare frequenze nell'intorno dei 38.5KHz. Questo permette il filtraggio della luce solare (0Hz) e della luce generata da lampade a incandescenza (50Hz) o fluorescenti (100Hz). La sensibilit del dispositivo ha un andamento tipicamente a campana, con massima sensibilit sui 38.5KHz.

fig. 6.2.5 2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine 42

Inviando un segnale a 38.5KHz al diodo emettitore si trasmette sulla frequenza di massima sensibilit del rilevatore, dato che i filtri lasciano passare praticamente tutto il segnale. Se ci si allontana via via da tale frequenza ci si sposta rispetto al punto di massima sensibilit della campana, ottenendo un effetto del tutto simile a quello gi illustrato precedentemente. Naturalmente i due metodi possono essere utilizzati contemporaneamente. Poter modulare la sensibilit estremamente importante, perch in tal modo possibile localizzare, sul piano, con una relativa precisione un ostacolo o un oggetto posto all'interno del campo visivo. Un ulteriore aspetto su cui riflettere riguarda lo sniffing, ovvero la ricerca di qualcosa. Mediante gli infrarossi non possibile solamente localizzare un oggetto solido posto all'interno del campo visivo, ma anche, ad esempio, una striscia colorata disegnata sul piano. Se il contrasto fra fondo e la suddetta striscia sufficientemente marcato (ad esempio bianco il fondo e nera la striscia colorata), il sistema visivo a infrarossi pu seguire (o sniffare) la traccia. Il corpo nero ideale, infatti, fig. 6.2.6 assorbe tutte le radiazioni, comprese quelle emesse dal led a 980nm, mentre una superficie bianca le riflette. Tale caratteristica fisica pu essere sfruttata per applicare lo sniffing di una linea tracciata sul pavimento e movimentare il Boe-Bot in maniera guidata.

6.3 - L'istruzione FreqOut


Al fine di agevolare il lavoro del programmatore, il linguaggio PBasic pone al suo servizio alcune istruzioni dedicate. L'istruzione FREQOUT, ad esempio stata pensata per sintetizzare dei toni audio. Mediante detta istruzione possibile emettere un segnale alla frequenza impostata sulla linea selezionata. Ad esempio, le due istruzioni seguenti permettono di inviare sulla linea P8 un segnale a 38.5KHz per la durata di un millisecondo e porre nella variabile LeftEye l'esito della lettura del segnale da parte del rilevatore. Quando quest'ultimo legge il suddetto segnale, rileva uno stato logico pari a 0. Il seguente un esempio di quanto detto.
FREQOUT 8, 1, 38500 LeftEye = IN9

2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine

43

7.1 - I sensori di luminosit


Molti sono i sensori ed i trasduttori in grado di fornire una variazione di grandezza elettrica in uscita al variare della quantit di luce che li colpisce: fotodiodi, fototransistor e fotoresistenze, per restare nel solo campo dei sensori, sono fra i pi usati in campo elettronico. Le fotoresistenze, in particolare, sono di particolare interesse, perch sensibili ad un largo spettro della luce visibile, contrariamente a fototransistor e fotodiodo, che hanno solitamente una sensibilit maggiore nella banda dell'infrarosso. Spesso le fotoresistenze (fig. 7.1.1) sono identificate con l'acronimo LDR (Light Dependent Resistor) e sono caratterizzate dalla loro capacit di variare il loro valore resistivo in funzione della quantit di luce da cui sono colpite. Normalmente quando si usa il termine luce ci si riferisce alla porzione di spettro elettromagnetico visibile all'occhio umano, ossia alle radiazioni aventi lunghezza d'onda comprese fra i 400 ed i 700 nanometri. Le radiazioni infrarosse hanno invece una lunghezza d'onda superiore (800-1000nm) e trasportano quindi un'energia inferiore.

fig. 7.1.1

tab. 7.1.1

In tabella 7.1.1 sono rappresentati i principali tipi di radiazioni elettromagnetiche. Dalla tabella appare evidente che solo una piccolissima parte dello spettro rappresentato visibile all'occhio umano. Teoricamente, quindi, un robot potrebbe possedere una vista migliore di quella umana, foss'anche solamente perch usando lo spettro infrarosso possibile vedere al buio. fig. 7.1.2 In figura 7.1.2, invece, rappresentato uno specchietto indicante la destinazione d'uso di diverse lunghezze d'onda: raggi gamma, raggi X, ultravioletti, luce visibile, infrarossi ed onde radio.
2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine 44

Le fotoresistenze, sono costituite da materiale semiconduttore di tipo N, quali il solfuro di cadmio CdS o il solfuro di piombo PbS, oppure da materiali fotosensibili quali l'ossido di zinco o di selenio. Quando una radiazione luminosa colpisce un materiale fotosensibile, l'energia dei fotoni incidenti viene utilizzata dagli elettroni posti in banda di valenza per tentare il passaggio in banda di conduzione. La resistenza, in tal modo, viene a dipendere dalla superficie dell'elemento sensibile, dalla quantit di flusso L (lux) sull'unit di area, nonch da una costante adimensionale a e da una costante K (/lux) che sono caratteristiche di ciascun materiale. Per una fotoresistenza al CdS la costante a compresa fra 0,7 e 0,9. La relazione che esprime il legame fra i parametri citati e la resistenza del dispositivo la seguente: -a R = KL dove K la resistenza offerta dal dispositivo in presenza di flusso unitario. Di seguito vengono forniti alcuni dati comparativi utili per dare un'idea di quanto vale un lux: la luce del sole varia fra i 32000lx ed i 100000lx; sotto i riflettori di uno studio televisivo si hanno circa 1000lx; in un ufficio illuminato secondo normativa vi sono 500lx; la luce fornita dalla luna pari a circa 1lx. Pi frequentemente, per, il costruttore fornisce dei diagrammi che mettono in relazione la resistenza all'illuminazione come indicato in fig. 7.1.3 A e B.

fig. 7.1.3 45

2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine

Di seguito, invece, sono forniti i dati salienti di un BPY63, della Siemens.

7.2 - Un problema
Si immagini di dover risolvere al pi basso livello possibile il seguente problema: un robot deve localizzare, ovvero mappare sul piano, una fonte luminosa continua posta su terreno non accidentato (ossia privo di ostacoli) ad un'altezza di 150mm. Risolvere il problema al pi basso livello possibile una necessit imposta dal fatto che i possibili solutori del problema potrebbero frequentare il 3 corso di Elettronica, possedendo, quindi, delle conoscenze ancora limitate. Al problema si aggiungono ulteriori due specifiche: a) non noto l'angolo di emissione della sorgente; b) non nota la lunghezza d'onda della sorgente luminosa. Si sa solo che appartiene allo spettro di luce visibile.
2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine 46

In fig. 7.2.1 schematizzato un robot entrato nel cono di luce di una sorgente luminosa.
Sorgente

Cono di luce

fig. 7.2.1

Se il robot dovesse avere una fotoresistenza posta sulla sua parte anteriore, potrebbe ruotare di parecchi gradi mantenendo sostanzialmente uniforme il grado illuminazione del sensore. Una schematizzazione di ci presentata in Raggi incidenti con Fotoresistenza fig. 7.2.2. Questo significa che la angolo diverso fotoresistenza, una volta entrata nel cono potrebbe non modificare sostanzialmente il proprio valore fig. 7.2.2 resistivo, nemmeno in presenza di significative rotazioni della stessa. Nasce quindi il problema di come possa il robot localizzare sul piano la sorgente luminosa. Naturalmente le soluzioni praticabili sono moltissime. Una delle pi semplici (quindi osservante della necessit esposta ad inizio paragrafo) consiste nell'intubare la fotoresistenza, come illustrato nella vista di sezione di fig. 7.2.3. In tal modo la fotoresistenza verr colpita solamente dai raggi aventi un angolo massimo
fig. 7.2.3 2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine 47

(o -) rispetto ai raggi entranti perpendicolarmente (parallelamente ai bordi del tubo). In funzione del diametro e della lunghezza del tubo possibile argomentare in maniera piuttosto precisa riguardo alla posizione della sorgente luminosa. Proviamo ad analizzare una possibile situazione. Si supponga una sorgente luminosa avente un angolo di emissione pari, ad esempio, a 30. Si supponga, altres, che la distanza massima che separa il robot dalla sorgente sia di 100cm e che si voglia calcolare l'angolo (rispetto ad un ipotetico piano cartesiano) dell'interpolante che congiunge il robot alla sorgente con un errore massimo di 5. Supponendo il diametro del tubo imposto a 5mm (coincidente con il diametro della fotoresistenza), si vuole calcolare la lunghezza ottimale di detto tubo per raggiungere la precisione esposta.

100cm

Sorgente di luce Raggio incidente

err

lgt

Se err pu assumere il valor massimo di 20,25cm (l'errore massimo ammesso err pi la met del diametro della fotocellula) e si ipotizza una distanza dalla fonte luminosa di 100cm, conoscendo l'angolo di incidenza del raggio di luce Affinch l'angolo massimo di incidenza della radiazione sulla fotocellula sia si deve avere che d lgt = tg dove d il diametro della fotocellula.

2010 Santino Bandiziol Istituto Tecnico Industriale Statale A. Malignani di Udine

48

Potrebbero piacerti anche