1 di 25 Dopo avar appreso le basi sull`elettronica e sulla robotica, ho
Transcript
1 di 25 Dopo avar appreso le basi sull`elettronica e sulla robotica, ho
1 di 25 Dopo avar appreso le basi sull'elettronica e sulla robotica, ho realizzato un piccolo robot, in grado di interagire autonomamente con l'ambiente che lo circonda, e di ubbidire agli ordini impartitigli. Questo progetto è l'evoluzione di un semplice robot proposto dalla DeAgostini in collaborazione con PARALAX, in un corso di apprendimento, costruzione e programmazione alla portata di tutti per imparare i principi della robotica divertendosi. Ciò che il robot può fare dipende dalla dotazione hardware e dal software scritto in base alle esigenze e fantasia dell'utente. Il robot può rispondere a stimoli esterni: muovendosi, accendendo luci, emettendo suoni; può elaborare: interpretando i dati acquisiti ed applicandovi formule matematiche ottenendo risultati; comunicare dati: inviando segnali elettrici direttamente via cavo, o attraverso l'etere tramite onde elettromagnetiche. Con la robotica ho imparato che è possibile convogliare in un'unica disciplina le più svariate materie didattiche, infatti si possono applicare tutti i concetti di fisica come la meccanica, l'ottica, la termologia e l'elettromagnetismo; la matematica logica, aritmetica e geometrica; l'inglese, come lingua di riferimento, è utilizzata anche in tutti i dati tecnici, e linguaggi di programmazione; tutto ciò che riguarda l'elettronica analogica e digitale. Non dimentichiamo che un robot è una macchina che per diventare attiva ha bisogno di una scopo, e quindi bisogna progettare il software su misura alle sue capacità, inserendo così anche l'informatica; ed infine anche un po' di scienze in quanto occorre prima avere un'idea di come sono fatti gli esseri viventi da cui prendere eventualmente spunto, ed osservare gli ostacoli che la natura oppone all'uomo nell'esplorazione di luoghi o mondi resi inaccessibili… ma la cosa più importante è la passione, tanta voglia di fare e molta fantasia. Un robot è un'automa complesso e flessibile, in quanto il centro di elaborazione è costituito da un'elettronica programmabile, basata su microprocessore, cioè un vero e proprio computer che riceve input in forma digitale, li elabora, e fornisce degli output. Le applicazioni di queste macchine ormai ricoprono tutti i settori: - Medicina - Industria - Arma - Sicurezza - Esplorazione - Soccorso e tanti altri, in cui serve precisione, ripetitività, forza, accesso in ambienti particolari e sensi di cui l'uomo non dispone. Entrando subito nella descrizione del mio primo robot, cominciamo a descrivere essenzialmente la parte elettronica hardware e software. 2 di 25 - HARDWARE Il cuore di questo robot è una scheda programmabile chiamata BASIC STAMP, mi è stata molto utile in quanto mi ha permesso, grazie alla sua semplicità d'uso, di ottenere ottimi risultati quando (4 anni fa) ancora di MICONTROLLORI e memorie EEPROM ne sapevo ben poco. Di BASIC STAMP ne esistono molte versioni, alcune sono state utilizzate addirittura dalla NASA per l'apertura dei deflettori dei satelliti (organi che deviano il propellente per il mantenimento dell'orbita); la versione che ho avuto sotto mano è il BASIC STAMP 2 che utilizza: un microcontrollore PIC16c57 che lavora su dati ad 8bit con istruzioni da 12, ed una eeprom seriale 24LC16 dalla capacità di 16Kbit (entrambi i chip sono costruiti da MICROCHIP, che offre supporto tecnico anche in Italia); inoltre sulla scheda programmabile sono presenti l'interfaccia per la programmazione seriale (adattando i livelli RS232 a TTL), lo stabilizzatore di tensione e l'oscillatore ceramico per il clock a 20Mhz. È importante saper che questo tipo di microcontrollore è un po' vecchiotto, tanto che appartiene alla generazione dei µC con memoria EPROM (cioè quelli con finestrella per la cancellazione tramite raggi UV, mentre gli ultimi PIC usano memoria FLASH modificabile elettricamente), in questa memoria non vi risiede il programma sviluppato dall'utente, ma un interprete che consente di scrivere sul chip di memoria 24LC16 il software progettato con linguaggio PBASIC (linguaggio di programmazione in stile basic, realizzato apposta dalla PARALLAX per i basic stamp). Sia il software Pbasic che gli schemi elettrici dei BasicStamp sono reperibili gratuitamente in internet, per cui chiunque esperto di elettronica può realizzarsi il proprio sistema di sviluppo anche personalizzato (robot, automi, sistemi di acquisizione dati, giochi elettronici, calcolatori acc), ma da quanto detto sopra non basta realizzare l'hardware, poiché i PIC che troveremo in commercio sono vergini, e prima di poterli programmare in PBASIC occorre scaricare l'interprete su EPROM, o copiandolo da un altro PIC o scaricandolo da internet [ST2.HEX] (naturalmente tutto ciò a scopo personale). Di fatti i PIC senza questo interprete possono essere programmati solo a basso livello con istruzioni basilari, questo modo di programmare permette di gestire i minimi dettagli ma risulta particolarmente elaborioso. Con Pbasic invece si programma con facilità, le semplici istruzioni sono davvero molto utili ed intuitive, senza negare la gestione dei singoli bit sulle variabili, o di scrivere un certo dato in una locazione di memoria. 3 di 25 Ecco di seguito lo schema del BasicStamp2: P12 e P13 sono destinati ai servomotori Questa scheda mette a disposizione un microcontrollore con architettura a 8bit, esternamente presenta 20 linee I\O (relativi alla porte A-B-C)di cui 16 sono gestibili dall'utente, mentre le altre 4 (relative alla porta A) sono dedicate all'interfacciamento con la memoria e con il computer; gli altri 8 pin sono dedicati all'alimentazione (Vdd e GND), al reset, e 2 per l'oscillatore, il pin T0CKI per l'ingresso della periferica TIMER, siccome quest'ultima non viene sfruttata dall'esterno l'ingresso T0CKI viene collegato a massa. Accennando un po' qualche dettaglio su microcontrollore, esso ha: un'unità ALU che lavora su due registri, uno è il registro "W" di lavoro (work) e l'altro è il registro STATUS ovvero di stato; il program counter con due soli livelli di STACK; una memoria ROM da 2k x 12bit , il registro istruzioni e decoder istruzioni; poi abbiamo una locazione a parte in cui memorizzare una parola di configurazione contenente impostazioni come la protezione del codice e l'abilitazione di periferiche interne; abbiamo anche il circuito interno per l'oscillatore di clock che richiede solo il componente oscillante; fra le periferiche interne si individuano gli immancabili WATCH DOG\TIMER e PRESCALER (quest'ultimo è controllato dall'option register), tanto per rinfrescarci le idee il WATCH DOG serve a resettare il pic quando si entra in un loop non previsto, mentre il timer viene utilizzato per generare ritardi nel software e nel campionamento di ingressi; abbiamo poi una SRAM a 72 byte di cui col Pbasic se ne possono utilizzare soli 32; ed in conclusione abbiamo i registri per le porte I\O. 4 di 25 qui di seguito esponiamo il package del micro con le indicazioni delle connessioni, e la configurazione circuitale dei registri delle porte di I\O. Da notare che in output abbiano uno stadio pusch-pull utile per riuscire a pilotare in corrente dei led, ma funge anche da buffer, portandosi in alta impedenza quando la or da 1_logico e la and da 0_logico. il set di istruzioni assembler lo esponiamo solo a titolo informativo visto che, grazie all'interprete, il micro viene programmato ad alto livello in Basic: 5 di 25 Ed ecco lo schema a blocchi del microcontrollore PIC16C57: per quanto riguarda la memoria EEPROM seriale 24LC16, essa si presenta in un package ridottissimo ma offre 16 Kbit con accesso (indirizzamento, lettura e scrittura) seriale sincrono e quindi con protocollo I2C. 24LC16 6 di 25 anche questa piccola EEPROM è un gioiellino di tecnologia in quanto il chip integra al suo interno tutto ciò che necessita per l'indirizzamento, la lettura e la scrittura. Descriviamo ora il funzionamento dei pin : - pin1-2-3 (relativamente A0-A1-A2): servono per l'indirizzamento parallelo delle 8 mappe di memoria (da 4Kbit) costituenti l'array conmplessivo. - Pin4 (GND): 0 volt rispetto all'alimentazione. - Pin5 (SDA): questo è un pin bidirezionale su cui confluiscono serialmente indirizzi dati e parole di riconoscimento; allo scopo di scrivere e leggere. - Pin6 (SCL): pin d'input per il sincronismo dei dati. - Pin7 (WP): pin d'input che consente di proteggere il dispositivo dalle scritture ponendolo a Vcc, altrimenti lo poniamo a GND. - Pin8 (Vcc): positivo di alimentazione (5V---) In questa memoria è possibile scrivere un solo byte o una pagina intera, si possono leggere locazioni a caso (random) oppure sequenzialmente. Vedimo adesso alcuni grafici che indicano come effettuare queste operazioni: 7 di 25 vediamo adesso il set di istruzioni ad alto livello che offre il pbasic: Test e salto IF...THEN BRANCH GOTO GOSUB RETURN RUN POLLRUN Esegue un test ed effettua un salto ad una riga del programma. Effettua un salto ad una riga del programma in base ad un indice. Effettua un salto incondizionato ad una riga del programma. Effettua un richiamo di una procedura. Ritorna da una procedura. Esegue un altro programma. Esegue un altro programma fino al ricevimento di un interrupt. Cicli di esecuzione FOR..NEXT Esegue un ciclo delle istruzioni un certo numero di volte. Accesso alla EEPROM EEPROM DATA READ WRITE Memorizza dei dati nella EEPROM prima di scaricare il programma. Memorizza dei dati nella EEPROM prima di scaricare il programma. Copia un byte dalla EEPROM ad una variabile. Scrive un byte nella EEPROM. Accesso alla RAM GET PUT Copia un byte dalla RAM in una variabile. Scrive un byte nella RAM. Numerici LOOKUP LOOKDOWN RANDOM Legge un dato all’interno di un elenco. Cerca un dato all’interno di un elenco. Genera un numero pseudo-casuale. I/O Digitale INPUT OUTPUT REVERSE LOW HIGH TOGGLE PULSIN PULSOUT BUTTON COUNT XOUT Setta un pin in modalità di inpu.t Setta un pin in modalità di output. Inverte la direzione di un pin . Mette a 0 logico un pin settato in output. Mette a 1 logico un pin settato in oupu.t Setta un pin in output ed inverte lo stato logico . Misura un inpulso in ingresso. Genera un impulso invertendo lo stato di un pin. Legge lo stato di un pulsante e salta ad una riga del programma. Conta i cicli (1-0 e 0-1) su di un pin in un lasso di tempo. Genera il codice di controllo della linea X-10. I/O Seriale asincrona SERIN SEROUT Legge un dato da linea seriale asincrona. Scrive un dato su di una linea seriale asincrona. I/O Seriale sincrona SHIFTIN SHIFTOUT Legge un dato da una linea seriale sincrona. Scrive un dato su una linea seriale sincrona. I/O Analogico PWM RCTIME Genera una tensione di uscita variabile 0-5V utilizzando un circuito RC (Al termine setta il pin in input) Misura il tempo di carica/scarica di un circuito RC. Attesa PAUSE Esegue una pausa da 0 a 65535 millisecondi. Suono FREQOUT DTMFOUT Genera una o due onde sinusuoidali di una data frequenza. Genera un tono telefonico DTMF. Consumi NAP SLEEP END Sospende l’esecuzione del programma per un piccolissimo periodo. Si ferma per un periodo da 1 a 65535 secondi. Si ferma fino a quando non si resetta l’alimentazioni. Analisi dei problemi DEBUG Invia informazioni al PC per il debugging. enza soffermarci a descrivere la sintassi per ogni istruzione, andiamo avanti nella descrizione sintetica del progetto. Anche perché il linguaggio PBASIC e semplicissimo e i manuali d'uso si trovano anch'essi in internet. 8 di 25 Oltre al BASICSTAMP, ai servomotori ed alcuni sensori acquisiti col corso di robotica, ho voluto personalizzare il mio robot progettando utilissimi moduli per espandere le potenzialità offerte dal microcontrollore. Quindi cominciando dai più semplici fino ai più complessi, andremo a parlare dei circuiti funzionali aggiuntivi. SRACCIO MECCANICO ANTENNA M +V ACCUMULATORE 6_BATTERIE RICARICABILI PER UN APPORTO TOTALE DI MODULO RADIO HALF DUPLEX 433.92MHZ 7,2V x 2A DRIVER BRACCIO MECCANICO CONTROLLATO CON TRASDUTTORE DI POSIZIONE (POTENZIONETRO) AUREL RF_SAW STABILIZZATORI A: PENNARELLO 5v--RTX_ENABLE DRIVER MODULO RADIO PULSANTE SENSORI DI PROSSIMITA' (BAFFI) DRIVER BILED COLOR_BILED 16 OUTPUTS RISUONATORE CERAMICO EEPROM SERIALE 16Kbit I2C 24LC16 LINEA SINCRONA E PIN DI CONTROLLO PIC16C57 INTERFACCIA I/O 16 INPUTS LINEA ASINCRONA A 9600BIT/S PROTEZIONE CON CONTROLLO DI PARITA' LINEA SINCRONA 8BIT INTERFACCIA RS232 PER LA PROGRAMMAZIONE SENSORI AD INFRAROSSI PER RILEVARE OGGETTI A DISTANZA(DUE FRONTALI ED UNO POSTERIORE) ADC_804 SENSORI AD EFFETTO HALL PER IL CONTROLLO DELLA VELOCOTA' DELLE RUOTE A SENSORE DI TEMPERATURA LM35CZ SERVO SX TRASDUTTORE DI LUMINOSITA' / DRIVER LED BLU SERVO DX ANTENNA MODULO RADIO HALF DUPLEX 433.92MHZ OSCAR_TEK AUREL RF_SAW DRIVER MODULO RADIO RS232 COMPUTER: STAZIONE DI CONTROLLO CARICA BATTERIA TEMPORIZZATO 9 di 25 I blocchi gialli fanno parte dellla dotazione BasicStamp, di cui abbiamo gia parlato. Invece adesso andremo ad esaminare quelli blu ovvero quelli aggiuntivi che ho progettato e realizzato nel corso di questa avventura. - "A", amplificatore audio: 7,2V si tratta di un amplificatore audio in classe "B" da 1,2Watt realizzato in un TBA820 C1 C4 unico chip, il TBA820; questo integrato 6 100uF 470uF 7 3 può essere alimentato con una tensione P15 5 + + massima di 16v, e può dare in uscita una 8 2 4 corrente max di 1,5A. Ottimo per R1 1k applicazioni portatili, reazionato per + C3 eliminare la distorsione di cross over, ed è 100uF + C2 una buona soluzione per i casi in cui si 100uF vuole dissipare poco calore occupando spazi ridotti. All'ingresso di questo circuito in realtà applico l'uscita digitale P15 del basicstamp, facendo quindi lavorare l'amplificatore in classe "D" (la classe "D" è una delle migliori soluzioni digitali audio, poiché consente di risparmiare potenza, spazio e denaro, infatti invece di convertire in analogico un segnale numerico, si preferisce avere un'uscita PWM cioè un'onda quadra rappresentante l'andamento medio di un valore attraverso la durata degli impulsi, in questo caso precalcolati; questo segnale può trasformarsi in un valore di tensione solo se la si applica ad un carico R-C o induttivo come un motorino DC od un'altoparlante). - "driver biled": circuito che riceve in ingresso un livello logico C-MOS e determina il colore di un led bicolore (verde con 0, rosso con 1): questa semplice soluzione la ho ottenuta con l'integra LM358 che contiene al suo interno due operazionali, che possono pilotare carichi fino a 60mA, e quindi si prestano volentieri per pilotare dei led. Entrambi gli operazionali sono configurati come comparatori, uno invertente e Lm358 l'altro non invertente, con tensione di soglia pari a Vcc/2 ovvero 2,5v; questo circuito quindi è in grado di riconoscere i livelli logici: quando ci si presenta un bit_1 l'operazionale superiore porterà l'uscita a Vcc attivando il led rosso (mentre l'operazionale inferiore manterrà l'uscita a 0v), se invece il bit è a 0 allora si verifica il caso contrario illuminando la capsula di verde. Nota bene che la virtual_out_14 proviene da una scheda di espansione di cui parleremo successivamente. SPK1 8Ω 10 di 25 - fototrasduttore \ driver led blu si tratta di una variante del trigger di shmit (comparatore con isteresi con soglia variabile) che mi consente di interpretare il valore homico di una fotoresistenza per rilevare quando viene a mancare la luce, inoltre attraverso il trimmer e possibile regolare la finestra d'isteresi in modo da decidere a quale intensità luminosa accendere o spegnere il led blu ad alta efficienza (cioè che emette un fascio BC337 luminoso d'intensità superiore ai comuni led). Ho scelto la comparazione con isteresi per diminuire la sensibilità, in modo che quando s'accende il led illumenante il percorso, non si abbia una retroazione positiva, con conseguente lampeggiamento automatico del led. Quindi in conclusione il circuito opera su due soglie di luminosità distinte, quella inferiore interpretata come buio e quella superiore (grado di luminosità più intenso di quella prodotta dal led) come ritorno della luce. - sensori di prossimità e di distanza Vcc i sensori di prossimità sono degli switch che si chiudono quando il robot urta un'ostacolo, questi sensori si interfacciano con la scheda d'espansione I\O. Mentre quelli di distanza son realizzati con sensori IR (infrared, a raggi infrarossi), questi sensori son realizzati tramite un diodo infrarosso pilotato con impulsi, ed un fototransistor che si interfaccia direttamente con i circuiti digitali, e quindi direttamente col basic stamp. Il funzionamento dei sensori a infrarossi si basa sul principio della riflessione che avviene quando un'onda elettromagnetica incontra la superficie di separazione fra due materiali differenti (in altre parole quando il raggio IR incontra un'ostacolo ritorna parzialmente indietro per il fenomeno della riflessione). Nel caso un cui c'è l'ostacolo, quindi, il fototransistor rileva il raggio che ri torna in dietro; ma la luce infrarossa, come tutte le onde elettromagnetiche, non viene riflessa allo stesso modo con tutti gli oggetti, infatti oggetti più scuri riflettono meno rispetto a quelli più chiari, quindi è difficile che il robot riesca ad individuare in tempo gli ostacoli neri, ed è in questi casi che intervengono i sensori di prossimità. Un importantissimo concetto ricavato dalla fisica è che: un'onda elettromagnetica in un periodo percorre un determinato spazio, definito da: λ(m) = v / f con v=c/n (λ = lunghezza d'onda in metri, v = velocità di propagazione in m/s, c = velocità di propagazione delle onde EM nel vuoto, n = indice di rifrazione che rappresenta il rapporto fra "v" ed "n") fatte queste considerazioni possiamo affermare che se emetto un impulso luminoso di durata T, e vado subito a testare il fotodetector, posso farmi un'idea della distanza di un eventuale ostacolo se il raggio risulta riflesso: cioè irradiando il raggio IR per 2 ms, esso avrà percorso una determinata distanza, e se c'è un'oggetto entro tale distanza lo stesso raggio tornerà in indietro (mettendoci lo stesso tempo che ha Baffo SX Virtual_I_4 Baffo DX Virtual_I_3 11 di 25 impiegato a raggiungere l'ostacolo), in questo caso posso giudicare che l'ostacolo sta entro un certa distanza. Applicando questo concetto a diversi periodi d'irradiazione si ottiene una approssimabile valutazione di distanza. Dopo tentativi e varie formule ho ricavato una formula accettabile che permette al microcontrollore di poterla elaborare (sapendo che il microcontrollore non può lavorare su numeri con virgola): innanzitutto emetto un set di frequenze comprese fra 10Khz e 60Khz con uno step di 5Khz; naturalmente minore è lo step e maggiore sarà la risoluzione, ma il robot deve aver tempo anche per muoversi ed effettuare tanti calcoli, e quindi spesso si sceglie di scendere a compromessi; ad ogni frquenza erogata vado a testare l'ingresso relativo al fototransistor e controllo se il raggio è stato riflesso, in caso affermativo allora vado a sommare il valore della frequenza in un'apposita variabile, successivamente si passa alla frequenza maggiore facendo lo stesso controllo; in fine se ho davanti un'ostacolo allora la mia variabile contiene un determinato coefficiente inversamente proporzionale alla distanza, per questo motivo ho associato la seguente formula approssimata [DISTANZA (cm) = 10000/(5*contenuto variabile)] (siccome quando non rilevo ostacoli la distanza risulta pari a zero la converto, per via if..then, in 99). Vcc IR_SX detect P8 Vcc IR_DX detect P9 P7 Vcc IR_DWN detect P10 - MODULI RADIO HALF DUPLEX 433.92MHz Modulo SAW a basso costo per la ricetrasmissione di dati [richiede una sola antenna]. Consente una ricetrasmissione half-duplex con breve tempo di commutazione fra modo Tx e modo Rx. L'elevata banda passante BF consente in ricezione 2400 baud (max) utilizzando codifica Manchester, 9600bit/s mandando in modulazione direttamente i dati digitali. Di fatti nel mio progetto di robotica li faccio lavorare a questa velocità; per tranquillizzare gli interessati, dimostro di seguito che la velocita massima da me scelta va benissimo. - attraverso una proporzione andremo a vedere quanto vale il tempo di bit: 9600bit : 1s = 1bit : Tbit Tbit = 1bit*s / 9600 = 104,17us Tbit - quindi la frequenza massima che può essere assunta dai bit (quando non vi sono bit consecutivi allo stesso valore, ma alternativamente 1 e 0) equivale all'inverso del periodo completo: T = 2*Tbit = 2*104,17 = 208,34us T 12 di 25 F = 1/T = 1/ 208,34 = 4,8KHz Sapenndo che la frequenza massima supportata dalla banda BF del modulo radio vale 5KHz, possiamo tranquillamente lavorare a 9600bit/s (occupando una banda fino a 4800KHz) IL TRASMETTITORE si basa su di un modulatore d'ampiezza on-off, in cui la modulante è costituita dai livelli logici TTL, mentre la portante a 433.92Mhz è generata da un oscillatore SAW. Il pin 8 serve ad abilitare la trasmissione, mentre il pin 2 è l'ingresso dati da trasmettere. si ha una banda complessiva di 5Kha , di cui abbiamo parlato prima; la trasmissione può avvenire ponendo il pin8 a 5v. IL RICEVITORE invece si abilita ponendo il pin 25 a 5v. sia lo stadio RX che TX vanno abilitati uno per volta, poiché questa è la filosofia half duplex. I dati ricevuti escono dal pin25. L'antenna è unica e viene commutata da uno stadio all'altro in base alle condizione RX o TX. Il ricevitore si basa sul principio super eterodina, in quanto può usufruire della portante generata localmente dallo stadio TX: quindi il segnale captato viene mixato con la portante, e poi viene estratta la banda nell'intorno della fraquenza intermedia con filtro passa basso attivo (che amplifica anche il segnale) tale segnale (analogico) amplificato e ripulito (ma ancora distorto) può essere accessibile dall'esterno sul pin22 per poterlo analizzare con oscilloscopio, mentre sul pin25 abbiamo l'uscita digitale ottenuta tramite un comparatore. 13 di 25 DATI TECNICI ANTENNA Fw = 433MHz Z0 = 50Ω Pmax = 2W Top. = -20 +80°C Antenna STILO omnidirezionale flessibile in gomma tarata sulla frequenza di 433.92 Mhz. Fornita in Kit per il montaggio diretto a parete sui contenitori metallici o plastici in cui alloggia la circuiteria RF. Indicata per apparecchiature palmari, con caratteristiche antinfortunistiche, e doti di resistenza alle sollecitazioni meccaniche ed avverse condizioni climatiche. Possono sostituire una antenna in quarto d' onda. 14 di 25 INTERFACCE PC - MODULO RADIO Siccome i livelli logici della porta seriale del PC (RS232) transitano da -12v (1_logico) a +12v (0_logico), occorre convertirli in livelli TTL (0|5v) che sono adatti ad alimentare direttamente il modulo radio RTX (inoltre il livello di riposo della RS232 viene anch'esso interpretato come livello logico 0). Il modulo radio assorbe rispettivamente 2,5 mA in RX e 4,5 mA in TX, quindi il modulo radio dal lato del pc non richiederà alimentazione esterna, poiché scriverò un programma adatto a portare a +12v almeno due terminali [pin 4(DTR) e 7(RTS)] cosicché raddrizzando con diodi e stabilizzando con gli stabilizzatori LM78L05, otterrò la corrente desiderata con %v---. Dallo schema elettrico si notare che il modulo radio è abilitato sia a trasmettere che a ricevere, ma la comunicazione non può avvenire nei due sensi contemporaneamente: sia perché il modulo radio, sfruttando solo il canale a 433.92 MHz, opera in modalità half duplex, sia perché la stessa porta seriale del pc di per se lavora in un'unica direzione per volta (è quindi il computer stesso a lavorare in half duplex, trasmettendo e ricevendo in tempi distinti). D1 1N4148 DTR_4 RX_EN_25 D2 1N4148 RTS_7 U1 78L05 IN TX_EN_8 OUT 78L05 COM D3 1N4148 TX_D_3 U2 78L05 IN TX_D_2 OUT U_M_E COM COMM_FEMMINA 5 9 1 R1 4.7k SIP_25 D4 1N4148 6 RX_D_2 RX_D_23 GND_5 GND_TOT 9 TX_DATA 2 23 RX_DATA 25 RX_ENABLE Digital Data RF SAW Transceiver TX_ENABLE 8 1 6 10 11 12 13 14 16 20 15 di 25 Vediamo adesso alcune specifiche tecniche della porta COMM del computer: 5 4 3 2 1 9 8 7 6 Spina maschio, lato connessione 1 2 3 4 5 6 7 8 9 Spina femmina, lato connessione la descrizione dei piedine è la seguente: - 1 = DCD (data carrier detect, pin i\o per comunicare se la trasmissione continua ho ha avuto fine) - 2 = RX (pin d'input dedito alla ricezione dati) - 3 = TX (pin d'output dedito alla trasmissione dati) - 4 = DTR (data terminal ready, pin d'out su cui si invia un livello logico alto quando il computer è pronto a trasmettere) - 5 = GND (massa comune) - 6 = DSR (data set ready, pin d'input da collegare al DTR di un altro computer,in questo modo ricevendo un livello logico alto, ci si pone in ricezione) Quindi il DTR serve a far richiesta di trasmissione dati, tramite il DSR invece si ricevere l'eventuale richiesta, ed in caso affermativo il computer si pone in ricezione. - 7 = RTS (request to send, pin d'out che indica con livello logico alto, che il computer è attivo) - 8 = CTS (clear to send, pin d'input che serve ad identificare la presenza attiva di un altro computer o la presenza fisica di una periferica) mentre DTR e DSR servono ad instaurare il colloquio (orientati ai dati), RTS e CTS servono ad identificare la presenza di una stazione, che sia periferica o computer: in pratica connettendo i due sistemi, essi portano a livello alto RTS, riconoscendosi a vicenda leggendo il valore di tensione sui rispettivi CTS; nel caso di una comune periferica basta collegare i due pin per raggirare il segnale, indicando l'avvenuta connessione fisica. - 9 = RI (ring indicator…) la linea di trasmissione seriale COMM si presta volentieri a comunicazioni in half duplex (cioè che i versi di comunicazione possono avvenire uno per volta: se trasmetto non posso ricevere, se ricevo non posso trasmettere), con protocolli asincroni orientati al carattere, sino a velocità di 9600bit/s. Di fatti sono proprio queste le caratteristiche di cui si avvale la comunicazione fra robot e PC, seguendo la seguente regola per il riconoscimento dei caratteri: START_BIT 1 CARATTERE A 7_BIT PARITY BIT STOP_BIT 0 16 di 25 ROBOT - MODULO RADIO L'interfacciamento fra robot e modulo radio avviene in modo strategico: gli ingressi di abilitazione TX ed RX del modulo sono pilotati da due comparatori (contenuti nell'integrato LM358); proprio besendosi sul principio adoperato con il led bicolore,posso scegliere attraverso un singolo bit se trasmettere o ricevere. La figura seguente rappresenta l'interfecciamento al modulo radio dal lato robot. 9 TX_DATA=P5 2 23 RX_DATA=P6 Digital Data RF SAW Transceiver 25 8 1 TX_ENABLE TRX_MODE=1 6 10 11 12 13 14 16 20 RX_ENABLE RTX_MODE=0 Gli operazionali son alimentati con la tensione diretta della batteria RTX_MODE INTERFACCIA - DRIVER BRACCIO MECCANICO CONTROLATO IN TENSIONE Si tratta di un circuito analogico che riceve in ingresso un valore binario, ed in base alla posizione del braccio meccanico decide se azionare o meno il motorino DC, il BIT d'ingresso serve solo a decidere il verso dello spostamento angolare complessivo, equindi la marcia del motore. Ic1 è l'LM324 che contiene 4 A.O; il DNE293 è un driver a mosfet_push-pull per piccoli motori DC. IC1_1/2 sono due comparatori, con relative soglie di riferimento (tarabili attraverso trimmers), in funzione della posizione del braccio meccanico (rilevata dal potenziometro RM). Il primo comparatore è configurato in modo invertente, viceversa l'altro in modo non invertente. Quando si raggiunge la posizione inferiore (braccio abbassato) l'uscita del primo comparatore commuta da 0v a 8Vdd (accendendo la spia verde); 17 di 25 invece quando si raggiunge la posizione superiore (braccio alzato) è il secondo A.O a commutare da 0v a 8Vdd (accendendo la spia rossa). Nel range compreso fra braccio abbassato ed alzato (quindi nessuna spia accesa), entrambi gli operazionali danno in uscita una tensione di 0v, che attraverso 2diodi al silicio la faccio diventare 1,4v. Proprio questa tensione che è maggiore dello 0logico, ma minore dell'1logico, viene comparata ulteriormente con i livelli logici di controllo forniti dal microprocessore. Si nota c'è bisogno di una sola porta del micro, la quale opera direttamente sull'AO3, e negata sull'AO4. +Vdd 12 4 Ic1_1 14 10 9 Ic1_3 13 8 1 2 7 8 4 5 12 16 3 13 6 3 Ic1_2 2 1 5 Ic1_4 6 7 11 NOT Sapendo che per un comparatore se [ V+ > V- ] allora [ Vout = +Vs ], mentre se [ V+ < V- ] allora [ Vuot = GND ], andremo a realizzare delle tabelle relative agli operazionali 3 - 4 per descrivere in che modo viene pilotato il motore: Motore fermo 18 di 25 - SENSORI AD EFFETTO HALL Si tratta di sensori che rilevano il campo magnetico di una certa intensità entro i 2mm. Questi li sfrutto per controllare la velocità delle ruote (a cui ho applicato un piccolo magnete), allo scopo di far andare il ROBOT a velocità equa per entrambe le ruote e quindi diritto. Quando il magnete passa nelle prossimità del sensore questo da in uscita 0volt, altrimenti non avremo niente e quindi la resistenza di pull'UP porta l'uscita a Vcc. (il fatto che questo trasduttore dia un livello logico alto tramite una resistenza, non va trascurato quando lo si interfaccia con la scheda d'acquisizione dati, di cui presto parleremo, perché essa per ogni ingresso pone una resistenza di pull-DWN; quindi per gli ingressi dediti ai due sensori ad effetto hall tale resistenza risulta assente). - SCHEDA ESPANSIONE 16_I \ 16_O - ADC + SENSORE DI TEMPERATURA Si tratta dell'ultima grande risorsa hardware che ho donato al robot. E' una scheda eccezionale che mi permette di ottenere 16 linee d'input ed altre 16 d'output (ma volendo si possono ampliare ulteriormente utilizzando sempre gli stessi pin d'interfacciamento col basic stamp). Inoltre vi è anche un'ingresso analogico realizzato con convertitore ADC804 a 8bit di risoluzione, il cui scopo attuale e la quantizzazione del segnale proveniente da un sensore di temperatura di precisione: si tratta dell'LM35CZ che da in uscita una tensione direttamente proporzionale alla temperatura acquisita (10mV al °C). Il tutto s'interfaccia col micro tramite linee seriali sincrone ed alcuni pin per il caricamento dei dati nei registri. Entrando nei dettagli circuitali, questa scheda si avvale dei favolosi chip C-MOS a media scala di integrazione (MSI): - il CD4014, che contiene un registro a scorrimento PISO sincrono a 8bit, utile per la serializzazione dei dati senza ricorrere a due chip: MUX e COUNTER, risparmiando sullo spazio, costo e complessità di progettazione. INGRESSI PARALLELI CARICAMENTO DEGLI INGRESSI TRAMITE IMPULSO A LIVELLO LOGICO 1 INGRESSO SERIALE, DA UN ALTRO REGISTRO O DISPOSITIVO SINCRONO LINEA DI SINCRONISMO CLOCK USCITA SERIALE 19 di 25 - Il CD4094 che contiene un SIPO a 8bit, per lo scorrimento parallelo dei dati, ed un PIPO, anch'esso a 8bit per il caricamento sulle uscite. INGRESSO DATI SERIALI LINEA DI SINCRONISMO (CK) USCITA SERIALE DA COLLEGARE AD UN ALTRO REGISTRO PER ALLARGARE LA CAPACITA', E QUINDI IL NUMERO DI USCITE CARICAMENTO DATI PARALLELI IN LATCH (8BIT PIPO TAMPONE) DOPO LO SCORRIMENTO ABILITAZIONE USCITE TREESTATE Grazie a questi chip si ottiene una delle migliori soluzioni per l'acquisizione seriale di ingressi paralleli e la messa in parallelo di dati seriali, risparmiando sui costi e sullo spazio occupato. Nella pagina seguente è riportato lo schema elettrico del modulo di espansione. 20 di 25 Nello schema sono assenti i pin lasciati disconnessi, ed i pin d'alimentazione dei registri (che per tutti i registri son il pin16 a Vcc ed il pin8 a GND), d'altronde cone in tutti gli schemi ho voluto riservare le numerazioni degli stessi pin, per renderne più semplice lo studio. PORT_EN DATA_IN D STORE STR EO 4094 D Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0 CP 5V STR EO 5V LM35cz VS OUT Q7 PE DS CP 4014 Q7 5V Vcc Vin WR + 4014 5V Vref ADC808 CKA D7 D6 D5 D4 D3 D2 D1 D0 EOC CS' C1 150pF P7 P6 P5 P4 P3 P2 P1 P0 PE DS CP CKIN 10k P7 P6 P5 P4 P3 P2 P1 P0 PE DS CP GND Vcc/2 P7 P6 P5 P4 P3 P2 P1 P0 RD' Vin - AGND DGND Q7 PARALLEL INPUTS CP QS Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0 PARALLEL OUTPUTS CLOCK 4014 DATA_OUT 4094 21 di 25 SOFTWARE Per quanto riguarda il software espongo rapidamente il semplice protocollo relativo alla gestione della comunicazione fra robot e computer, ed il diagramma di flusso, anch'esso semplificato, riguardo le routine svolte dal robot quando interagisce con l'ambiente. - Generalità sul Protocollo progettato per mettere in comunicazione il robot col PC: azione Codici vari per il tele-controllo comando Richiesta esplorazione Robot irraggiungibile o spento Robot ha ricevuto comando per l'esplorazione e quindi invia la conferma "O" maiuscolo in ASCII, per 10 in modo da garantire il raggiungimento dello scopo (porre il PC in ricezione dei dati acquisiti in ambiente aperto) Interruzione da parte dell'utente pigiando il pulsante rosso "77a" in ASCII, 10 volte ogni 200ms "77a" in ASCII, 10 volte ogni 200ms "O " in ASCII, 10 volte consecutive INFO VARIE PRECEDUTE DA CARATTERI DI RICONOSCIMENTO "S" maiuscola, che indica lo stop ed attesa conferma, se il PC non riceve conferma entro 2s allora evidenzia la mancata connessione e chiede se si vuole ritentare In caso affermativo il PC si pone in ricezione per acquisire dati ed elaborarli Rielabora tutti i dati che arrivano preceduti da campo di riconoscimento, realizzato tramite caratteri prestabiliti Il programma si riporta nelle condizioni iniziali in cui si controllavano i movimenti del robot 22 di 25 - tabella delle sequenze di caratteri impiegati nei comandi di telecontrollo: La "a" minuscola indica al robot che il comando numerico è terminato e che lo può interpretare queste sequenze sono state scelte appositamente per evitare, negli errori di trasmissione, che un comando venga interpretato diversamente, e ciò grazie alla duplicità dei caratteri (11..22..33…), e quindi alla distanza impiegata fra in codice e l'altro (pari a 11): infatti è molto improbabile che una sequenza di due caratteriuguali sia alterata a tal punto da riprodurre altri due caratteri identici; questo risultato lo ho ottenuto facendo esperienza con i moduli radio che qualche volta, per effetto del rumore presente nell'etere, sbagliavano l'interpretazione dei dati di uno o due bit: quando l'errore è di un bit allora ci pensa il controllo di parità a scartare la sequenza, ma quando vi sono due bit alterati si possono creare problemi. Quindi con la strategia adoperata due caratteri un comando alterato non provoca nessun effetto. Il comando "77a" è l'unico che rispetta una regola più complessa: infatti come abbiamo accennato precedentemente, questo comando è destinato alla richiesta di esplorazione automatica, ed una volta il robot lo interpreta invia verso il computer un carattere di conferma "O" maiuscola; questa comunicazione indica al programma sul PC che deve leggere tutto ciò che arriva via radio, e quindi sulla COMM1, ed interpretare i dati. - tabella sequenze dati inviati dal robot: il computer riceve questi dati, che che possono essere semplici indicatori o dei veri epropri pacchetti, e grazie al programma che ho progettato riesce a gestirli ed a presentarmi le info estratte e rielaborate. 23 di 25 DIAGRAMMA DI FLUSSO sintetico lato robot Nella EEPROM del robot ci sta un programma davvero complesso che occupa soli 12Kbit e richiede quasi tutta la RAM del micro (251bit su 256bit, ricordando che 256bit equivalgono a 32byte). accensione Settaggi iniziali ed inizializzazione di alcune variabili Va nella routine di acquisizione ponendo il modulo radio in stato RX no esegui si RX comando ? no RX richiesta explo? si Commuta in stato TX, trasmetti conferma e parti all'avventura Inizializza alcune variabili, tra cui la velocità delle ruote stimata equivalente Avanza nell'ambiente e tramite sensori hall, acquisisci sincronismo con le ruote, quindi tieni sotto controllo la velocità per andare diritto no si Qualcuno ha pigiato il pulsante rosso? Scannerizza tutti i sensori, rielabora ed eventualmente reagisci con suoni, luci e movimenti. Trasmetti ad ogni evento le relative info (in real time) 24 di 25 Software PC Questo programma, realizzato grazie alla semplicità di visual basic, a scuola, è costituito da una futuristica interfaccia grafica in cui sullo sfondo del programma possiamo apprezzare una bellissima immagine di un pianeta immaginario ed alcuni effetti grafici calcolati applicati a vari satelliti in movimento, fra cui palle da basebal e pupazzetti vari… ma analizzando l'utilità di questo programma possiamo disporre di un joystik direzionale virtuale realizzato con degli spin button incrociati (le stesse funzioni sono ottenibili tramite tasti direzionali su tastiera, ma l'effetto è più lento, si consiglia di aumentare la velocità di ripetizione dei caratteri da pannello di controllo) ed alcuni pulsanti di facile interpretazione e riconoscimento (visto che su ogni pulsante è indicata la funzione che svolge): questi pulsanti servono ad abilitare o disabilitare i suoni emessi dal robot, abbassare od alzare il braccio meccanico, compiere degli spostamenti in avanti e dietro, fare richiesta di esplorazione ed in caso di mancata connessione appaiono altri due pulsanti per ritentare [ok] o meno [annulla]. Inoltre vi sono: sopra e sotto i pulsanti direzionali due grafici temporali su cui vengono indicate le trasmissioni effettuate, in alto a destra una picture box su cui visualizzo il cursore indicante gli spostamenti del robot in un area (attraverso calcoli trigonometrici), in basso alla finestra c'è una barra di stato indicante l'angolazione, la posizione le coordinate ed il tempo di connessione necessario quando si fa richiesta di esplorazione. Abbiamo anche una casella di testo in alto nera, che indica i caratteri dalle sequenze in output. Durante l'esplorazione i programma è predisposto per acquisire i dati rielaborarli e presentarli, in questo caso l'interfaccia muta facendomi visualizzare i dati ma il ancora non è completo… lavori in corso… 25 di 25