Progetto e Realizzazione di una Piattaforma Robotica per
Transcript
Progetto e Realizzazione di una Piattaforma Robotica per
UNIVERSITÀ DEGLI STUDI DI PARMA FACOLTÀ DI INGEGNERIA CORSO DI LAUREA IN INGEGNERIA ELETTRONICA PROGETTO E REALIZZAZIONE DI UNA PIATTAFORMA ROBOTICA PER APPLICAZIONI INDOOR: STUDIO DI UN CASO NELL’AMBITO DEL PROGETTO ROBOCUP ITALIA Relatore: Chiar.mo Prof. Ing. G. ADORNI Correlatori: Dott. Ing. S. CAGNONI Dott. Ing. M. MORDONINI Candidato: CARLO BERNARDI ANNO ACCADEMICO 1999–2000 Ai miei genitori e ai miei nonni Indice Introduzione 1 1 Nascita di un robot 3 1.1 La struttura di un robot . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.1.1 Robot autonomi . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.1.2 Interazione con l’ambiente esterno . . . . . . . . . . . . . . . 5 La RoboCup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.2.1 RoboCup: categoria middle-size . . . . . . . . . . . . . . . . 6 1.2.2 Categoria middle-size: estratto del regolamento . . . . . . . . 7 1.3 Romolo il precursore . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.4 Architettura di TinoZoff . . . . . . . . . . . . . . . . . . . . . . . . 10 1.4.1 Dispositivi installati su TinoZoff . . . . . . . . . . . . . . . . 10 Architettura di Galavrón . . . . . . . . . . . . . . . . . . . . . . . . 12 1.5.1 Percezione . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.5.2 Elaborazione . . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.5.3 Azione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.5.4 Alimentazione . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.2 1.5 2 Elaborazione delle immagini 2.1 2.2 14 Acquisizione e segmentazione . . . . . . . . . . . . . . . . . . . . . 14 2.1.1 Caratteristiche della videocamera . . . . . . . . . . . . . . . 15 2.1.2 Caratteristiche del frame-grabber . . . . . . . . . . . . . . . 19 Strategia di elaborazione . . . . . . . . . . . . . . . . . . . . . . . . 20 ii Indice 2.3 iii Estrazione delle informazioni . . . . . . . . . . . . . . . . . . . . . . 20 2.3.1 23 Calcolo della posizione della palla . . . . . . . . . . . . . . . 3 Struttura software 3.1 3.2 3.3 3.4 Sistemi a behaviors . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3.1.1 Agenti ed agenti autonomi . . . . . . . . . . . . . . . . . . . 25 3.1.2 Behaviors . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.1.3 ETHNOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 3.1.4 Saphira . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 3.1.5 Confronto tra Saphira ed ETHNOS . . . . . . . . . . . . . . 32 Gli esperti del robot . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 3.2.1 Copertura della porta . . . . . . . . . . . . . . . . . . . . . . 35 3.2.2 Riposizionamento . . . . . . . . . . . . . . . . . . . . . . . 35 3.2.3 Visione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 Interazione con il mondo . . . . . . . . . . . . . . . . . . . . . . . . 38 3.3.1 Controllo del movimento . . . . . . . . . . . . . . . . . . . . 38 3.3.2 Strategia di attivazione del kicker . . . . . . . . . . . . . . . 38 Esempio: l’esperto di riposizionamento . . . . . . . . . . . . . . . . 39 4 Il sistema di potenza 4.1 4.2 43 Alimentazione a batterie . . . . . . . . . . . . . . . . . . . . . . . . 43 4.1.1 Parametri da considerare . . . . . . . . . . . . . . . . . . . . 43 4.1.2 Tipi di batterie . . . . . . . . . . . . . . . . . . . . . . . . . 45 Più potenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 4.2.1 La scheda di potenza . . . . . . . . . . . . . . . . . . . . . . 53 4.2.2 Il KaOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 4.2.3 Controllo dei motori . . . . . . . . . . . . . . . . . . . . . . 57 4.2.4 Sviluppi futuri del KaOS . . . . . . . . . . . . . . . . . . . . 59 5 Sviluppi futuri e conclusioni 5.1 25 60 Sviluppi futuri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 5.1.1 60 Algoritmi genetici . . . . . . . . . . . . . . . . . . . . . . . Indice iv 5.1.2 5.2 Nuovi sensori . . . . . . . . . . . . . . . . . . . . . . . . . . 60 Risultati delle competizioni . . . . . . . . . . . . . . . . . . . . . . . 62 5.2.1 Parigi ’98 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 5.2.2 Stoccolma ’99 . . . . . . . . . . . . . . . . . . . . . . . . . 65 5.2.3 Amsterdam 2000 . . . . . . . . . . . . . . . . . . . . . . . . 65 A Manuale d’uso del robot 67 A.1 Batterie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 A.1.1 Carica delle batterie con il caricabatterie . . . . . . . . . . . . 67 A.1.2 Carica con alimentatore da banco . . . . . . . . . . . . . . . 68 A.2 Circuito pneumatico per il kicker . . . . . . . . . . . . . . . . . . . . 69 A.3 Alimentazione del robot . . . . . . . . . . . . . . . . . . . . . . . . 69 A.3.1 Alimentazione da batterie . . . . . . . . . . . . . . . . . . . 69 A.3.2 Alimentazione con alimentatore PC . . . . . . . . . . . . . . 70 A.3.3 Alimentazione con alimentatore da banco . . . . . . . . . . . 70 A.4 Scheda di controllo . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 A.4.1 Collegamenti elettrici . . . . . . . . . . . . . . . . . . . . . . 71 A.4.2 Aggiornamento del PSOS . . . . . . . . . . . . . . . . . . . 71 A.4.3 Parametri del PSOS . . . . . . . . . . . . . . . . . . . . . . . 71 A.5 Collegamento al robot . . . . . . . . . . . . . . . . . . . . . . . . . . 72 A.5.1 Collegamento diretto . . . . . . . . . . . . . . . . . . . . . . 72 A.5.2 Collegamento tramite rete . . . . . . . . . . . . . . . . . . . 73 A.6 Programmazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 A.6.1 Avvio del programma . . . . . . . . . . . . . . . . . . . . . 74 A.6.2 Modifica e procedure di compilazione . . . . . . . . . . . . . 74 B Schema del robot 75 C Listato del KaOS 79 Ringraziamenti 120 Bibliografia 121 Elenco delle figure 1.1 Un robot B14 RWII. . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.2 Architettura del robot “Romolo”. . . . . . . . . . . . . . . . . . . . . 9 1.3 Il robot TinoZoff. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.4 Il robot Galavrón. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.1 Schema del sistema di acquisizione delle immagini. . . . . . . . . . . 15 2.2 Conversione A/D del segnale video. . . . . . . . . . . . . . . . . . . 16 2.3 Posizionamento delle telecamere su Galavrón. . . . . . . . . . . . . . 19 2.4 Acquisizione di immagini tramite specchio sferico. . . . . . . . . . . 21 2.5 Campo inquadrato dalle telecamere del robot. . . . . . . . . . . . . . 22 2.6 Calcolo della posizione della palla. . . . . . . . . . . . . . . . . . . . 24 3.1 Ethnos: il funzionamento di un esperto. . . . . . . . . . . . . . . . . 30 3.2 Saphira: architettura di sistema. . . . . . . . . . . . . . . . . . . . . 32 3.3 Saphira: architettura di controllo. . . . . . . . . . . . . . . . . . . . . 33 3.4 Esperto di decisione: strategia di copertura della porta. . . . . . . . . 36 3.5 Zona di corretta posizione del robot e sistema di riferimento adottato. 39 3.6 Esperto ETParking: analisi dei singoli stati. . . . . . . . . . . . . . . 41 3.7 Esperto ETParking: diagramma degli stati. . . . . . . . . . . . . . . . 42 4.1 Profili di scarica per diversi tipi di celle. . . . . . . . . . . . . . . . . 45 4.2 Effetto memoria per le celle al Ni-Cd. . . . . . . . . . . . . . . . . . 47 4.3 Velocità del robot con diversi carichi. . . . . . . . . . . . . . . . . . 52 4.4 Funzionamento degli encoders incrementali. . . . . . . . . . . . . . . 55 v Elenco delle figure vi 4.5 Schema di funzionamento del sistema operativo KaOS. . . . . . . . . 56 4.6 Potenza ai motori: modulazione ad ampiezza di impulso (PWM). . . . 58 5.1 RoboCup ’98. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 5.2 Tabellone della RoboCup ’98. . . . . . . . . . . . . . . . . . . . . . 63 5.3 RoboCup ’99. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 5.4 Tabellone della RoboCup ’99. . . . . . . . . . . . . . . . . . . . . . 64 5.5 EuRoboCup 2000. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 B.1 Schema elettrico del robot Galavrón. . . . . . . . . . . . . . . . . . . 78 Elenco delle tabelle 1.1 RoboCup: tabella dei colori. . . . . . . . . . . . . . . . . . . . . . . 7 3.1 ETHNOS: gli esperti del robot. . . . . . . . . . . . . . . . . . . . . . 34 4.1 Confronto delle caratteristiche di diversi tipi di batterie. . . . . . . . . 51 4.2 Parametri dei motori del robot. . . . . . . . . . . . . . . . . . . . . . 54 4.3 68HC11F1: pins utilizzati nel controllo dei motori. . . . . . . . . . . 59 A.1 Parametri del PSOS. . . . . . . . . . . . . . . . . . . . . . . . . . . 72 vii Introduzione L’oggetto di questa tesi riguarda le problematiche relative alla realizzazione di robot autonomi che devono eseguire compiti in ambienti chiusi, solo parzialmente noti. A tale scopo è stato progettato un sistema di visione e controllo per robot mobili che consenta di individuare un pallone (opportunamente colorato) e cerchi di impedire che tale pallone entri in una speciale “porta”. Anche se si è cercato per quanto possibile di esporre argomenti generali, in questa tesi viene descritto il progetto e la realizzazione di un robot portiere secondo determinate specifiche: le specifiche tecniche della RoboCup: The Robot World Cup Initiative. La RoboCup è nata con lo scopo di confrontare su di un terreno comune, quello del gioco del calcio, diverse soluzioni nell’ambito dell’intelligenza artificiale e della robotica e per favorire la ricerca su sistemi autonomi, sistemi multi-agente e cooperazione. La partecipazione alla RoboCup, tramite la squadra nazionale italiana ART (Azzurra Robot Team), è stata possibile grazie al progetto RoboCup Italia che, oltre all’Università di Parma, ha interessato anche le Università di Roma (La Sapienza), Milano Bicocca, Milano Politecnico, Palermo, Genova, Padova ed il Consorzio Padova Ricerche. Nel corso di questo lavoro sono state analizzate le diverse componenti di un’architettura classica per un robot autonomo, visto come un agente dotato di percezione, elaborazione (reasoning), azione sul mondo circostante. Per un robot autonomo la percezione consiste in tutti quei sottosistemi in grado di apportare una conoscenza sullo stato dell’ambiente esterno. Il robot in questione è dotato di due telecamere con ottiche grandangolari e di una schiera di sensori infrarossi e di sensori di contatto. Le immagini inquadrate dalle telecamere hanno richiesto un grosso sforzo elaborativo per estrarre 1 Introduzione 2 le informazioni importanti per il robot. Trattandosi di un robot portiere, la principale informazione riguarda la posizione e la direzione della palla. È stato necessario quindi finalizzare l’elaborazione dell’immagine ad un efficiente riconoscimento di oggetti. L’analisi delle prestazioni del sistema robotico realizzato sfruttando una base mobile commerciale ha messo in risalto che le prestazioni erano insufficienti per l’ambito qui descritto, ragione per cui è stata realizzata una scheda di potenza per motori elettrici in corrente continua ed è stato scritto in assembler un sistema operativo (KaOS) preposto al controllo dei motori del robot. Tale sistema operativo è ospitato su un microprocessore Motorola MC68HC11. Il progetto è stato suddiviso in due parti: la prima è consistita nello sviluppo dei sistemi di visione e di controllo e nella loro sperimentazione presso il Dipartimento di Ingegneria dell’Informazione dell’Università di Parma, mentre la seconda nella partecipazione alla RoboCup ’98 a Parigi (luglio 1998) dopo uno stage di preparazione a Padova presso il Consorzio Padova Ricerche, alla RoboCup ’99 a Stoccolma (agosto 1999) ed infine alla EuRoboCup, il primo campionato europeo di calcio per robot, nel giugno 2000 ad Amsterdam. Capitolo 1 Nascita di un robot Un robot, secondo l’accezione corrente, è un servitore meccanico, cioè una macchina che serve a coadiuvare o a sostituire l’uomo nel lavoro. L’utilizzo di robot è diventato indispensabile in numerose applicazioni: catene di montaggio, esplorazione spaziale e sottomarina, ambiti di lavoro pericolosi per l’uomo oppure in ambito bellico. Tuttavia i robot sono ancora nella prima fase del loro sviluppo. Non si assiste ancora, in robotica, alla diffusione di massa di robot personali, contrariamente a quanto è avvenuto per i calcolatori. I robot attuali ricordano più i mainframes obsoleti che non gli attuali e versatili personal computer. Infatti sono progettati essenzialmente per eseguire compiti specifici. Un robot di una catena di montaggio non può essere riconvertito per altri compiti perché è stato progettato e costruito per quel determinato compito. In altre parole, mentre i personal computer possono facilmente essere riprogrammati, i robot attuali sono fortemente dipendenti dai compiti che devono svolgere. Si presenta cosı̀ un primo problema: quello della flessibilità nell’eseguire determinati compiti. Tale flessibilità può essere richiesta anche dall’ambito in cui si intende utilizzare il robot. 1.1 La struttura di un robot Per struttura di un robot si intendono tutti quei sottosistemi funzionali che costituiscono il robot stesso. Da un punto di vista fisico si possono classificare i robot in base ai sensori e agli attuatori a bordo. Un robot mobile deve possedere quegli attuatori 3 Capitolo 1. Nascita di un robot 4 (ruote, gambe, cingoli) che ne consentono il movimento. Inoltre deve essere dotato di un insieme di sensori che rendano possibile un movimento non banale. In un braccio robotizzato si possono ad esempio distinguere il sistema di controllo, quello di movimento, quello di manipolazione e quello di programmazione. Gli attuatori sono dunque quei dispositivi che consentono al robot di cambiare la propria posizione, la propria configurazione esterna o di cambiare la posizione di oggetti. I sensori sono quei dispositivi che permettono al robot di conoscere lo stato dell’ambiente circostante (telecamere, sonar, sensori ad infrarossi, sensori di prossimità e di contatto e cosı̀ via) e il proprio stato interno (encoders, bussole, accelerometri). 1.1.1 Robot autonomi I robot possono essere autonomi oppure controllati dall’uomo. La differenza sostanziale è che un robot autonomo deve essere in grado, entro certi limiti, di districarsi da situazioni potenzialmente pericolose e quindi deve poter prendere decisioni esclusivamente sulla base di dati preesistenti e di ciò che percepisce dai sensori. In questo senso, un robot autonomo è dotato di flessibilità in quanto può cambiare il proprio comportamento come reazione a mutamenti dell’ambiente esterno. Un robot autonomo deve in sostanza mostrare una relazione tra percezione e azione e questa relazione deve essere in qualche modo “intelligente”, cioè finalizzata ad uno scopo. In un robot autonomo si possono distinguere almeno quattro sottosistemi: Percezione, Elaborazione delle informazioni, Azione, Alimentazione. I primi due sottosistemi costituiscono l’intelligenza del robot, mentre gli altri due permettono al robot di eseguire i compiti per cui è stato progettato, consentendo al robot di interagire con l’ambiente esterno. Capitolo 1. Nascita di un robot 5 1.1.2 Interazione con l’ambiente esterno Nella costruzione di un robot va tenuto presente l’ambiente nel quale il robot stesso si troverà ad operare. Una prima classificazione è quella di suddividere i robot in base al fatto che l’ambiente esterno sia conosciuto a priori (totalmente o parzialmente) dal robot, oppure che il robot si trovi ad operare in un ambiente totalmente ignoto. Una definizione più approfondita di che cosa si intenda per conoscenza verrà data in seguito. Il robot si troverà quindi ad operare in un ambiente definito da regole che codificano i colori e le geometrie dell’ambiente stesso e che limitano in certi casi la libertà di movimento del robot. Tutto ciò, unitamente ad altre informazioni, costituisce il bagaglio di conoscenze a priori (knowledge base) che il robot deve possedere. Volendo costruire un robot portiere per la RoboCup, si deve tener presente che il regolamento aiuta a conoscere l’ambiente in cui il robot si muoverà. In pratica, essendo definito per regolamento che la palla è di colore rosso, il robot sa di doversi aspettare sempre una palla rossa. Viceversa, il robot non sa dove e come si muoverà la palla, nè dove e come si muoveranno gli altri robot. Si può quindi affermare che il robot portiere si muoverà in un ambiente noto solo parzialmente. Inoltre è importante sottolineare che il robot deve essere autonomo, ciò vuol dire che il livello di conoscenza che il robot possiede può essere modificato solo in base alle informazioni che provengono dalle telecamere, dai sensori o da altri robot e non da un eventuale intervento umano dall’esterno. 1.2 La RoboCup Anche se si cercherà per quanto possibile di esporre argomenti generali, lo svolgimento di questa tesi è però fortemente orientato ad un particolare ambiente, la RoboCup, entro il quale si sono svolte tutte le prove. È opportuno quindi illustrare brevemente l’ambito entro il quale è stato concepito questo lavoro. La RoboCup, organizzata dalla RoboCup Federation, è una manifestazione che propone alla comunità scientifica una sfida, quella di costruire ed organizzare squadre di robot-calciatori e di farli competere in un torneo. Nata nel 1997 da un’idea dei giapponesi H.Kitano e M.Asada[10], la Capitolo 1. Nascita di un robot 6 Robot World Cup Initiative si è data come obbiettivo a lungo termine quello di giungere a costruire, intorno all’anno 2050, una squadra di robot calciatori bipedi che sia capace di sfidare secondo le regole della FIFA la squadra che allora sarà campione del mondo di calcio. Nondimeno, a breve termine la RoboCup prevede di dare un significativo impulso alla ricerca nei campi dell’intelligenza artificiale e della robotica. Infatti lo sviluppo di sensori, di comportamenti e di cooperazione necessari per raggiungere l’obiettivo fissato dalla RoboCup può avere una applicazione immediata in tutti quei campi laddove già i robot sono utilizzati o dove ne è ormai prossimo l’impiego. Secondo il regolamento, vi sono essenzialmente due categorie di robot: small-size e middle-size (detta anche F-2000). La differenza principale, a parte le dimensioni, consiste nel fatto che i robot della categoria middle-size devono essere completamente autonomi per quanto riguarda la visione. Nella small-size, al contrario, i robot sono aiutati da una telecamera che inquadra tutto il campo di gioco, il cosiddetto “Global Vision System”. Il robot del progetto segue le specifiche della categoria middle-size F-2000. 1.2.1 RoboCup: categoria middle-size La categoria middle-size è stata pensata per favorire la ricerca su sistemi autonomi, sistemi multi-agente, cooperazione e per studiare robot che possano assolvere a compiti specifici in ambienti in cui non è possibile una forma di telecontrollo diretto. In particolare si pensi alle fabbriche, dove già oggi si fa largo uso di robot nel ciclo produttivo, oppure all’esplorazione dello spazio, un campo quest’ultimo in cui per ragioni di sicurezza ed economicità i robot verranno sempre più utilizzati. E proprio in campo spaziale possono esserci le ricadute più significative. Infatti, poiché le distanze spesso non consentono un controllo diretto dei veicoli, risulta fondamentale poter disporre di robot con un certo livello di autonomia. In questo ambito ricade l’esplorazione dei corpi del sistema solare, che ha come esempi più recenti il robot marziano Sojourner e la sonda NEAR, attualmente in orbita intorno all’asteroide Eros[8]. Capitolo 1. Nascita di un robot Colore Rosso Blu Giallo Verde Bianco Ciano Magenta 7 Oggetto palla una porta l’altra porta campo linee marker squadra 1 marker squadra 2 Tabella 1.1: RoboCup: tabella dei colori. 1.2.2 Categoria middle-size: estratto del regolamento Campo di gioco. La dimensione del campo di gioco è di 50009000 mm circa e la superficie è di colore verde. Una parete bianca alta 500 mm circonda tutto il campo ad eccezione delle porte. Sul campo vi sono alcune linee che identificano il centrocampo e le aree di rigore. Le linee sono di colore bianco, larghe 40 mm. Il cerchio di centrocampo ha un diametro di 2000 mm. Le aree di rigore sono due rettangoli di 30001000 mm. Porte. Le porte sono larghe 2000 mm, sono alte 900 mm ed hanno una profondità che deve essere superiore al diametro della palla. Ogni porta è dipinta di un colore unico definito nella tabella dei colori. Palla. La palla per i robot della categoria Middle-Size è un pallone FIFA standard numero 4, diametro 200 mm. Il colore è definito nella tabella dei colori. Squadre e robot. Una squadra è composta di un massimo di quattro robot e può avere un portiere. Le dimensioni di ogni singolo robot non devono superare i 2025 cm2 di area circoscritta dal perimetro del robot stesso nella sua massima estensione. Vi sono limitazioni specifiche per le convessità del perimetro. Inoltre, la diagonale massima interna a tale area non può essere più di 63 cm. È ammessa qualsiasi forma a patto che le dimensioni non superino quelle massime previste. Un robot può essere alto al massimo 80 cm. Il colore dei robot deve essere nero Capitolo 1. Nascita di un robot 8 per quanto più possibile e comunque si devono evitare quei colori presenti nella tabella dei colori. Comunicazioni e sensori. Non ci sono restrizioni alle comunicazioni con e tra i robot ed il computer remoto (la cosiddetta consolle della squadra), eccetto per il divieto di intervento degli operatori. Qualunque tipo di sensore è ammesso, eccetto il sistema di visione globale (una telecamera esterna che inquadra tutto il campo dall’alto). Sono proibiti dispositivi che trattengono la palla o che limitano uno dei gradi di libertà della palla. Partita. Una partita consiste di due tempi di 10 minuti ciascuno con un intervallo di 15 minuti. Vince la squadra che segna più reti. 1.3 Romolo il precursore Nella fase di sviluppo e sperimentazione si è utilizzato un robot mobile B14 della Real World Interface Inc. (figura 1.1), dotato di un computer con processore Pentium 200 MMX e sistema operativo Linux (Slackware con kernel versione 2.0.30). Il robot B14, ribattezzato Romolo, è inoltre dotato di una scheda frame-grabber Matrox Meteor per l’acquisizione di immagini da telecamera a colori e di una schiera di 16 sensori a raggi infrarossi disposti ad intervalli regolari intorno al robot. In base alla definizione dell’immagine acquisita, il sistema è in grado di elaborare un certo numero di fotogrammi ogni secondo (frame-rate). Il parametro relativo al frame-rate è fondamentale per avere una risposta accettabile ai movimenti della palla. Si è scelto di far acquisire le immagini con una risoluzione di 120 linee per 160 colonne ad una profondità di colore di 24 bit in formato RGB. Questa configurazione dà luogo ad un frame-rate di circa 7 fotogrammi al secondo. Il software realizzato si occupa ciclicamente di acquisire un’immagine dalla telecamera, di elaborarla per ottenere l’informazione relativa alla posizione della palla rispetto al robot, di decidere se e verso dove far muovere il robot, di controllare se il robot è davanti alla porta o meno e, infine, di dare gli opportuni comandi ai motori delle ruote. Diversamente dai suoi successori, su Romolo non è stato utilizzato alcun Capitolo 1. Nascita di un robot 9 Figura 1.1: Un robot B14 RWII. Camera Frame grabber Linux Pentium MMX Movimento Figura 1.2: Architettura del robot “Romolo”. Sensori a infrarossi Capitolo 1. Nascita di un robot 10 sistema ad agenti per il controllo del comportamento. Ad occuparsi di tutte le decisioni relative al movimento del robot è il programma. Una delle limitazioni maggiori riscontrate con Romolo è stata quella della non grande ampiezza del campo inquadrato dalla telecamera, pari a circa 70o . Se da un lato un angolo cosı̀ stretto ha fatto sı̀ che le immagini della telecamera non presentassero particolari distorsioni (tanto che nell’elaborazione delle immagini la distorsione è stata trascurata), dall’altro lato è evidente che nel contesto è preferibile che un portiere debba poter inquadrare la parte più ampia possibile del campo di gioco. La telecamera è stata posizionata sulla parte superiore del robot ed è stata inclinata in modo da coprire una zona che andasse da circa 10 cm dalla base del robot fino a circa 2 metri di distanza. 1.4 Architettura di TinoZoff Nella realizzazione del robot TinoZoff ci si è posti come obbiettivo principale quello di poter avere a disposizione una architettura aperta, in grado di essere facilmente aggiornata. Questo obbiettivo è stato solo parzialmente raggiunto con TinoZoff, mentre è stato raggiunto con successo nella creazione di Galavrón. In base all’esperienza acquisita con Romolo, si è voluto implementare un sistema di visione che garantisse un ampio campo inquadrato e nello stesso tempo non fosse troppo penalizzante come risoluzione. Sono state acquistate due telecamere a basso costo e due ottiche grandangolari dotate di 120o di apertura. Con queste si è realizzato uno schema di visione binoculare, ma non stereo, in grado di coprire più di 200o di terreno di gioco. 1.4.1 Dispositivi installati su TinoZoff Essenzialmente, l’architettura di TinoZoff è composta da quattro blocchi: alimentazione, visione, elaborazione, azione. Alimentazione. Il sistema di alimentazione di TinoZoff è composto da due batterie al Pb-acido da 12V-4Ah collegate in serie, che forniscono 24 V all’alimentatore. L’autonomia del robot è variabile in quanto dipende dall’utilizzo dei motori. In Capitolo 1. Nascita di un robot 11 Figura 1.3: Il robot TinoZoff. ogni caso è più che sufficiente a concludere una partita senza la necessità di dover sostituire le batterie nell’intervallo. Visione. Su TinoZoff, come detto in precedenza, sono state installate due telecamere. I segnali video delle due telecamere vengono fatti confluire a due schede di acquisizione. Le due schede sono differenti, infatti una è una Matrox Meteor, mentre l’altra è una Intel Smart Video III basata sul chip BrookTree BT848. Elaborazione. TinoZoff si basa su di un robot Pioneer 1 ActivMedia. Il PC installato a bordo comprende una motherboard Asus Tx-97 con un processore AMD K6 a 200 MHz e una RAM da 64 Mb (funzionante a 66 MHz). Azione. TinoZoff si muove grazie a due motori[6] in corrente continua con encoder incorporati Pittman della serie GM9034. Inoltre è dotato di un sistema pneumatico per respingere la palla (kicker) con una bombola per aria compressa da un litro e due pistoni Camozzi da 5cm a singolo effetto comandati da due elettrovalvole. Il kicker esteso è visibile nella figura 1.3. Capitolo 1. Nascita di un robot 12 Figura 1.4: Il robot Galavrón. 1.5 Architettura di Galavrón Galavrón nasce come sviluppo di TinoZoff. Come già era stato possibile constatare, la progettazione e la successiva realizzazione di un robot in grado di svolgere efficacemente il compito per cui è nato presuppongono alcuni compromessi. Si devono inoltre valutare i limiti entro i quali sia davvero possibile applicare le tecniche che si intendono utilizzare. Si è visto che la maggior parte del tempo impiegato nella costruzione è stata utilizzata per individuare soluzioni ai problemi “reali”, cioè derivanti da caratteristiche e vincoli dell’ambiente reale. Galavrón è costituito da un telaio modulare in alluminio che comprende quattro sottosistemi: percezione (visione, infrarossi e bumper), elaborazione, azione (motori e kicker) ed alimentazione. Per quanto riguarda il telaio, grande attenzione è stata posta al fine di rendere agevoli gli interventi di modifica di componenti e di manutenzione all’interno del robot. Capitolo 1. Nascita di un robot 13 1.5.1 Percezione Diversamente da TinoZoff, questo sottosistema non comprende solo la visione. Infatti su Galavrón sono installati quattro sensori infrarossi ed inoltre l’informazione di attivazione dei microswitch del kicker viene passata al PC, con la possibilità di utilizzarla per valutare se ci sono stati urti. 1.5.2 Elaborazione Nonostante il rapidissimo incremento nelle prestazioni dei processori e delle memorie, un upgrade del PC del robot è legato anche ad altri fattori non trascurabili. In primo luogo si deve considerare l’assorbimento del processore in quanto all’aumentare delle frequenze di clock aumenta anche la potenza assorbita. Di conseguenza, mantenendo il medesimo sistema di alimentazione, si riduce l’autonomia. Su Galavrón è installato un processore Intel Celeron a 466 MHz che assorbe circa 20 Watt, un assorbimento decisamente inferiore a quelli dei più moderni Pentium III o AMD Athlon. 1.5.3 Azione Il sottosistema di azione comprende i motori ed il kicker. I motori sono gli stessi di TinoZoff. Il controllo dei motori è trattato più in dettaglio al punto 4.2.3. Il kicker è stato realizzato ex-novo e si basa su quattro elettrovalvole che controllano quattro pistoni a doppio effetto. La bombola è in alluminio e ha una capacità di due litri. Vi è anche una piccola bombola per il circuito chiuso di ritorno, a bassa pressione. 1.5.4 Alimentazione Galavrón è stato predisposto per ospitare due o quattro batterie al Pb-acido, oppure due batterie agli ioni di litio. Inoltre si è cercato di installare componenti che avessero un consumo di corrente limitato. Per una descrizione più completa del sistema di alimentazione si rimanda al capitolo 4 e all’appendice B. Capitolo 2 Elaborazione delle immagini Di tutti i campi di applicazione, quello che ha tratto i maggiori benefici dall’aumento della capacità di elaborazione dei moderni PC è senz’altro quello legato al multimediale ed in particolare quello legato all’elaborazione delle immagini. Questo corrisponde a poter trattare un flusso enorme di dati in un tempo ragionevole. I dati contenuti in una immagine non sono però direttamente accessibili all’elaboratore in quanto una immagine richiede di essere acquisita e digitalizzata. 2.1 Acquisizione e segmentazione Per acquisizione di un’immagine si intende il processo tramite il quale l’immagine inquadrata da una videocamera o da un qualsiasi altro sensore ottico viene trasferita nella memoria del computer[22]. A rigor di logica, si può parlare di acquisizione anche quando si passa allo scanner una foto o una diapositiva in quanto la pellicola fotografica è a tutti gli effetti un sensore ottico. Tuttavia nell’ambito dei robot mobili risulta evidente che l’acquisizione delle immagini deve avere una caratteristica imprescindibile: essere quasi istantanea. In questa sezione verrà quindi considerata l’acquisizione di immagini tramite videocamera. L’immagine inquadrata viene trasformata dalla videocamera in un segnale video analogico in banda base ed inviata in questa forma ad una scheda di conversione A/D. Questa scheda è detta frame-grabber (letteralmente: cattura-fotogrammi) e si occupa di convertire l’immagine in un formato digitale adatto 14 Capitolo 2. Elaborazione delle immagini Videocamera Segnale video analogico 15 Frame-grabber Immagine digitalizzata Figura 2.1: Schema del sistema di acquisizione delle immagini. all’elaborazione elettronica. In fig.2.1 è stato schematizzato un sistema di acquisizione di immagini. 2.1.1 Caratteristiche della videocamera La videocamera è composta dal sensore CCD (Charge Coupled Device, cioè dispositivo ad accoppiamento di carica), dall’ottica e da una parte elettronica di conversione del segnale. Il segnale in uscita dalla videocamera (segnale video) può essere secondo uno dei tre seguenti formati: PAL (standard europeo), NTSC (standard americano) o SECAM (standard francese). Questi tre formati si differenziano tra l’altro per il numero di linee che compongono l’immagine. Il sensore CCD è il “cuore” della videocamera. Le caratteristiche principali del sensore riguardano la risoluzione, l’intervallo spettrale e l’efficienza quantica. Le caratteristiche dell’ottica che prenderemo in considerazione sono due: campo inquadrato e distorsione. Risoluzione del sensore. La risoluzione del sensore dipende dal numero di pixel del sensore stesso e dalle dimensioni dei singoli pixel. La dimensione di un pixel può arrivare a pochi micron per lato nei migliori CCD. Il numero di righe di pixel Capitolo 2. Elaborazione delle immagini 16 Una linea di informazione Impulsi di sincronismo orizzontale (a) Segnale video analogico. Tensione (V) Una linea di informazione Tempo (t) 11 00 00 11 11 00 00 11 Pixel dell’immagine digitalizzata (b) Conversione A/D del segnale video. Figura 2.2: Conversione A/D del segnale video. Capitolo 2. Elaborazione delle immagini 17 del sensore può non essere un multiplo esatto del numero di righe dello standard dell’immagine in uscita, per cui può esservi la necessità che l’elettronica faccia una interpolazione. Intervallo spettrale ed efficienza quantica. Questi parametri sono relativi alla percezione del colore. Per intervallo spettrale si intende l’intervallo delle lunghezze d’onda della radiazione elettromagnetica che vengono rivelate dal sensore. L’occhio umano ha un intervallo spettrale che va dai 400nm (violetto) ai 700nm (rosso). Inoltre la sensibilità al colore nell’occhio umano non è costante in tutto l’intervallo, ma presenta un massimo intorno ai 500600nm. Questo massimo varia a seconda delle condizioni di luce, spostandosi verso il violetto nelle ore notturne. Da ultimo, il cervello elabora l’informazione ricevuta dall’occhio, per cui la percezione del colore è in qualche modo influenzata da ciò che ci si aspetta di vedere. Un esempio di questa elaborazione è che l’immagine che si forma sulla retina è capovolta ed è compito del cervello raddrizzarla[21]. In un sensore CCD l’intervallo spettrale è solitamente più ampio coprendo anche lunghezze d’onda nel vicino infrarosso. La sensibilità al colore in un sensore CCD difficilmente ricalca quella dell’occhio umano, per cui vengono a determinarsi dominanti cromatiche che nei sensori di bassa qualità possono essere evidenti, richiedendo una calibrazione del colore nell’immagine acquisita. L’efficienza quantica è un parametro che indica quanti fotoni vengono “catturati” dal sensore ed in pratica è un indicatore della capacità del CCD di registrare immagini anche in condizioni di luce scarsissima. Per fare un paragone, sia pure approssimativo, con le pellicole fotografiche, le migliori raggiungono sensibilità di 1600 ISO (a scapito però di una perdita della risoluzione). Un sensore CCD ha una sensibilità equivalente a oltre 20000 ISO, senza alcuna perdita di risoluzione. Questo parametro è fondamentale qualora non siano note a priori le caratteristiche di illuminazione dell’ambiente all’interno del quale si muoverà il robot. Proprio per questo motivo, prima delle gare della RoboCup si devono calibrare i colori delle immagini acquisite dalle telecamere. In ambito RoboCup la defini- Capitolo 2. Elaborazione delle immagini 18 zione dei colori e del tipo di luce delle lampade che illuminano il campo è una problematica ancora aperta. Non basta dichiarare che il pallone è rosso, il campo è verde e cosı̀ via, ma sarebbe opportuno indicare i colori tramite un riferimento quale ad esempio i codici Pantone utilizzati dalle tipografie. Campo inquadrato. Il campo inquadrato dalla videocamera deve essere valutato in funzione dell’applicazione che si intende realizzare. Nel campo dei robot mobili si devono valutare i compiti che ciascun robot è chiamato ad eseguire. Il regolamento della RoboCup prevede esplicitamente la presenza di un robot portiere, per cui è ragionevole cercare di “far vedere” al portiere quanto più terreno di gioco possibile. Sono cosı̀ state implementate varie soluzioni per ampliare il campo inquadrato, soluzioni che si possono raggruppare in quattro categorie: sistemi di visione omnidirezionali, poche telecamere con ottiche grandangolari, tante telecamere ciascuna inquadrante una porzione di campo limitata ed infine la soluzione con una sola telecamera orientabile ed eventualmente con zoom. Galavrón è dotato di un sistema di visione con due telecamere con ottiche grandangolari posizionate con un angolo di 90o , come nelle figure 2.3 e 2.5. In fase di sviluppo è stato testato anche un sistema di visione omnidirezionale. Tale sistema, utilizzato anche da alcuni robot della squadra ART, è stato scartato in quanto vi sono notevoli difficoltà tecniche nell’ottenere specchi dalla forma adeguata. In figura 2.4 si vedono due esempi di acquisizione tramite un improvvisato specchio sferico. Distorsione. La distorsione introdotta dalle ottiche dipende dalla geometria delle ottiche stesse, considerando come ottica non solo le lenti degli obiettivi delle telecamere, ma anche eventuali specchi. Il robot, muovendosi, sfrutta le informazioni del sistema di visione per aggiornare costantemente la propria conoscenza riguardo all’ambiente esterno, pertanto può essere necessario valutare l’impatto della distorsione sulla percezione del robot e, se necessario, correggerla. Capitolo 2. Elaborazione delle immagini 19 Figura 2.3: Posizionamento delle telecamere su Galavrón. 2.1.2 Caratteristiche del frame-grabber Il frame-grabber riceve in ingresso il segnale video analogico prodotto dalla videocamera (figura 2.2(a)) e invia sul bus dati del PC l’immagine in formato digitale. La trasformazione da segnale analogico a digitale (conversione A/D) è compiuta in due fasi: campionamento del segnale analogico ad una frequenza fissa, conversione della tensione del segnale negli istanti di campionamento in valori che vengono memorizzati all’interno dei pixel dell’immagine digitalizzata come da figura 2.2(b). Su TinoZoff sono state installate due schede di acquisizione diverse (una basata sul chip BT848 ed una Matrox Meteor). È apparsa subito evidente una grande differenza nella qualità dell’immagine acquisita a parità di telecamere. Questo problema ha inciso negativamente sulla calibrazione corretta del sistema di acquisizione. Cosı̀ su Capitolo 2. Elaborazione delle immagini 20 Galavrón si è deciso di installare due frame-grabbers dello stesso modello, AverMedia Ez-Capture, basati sul chip BrookTree BT878. 2.2 Strategia di elaborazione Il sistema di acquisizione delle immagini, di cui vediamo uno schema in figura 2.5(a), acquisisce contemporaneamente entrambe le immagini provenienti dalle due telecamere (figure 2.5(b) e 2.5(c)). Tuttavia viene elaborata solo quell’immagine che inquadra la palla. In pratica, all’avvio del programma il robot elaborerà l’immagine proveniente da una delle due telecamere. Se viene trovata la palla, allora l’immagine da elaborare nel ciclo successivo sarà ancora quella proveniente dalla stessa telecamera, altrimenti verrà eleborata l’altra. Questo meccanismo di switching delle immagini funziona anche quando la palla si trova nella zona in cui le inquadrature delle due telecamere si sovrappongono (figura 2.5(a)), garantendo cosı̀ al robot di poter avere sempre l’informazione sulla posizione della palla. Un punto critico di questa architettura risiede proprio nella presenza di una zona di sovrapposizione delle inquadrature. Per fare in modo che il robot abbia informazioni univoche sulla posizione della palla quando essa è all’interno di tale zona, bisogna calibrare con estrema precisione le tabelle di look-up. Tali tabelle restituiscono la posizione della palla sul piano di gioca a partire dalla posizione che essa ha all’interno dell’immagine acquisita. È chiaro pertanto che la procedura di elaborazione delle immagini deve poter restituire lo stesso dato di posizione sia che stia elaborando l’immagine di sinistra, sia quella di destra. Purtroppo questo presupposto non è sempre verificato in quanto la zona di sovrapposizione si trova al margine delle immagini, proprio là dove è maggiore la distorsione introdotta dalle ottiche. 2.3 Estrazione delle informazioni L’immagine acquisita è salvata in un buffer in memoria in formato RGB a 32 bit. Tale formato prevede quattro bytes per pixel, di cui solo i primi tre (relativi ai colori blu, verde e rosso) vengono utilizzati nell’elaborazione. L’obbiettivo dell’elaborazione è Capitolo 2. Elaborazione delle immagini Figura 2.4: Acquisizione di immagini tramite specchio sferico. 21 Capitolo 2. Elaborazione delle immagini Campo inquadrato dalla telecamera sinistra 22 Zona di sovrapposizione delle due immagini (~30°) 120° 111 000 000 111 000 111 000 111 000 111 000 111 Campo inquadrato dalla telecamera destra 120° (a) Schema del campo inquadrato corrispondente alle immagini qui sotto. (b) Campo inquadrato dalla telecamera sinistra. (c) Campo inquadrato dalla telecamera destra. Figura 2.5: Campo inquadrato dalle telecamere del robot. Capitolo 2. Elaborazione delle immagini 23 quello di estrarre dall’immagine l’informazione sulla posizione della palla. In ambito RoboCup la palla è di colore rosso per regolamento. In realtà il colore ufficiale è l’arancione, tuttavia si tratta di un arancione molto intenso che spesso tende a saturare verso il rosso. 2.3.1 Calcolo della posizione della palla L’elaborazione si compone di tre passaggi fondamentali: estrazione dei pixel giudicati di colore rosso, calcolo del loro baricentro nell’immagine, assegnazione di una posizione fisica sul campo al punto ottenuto nel passaggio precedente. Il primo passaggio è quello dell’estrazione dei pixel rossi. A tale scopo l’immagine viene scandita e ogni pixel viene confrontato con determinate soglie relative ai tre colori. In dettaglio, prima di affermare che un pixel è rosso vengono effettuati due confronti: eliminazione del bianco, soglia sul rosso. Non è sufficiente porre una soglia sul byte relativo al colore rosso per affermare che un pixel è rosso. Infatti anche un pixel bianco o ad esempio marrone presenterà una componente rossa molto elevata. L’eliminazione del bianco serve proprio ad eliminare quei pixel che, pur avendo una forte componente rossa, non sono rossi. Per fare questo, si marcano come “non rossi” tutti quei pixel per i quali Red (Green + Blue) < SOGLIA 1: Il secondo confronto avviene esclusivamente sulla componente rossa dei pixel che hanno superato il primo confronto. Sono considerati “rossi” tutti quei pixel per i quali Red > SOGLIA 2: Capitolo 2. Elaborazione delle immagini 24 Tabella di look-up Figura 2.6: Calcolo della posizione della palla. A questo punto viene calcolato il baricentro dei pixel rossi ottenendone le coordinate X e Y riferite all’immagine. Per passare da queste coordinate alle coordinate della palla sul campo (figura 2.6) si utilizzano due tabelle di look-up, una per ogni telecamera. Queste tabelle presentano quattro colonne ciascuna. Nelle prime due colonne sono elencate tutte le possibili diverse coordinate X-Y nell’immagine, mentre nelle ultime due le corrispondenti posizioni della palla sul terreno. Le tabelle vengono caricate in memoria all’avvio del programma, in modo che l’accesso sia il più rapido possibile. Per la generazione delle tabelle sono stati sviluppati programmi ad hoc che hanno richiesto la creazione di un modello del sistema ottico delle telecamere. Questi tools consentono anche di marcare determinati pixel come “esterni al campo di gioco”, in modo da limitare l’elaborazione al solo campo utile. Capitolo 3 Struttura software Non sempre si pone l’attenzione dovuta alle interazioni che avvengono nel mondo reale tra gli agenti in quanto entità fisiche dotate di massa, forma e dimensione. In questo capitolo si tratterà della organizzazione dei comportamenti del robot, analizzando i principi di progettazione di agenti autonomi[20], la collaborazione multi-agente, l’elaborazione dei dati provenienti dai sensori (la cosiddetta fusione sensoriale) finalizzata alla pianificazione di obbiettivi. In questo ambito talvolta la parola robot verrà usata in luogo della più corretta espressione agente robotico, cioè un agente che opera nel mondo reale. 3.1 Sistemi a behaviors 3.1.1 Agenti ed agenti autonomi In questo capitolo si parlerà di agenti autonomi e di comportamenti. Risulta opportuno definire una terminologia di base[20]: Agente. Entità in grado di percepire attraverso sensori e di agire tramite attuatori. Se si parla di agente intelligente, le azioni sono collegate alle percezioni razionalmente. Nel caso dei robot descritti in questa tesi si parla appunto di agenti intelligenti. 25 Capitolo 3. Struttura software 26 Agente robotico. Agente che opera nel mondo fisico. I sensori e gli attuatori di un agente robotico sono dispositivi che leggono l’ambiente esterno e influiscono su di esso. Agente deliberativo. Agente in grado di pianificare una sequenza di azioni da eseguire successivamente. Agente reattivo. Agente che reagisce agli stimoli esterni immediatamente, senza elaborare piani a lungo termine. Gli agenti robotici ricadono essenzialmente in questa categoria. Agente autonomo. Un agente autonomo ha come caratteristica il fatto che il controllo sulle azioni è svolto dall’agente stesso. Possono esservi vari livelli di autonomia, ad esempio un agente autonomo può prendere le proprie decisioni solo dopo aver comunicato con altri agenti. In questo caso si può parlare di coordinamento in un sistema multi-agente. In ambito RoboCup, considerando ogni robot della squadra come un agente autonomo, vi possono essere varie soluzioni di coordinamento. In particolare si è osservato che alcune squadre non adottano alcuna forma di coordinamento. I robot sono cosı̀ agenti con un grado totale di autonomia. Tuttavia l’aspetto negativo della mancanza di coordinamento è che spesso i robot si ostacolano a vicenda senza riuscire a raggiungere un obbiettivo comune. Azzurra Robot Team implementa un coordinamento che è il più sofisticato tra quelli visti finora, prevedendo che i robot in campo si scambino messaggi di posizione propria, della palla e di ruolo in modo da far emergere un comportamento complessivo di squadra funzionale al raggiungimento dell’obbiettivo e cioè del goal. L’agente robotico vede l’ambiente reale esterno secondo tre principali caratteristiche: Percezione. L’agente percepisce in tempo reale (o quasi, dal momento che si tratta di interazioni reali) il comportamento di quegli oggetti di cui non conosce forma, posizione e movimento. Capitolo 3. Struttura software 27 Comportamento. A seconda dei cambiamenti dinamici dell’ambiente circostante, l’agente individua il comportamento ritenuto migliore. In ambito RoboCup è a questo livello che entra in gioco il coordinamento con gli altri agenti presenti. Il comportamento (o behavior) è un programma che implementa le specifiche corrispondenti ad una determinata azione. Azione. Il controllo su oggetti dell’ambiente circostante presuppone una serie di problematiche nuove quando si pensi che le principali applicazioni robotiche realizzate finora prevedono la manipolazione di oggetti statici o con traiettorie prevedibili. L’esecuzione di un’azione consente all’agente di portarsi da uno stato iniziale ad uno stato finale definito dalle specifiche dell’azione stessa. Un piano d’azione è dunque composto da azioni che, se eseguite con successo, portano l’agente a raggiungere l’obbiettivo finale. La pianificazione delle azioni da svolgere è sempre possibile. Tuttavia si deve fare una importante distinzione tra condizioni ideali e mondo reale. In condizioni ideali si può trovare un piano di azione ottimale caratterizzato da: perfetta conoscenza dell’ambiente esterno, certezza sull’effetto delle proprie azioni. Nel mondo reale vi sono però problemi che limitano, e in taluni casi rendono impossibile, la ricerca di un piano di azione ottimo: incertezza sulla conoscenza dell’ambiente esterno, incertezza sull’effetto delle proprie azioni, incertezza sulle informazioni ricevute dai sensori. 3.1.2 Behaviors Per behavior si intende un insieme di processi che coinvolgono percezione ed azione. Un behavior è caratterizzato da una lista di precondizioni che ne determinano l’attivazione. Quando tali condizioni sono verificate, il behavior diventa attivo, mandando Capitolo 3. Struttura software 28 in esecuzione i propri processi[12]. Un sistema a behaviors (cioè a comportamenti), indipendentemente dal linguaggio di programmazione con cui lo si implementa, è in generale costituito da una architettura in cui sono contenuti i behaviors e da una serie di regole per la progettazione, l’attivazione e l’interazione dei behavior tra di loro e con l’ambiente esterno. La struttura software che si è realizzata è costituita da un insieme di agenti che cooperano tra di loro scambiandosi vari tipi di messaggi. Brooks[5], nel 1986, ha proposto una prima, innovativa, architettura a behavior, la subsumption architecture. Con essa Brooks assume che un compito complesso possa essere suddiviso in tanti behavior che vengono eseguiti parallelamente e che competono per il controllo esclusivo dell’agente. Le idee di Brooks applicate alla robotica non prevedono un tipo di intelligenza standard a bordo, come può essere un programma creato secondo regole rigide. Viceversa, il comportamento complessivo del robot è determinato dall’interazione e dalla cooperazione di tanti comportamenti elementari. Successivamente al lavoro di Brooks, sono state presentate soluzioni nuove e più flessibili riguardo all’attivazione dei vari behaviors. L’obbiettivo finale è comunque quello di far avere al robot comportamenti funzionali allo scopo per il quale è stato costruito mediante l’integrazione di percezione, decisione e movimento. In pratica, il robot dovrà muoversi secondo una logica che non è direttamente implementata in una particolare sezione di codice, ma che è viceversa il risultato dell’integrazione dei moduli di percezione, decisione e comunicazione con gli altri robot. Possiamo sintetizzare questa tecnica con il termine purposive vision, cioè l’integrazione di purposive action e visual perception. Uno schema ad alto livello comprende quattro tipi di agenti principali: Percezione, Decisione, Movimento e Comunicazione. Questi, cooperando tra di loro, formano quello che può essere definito come agente fisico. Ogni agente a sua volta si può considerare è costituito da un insieme di sub-agenti di più basso livello. Capitolo 3. Struttura software 29 3.1.3 ETHNOS Il sistema utilizzato per la gestione degli agenti è ETHNOS[18][19] (Expert Tribe in a Hybrid Network Operating System), realizzato presso l’Università di Genova. ETHNOS è un sistema basato sulle specifiche real time POSIX e fornisce le primitive per la creazione di agenti, per la loro schedulazione e la loro interoperabilità, fornendo un prefissato protocollo di comunicazione tra i processi. Gli agenti di ETHNOS sono chiamati esperti e sono quelli che in precedenza sono stati definiti come sub-agenti. In realtà non è detto che di per sè un esperto abbia tutte le caratteristiche per essere definito come un agente, e cioè autonomy, social ability, reactivity, pro-activeness. Ciò che conta è che un determinato insieme di esperti costituisca un agente con tutte le carte in regola per essere definito tale. Possiamo descrivere semplicemente un esperto come un programma che esegue ripetutamente una stessa porzione di codice, preposta a risolvere un compito specifico. ETHNOS permette la schedulazione di tre tipi di esperti: Esperti periodici. Eseguono il proprio compito secondo una scadenza temporale prefissata. Esperti sporadici. Eeguono il proprio compito in relazione al verificarsi di determinati eventi (ricezione di messaggi di attivazione). Esperti di background. Eseguono il proprio compito solo quando il processore non è occupato nell’esecuzione di esperti periodici o sporadici. Possono essere creati anche esperti di subscheduling, con il compito di schedulare esperti periodici o sporadici. La schedulazione avviene tramite il kernel, un programma che si interfaccia con lo scheduler di sistema gestendo le priorità degli esperti e le comunicazioni tra di loro. In ETHNOS gli esperti sono programmati in linguaggio C/C++. Il kernel riconosce come esperto un qualunque oggetto appartenente ad una classe derivata dalla classe ETEepert. Tale classe genitrice mette a disposizione tre funzioni (Init,Do your duty e Close), che devono essere definite all’interno del codice dell’esperto che si vuole creare. Capitolo 3. Struttura software 30 START Init Do your duty Close STOP Figura 3.1: Ethnos: il funzionamento di un esperto. Init(). Questa funzione comprende una parte di codice che il kernel eseguirà una volta sola, prima dell’attivazione dell’esperto. Do your duty(int wc). È il codice vero e proprio dell’esperto, cioè quello che viene eseguito ogni volta che il kernel cede il controllo all’esperto. Close(). È analoga ad Init(), cioè si tratta di una parte di codice che il kernel eseguirà una volta sola, dopo l’ultima esecuzione dell’esperto. Ogni esperto in ETHNOS è dunque organizzato secondo tre blocchi funzionali. Questi blocchi sono costituiti dalle procedure di inizializzazione (Init), di esecuzione (Do Your Duty) e di chiusura (Close), come riportato in figura 3.1. Condizioni di schedulabilità degli esperti. L’appartenenza di un esperto a uno dei tre tipi elencati (esperti periodici, sporadici o di background) è conseguenza dei parametri passati al costruttore della classe ETExpert e delle operazioni eseguite Capitolo 3. Struttura software 31 all’interno della funzione Init(). In particolare, per gli esperti periodici è necessario specificare nel costruttore il periodo di attivazione ed è questo parametro a determinarne la priorità sugli altri esperti in quanto più è breve il periodo di attivazione, maggiore è la priorità. Per gli esperti sporadici o di background si può impostare un livello di priorità prefissato. Il periodo di attivazione degli esperti periodici ne determina anche la schedulabilità o meno. Infatti ETHNOS è un sistema real time e deve perciò garantire la schedulabilità degli esperti. È il kernel ad occuparsi di questo compito svolgendo un test di schedulabilità secondo l’algoritmo Rate Monotonic. Questo algoritmo pone come condizione per la schedulabilità un fattore U di utilizzazione del processore n U = Ci ∑ Ti i=1 < 0:69 dove Ci è il tempo di esecuzione dell’esperto i-esimo e Ti è il periodo dell’esperto i-esimo. 3.1.4 Saphira Saphira[2] è un’architettura per il controllo dei robot mobili sviluppata da Kurt Konolige ed implementata con successo su numerosi robot, tra cui i robot commerciali Pioneer della ActivMedia[11]. Dal momento che sia TinoZoff che Galavrón sono nati a partire da un robot Pioneer 1 ActivMedia, è opportuno accennare anche a Saphira quale possibile sistema da utilizzare. Analogamente ad ETHNOS, il sistema Saphira è dotato di uno scheduler, il cosiddetto micro-tasking OS, un sistema operativo che si occupa di schedulare ciclicamente i task di controllo del robot e quelli definiti dall’utente. Più in dettaglio, Saphira è composta da due architetture distinte: la prima, detta architettura di sistema (fig.3.2), si occupa delle operazioni basilari per il controllo del robot. Nello specifico, a questo livello vengono inviati e ricevuti i pacchetti di comunicazione con il robot, viene aggiornata una copia dello stato interno del robot detta state reflector ed inoltre vengono eseguiti i micro-task definiti dall’utente. La seconda architettura, detta architettura di controllo (fig.3.3), consiste in una serie di micro-task Capitolo 3. Struttura software 32 Micro tasks dell’utente e attività Routines di controllo e applicazioni State reflector Routines asincrone definite dall’utente Pacchetti di comunicazione Micro-tasking OS sincrono Figura 3.2: Saphira: architettura di sistema. che implementano tutte le funzioni necessarie alla navigazione del robot. Questa seconda architettura si basa sui dati provenienti dallo state reflector. Con Saphira i task vengono programmati in linguaggio C/C++, mentre le attività sono programmate in Colbert, un linguaggio pseudo-C interpretato, assai semplice da imparare. 3.1.5 Confronto tra Saphira ed ETHNOS Un confronto in assoluto tra Saphira ed ETHNOS non è possibile in quanto, pur essendo entrambi sistemi ad agenti e potendo coesistere e scambiarsi messaggi nell’ambito di una architettura ad agenti distribuita, presentano ad una analisi più approfondita differenze sostanziali. In primo luogo la schedulazione dei processi è sostanzialmente differente essendo più rigida in ETHNOS, ma anche fornendo per questo prestazioni di gran lunga migliori rispetto a Saphira. Il controllo sulla schedulazione dei processi[19] è totale in ETHNOS. Questo punto si è rivelato cruciale nella scelta di ETHNOS quale sistema per la gestione degli agenti. Infatti, dal momento che risulta critico il tempo di risposta del robot ad un comando di movimento, ETHNOS garantisce su questo Capitolo 3. Struttura software 33 Linguaggio Colbert Routines di visualizzazione Global Map Routines di registrazione Local Perceptual Space Controllo fuzzy Controllo diretto del movimento Routines di gestione dei sensori State reflector Figura 3.3: Saphira: architettura di controllo. versante prestazioni migliori rispetto a Saphira. Viceversa, Saphira offre al programmatore la possibilità di utilizzare variabili fuzzy ed è dotata di tools di sviluppo e di controllo decisamente più user friendly. 3.2 Gli esperti del robot Gli esperti di Galavrón sono undici e si possono considerare appartenenti ad uno dei tre agenti seguenti: percezione, elaborazione ed azione. L’agente di percezione è descritto dalla funzione di transizione di stato: W ORLD STAT E (k) INT STAT E (k) ! PERCEPT (k) in cui: WORLD STATE(k) è lo stato dell’ambiente esterno in cui opera l’agente fisico, Capitolo 3. Struttura software 34 Esperto Funzione ETVision ET Localization ET Decision ET Pioneer ET FollowBall ET TurboBoost ET Intercept ET Line ET Parking ETCommunication ET Receive Acquisizione e elaborazione immagini Controllo posizione del robot Decisione sul movimento Comunicazioni con la scheda di controllo Posiziona il robot davanti alla palla Manda il robot incontro alla palla Manda il robot in copertura della porta Calibra l’odometria guardando le linee dell’area Riporta il robot all’interno dell’area Invia i messaggi agli altri robot Riceve i messaggi dagli altri robot Tabella 3.1: ETHNOS: gli esperti del robot. INT STATE(k) è lo stato interno dell’agente fisico, PERCEPT(k) è ciò che viene rilevato allo stato k. L’agente di azione è descritto dalla funzione: INT STAT E (k) ! WORLD STAT E (k + 1): L’agente di decisione è il collegamento tra l’agente di percezione e quello di azione. Esso presenta la seguente funzione di transizione di stato: REASONING(k) : PERCEPT (k) KNOW LEDGE BASE ! INT STAT E (k + 1) in cui KNOWLEDGE BASE rappresenta la base di conoscenze del sistema. Vediamo in dettaglio un esperto appartenente a ciascuno dei tre agenti sopra descritti. Capitolo 3. Struttura software 35 3.2.1 Copertura della porta ETDecision è l’esperto che decide dove far muovere il robot considerato lo stato interno del robot e le informazioni della visione. L’esperto di decisione riceve messaggi sulla posizione della palla dall’esperto di visione. Questi messaggi vengono elaborati alla luce della conoscenza del sistema e dello stato interno e viene presa la decisione. La decisione diviene operativa nel momento in cui viene prodotto un messaggio indirizzato all’esperto che deve compiere l’azione decisa e viene inviato al kernel. Si tratta di un esperto sporadico, in modo da essere perfettamente sincronizzato con l’esperto di visione. La “conoscenza del sistema” è costituita dalle strategie utilizzate per la navigazione e per il controllo delle azioni di gioco a seconda delle diverse situazioni che si vengono a creare. Lo stato del sistema in un determinato istante è costituito dall’insieme dei messaggi che vengono prodotti in quell’istante, dai messaggi che provengono dagli altri robot, dalle informazioni odometriche, dalle informazioni sulla palla e sulle linee e dallo stato precedente. Il codice che implementa l’esperto di decisione è organizzato a grandi linee secondo lo schema: - costruttore oggetto, - inizializzazione, - controlla se la palla è visibile, non visibile oppure è visibile ma non valida, - in base allo stato della palla prende una decisione. Sel la palla è visibile, l’esperto calcola la retta che congiunge la palla al centro della porta e decide di muoversi verso il punto di intersezione con la retta sulla quale si sta muovendo il robot (figura 3.4). Nel caso la palla sia troppo vicina al robot (entro circa 50cm), l’esperto di decisione si limita a far stare il robot davanti alla palla. 3.2.2 Riposizionamento Prima di introdurre il concetto di riposizionamento del robot e di come questo venga attuato, è importante sottolineare che il robot possiede costantemente determinate Capitolo 3. Struttura software Congiungente palla-centro porta 36 Movimento del robot in copertura Figura 3.4: Esperto di decisione: strategia di copertura della porta. informazioni sulla propria posizione in campo. In pratica, il robot è in grado di localizzarsi. Con il termine localizzazione si intende il processo che consente al robot di individuare ed aggiornare la propria posizione e la propria orientazione grazie ai dati provenienti dai sensori. Il processo di localizzazione può essere più o meno preciso, questo dipende dal metodo e anche dal tipo di sensori utilizzati. Volendo migliorare nella precisione è possibile utilizzare metodi di localizzazione sofisticati, oppure sensori più precisi. Entrambe le soluzioni presentano costi. In particolare, metodi più sofisticati presuppongono una maggior pesantezza computazionale che non sempre è compatibile con l’applicazione reale. Galavrón è in grado, sia pure con alcuni limiti, di autolocalizzarsi, cioè di compiere autonomamente il processo di localizzazione. Per riposizionamento del robot si intende una manovra al termine della quale il robot si riporta in una posizione predefinita e con una orientazione predefinita. La manovra di riposizionamento può anche prevedere una calibrazione dell’odometria del robot se questa si discosta troppo dalle informazioni che il robot ricava dai suoi sensori. L’odometria è quell’insieme di informazioni che consentono al robot di conoscere il cammino percorso sul terreno a partire da una posizione iniziale nota. Di fatto, gli odometri (composti da una parte hardware, gli encoder dei motori, e dal software di decodifica) sono sensori di posizione relativi. Essi cioè aggiornano costantemente la Capitolo 3. Struttura software 37 posizione rispetto a quella che il robot possedeva nello stato precedente. Nel caso del robot portiere il riposizionamento consiste nel far tornare il robot all’interno dell’area di porta, al centro, e con una orientazione parallela al fondo campo. Il robot, cioè, torna in quella che è la sua posizione iniziale. In una successiva sezione viene trattato più in dettaglio l’esperto di riposizionamento ed il suo diagramma di flusso. 3.2.3 Visione La visione consiste nell’acquisizione delle immagini dalle telecamere e dalla elaborazione per ottenere le informazioni volute. A questo scopo è preposto l’esperto di visione ETVision. Compito principale dell’esperto di visione è dunque quello di restituire la posizione della palla rispetto al robot a partire dalle immagini acquisite. La funzione Do Your Duty dell’esperto di visione contiene al suo interno le funzioni di acquisizione delle immagini, di filtraggio delle stesse alla ricerca dei pixel rossi (colore della palla) e di calcolo delle coordinate della palla. L’esperto di visione è un esperto periodico con un periodo di 100ms. Il codice che implementa l’esperto è organizzato a grandi linee secondo lo schema: - costruttore oggetto; - inizializzazione telecamere; - inizializzazione buffers (aree di memoria che contengono le immagini); - caricamento tabelle di look-up (servono per convertire le coordinate in pixel in centimetri sul sistema di riferimento solidale col robot); - acquisizione immagini; - ricerca palla; - calcolo posizione; - invio messaggio di localizzazione palla. Capitolo 3. Struttura software 38 Il sistema di riferimento scelto è un sistema ortogonale con l’asse delle ascisse disposto parallelamente alla porta con direzione positiva verso destra e con l’asse delle ordinate perpendicolare alla porta con direzione positiva verso centro-campo. 3.3 Interazione con il mondo 3.3.1 Controllo del movimento Il controllo del movimento viene svolto a basso livello dal sistema operativo della scheda di controllo (PSOS o KaOS). A più alto livello è l’esperto di decisione a inviare la maggior parte dei comandi di movimento in base alle decisioni prese. Vi sono tuttavia anche altri esperti che saltuariamente possono scavalcare l’esperto di decisione. Uno di questi è l’esperto ETTurboboost. Quando la palla si trova a fianco del robot, la strategia migliore è quella di far muovere il robot verso la palla il più velocemente possibile. L’esperto ETTurboboost ha proprio questo compito e viene attivato in condizioni d’emergenza quando evidentemente la strategia di copertura precedentemente illustrata ha fallito. Gli esperti che inviano comandi di movimento richiamano determinate funzioni in una classe messa a disposizione dall’esperto ETPioneer il quale si occupa della gestione del protocollo di comunicazione con la scheda di controllo tramite la porta seriale. 3.3.2 Strategia di attivazione del kicker L’esperto di decisione, sulla base dei messaggi di posizione della palla, decide se abilitare o meno il sistema di calcio (kicker). Se il robot non vede la palla, il kicker viene disabilitato in modo da evitare di attivarlo in caso di urti contro altri robot o contro i bordi del campo. Viceversa, nel caso in cui la palla rimanga ferma a pochi centimetri dal robot, l’esperto di decisione può forzare l’attivazione delle elettrovalvole per cercare comunque di spazzare la palla. Siccome il KaOS disabilita a sua volta il kicker se gli infrarossi rilevano un ostacolo, tale attivazione forzata da parte dell’esperto di decisione scavalca il KaOS e determina comunque un calcio. Capitolo 3. Struttura software 39 Y 11111111111 00000000000 00000000000 11111111111 00000000000 11111111111 90° 180° 0° X Fascia di posizione 270° Figura 3.5: Zona di corretta posizione del robot e sistema di riferimento adottato. 3.4 Esempio: l’esperto di riposizionamento Come anticipato, l’esperto di riposizionamento (ETParking) ha il compito di riposizionare il robot nell’area, in posizione centrale. Questo esperto viene familiarmente chiamato anche esperto di parcheggio in quanto la manovra che fa compiere al robot è assai simile a quella di una automobile che parcheggia. Viene attivato nei casi in cui il robot sia avanzato eccessivamente (addirittura fuori dall’area) o sia arretrato eccessivamente (addirittura all’interno della porta). Il riposizionamento avviene esclusivamente in base alle informazioni odometriche, per cui sorge la necessità di convalidarlo mediante la visione (esperto ETLine). L’esperto ETParking è un esperto sporadico e viene attivato nel momento in cui l’esperto di decisione produce il messaggio MSG PARKING. Il robot viene riposizionato facendogli compiere le seguenti manovre fondamentali: - ruota fino a formare un angolo di 45 gradi con la linea di porta (la rotazione avviene nel verso in cui è minore l’angolo da descrivere per raggiungere la posizione desiderata); - avanza o arretra fino a raggiungere la corretta posizione; - ruota in senso contrario rispetto alla prima rotazione, in modo da disporsi parallelamente alla linea di porta; Capitolo 3. Struttura software 40 - si dispone in posizione centrale rispetto alla porta; - attiva l’Esperto ETLine per convalidare la manovra di parcheggio mediante la visione. Nel caso in cui la palla risulti visibile mentre sta compiendo manovre di parking l’esperto di decisione può interrompere la manovra inviando all’esperto di parcheggio il messaggio di stop. L’esperto può essere modellato mediante un Automa a Stati Finiti (ASF), come mostra la figura 3.7. Ogni stato rappresenta una manovra del robot. In rosso sono evidenziati i passaggi di stato allorchè il robot vede la palla ed è costretto perciò ad interrompere la manovra di riposizionamento. Gli stati sono i seguenti: A: controlla che il robot sia nella fascia di tolleranza consentita lungo l’asse y. In caso positivo passa allo stato B, altrimenti allo stato H. B: controlla l’allineamento. Se il robot forma un angolo diverso da 0 gradi (5o di tolleranza) con la linea di porta, lo fa ruotare finché tale posizione viene raggiunta. In questo caso si passa allo stato H. H: ci si arriva da A se l’ordinata del robot non è nella fascia consentita (figura 3.5). Controlla se il robot si trova a destra o a sinistra del centro della porta. C: se il robot è a destra del centro della porta ruota di +45o . D: si muove verso sinistra finché non raggiunge la stessa y. E: se il robot è a sinistra del centro della porta ruota di 45o . F: si muove verso destra finché non raggiunge la stessa y. I: riposiziona il robot al centro della porta. L: attiva l’esperto ETLine, in modo che il robot si allinei con la riga bianca che delimita l’area. Da notare che lo stato L attiva l’esperto ETLine direttamente, scavalcando il meccanismo standard secondo il quale dovrebbe segnalare all’esperto di decisione la necessità di attivare l’esperto ETLine. Capitolo 3. Struttura software START 41 START Y nel range consentito? Sì STATO(k+1)=B START Orientaz. nel range consentito? No No Ruota il robot Orientaz. intorno a +45°? Sì No Ruota il robot Sì STATO(k+1)=H STATO(k+1)=I STATO(k+1)=D STOP STOP STOP (a) Stato A. (b) Stato B. START (c) Stato C. START Orientaz. intorno a +45°? No STATO(k+1)=C Sì START Orientaz. nel range consentito? No Orientaz. intorno a -45°? STATO(k+1)=B Sì Y nella zona corretta? No Muoviti a sinistra Sì No Sì X tra -100mm e +100mm? No Y nella zona corretta? Muove il robot Sì No STATO(k+1)=L STATO(k+1)=B STOP STOP STOP (e) Stato I. START (f) Stato F. START Sì X >=0? Muoviti a destra Sì STATO(k+1)=B (d) Stato D. STATO(k+1)=E STATO(k+1)=C No Orientaz. intorno a -45°? No Ruota il robot START Sì Attiva esperto ETLine STATO(k+1)=E STATO(k+1)=F STOP STOP (g) Stato H. STOP (h) Stato E. (i) Stato L. Figura 3.6: Esperto ETParking: analisi dei singoli stati. Figura 3.7: Esperto ETParking: diagramma degli stati. Robot entro la fascia di posizione Robot fuori dalla fascia di posizione B H Robot a destra della porta Robot entro la fascia di posizione Robot a sinistra della porta C Capitolo 3. Struttura software A Riposizionamento completato E L Angolo errato Robot allineato con la porta Angolo +45° D Angolo errato Angolo -45° F Robot centrato correttamente rispetto alla porta I 42 Capitolo 4 Il sistema di potenza 4.1 Alimentazione a batterie L’alimentazione tramite batterie è una componente critica della costruzione del robot. Attualmente vengono infatti utilizzate batterie al Pb-acido. Sono però disponibili anche batterie di diversi tipi. Vediamo di analizzare i pro e i contro delle più comuni batterie1 cominciando dai parametri che devono guidare nella scelta[9][13]. Anche se tutti i parametri seguenti sono importanti nella scelta del tipo di batterie da utilizzare in ambito robot mobili, è però chiaro che non tutti hanno lo stesso peso nella decisione finale. 4.1.1 Parametri da considerare Energia specifica (o densità di energia o capacità). Determinata dalla tensione della cella e dalla quantità di carica che può essere immagazzinata, E = qV . Questo parametro è solitamente valutato sulla base del peso o del volume della cella: Capacità teorica in peso = qV =massa (Watt hr=kg) Capacità teorica in volume = qV =volume (Watt hr=l ) 1 Le informazioni tecniche contenute in questa sezione sono state reperite nei siti internet di vari produttori, in particolare Varta (www.varta.com) e Duracell (www.duracell.com). Essenziali sono state anche le informazioni reperite nel newsgroup sci.chem.electrochem.battery. 43 Capitolo 4. Il sistema di potenza 44 I valori teorici sono raggiunti solo in parte, specialmente a causa del fatto che tali valori trascurano il rapporto peso / volume dei componenti inattivi. Più correttamente, la capacità è il prodotto della densità di energia per la massa della cella ed è riportata in Ah o mAh. Potenza specifica (o densità di potenza). Solitamente valutata in termini di massa della cella: Potenza specifica = E tempo=massa = qV =hr massa della cella (W =kg) Questo parametro è legato alla densità energetica dato un certo tasso di scarica e indica quanto rapidamente può essere scaricata la cella e quanta potenza viene generata. Una cella con un’alta densità energetica può fornire una tensione elevata e una riduzione di capacità con alti tassi di scarica e perciò avere una bassa densità di potenza. Potenziale della cella. Tensione operativa ai capi della cella e profilo di scarica[9]. In figura 4.1 sono disegnati i profili di scarica per alcuni tipi di celle. Essi indicano come varia il potenziale della cella durante la fase di scarica. Carica/scarica. Numero di cicli di carica/scarica che una cella può sopportare. Tasso di autoscarica. Indica quanto rapidamente la batteria perde potenziale quando viene lasciata carica e inutilizzata. Vita utile. Durata di vita della cella, espressa in anni, indipendentemente dal fatto che la batteria venga utilizzata o meno. Sicurezza. Situazioni di potenziali pericoli causati dal modo di impiego o da un errato utilizzo della batteria, tossicità dei materiali, reattività dei componenti, comportamento in corto circuito o in caso di danneggiamento del rivestimento. Ambiente ed ecologia. Queste considerazioni riguardano in primo luogo l’impiego di materiali non tossici per l’uomo e per l’ambiente e la possibilità di riciclaggio. Capitolo 4. Il sistema di potenza 45 Figura 4.1: Profili di scarica per diversi tipi di celle. Condizioni operative speciali. Vi sono batterie adatte per alte o basse temperature, batterie sigillate che possono essere utilizzate in qualunque posizione, batterie pressurizzate. Non è il caso dei robot mobili, tuttavia vi può essere necessità di garantire biocompatibilità. Costo. Anche se è stato lasciato per ultimo, non è certo un parametro trascurabile. Determinate tecnologie costruttive presentano a tutt’oggi un costo che le rende impraticabili, tuttavia siccome l’evoluzione in questo campo è abbastanza rapida (sulla scia della diffusione di apparati portatili come telefoni cellulari o laptop), è probabile che in un prossimo futuro questo parametro incida meno nella scelta. 4.1.2 Tipi di batterie Piombo-acido. È il tipo di batteria utilizzato. Queste batterie sono utilizzate principalmente dall’industria automobilistica. Ne esistono diversi tipi a seconda delle applicazioni. In generale le celle sono costituite da un catodo di PbO2 , un anodo Capitolo 4. Il sistema di potenza 46 di Pb e un elettrolita di acido solforico. Le due reazioni agli elettrodi sono: Pb + SO4 = PbSO4 PbO2 + 4H + + 2e + SO4 (sol ) + 2e = PbSO4 (sol ) Entrambi gli elettrodi si dissolvono nell’elettrolita durante la reazione di scarica. Durante il processo di carica avvengono le reazioni inverse, tuttavia una carica eccessivamente protratta (overcharge) porterà all’elettrolisi dell’acqua con la conseguente formazione di H2 gassoso (pericolosissimo!) al catodo. Le batterie al Pb-acido sigillate, in commercio dagli anni ’70, non richiedono il rabbocco periodico dell’elettrolita. Ciò si ottiene inserendo un ricombinante catalitico che produce acqua dall’idrogeno e dall’ossigeno che talvolta si formano durante il processo di carica. Le celle hanno un potenziale nominale di 2V, hanno un costo decisamente basso e hanno una elevata densità di potenza (necessaria all’avviamento dei motori a scoppio, può arrivare a 600 W/kg). Altro vantaggio è la facile reperibilità di diversi formati. Una batteria del robot costa intorno alle 50000 lire. Volendo aumentare l’energia immagazzinata a bordo del robot è sufficiente sostituire le batterie con altre. Un altro vantaggio delle batterie al Pb-acido è la loro bassa resistenza interna, che si traduce in una ottima capacità di fornire correnti di spunto. Possono sopportare alcune centinaia di cicli di carica/scarica (intorno a 500). Se però vengono scaricate completamente, tale limite si abbassa drasticamente. Tuttavia l’inconveniente principale che queste batterie comportano è il peso che in talune applicazioni può risultare eccessivo. Infatti la densità di energia di queste celle è tipicamente inferiore a 100 W hr/kg. Le batterie di TinoZoff pesano 1,7kg ciascuna. Nickel-Cadmio. Queste celle contengono un catodo composto di Ni(OH )2 , un catodo di cadmio e un elettrolita acquoso composto di KOH. La reazione complessiva nella cella è 2NiOOH + 2H2 O + Cd = 2Ni(OH )2 + Cd (OH )2 Capitolo 4. Il sistema di potenza Figura 4.2: Effetto memoria per le celle al Ni-Cd. 47 Capitolo 4. Il sistema di potenza 48 Le batterie composte da celle al Ni-Cd possono sopportare più di 1000 cicli di carica/scarica. Presentano gli stessi vantaggi delle batterie al Pb-acido, tranne per il fatto che hanno un costo lievemente superiore e la loro disponibilità è limitata ai formati commerciali AAA, AA, C, D e pochi altri. Una cella al Ni-Cd fornisce una tensione di 1,2V che rimane pressoché costante durante il processo di scarica. Questo è un problema nel momento in cui si vuole determinare il livello di carica. Altro problema è l’effetto memoria (fig.4.2) di cui questo tipo di batterie risente, cioè la progressiva riduzione nella capacità di immagazzinare energia qualora vengano ricaricate dopo cicli di scarica non completi. L’effetto memoria comporta l’impossibilità di utilizzare la carica residua di una cella a Ni-Cd se essa non viene completamente scaricata. Ciò è dovuto alla formazione di una superficie passiva agli elettrodi. Questa superficie si comporta da barriera a ulteriori reazioni chimiche nella cella. Nickel-Metalidrato. Nelle celle al NiMH l’anodo è un elettrodo composto da un metallo idrato che serve da sorgente solida di idrogeno che possa essere ossidato per formare protoni. La reazione all’anodo è: MH + OH = M + H2 O + e perciò la reazione completa della cella diventa: NiOOH + MH = Ni(OH )2 + M Gli anodi sono costituiti da metalli in grado di intrappolare idrogeno, ad esempio Pd. Tuttavia questi non sono utilizzati nelle celle al NiMH per svariate ragioni tra cui il costo del palladio. Gli anodi usati in questo tipo di celle sono allora leghe composte di diversi metalli come vanadio, titanio, zirconio, nickel, cromo, cobalto e ferro. Tali leghe si dividono in due classi: tipo AB5 come ad esempio la lega LaNi5 e tipo AB2 come ad esempio TiMn2 o ZrMn2 . Sono da preferire anodi formati da leghe di tipo AB5 poiché offrono una migliore resistenza alla corrosione. Le batterie al Nickel-Metalidrato conservano molti dei vantaggi dei Capitolo 4. Il sistema di potenza 49 quelle al Ni-Cd, in particolare un lungo ciclo di vita utile, mantenendosi superiori in quanto a densità di energia e di potenza. Lo svantaggio principale di queste batterie è il costo che va da 4 a 10 volte quello di una analoga batteria al Pb-acido. Litio e ioni di litio. Le batterie agli ioni di litio sono una tecnologia nuovissima essendo in commercio solo dalla metà degli anni ’90. Rispetto agli altri tipi di batterie fin qui presentati, quelle agli ioni di litio sono le più delicate in assoluto e vengono utilizzate in quelle applicazioni che richiedono alte densità di energia e dove il costo è un parametro trascurabile. Due batterie agli ioni di litio da 10,8V-4,5Ah sono state acquistate per il robot Galavrón. Il costo di una di queste batterie è circa sette volte quello di una equivalente batteria al Pb-acido. Le prime batterie al litio non ricaricabili sono state commercializzate intorno al 1970, tuttavia gli studi per ottenere batterie al litio ricaricabili sono proseguiti per oltre vent’anni a causa di problemi legati alla sicurezza. Il litio è il metallo più leggero, ha il potenziale elettrochimico più alto e fornisce il più elevato contenuto energetico. Le batterie ricaricabili che usano il litio come elettrodo sono perciò in grado di fornire sia una tensione elevata, che una eccellente densità energetica (grazie al minor peso). A causa però dell’intrinseca instabilità del litio metallico, in particolare durante il processo di carica, le batterie ricaricabili basate sul litio oggi in commercio fanno uso di ioni di litio ottenuti da composti quali il biossido di litio-cobalto (LiCoO2 ). Diversamente dalle batterie al litio (che possono anche esplodere), le batterie agli ioni di litio sono relativamente sicure. I vantaggi delle batterie agli ioni di litio sono sostanzialmente l’elevata densità di energia (100 W hr/kg), l’assenza di effetto memoria e il ciclo di vita che permette fino a 500800 cicli di carica/scarica. Gli svantaggi sono dovuti al costo e al rischio di danneggiamento dovuto all’overcharge o a corto circuiti. Alcaline non ricaricabili. Le batterie alcaline sono batterie primarie, cioè non ricaricabili2 . Le batterie alcaline concettualmente sono simili alle pile Leclanchè, 2 In commercio esistono anche batterie alcaline ricaricabili, tuttavia il loro brevissimo ciclo di vita (massimo 3050 cicli di carica/scarica) le rende impraticabili per l’impiego nei robot mobili. Capitolo 4. Il sistema di potenza 50 cioè Zinco-carbone, ma fanno uso di un elettrolita alcalino (KOH) più conduttivo, anziché acido come nelle celle Zinco-carbone. Questo abbassa la resistenza interna della cella e di conseguenza permette di ottenere tassi di scarica più elevati e maggiori densità di potenza. Questo tipo di celle solitamente ha un anodo di Zn sinterizzato e un catodo di MnO2 anch’esso sinterizzato a cui viene aggiunta polvere di grafite per aumentarne la conduttività. L’elettrolita è in gel con l’aggiunta di derivati della cellulosa. Le reazioni agli elettrodi in ambiente basico sono: Zn + 2OH = Zn(OH )2 + 2e 2MnO2 + H2 O + 2e = Mn2 O3 + 2OH Le batterie alcaline hanno densità di energia teorica paragonabile a quelle Zncarbone, cosı̀ come hanno lo stesso potenziale di cella (1,5V), ma forniscono valori di energia più alti sperimentalmente. Esse sono tuttavia più costose. In particolare bisogna considerare che non sono ricaricabili3 e quindi non sono proponibili in ambito robot mobili. Un tipo di cella alcalina molto interessante è quella a Zinco-aria in cui lo zinco è ossidato come prima, mentre al catodo si ha la seguente reazione: O2 + H2 O + 4e = 2OH La reazione complessiva della cella è dunque: 2Zn + O2 = 2ZnO Di fatto questa è un ibrido tra una batteria e una cella a combustibile in cui il combustibile (l’O2 presente nell’aria) è illimitato e non aggiunge peso alla cella. 3 Le batterie alcaline non ricaricabili possono essere “rigenerate” mettendole per alcune ore in un caricabatterie. Questo processo (che non è una ricarica vera e propria) può essere ripetuto due o tre volte al massimo. Esso restituisce alla batteria una durata che è circa il 2030% di quella iniziale[14]. Capitolo 4. Il sistema di potenza Densità di energia Whr kg) Pot. cella V = ( ) 40 38 60 2; 1 1; 2 NiMh 60 80 1; 2 Litio 300 3; 0 Ioni Li Alcaline non ric. Duracell Alcaline ricaricab. Zn-aria 110 140 3; 6 1; 5 80 1; 5 310 1; 4 Tipo Pb-acido Ni-Cd ( 51 Capacità mAh) ( 1 120Ah AA 800 C 1500 D 2500 AA 1200 C 2200 D 4000 C 5000 D 14000 1 4Ah AA 2800 C 7800 D 15000 Resist. interna Carica ( ) 0; 006 0; 009 scarica 500 più di 1000 0; 1 500 0; 3 800 0; 1 30 Tabella 4.1: Confronto delle caratteristiche di diversi tipi di batterie. Questo rende le celle a Zn-aria convenienti in quanto a densità di energia (si raggiungono valori anche di 900 W hr/kg). Anche se questo tipo di celle non è reversibile, tuttavia lo ZnO può essere rimosso dalle celle esaurite e sottoposto ad elettrolisi per riformare Zn metallico. 4.2 Più potenza Un problema che è emerso nel corso dello sviluppo del robot è che il tempo di risposta ad un comando di movimento deve essere quanto più rapido possibile. Risulta evidente la necessità di dotare il robot di un sistema hardware all’altezza delle prestazioni richieste. Capitolo 4. Il sistema di potenza 52 Figura 4.3: Velocità del robot con diversi carichi. Lo sforzo maggiore si è concentrato sui motori[7]. I motori del robot sono motori in corrente continua, a magneti permanenti, con spazzole e collettore, controllati in tensione d’armatura[6]. I robot Pioneer 1 ActivMedia[1] sono dotati di una scheda che comprende la parte di controllo dei motori e quella di potenza. L’integrato che invia la potenza ai motori è un L298N della ST. Il vantaggio di tale integrato è che è composto da due banchi indipendenti e quindi ne serve uno solo per controllare due motori in corrente continua. La scheda di controllo dei motori è però dimensionata per un Pioneer 1 il quale, stando al manuale, ha una massa di 7,7kg e un carico utile dichiarato di 4,5kg. Usando come base un Pioneer 1, sono stati aggiunti diversi componenti e la massa complessiva del robot ha superato i 25kg. È chiaro che questo incremento di massa ha causato notevoli problemi nella reattività del robot TinoZoff. Per avere un’indicazione quantitativa dei problemi di reattività sono stati fatti alcuni test. In fig.4.3 è rappresentato il risultato di uno di questi test. Al robot vengono Capitolo 4. Il sistema di potenza 53 impartiti due comandi distanziati di 4 secondi. Il primo comando viene dato all’istante zero ed è un comando di speed (1000)4 , cioè il programma ordina al robot di partire verso destra alla massima velocità. Dopo 4000 millisecondi viene dato un comando di speed ( 1000), per cui il robot deve invertire la direzione. Si è valutata la reazione del robot TinoZoff con diverse condizioni di carico. La condizione ideale è quella disegnata in rosso ed è stata ottenuta con il robot sollevato dal terreno: si tratta quindi di una condizione puramente teorica, che pone un limite alle prestazioni. Con il robot in configurazione da gara la curva della velocità è quella disegnata in rosa. Le curve blu e verde sono state ottenute con il robot sul campo, ma alleggerito di alcuni kg. In particolare la curva blu è stata ottenuta alleggerendo il robot di 2.9kg, mentre quella verde alleggerendo di 3.5kg. Risulta evidente che, in configurazione da gara, il robot raggiunge la velocità impostata dopo circa tre secondi. Questo è un tempo altissimo poiché significa che nella realtà non potrà mai arrivare a raggiungere una velocità di 1000mm=sec, infatti il robot portiere deve muoversi all’interno dell’area di porta, che è un rettangolo di 3 metri per 1. Ci siamo cosı̀ trovati ad avere un sottosistema di movimento diventato insufficiente. Inoltre va considerato che non è sempre possibile lavorare sul versante della riduzione della massa del robot. Infatti un robot “leggero” potrebbe trovarsi in difficoltà negli scontri con gli altri robot. La situazione a cui si era giunti non era però più sostenibile anche a causa del fatto che l’integrato L298N subiva forti sollecitazioni. Già prima della partenza per la RoboCup ’99 si sono manifestati malfunzionamenti di questo integrato. 4.2.1 La scheda di potenza Proprio a causa delle limitazioni imposte dall’integrato L298N, si è deciso di progettare una scheda che fosse in grado di fornire una maggiore potenza ai motori. L’L298N limita la corrente erogabile ad ogni motore a 2A. Ricercando tra gli integrati disponibili per sostituirlo, la scelta è caduta sull’LMD18200 della National Semiconductors. dettaglio, si assegna alla classe ETPioneer la velocità 1000, cioè 1000mm=sec, tramite il comando ETHNOS Topazia > SetSpeed (1000). 4 In Capitolo 4. Il sistema di potenza Tensione d’armatura Resistenza elettrica Induttanza Costante di coppia Gradiente tensione motore Corrente di stallo Rapporto di riduzione 54 Grandezza Valore E R L kT kE IS N 12V 0:83Ω 0:63 10 3H 18:22 10 3N m=A 18:24 10 3V s=rad 14:46A 19:7 : 1 Tabella 4.2: Parametri dei motori del robot. La caratteristica principale di questo integrato è quella di fornire fino a 3A di corrente in continua. Inoltre l’LMD18200 possiede una serie di protezioni e di controlli che ne rendono più facile l’utilizzo rispetto all’L298N quali un segnale di thermal flag e un input di brake. Infine, l’LMD18200 ha i diodi di ricircolo della corrente che sono integrati, mentre con l’L298N servono 4 diodi a recupero rapido per ogni motore. I motori dei Pioneer sono motori Pittman serie GM9034 e sono alimentati a 12 Volt, questo poiché l’alimentazione sui Pioneer è garantita da una sola batteria da 12V. I parametri principali dei motori sono riportati in tabella in quanto, nei datasheets forniti, la Pittman li riporta solo in once e pollici e non in grandezze SI. Siccome su Galavrón sono presenti due batterie da 12V in serie per garantire 24V all’alimentatore del PC, si è pensato di utilizzarli per alimentare a 24V anche i motori in modo da ottenere maggiore potenza, anche in base alle indicazioni di [6], che danno come parametri ottimali per questo tipo di robot una tensione di alimentazione E = 24V con una corrente massima Imax = 6:2A ed un rapporto di riduzione di 19:7 : 1. La scheda di potenza dei motori è stata pensata per ricevere in ingresso tensioni da 12 a 35V. Tuttavia, una volta collegati i 24V, si sono avuti problemi nella lettura degli encoder dei motori con conseguenti instabilità del controller. Per risolvere questo problema si è lavorato su due fronti. Innanzitutto è stata realizzata una scheda aggiuntiva di alimentazione dei motori. Tale scheda accetta in ingresso tensioni da 21 a 35V e restituisce in uscita 18V stabilizzati, con un assorbimento massimo di corrente di 5A. D’altra parte si è deciso Capitolo 4. Il sistema di potenza 55 Figura 4.4: Funzionamento degli encoders incrementali. di migliorare anche la gestione degli encoder, per lo meno campionando i segnali ad una frequenza maggiore di quella garantita dal PSOS. 4.2.2 Il KaOS Per il robot Galavrón è stato sviluppato in assembler5 anche un altro sistema operativo, detto KaOS (Karlo Operating System), che può essere scaricato sul microprocessore. Questo sistema operativo è nato per superare le limitazioni del PSOS in fase di campionamento dei segnali degli encoder6 . Il funzionamento del KaOS (vedi figura 4.5) si basa su tre routines principali attivate da tre segnali di interrupt. Due di questi (l’interrupt TOC 4 e l’interrupt TOC 5) sono temporizzati, mentre il terzo (l’interrupt dell’interfaccia di comunicazione seriale) si attiva ogniqualvolta il microprocessore riceve un carattere dal PC. I parametri del KaOS sono per la maggior parte fissati all’interno del codice assembler. Possono essere variati soltanto il revcount, l’acc e il parametro experim, che però ha un significato differente. Ponendo experim a 1 si attivano funzioni supplementari quali l’obstacle avoidance tramite i sensori infrarossi e l’ini5 Fondamentale per lo sviluppo del KaOS come di qualunque altra applicazione con il 68HC11 è il manuale di riferimento[16], presente sul sito www.mot-sps.com in formato PDF. Per assemblare il codice si è utilizzato l’assemblatore A6801 ed il linker XLINK, operanti in ambiente Windows. Sono stati realizzati anche alcuni tools di sviluppo ad hoc. 6 Gli encoder dei motori del robot sono del tipo incrementale a quadratura di fase (figura 4.4), a due canali (A e B), senza il canale I, e prevedono 100 impulsi per giro dell’albero motore[7]. I due canali possono presentare quattro diversi stati, per un totale di 400 stati per giro di albero motore. Siccome il motore ha un rapporto di riduzione di 19.7:1, per ogni giro di ruota vi sono 7880 diversi stati. La risoluzione degli encoder si calcola dividendo la circonferenza della ruota (che ha un diametro di 125mm) per 7880. Capitolo 4. Il sistema di potenza INTERRUPT TOC 4 Frequenza: 12500 Hz 56 Lettura degli encoder Impostazione delle PWM ai motori INTERRUPT TOC 5 Frequenza: 1250 Hz Controllo dei motori Analisi dei dati dei sensori Blocco motori di emergenza Visualizzazione sul display LCD Spedizione pacchetti di comun. Esecuzione dei comandi INTERRUPT SERIAL C.I. Attivo alla ricez. di un car. Ricezione dei pacchetti dal PC Figura 4.5: Schema di funzionamento del sistema operativo KaOS. Capitolo 4. Il sistema di potenza 57 bizione del kicker. Viceversa, ponendo a zero questo parametro, le informazioni dei sensori infrarossi vengono passate direttamente al PC. Il KaOS è nato esclusivamente con lo scopo di poter campionare i segnali degli encoder ad una frequenza maggiore rispetto a quella garantita dal PSOS (10kHz). Per ottenere questo risultato sono state sacrificate importanti funzioni che il PSOS offre, e cioè: nel KaOS manca la gestione dei sonar, della bussola, dei servomotori, del livello delle batterie e del cicalino. Inoltre il set dei comandi, pur mantenendosi fedele al protocollo di comunicazione del PSOS, è più ridotto e presenta comandi diversi sviluppati appositamente per Galavrón quali quelli dedicati al kicker. 4.2.3 Controllo dei motori Per una spiegazione dettagliata del controllo dei motori si rimanda a [6] per la parte del controllo hardware e a [7] per la parte del controllo proporzionale-integrativo. In questo paragrafo tratteremo brevemente di come generare a livello del microprocessore i segnali necessari al controllo. I motori vengono controllati dal microprocessore 68HC11 tramite i segnali di direzione e di velocità. Quest’ultimo è un segnale in formato a modulazione di ampiezza di impulso (PWM - Pulse Wave Modulation). La velocità di rotazione di un motore viene variata cambiando il duty cycle del segnale PWM in modo da fornire una tensione media all’armatura pari a quella desiderata. All’interno del KaOS, la routine che si occupa di variare il duty cycle della PWM è quella dell’interrupt TOC4[16]. Essa viene eseguita ad una frequenza di 12500Hz, per cui trascorrono 80µs tra un’esecuzione e la successiva. Siccome la versione del 68HC11 utilizzata (la F1[15]) non prevede direttamente alcuna uscita PWM, è compito del programmatore occuparsi di ottenerle. Dunque il KaOS utilizza gli interrupt TOC1 e TOC2 come monostabili variandone la durata di attivazione tra un minimo di 5µs7 ed un massimo di 80µs (massima velocità), che corrisponde non più ad una PWM, ma ad un segnale continuo. Questi due interrupt agiscono su due pin di output del 7 Il limite minimo è necessario in quanto gli integrati di potenza non vengono attivati da impulsi troppo brevi. Nel caso dell’LMD18200 l’impulso minimo è di 1µs, mentre per l’L298N è di 3µs. Capitolo 4. Il sistema di potenza 58 V PWM del 25% 1111 0000 0000 1111 0000 1111 0000 1111 0 V 11111 00000 00000 11111 00000 11111 00000 11111 40 80 11111111 00000000 00000000 11111111 00000000 11111111 00000000 11111111 11111111 00000000 120 111111111 000000000 000000000 111111111 000000000 111111111 111111111 000000000 111111111 000000000 PWM del 50% 0 V media ai motori 40 80 160 µs 160 µs V media ai motori 120 Periodo: 80µs Figura 4.6: Potenza ai motori: modulazione ad ampiezza di impulso (PWM). 68HC11[15]. Volendo spegnere i motori è sufficiente disattivare gli interrupt TOC1 e TOC2. La routine assembler di controllo dei segnali PWM dei motori è, come detto, contenuta all’interno della routine dell’interrupt TOC4. Viene riportata qui di seguito senza ulteriori commenti8. Per approfondimenti si faccia riferimento a [16] e [15]. 8 Con LDX #Registers LDD Word_PWM_cycl_ant BEQ TOC4_Int_b ADDD TCNT,X STD TOC1,X BCLR OC1D,X,#B7 BSET CFORC,X,#B7 BSET OC1D,X,#B7 il 68HC11 vi sono diversi modi per ottenere un’onda PWM. Essi dipendono anche dal tipo di hardware intorno al processore. Una soluzione diversa è illustrata in [9]. Capitolo 4. Il sistema di potenza Pin n.ro 35 36 27 26 59 61 63 65 59 Nome PA7/TOC1 PA6/TOC2 PG0 PG1 PE0 PE1 PE2 PE3 Funzione PWM motore anteriore PWM motore posteriore Direzione motore anteriore Direzione motore posteriore Encoder A motore anteriore Encoder B motore anteriore Encoder A motore posteriore Encoder B motore posteriore Tabella 4.3: 68HC11F1: pins utilizzati nel controllo dei motori. TOC4_Int_b TOC4_Int_a LDD Word_PWM_cycl_post BEQ TOC4_Int_a ADDD TCNT,X STD TOC2,X BCLR TCTL1,X,#B6 BSET CFORC,X,#B6 BSET TCTL1,X,#B6 BSET OC1D,X,#B7 4.2.4 Sviluppi futuri del KaOS Futuri sviluppi del KaOS prevedono la gestione dei sensori del kicker come bumpers, lo sviluppo di un protocollo più efficiente in modo da superare la limitazione della velocità della linea seriale e l’introduzione di nuovi comandi come ad esempio la possibilità di variare il parametro di accelerazione in run time. Capitolo 5 Sviluppi futuri e conclusioni Essenziale allo sviluppo del robot è la sperimentazione di nuove metodologie. Sperimentare significa anche rimettere in discussione i risultati raggiunti per confrontarli con le nuove idee. In questo capitolo sono presentati anche i risultati ottenuti, in termini sportivi, da Azzurra Robot Team. 5.1 Sviluppi futuri 5.1.1 Algoritmi genetici Fra le nuove strategie di controllo del robot, assai interessante si è rivelata una basata su algoritmi genetici[3]. Sul robot TinoZoff è stata implementata anche una strategia di movimento basata su di un algoritmo genetico la cui evoluzione è stata portata a termine su di un simulatore. Al robot simulato venivano effettuati vari tiri in porta e l’evoluzione dell’algoritmo veniva guidata dall’efficienza del robot nel parare questi tiri. Risultati incoraggianti si sono avuti al momento del passaggio dal simulatore al robot reale. 5.1.2 Nuovi sensori Nell’analisi dei sensori (di qualunque sensore) bisogna considerare due parametri: sensibilità e campo d’azione. La sensibilità di un sensore indica di quanto varia il segnale 60 Capitolo 5. Sviluppi futuri e conclusioni 61 di uscita del sensore al variare della grandezza misurata. Indicando con V l’uscita del sensore (tipicamente in Volt) e con x la grandezza fisica misurata, la sensibilità S del sensore è definita da ∆V V =S ∆x : x Il campo d’azione, altresı̀ detto anche portata, indica la massima distanza utile alla quale il sensore percepisce. Sulla base di quanto detto, si vede che un sensore è essenzialmente un sistema che converte una grandezza in un’altra, più facilmente misurabile dal processore del robot. I sensori possono essere suddivisi in due categorie: analogici e digitali. Un sensore analogico fornisce in uscita un segnale a tensione variabile secondo la legge vista prima. Non necessariamente la variazione della grandezza da misuarare ha un andamento lineare, ma può essere anche del tipo logaritmico o esponenziale. Di questo ne va tenuto conto al momento di progettare il sensore. Il 68HC11F1 installato a bordo del robot è dotato di quattro porte a cui si possono collegare direttamente segnali analogici variabili tra 0 e 5V. Per non interferire con la misura, il carico su queste porte deve avere una certa impedenza (dell’ordine dei 510kΩ). In ogni caso, per le specifiche di collegamento al microprocessore e per le modalità di lettura dei dati si vedano [16] e [15]. Un sensore digitale fornisce in uscita un segnale che può assumere solo due livelli logici, zero e uno, ai quali corrispondono due diversi livelli di tensione, di solito 0 e 5V. Un sensore analogico può essere usato come digitale ponendo una soglia. Di fatto i sensori a raggi infrarossi presenti sul robot sono proprio di questo tipo in quanto il ricevitore rende disponibile in uscita un segnale la cui corrente è proporzionale all’intensità del segnale ricevuto. L’interfacciamento di sensori digitali al micro è relativamente semplice, potendosi fare direttamente ai pin di input/output, oppure tramite un integrato che svolga le funzioni di buffer. In base all’ambiente nel quale si muove il robot, potrebbe essere interessante implementare sensori di pressione realizzati con microswitches o veri e propri sensori di pressione utilizzando i materiali conduttivi forniti come protezione dei circuiti integrati durante il trasporto[8]. Capitolo 5. Sviluppi futuri e conclusioni 62 Figura 5.1: RoboCup ’98. 5.2 Risultati delle competizioni In questa sezione si è voluto fare un breve bilancio delle competizioni alle quali hanno partecipato i robot dell’Università di Parma nell’ambito del progetto RoboCup Italia. 5.2.1 Parigi ’98 La partecipazione alla RoboCup ’98 a Parigi è stata preceduta dalla “Scuola di progettazione per robot calciatori”, uno stage di due settimane tenutosi a Padova. Lı̀ è nato il robot TinoZoff. A Padova le università partecipanti al progetto RoboCup Italia[17] si sono organizzate per formare la squadra italiana di robot calciatori. Tutti i robot della squadra, ad eccezione di un robot del Politecnico di Milano, sono stati costruiti partendo da robot commerciali Pioneer 1 ActivMedia[1]. In particolare, il portiere è stato fornito dall’Università di Brescia, allora facente parte del progetto. La caratteristica più importante del robot portiere di Brescia (chiamato Saracinescu) era l’interessante sistema di visione omnidirezionale che sfruttava uno specchio sferico. Questo sistema Capitolo 5. Sviluppi futuri e conclusioni 63 Figura 5.2: Tabellone della RoboCup ’98. garantisce al robot di avere una visione completa dell’ambiente circostante potendo inquadrare contemporaneamente la porta e la palla. Volendo sviluppare qualcosa di diverso, su TinoZoff si è deciso di installare un sistema di visione con due telecamere dotate di ottiche ad ampio angolo di apertura. Prima della scelta definitiva del sistema di visione, si è voluto sperimentare su Romolo il sistema di visione omnidirezionale. Il brevissimo tempo a disposizione per il montaggio ed i test del robot, unito a inevitabili problemi meccanici in fase costruttiva, non hanno permesso di presentare in campo TinoZoff per le gare della RoboCup ’98. Tuttavia l’esperienza parigina si è rivelata utilissima nel prosieguo del lavoro su TinoZoff e sugli altri robot della squadra. Infatti si sono viste le svariate soluzioni presentate dalle squadre partecipanti ed è stato possibile trarre spunti molto interessanti. Inoltre anche dal punto di vista sportivo la RoboCup ’98 è stata positiva per la spedizione italiana, avendo terminato ai quarti di finale dopo aver superato le tre partite di qualificazione senza subire reti. Capitolo 5. Sviluppi futuri e conclusioni Figura 5.3: RoboCup ’99. Figura 5.4: Tabellone della RoboCup ’99. 64 Capitolo 5. Sviluppi futuri e conclusioni 65 Figura 5.5: EuRoboCup 2000. 5.2.2 Stoccolma ’99 Anche per la partecipazione alla Robocup ’99 si è svolto uno stage di preparazione tenutosi a Roma nell’ambito della “Scuola di progettazione dei robot calciatori” seguito da vari incontri a Padova presso il consorzio Padova Ricerche. TinoZoff è stato designato quale portiere titolare ed è stato l’unico robot della squadra ad aver disputato per intero tutte e nove le partite della manifestazione. Il risultato finale della RoboCup ’99 è stato quanto mai lusinghiero dal momento che la squadra ART si è piazzata al secondo posto dopo aver sconfitto nelle eliminatorie gli americani dell’USC Dreamteam (campioni RoboCup ’97), gli iraniani dell’Università di Teheran (che poi diventeranno campioni) e, soprattutto, i tedeschi dell’Università di Friburgo, autentici dominatori della RoboCup ’98, in una semifinale entusiasmante. TinoZoff ha subito complessivamente cinque reti, di cui tre nella finale anche a causa di un problema ai motori e ha contribuito in maniera fondamentale al raggiungimento dell’ottimo risultato di squadra. 5.2.3 Amsterdam 2000 Al primo campionato europeo di calcio per robot erano presenti (per la categoria middle size) nove squadre europee più la squadra dell’Università di Teheran, invitata in Capitolo 5. Sviluppi futuri e conclusioni 66 qualità di campione del mondo in carica. Proprio la squadra iraniana e Azzurra Robot Team, all’inizio viste come favorite, si sono incontrate nella finale. Cosı̀ come a Stoccolma, anche ad Amsterdam a vincere è stata la squadra iraniana. Tuttavia i robot italiani, tra cui Galavrón, hanno mostrato maggiori doti scientifiche, evidenziando un gioco di squadra che, a livello di calcio per robot, comporta un coordinamento di behaviors distribuiti sui vari robot. Su sette partite disputate, ART ne ha vinte cinque, una pareggiata e una (la finale) persa, subendo complessivamente tre reti e segnandone quattordici. Appendice A Manuale d’uso del robot A.1 Batterie L’intero set di batterie di Galavrón è composto da 8 batterie piombo-acido da 12V-4Ah. Tali batterie devono essere caricate a tensione costante e con un limite di corrente. Vanno usate sul robot al massimo della carica. La tensione massima a vuoto è di circa 13V. Prima di iniziare la carica, è opportuno segnare sul registro la tensione della batteria e l’operazione “CARICA”. Quando finisce la carica, bisogna di nuovo segnare sul registro il numero della batteria, la sua tensione a vuoto e l’indicazione “FINE CARICA”. Batterie agli ioni di litio. Recentemente sono state acquistate anche due batterie agli ioni di litio da 10,8V-4,5Ah. Queste batterie, che sono batterie standard per laptop, presentano un enorme vantaggio in termini di peso rispetto a quelle al Pb-acido. Esse pesano infatti 430g l’una rispetto ai 1700g di una batteria al Pb-acido. A.1.1 Carica delle batterie con il caricabatterie I caricabatterie in dotazione sono due. Sono marchiati Parma e Parma2. Forniscono in uscita una tensione a vuoto di circa 14V e sono limitati in corrente a 500mA. Vanno collegati prima alla presa della corrente (230V) e poi alla batteria da caricare tramite 67 Appendice A. Manuale d’uso del robot 68 gli appositi connettori faston (rosso con rosso e nero con nero). Il led sul caricabatteria è l’indicatore di carica e si spegne quando la tensione raggiunge i 13,6V circa. Usando un cavo che metta in parallelo due batterie, è possibile caricarne anche due contemporaneamente con un solo caricabatterie. Si deve verificare che le due batterie abbiano all’incirca la stessa tensione a vuoto. La tensione delle batterie dopo la carica è di circa 13,5V e si stabilizza intorno ai 13,1V dopo circa 30 minuti. Se si può, è opportuno attendere questo tempo prima di utilizzarle, ciò per prolungare la vita delle batterie. I tempi di carica sono di 58 ore con una sola batteria collegata al carica- batterie. Se si collegano due batterie contemporaneamente, i tempi di carica possono anche raddoppiare. A.1.2 Carica con alimentatore da banco Si imposta la tensione in uscita dall’alimentatore a 13,8V e il limite di corrente tra 400 e 600mA. Si collega la batteria (rosso con rosso e nero con nero) e si accende il circuito. La batteria è carica quando assorbe meno di 1520 mA. Anche in questo caso vale il discorso che si possono caricare più batterie contemporaneamente. Aumentando però il limite di corrente complessivo, il tempo di carica non aumenta. Il limite di corrente dovrebbe essere sempre compreso tra il 10 ed il 15% della corrente nominale in Ah. È possibile caricare una batteria anche con un limite di corrente più alto. In tal modo si abbrevia il tempo di carica, ma la batteria sopporterà un numero inferiore di cicli di carica/scarica. Superbatteria (12V-12Ah) per il circuito pneumatico. Con i mezzi a disposizione, l’unico modo per caricarla è quello di usare l’alimentatore da banco. Si imposta come di consueto la tensione a 13,8V e si limita la corrente tra 1200 e 1500 mA. La carica si ottiene quando la batteria assorbe circa 80100 mA. La superbatteria rimane carica anche dopo parecchie decine di cicli di gonfiaggio della bombola. Volendo, è possibile utilizzare anche una batteria di quelle da 4Ah, tuttavia, poiché l’assorbimento richiesto dal compressore è di circa 3 Ampere, è preferibile non usare inutilmente le batterie del robot. Appendice A. Manuale d’uso del robot 69 A.2 Circuito pneumatico per il kicker La carica massima della bombola è di 9 bar (kg=cm2 ). Il limite da non superare in nessun caso è di 10 bar. Infatti il circuito a valle della bombola (raccordi, elettrovalvole e pistoni) è garantito per una pressione massima di 10 bar. Inoltre si deve considerare che, già a 9 bar, un calcio del robot fa scendere la pressione di circa 0,5 bar. Oltre questo limite si avrebbe quindi un guadagno trascurabile di potenza di calcio in quanto più la pressione è alta, più la bombola si scarica rapidamente. La carica avviene collegando il compressore alla valvola della bombola. A sua volta il compressore va alimentato con la superbatteria tramite la presa accendisigari. Questa presa ha due connettori faston, uno nero ed uno blu. Il nero va col nero della batteria ed il blu con il rosso. Il tempo di carica, partendo dalla bombola vuota ed arrivando a 9 bar, è di circa 2’30”. Durante questa fase bisogna prestare la massima attenzione a non surriscaldare il compressore. Se si può, è opportuno caricare la bombola fino alla pressione desiderata, lasciarla riposare e poi effettuare un “rabbocco”. Infatti, dal momento che l’aria in pressione si surriscalda, attendendo qualche secondo è possibile far stare più aria nella bombola. Svuotamento della bombola. Quando il robot viene spento, il circuito DEVE essere vuotato. Tale operazione si effettua inserendo la punta di un cacciavite nella valvola della bombola per consentire la fuoriuscita dell’aria. A.3 Alimentazione del robot Il robot può essere alimentato con due batterie da 12V-4Ah, tramite un alimentatore standard AT per personal computer, oppure tramite l’alimentatore da banco. A.3.1 Alimentazione da batterie Per le gare, oppure per le prove dei motori, il robot deve essere alimentato tramite batterie. Si devono collegare le batterie ai connettori faston che escono dagli alloggiamenti laterali alla base del robot. Le due batterie sono poi da collocare all’interno Appendice A. Manuale d’uso del robot 70 dei rispettivi alloggiamenti facendo attenzione a lasciare i faston verso l’esterno. Può essere utilizzata anche una terza batteria, da collocarsi sopra al robot. Questa configurazione comporta un maggior peso del robot, tuttavia ha il vantaggio di separare l’alimentazione del PC da quella dei motori. A.3.2 Alimentazione con alimentatore PC Un normale alimentatore standard AT può essere usato quando si intende lavorare sul robot per lunghi periodi, oppure ogniqualvolta si intenda risparmiare le batterie. L’alimentatore in dotazione è stato modificato per permettere un collegamento rapido e sicuro alla motherboard del robot. Si deve collegare il connettore a 15 terminali maschio dell’alimentatore con il connettore a 15 terminali femmina presente sul robot. Questo connettore alimenta la motherboard e l’hard disk. Inoltre si deve collegare un connettore a 4 terminali femmina dell’alimentatore con il connettore a 4 terminali maschio che va alle telecamere. A.3.3 Alimentazione con alimentatore da banco Il robot può essere alimentato anche tramite l’alimentatore da banco utilizzando la presa posta sul tetto in plexiglass. L’alimentatore deve essere posto in modo di funzio- namento PARALLEL, con una tensione di 2427V ed un limite in corrente di almeno 3A. Qualora si desiderasse utilizzare anche la scheda motori, bisogna collegare al robot anche due batterie e regolare l’alimentatore a circa 27V. In questa configurazione le batterie rimangono in “tampone”, cioè sono costantemente sotto carica, ma sono pronte a fornire la necessaria corrente di spunto richiesta dai motori. Senza le due batterie, l’alimentatore andrebbe in limitazione di corrente abbassando la tensione fornita e facendo fatalmente spegnere il PC. A.4 Scheda di controllo La scheda di controllo si occupa del movimento del robot tramite la lettura degli encoder dei motori, nonché dei sensori. Essa comunica con il PC tramite un collegamento Appendice A. Manuale d’uso del robot 71 seriale RS232. È dotata di un microprocessore Motorola MC68HC11F1[16] e di una flash eprom da 32Kbytes del tipo AT29C256 che contiene un piccolo sistema operativo detto PSOS (Pioneer Server Operating System), giunto alla versione 4.9. In considerazione del fatto che un ciclo di lettura/scrittura in memoria del microprocessore è di circa 140ns (con una frequenza di clock interno pari a 4MHz), se si intende sostituire la flash eprom si deve utilizzare un modello con un tempo di accesso pari a 120ns o inferiore. A.4.1 Collegamenti elettrici I collegamenti necessari al funzionamento della scheda di controllo sono essenzialmente il connettore di alimentazione, gli encoder dei motori, la porta seriale e i connettori di I/O. A.4.2 Aggiornamento del PSOS Il PSOS è residente nella EPROM della scheda di controllo e può essere aggiornato o sostituito con il KaOS sfruttando il programma psosdl1. Innanzitutto occorre mettere la scheda di controllo in boot mode premendo il tasto nero in basso a destra. Tenendo premuto il tasto nero si deve premere il tasto rosso a fianco (reset) e poi rilasciare prima il tasto rosso e poi il nero. Con questa operazione il 68HC11 viene messo in modalità di bootstrap[16] in quanto i pin 2 e 3 del micro, normalmente alti, vengono portati a zero e poi si effettua un reset. A questo punto si può lanciare il programma con la sintassi ./psosdl -b bootload.s19 nomefile.s19 A.4.3 Parametri del PSOS Essenziali al funzionamento del robot sono i parametri del PSOS[1]. Si tratta di una serie di valori che vengono scritti nella memoria non volatile del microprocessore e che 1 Si trova nella directory /backup/home/portiere/ETHNOS/ETPioneer/Psos49. Appendice A. Manuale d’uso del robot Parametro revcount motor experim baud stallmax stallwait acc pparam dparam iparam Max. 65535 1 1 1 32767 127 127 20 60 20 72 Min. 0 0 0 0 0 0 2 5 20 0 Default 32000 1 0 0 16384 4 4 10 45 10 Galavrón 35100 1 1 0 32767 4 8 20 20 20 Tabella A.1: Parametri del PSOS. servono ad interpretare correttamente i dati degli encoder, le impostazioni del controllo PID del robot e le impostazioni di velocità e di accelerazione2 . I parametri utilizzati dal robot sono visualizzati nella tabella A.1. Per modificare i parametri si deve usare il programma psoscf senza ulteriori comandi. Si veda il [1] per approfondimenti. A.5 Collegamento al robot L’accesso al PC del robot è possibile in due modi diversi: collegandosi direttamente tramite tastiera, mouse e video, oppure collegandosi via rete tramite la WaveLan. A.5.1 Collegamento diretto Per collegarsi direttamente al robot bisogna connettere una tastiera, un mouse (sulla porta PS/2 oppure COM2 poiché la COM1 è utilizzata dalla scheda dei motori) ed un video VGA. Se il robot è lontano dalla postazione di lavoro si può usare la prolunga 2 Se si utilizza il sistema operativo KaOS, il parametro experim si riferisce all’utilizzo dei sensori a raggi infrarossi. Appendice A. Manuale d’uso del robot 73 (circa 5 metri) per i tre dispositivi. Al login si può accedere come superutente (login: root), oppure come utente normale (login: bernaca password: bernaca). Si consiglia di accedere come root, passando successivamente all’utente normale se si utilizza ETHNOS. Digitando startx parte l’ambiente grafico KDE (versione 1.1.2). Prima di spegnere il robot si deve uscire dall’ambiente grafico seguendo le voci Fine Sessione/Esci da KDE. Una volta tornati in modalità testo si deve digitare halt avendo i diritti di root. Quando appare la scritta System halted, allora è possibile spegnere il robot. Questa procedura, sebbene non obbligatoria, è tuttavia caldamente consigliata poiché spegnendo correttamente il PC si evita il check del disco al successivo riavvio. A.5.2 Collegamento tramite rete Il collegamento tramite rete è il sistema che si utilizza di solito, anche perché è l’unico possibile in gara. Dal computer remoto si accede a Galavrón tramite rlogin. Ovviamente deve essere predisposto il collegamento installando la WaveLan sul computer remoto oppure utilizzando un router. L’indirizzo IP di Galavrón è 192.168.100.51. In questo caso non è possibile accedere a Galavrón come root, ma si deve usare l’utente bernaca. Per eventuali modifiche a queste impostazioni, si rimanda alla letteratura su Linux, come ad esempio [4]. È opportuno avviare il programma di Galavrón come utente e non come superutente. Infatti il sistema ETHNOS si impossessa di tutte le risorse del robot e, se si pianta, non c’è altro da fare se non spegnere il robot. Se invece il programma viene lanciato da utente normale, allora ETHNOS non ha accesso a tutte le risorse. Se si pianta in questo caso si ottiene un segmentation fault, però si riesce a riavviare il programma senza dover spegnere e riaccendere il robot. Appendice A. Manuale d’uso del robot 74 A.6 Programmazione Il programma del robot è scritto in linguaggio C/C++. A.6.1 Avvio del programma Come spiegato in precedenza, il programma del robot viene avviato solitamente come utente normale. Per comodità è stato creato un link al programma nella directory /home/bernaca in quanto è la directory in cui si entra collegandosi come utente normale. La procedura di avvio è semplice. Il programma si lancia digitando il seguente comando: ./tino [portnum] dove portnum è il numero della porta di comunicazione per lo scambio dei messaggi e può andare da 1200 fino a 1900. Di solito per convenzione si usa la porta numero 1800. Si noti la presenza del punto e dello slash prima del nome del programma. Siccome su Galavrón è installata la distribuzione Mandrake 7.0 di Linux, il punto e lo slash sono richiesti per avviare eseguibili in directory non comprese nel PATH. In gara si usa lanciare uno script che tiene sotto controllo l’esecuzione del programma e lo riavvia in caso di segmentation fault. La procedura è la seguente: ./ripeti tino 1800 dove 1800 è il numero della porta. A.6.2 Modifica e procedure di compilazione Il programma può essere modificato solo come utente root. Appendice B Schema del robot Galavrón è composto dai seguenti sottosistemi: Sistema di alimentazione. L’alimentatore di bordo è un alimentatore per PC con lo standard AT. Accetta in ingresso tensioni variabili tra 18 e 36 V e fornisce le necessarie tensioni alla motherboard, alle telecamere e alla scheda di controllo. All’alimentatore sono collegate due batterie in serie per una tensione di ingresso di 24 V. Computer di bordo. Il PC a bordo del robot è composto da un processore Intel Celeron a 466 MHz e la dotazione di memoria RAM prevede 128 Mb. La RAM è del tipo a 133 MHz, tuttavia il Celeron la gestisce a 66 MHz. L’hard disk è un hard disk da computer portatile da 6 Gb su cui è stato installato il sistema operativo Linux Mandrake 7.0 (kernel 2.2.14) grazie al quale “gira” il sistema ETHNOS[18]. Il peso dell’hard disk è di 90 grammi, l’assorbimento di corrente è circa un quinto di quello di un hard disk normale ed inoltre è garantita una eccezionale resistenza agli urti. Sulla motherboard sono installate quattro schede: Scheda video S3 ViRGE/Dx Scheda di rete Lucent WaveLAN (su apposito adattatore) Due frame grabbers Aver Media Ez-Capture (chip BT878) 75 Appendice B. Schema del robot 76 Telecamere. Ai due frame grabber sono collegate le due telecamere tramite un piccolo cavo coassiale che porta i segnali VID OUT e VID GND. Il collegamento elettrico alle telecamere prevede i 12 V di alimentazione delle telecamere ed i 5 V che servono a tenere aperti gli otturatori delle ottiche. Scheda di controllo. È una scheda dotata di un microprocessore con un piccolo sistema operativo (KaOS) dedicato al controllo del movimento del robot. La scheda in particolare pilota i driver dei motori (sulla scheda di potenza) e gestisce i segnali degli encoder aggiornando l’odometria del robot. Inoltre è presente un’interfaccia per l’I/O grazie alla quale sono possibili fino ad otto ingressi ed altrettante uscite. La comunicazione con il PC avviene tramite linea seriale. L’integrato utilizzato per l’interfaccia TTL/RS232 è un Maxim MAX233 che, rispetto al meno recente MAX232, presenta il vantaggio di avere già integrati i condensatori per le traslazioni dei livelli di tensione tra TTL e RS232. Devono essere presenti i segnali RX, TX e GND. Questa scheda assorbe circa 200 mA, per cui è alimentata senza problemi da un +12 V in uscita dall’alimentatore del PC. Scheda di potenza. Si occupa di fornire la potenza ai motori. I segnali che pilotano questa scheda sono isolati otticamente per una maggiore sicurezza. Tale scheda è alimentata a 18 V tramite una ulteriore scheda di alimentazione dedicata. In uscita verso il micro viene fornito un segnale di allarme collegato all’allarme di sovratemperatura dei driver. Questo segnale, anch’esso optoisolato, viene utilizzato dal micro per togliere potenza ai motori nel caso diventi attivo. In ingresso, invece, la scheda sente la presenza dei 5 V di alimentazione del micro. Dovessero mancare, è prevista l’attivazione del brake, cioè della frenatura dei motori tramite gli opportuni pin degli LMD18200. Scheda del kicker. Questa scheda è dedicata alla gestione degli ingressi e delle uscite dei kicker. Essa viene utilizzata per azionare le elettrovalvole del kicker tramite transistori Darlington e è direttamente connessa alla scheda del 68HC11. Il kicker è composto da una bombola in alluminio per l’aria compressa e da quattro elettrovalvole che attivano quattro pistoni a doppio effetto con i cilindri lunghi Appendice B. Schema del robot 77 8cm. Le elettrovalvole sono attivate dalla chiusura del contatto di un sensore posto sul kicker. Un monostabile si occupa di mantenere le elettrovalvole eccitate per un tempo sufficiente a far compiere ai pistoni l’intera corsa. Scheda dei sensori infrarossi. È collegata direttamente ai sensori, ai quali invia il segnale modulato e dai quali riceve il segnale di ritorno. Il clock è lo stesso del microprocessore (4 MHz). I segnali di ritorno vengono inviati agli ingressi digitali del micro. MOT. POST. BUMPERS THERMAL FLAG DIR. E PWM MOTORI ENCODERS Figura B.1: Schema elettrico del robot Galavrón. +12V PC GND SCHEDA KICKER +18V SCHEDA DI CONTROLLO (68HC11F1) ALIMENTATORE DEI MOTORI +12V PC GND 24V 12V 4 Ah ALIMENTATORE DI BORDO +12V +5V -5V -12V PWR GOOD PC GND NOSE E GENERAL I/O Schema del robot SCHEDA POTENZA MOTORI ELETTRO VALVOLE Appendice B. MOT. ANT. SCHEDA INFRAROSSI SERIALE RS232 +12V PC GND PC MOTHERBOARD Intel Celeron 466 MHz COAX VID OUT + VID GND 12V 4 Ah TV CAMERA 78 +12V +5V PC GND Appendice C Listato del KaOS * Definizioni generali * ----------------------------------------------------------------Registers equ $1000 ;Register Bank Origin EEP_ORG equ $6E00 ;EEPROM Memory Origin EEP_LEN equ $0200 ;EEPROM Memory Lenght RAM_ORG equ $0000 ;RAM Memory Origin RAM_TOP equ $03FF ;RAM top for Stack assign * Assegnazione simbolica dei bit nel byte * ----------------------------------------------------------------B7 equ $80 B6 equ $40 B5 equ $20 B4 equ $10 B3 equ $08 B2 equ $04 B1 equ $02 B0 equ $01 * Definizione dei bit in SCCR2 * ----------------------------------------------------------------TIE equ B7 ;transmit interrupt enable TCIE equ B6 ;transmit complete int. enable RIE equ B5 ;receiver interrupt enable ILIE equ B4 ;idle line interrupt enable TXE equ B3 ;transmit enable RXE equ B2 ;receiver enable RWU equ B1 ;receiver wake-up SBK equ B0 ;send break * Definizione dei bit in SCSR * ----------------------------------------------------------------TDRE equ B7 ;transmit data register empty TC equ B6 ;transmit complete RDRF equ B5 ;receiver data register full IDLE equ B4 ;idle line OR equ B3 ;over-run error NF equ B2 ;noise error FE equ B1 ;framing error * Definizioni dei registri interni * ----------------------------------------------------------------PORTA equ $00 ;I/O Port A DDRA equ $01 ;Data Direction for Port A PORTG equ $02 ;I/O Port G DDRG equ $03 ;Data Direction for Port G 79 Appendice C. Listato del KaOS PORTB equ $04 ;Output-only Port B PORTF equ $05 ;Output-only Port F PORTC equ $06 ;I/O Port C DDRC equ $07 ;Data Direction for Port C PORTD equ $08 ;I/O Port D DDRD equ $09 ;Data Direction for Port D PORTE equ $0A ;Input-only Port E CFORC equ $0B ;Compare Force Register OC1M equ $0C ;OC1 Action Mask Register OC1D equ $0D ;OC1 Action Data Register TCNT equ $0E ;Timer Counter Register (+ $0F) TIC1 equ $10 ;Input Capture 1 Register (+ $11) TIC2 equ $12 ;Input Capture 2 Register (+ $13) TIC3 equ $14 ;Input Capture 3 Register (+ $15) TOC1 equ $16 ;Output Compare 1 Register (+ $17) TOC2 equ $18 ;Output Compare 2 Register (+ $19) TOC3 equ $1A ;Output Compare 3 Register (+ $1B) TOC4 equ $1C ;Output Compare 4 Register (+ $1D) TOC5 equ $1E ;Output Compare 5 Register (+ $1F) TCTL1 equ $20 ;Timer Control Register 1 TCTL2 equ $21 ;Timer Control Register 2 TMSK1 equ $22 ;Timer Interrupt Mask Register 1 TFLG1 equ $23 ;Timer Interrupt Flag Register 1 TMSK2 equ $24 ;Timer Interrupt Mask Register 2 TFLG2 equ $25 ;Timer Interrupt Flag Register 2 PACTL equ $26 ;Pulse Accumulator Control Register PACNT equ $27 ;Pulse Accumulator Count Register SPCR equ $28 ;SPI Control Register SPSR equ $29 ;SPI Status Register SPDR equ $2A ;SPI Data Register BAUD equ $2B ;SCI Baud Rate Generator SCCR1 equ $2C ;SCI Control Register 1 SCCR2 equ $2D ;SCI Control Register 2 SCSR equ $2E ;SCI Status Register SCDR equ $2F ;SCI Data Read/Write ADCTL equ $30 ;A/D Control Register ADR1_MOTOR_L equ $31 ;A/D Result Register 1 ADR2_MOTOR_R equ $32 ;A/D Result Register 2 ADR3_ANALOG_INP equ $33 ;A/D Result Register 3 ADR4_BATTERY equ $34 ;A/D Result Register 4 BPROT equ $35 ;EEPROM Block Protect Register OPT2 equ $38 ;Option 2 Register OPTION equ $39 ;System Configuration Options COPRST equ $3A ;Arm/Reset COP Timer PPROG equ $3B ;EEPROM Programming Control Register HPRIO equ $3C ;High Priority I-bit & Miscellaneous INIT equ $3D ;RAM & I/O Mapping Register TEST1 equ $3E ;Factory Test Control Register CONFIG equ $3F ;COP, ROM, EEPROM Enables CSSTRH equ $5C ;Chip Select Strobe CSCTL equ $5D ;Chip Select Control Register CSGADR equ $5E ;Chip Select General I/O Address CSGSIZ equ $5F ;Chip Select General I/O Size * Definizioni delle variabili in EEPROM * ----------------------------------------------------------------EE_Word_Revcont equ $6F02 EE_Char_Motor equ $6F04 EE_Char_Experim equ $6F05 ; 1 = Infrarossi attivi EE_Array_Name equ $6F06 EE_Char_Baudrat equ $6F1B EE_Word_Stallmx equ $6F1C EE_Char_Stallwa equ $6F1E EE_Char_Watchdg equ $6F1F EE_Char_Pparam equ $6F20 EE_Char_Dparam equ $6F21 EE_Char_Iparam equ $6F22 EE_Array_Subcla equ $6F23 EE_Char_6 equ $6F2B EE_Word_2 equ $6F2C EE_Word_3 equ $6F2E EE_Char_Acc equ $6F30 80 Appendice C. Listato del KaOS * Definizioni delle variabili in RAM * ----------------------------------------------------------------Char_temp equ $0000 Char_Dig_input equ $0001 Char_Kicker equ $0002 Char_81 equ $0005 Char_temp_5 equ $0006 Char_temp_3 equ $0007 Char_temp_4 equ $0008 Word_temp_1 equ $0009 Word_Rkick equ $000B Char_temp_2 equ $000D Char_IR_enable equ $000E Word_millisec equ $0010 Word_Lkick equ $0012 Char_31 equ $0014 Char_28 equ $0015 Char_9 equ $0016 Char_47 equ $0019 Char_49 equ $001A Char_48 equ $001B Word_48 equ $001C Word_49 equ $001E Word_20 equ $0020 Word_19 equ $0022 Char_70 equ $0024 Word_Right_vel equ $0025 Word_Left_vel equ $0027 Word_29 equ $0029 Word_30 equ $002B Char_25 equ $002D Char_6 equ $002E Word_PWM_cycl_L equ $0030 Word_PWM_cycl_R equ $0032 Word_appl_R_pwr equ $0034 Word_appl_L_pwr equ $0036 Word_56 equ $0038 Word_57 equ $003A Word_Acceleraz equ $003C Word_FRkick equ $003E Char_motor_test equ $0040 Word_err_attu_R equ $0041 Word_err_prec_R equ $0043 Word_dposprec_R equ $0045 Char_IPD_R equ $0047 Char_DI_R equ $0048 Char_I_R equ $0049 Word_tens_mot_R equ $004A Word_err_attu_L equ $004C Word_err_prec_L equ $004E Word_dposprec_L equ $0050 Char_IPD_L equ $0052 Char_DI_L equ $0053 Char_I_L equ $0054 Word_tens_mot_L equ $0055 Char_58 equ $0057 Char_59 equ $0058 Char_oper_flags equ $0059 Word_12 equ $005A Word_14 equ $005C Word_36 equ $005E Word_37 equ $0060 Word_7 equ $0062 Word_Thpos equ $0064 Word_ang_setpnt equ $0066 Word_4 equ $0068 Word_6 equ $006A Word_8 equ $006C Word_13 equ $006E Word_51 equ $0070 Word_32 equ $0072 81 Appendice C. Listato del KaOS Word_33 Word_34 Word_35 Word_FLkick Word_83 Char_22 Char_87 Char_88 Word_Xpos Word_10 Word_Ypos Word_11 Char_Motorstatu Word_78 Word_79 Char_23 Char_24 Char_89 Char_sonar_rdng Word_80 Char_42 Word_22 Word_22_L Char_7 Word_50 Char_36 Char_32 Char_33 Char_35 Char_34 Char_2 Char_nr_comando Char_cmd_arg_1 Char_cmd_arg_2 Char_38 Char_45 Char_44 Word_intg_cur_L Word_mot_curr_L Word_intg_cur_R Word_mot_curr_R Char_stall_L Char_stall_R Char_watcdg_cnt Char_Dig_output Word_24 Char_modo_test Char_41 Word_53 Word_54 Word_55 Sonars_buffer Display_buffer Display_char_1 Display_char_2 Display_char_3 Display_char_4 Display_char_5 Display_char_6 Display_char_7 Display_char_8 Display_char_9 Display_char_10 Display_char_11 Display_char_12 Display_char_13 Display_char_14 Display_char_15 Display_char_16 Display_char_17 Display_char_18 Display_char_19 equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ $0074 $0076 $0078 $007A $007D $007E $007F $0080 $0081 $0083 $0084 $0085 $0087 $0088 $008A $008C $008D $008E $008F $0090 $0092 $0093 $0094 $0095 $0096 $0098 $0099 $009A $009B $009C $009D $009E $009F $00A0 $00C9 $00CA $00CB $00CC $00CE $00D0 $00D2 $00D4 $00D5 $00D6 $00D8 $00DA $00DD $00DE $00E0 $00E2 $00E4 $00EA $00FF $0100 $0101 $0102 $0103 $0104 $0105 $0106 $0107 $0108 $0109 $010A $010B $010C $010D $010E $010F $0110 $0111 $0112 82 Appendice C. Listato del KaOS Display_char_20 Display_char_21 Display_char_22 Display_char_23 Display_char_24 Display_char_25 Display_char_26 Display_char_27 Display_char_28 Display_char_29 Display_char_30 Display_char_31 Word_Pak_header Char_Byte_count Char_29 Char_27 Word_42 Word_43 Word_44 Word_45 Word_46 Word_Revcount Char_15 equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ $0113 $0114 $0115 $0116 $0117 $0118 $0119 $011A $011B $011C $011D $011E $011F $0121 $0199 $019A $019B $019D $019F $01A1 $01A3 $01D0 $01D4 * Dispositivi di I/O * ----------------------------------------------------------------LCD_Register_I equ $1060 LCD_Register_D equ $1061 IO2_Register_0 equ $1800 DIGITAL_OUTPUT equ $1801 DIGITAL_INPUT equ $2000 ******************************************************** * KARLO OPERATING SYSTEM v.1.0 FOR ART 2000 - GALAVRON * ******************************************************** P68H11 $defcpu.inc * Codice * ----------------------------------------------------------------RSEG CODE * ----------------------------------------------------------------* Startup * ----------------------------------------------------------------Startup LDS #$03FF LDX #Registers BSET TMSK2,X,#B0 SEI LDAA #(B7+B6+B5+B4+B3) STAA DDRA,X BCLR PORTA,X,#B3 LDAA #(B3+B2+B1+B0) STAA DDRG,X CLR Char_2 LDAA #(B7+B5+B4+B0) Startup_c STAA BAUD,X LDAA #(TXE+RXE) STAA SCCR2,X CLR SCCR1,X BSET OPTION,X,#B7 BSET CSCTL,X,#B5 CLR IO2_Register_0 BCLR SPCR,X,#(B7+B6+B5+B4) CLRA STAA DDRD,X JSR Clear_sonars LDX #Registers LDAA #B5 STAA CSGADR,X LDAA #(B2+B1) 83 Appendice C. Startup_d Listato del KaOS STAA BSET LDD STD LDAA STAA LDD STD STD STD STD STAA STD STD STD STD STD STD STD STD STAA STD STD STD STD STD STD STD STD STAA STD STD STAA STD STAA STAA STAA LDAA STAA LDAA STAA STAA CLRA STD STAA LDAA LSRA STAA STAA ADDA ADDA STAA STAA LDAA SUBA STAA STAA LDD STD STD LDAB CLRA STD LDD STD LDD STD LDD STD LDD STD LDD 84 CSGSIZ,X CSCTL,X,#(B3+B0) EE_Word_Revcont ; (35100 - #$891C) Word_Revcount EE_Char_Experim ; Abilitazione IR Char_IR_enable #$0000 Word_millisec Word_Thpos Word_7 Word_ang_setpnt Char_motor_test Word_Xpos Word_10 Word_11 Word_12 Word_13 Word_14 Word_PWM_cycl_L Word_PWM_cycl_R Char_Kicker Word_Rkick Word_Lkick Word_FRkick Word_FLkick Word_Left_vel Word_Right_vel Word_19 Word_20 Char_6 Char_stall_L Word_22 Char_7 Char_58 Char_oper_flags Char_9 Char_sonar_rdng #$FF Char_Dig_input #(B4+B3+B2+B1+B0) ;Inizializzazione del kicker Char_Dig_output DIGITAL_OUTPUT Word_24 Char_15 #$00 Char_I_R Char_I_L #$14 #$3C Char_IPD_R Char_IPD_L #$3C #$00 Char_DI_R Char_DI_L #Array_1 Word_29 Word_30 EE_Char_Acc Word_Acceleraz #$0100 Word_32 #$FF00 Word_33 #$0018 Word_34 #$FFE8 Word_35 #$01A0 ;EE_Char_Iparam ;EE_Char_Pparam ;EE_Char_Dparam ;EE_Char_Dparam ;EE_Char_Iparam Appendice C. Startup_g Startup_j Startup_k Startup_l Startup_n Startup_m Listato del KaOS STD LDD STD LDAA STAA LDAA STAA STAA STAA STAA STAA LDAA LDAB STD LDAA STAA JSR CLR CLR BSET BSET LDD ADDD STD LDAA STAA LDAA STAA BSET LDAA STAA BSET CLR CLI LDX JSR LDAA JSR LDAA STAA LDD STD LDD STD LDD STD LDD STD LDD STD LDAA STAA LDAA STAA JSR JSR CLR LDAA STAA LDX JSR LDX LDAB JSR LDAA STAA BSET LDX BRSET JMP JSR LDY Word_36 #$FE60 Word_37 #$04 Char_Motorstatu #$00 Char_23 Char_24 Char_25 Char_modo_test Char_27 #$FA #$FB Word_Pak_header #$20 Char_28 LCD_Init TMSK1,X TMSK2,X TFLG1,X,#(B5+B4+B3) TMSK1,X,#(B4+B3) TCNT,X #$0014 TOC5,X #B0 TCTL2,X #(B7+B6+B5) TCTL1,X PACTL,X,#B7 #B7 OC1M,X OC1D,X,#B7 Char_temp #MSG_startup String_to_buf #$0A Delay_A_10s Char_Dig_output DIGITAL_OUTPUT #$0208 Word_42 #$0008 Word_43 #$0208 Word_44 #$0008 Word_45 #$0208 Word_46 #$05 Char_29 #$01 Char_27 CLOSE_MOTORS RS232_Init Char_modo_test #$04 Char_Motorstatu #MSG_sync String_to_buf #MSG_ca #$10 String_to_buf_c #$4B Display_char_5 Char_oper_flags,#$10 #Registers PORTA,X,#B2,Startup_m Startup_r Subroutine_7 Word_7 85 Appendice C. Startup_o Listato del KaOS LDAB JSR LDAA CMPA BEQ LDX LDAB JSR JSR LDAA CMPA BEQ LDY LDAB JSR BRA #$0F Wri_Y_5_digit Char_Motorstatu #$04 Startup_n #MSG_conn #$00 String_to_buf_c Command_exec Char_Motorstatu #$04 Startup_k Word_7 #$0F Wri_Y_5_digit Startup_o * ----------------------------------------------------------------* Delays 250 millisec. with break * ----------------------------------------------------------------Delay_250ms JSR Subroutine_10 LDX #Registers BRSET PORTA,X,#B2,Delay_250ms LDAA #$32 Delay_250ms_a JSR Delay_7ms DECA BGT Delay_250ms_a RTS MSG_sync fcc fcb ’KaOS 0 ART 2000’ MSG_ca fcc fcb ’ C 0 MSG_conn fcc fcb ’Connesso! ’ 0 A’ * ----------------------------------------------------------------* Reset RS232 serial port * ----------------------------------------------------------------RS232_Reset JSR RS232_R_int_dis JSR Delay_250ms JSR RS232_Init RTS * ----------------------------------------------------------------* Startup (test mode) * ----------------------------------------------------------------Startup_r LDAA #$05 JSR Delay_A_10s BSR RS232_Reset LDX #MSG_test_mot JSR String_to_buf LDAA #$0A JSR Dly_A_10s_brk TSTA BNE Startup_t JSR Test_Motors Startup_t LDAA #$05 JSR Delay_A_10s LDX #MSG_test_digin JSR String_to_buf LDAA #$0A JSR Dly_A_10s_brk TSTA BNE Startup_q JSR Test_Dig_in Startup_q LDAA #$05 JSR Delay_A_10s LDX #MSG_test_cpu JSR String_to_buf 86 Appendice C. Startup_pas1 Startup_pas2 Startup_pas3 Startup_pas4 Startup_pas5 Startup_w Listato del KaOS LDAA JSR TSTA BNE JSR LDAA JSR LDX JSR LDAA JSR TSTA BNE LDAA JSR LDX JSR LDAA JSR TSTA BNE LDAA JSR LDX JSR LDAA JSR TSTA BNE LDAA JSR LDX JSR LDAA JSR TSTA BNE LDAA JSR LDX JSR LDAA JSR JMP 87 #$0A Dly_A_10s_brk Startup_w Test_CPU #$05 Delay_A_10s #MSG_pasqua1 String_to_buf #$0A Dly_A_10s_brk Startup_w #$05 Delay_A_10s #MSG_pasqua2 String_to_buf #$0A Dly_A_10s_brk Startup_w #$05 Delay_A_10s #MSG_pasqua3 String_to_buf #$0A Dly_A_10s_brk Startup_w #$05 Delay_A_10s #MSG_pasqua4 String_to_buf #$0A Dly_A_10s_brk Startup_w #$05 Delay_A_10s #MSG_pasqua5 String_to_buf #$0A Delay_A_10s Startup MSG_test_digin fcc fcb ’Digin: 0 BOOT termina’ MSG_test_cpu fcc fcb ’Test CPU.....BOOT termina’ 0 MSG_test_mot fcc fcb ’Test MOTORI..BOOT termina’ 0 MSG_pasqua1 fcc fcb ’KaOS thanks: 0 MSG_pasqua2 fcc fcb ’Stefano Cagnoni Monica Mordonini’ 0 MSG_pasqua3 fcc fcb ’Carlo Bernardi 0 MSG_pasqua4 fcc fcb ’Marcel. CarlettiFrida Loprieno 0 ’ MSG_pasqua5 fcc fcb ’Giov. Remondini Cristiano Rota 0 ’ Giovanni Adorni ’ Enzo Bocelli ’ * ----------------------------------------------------------------* LCD Init * ----------------------------------------------------------------- Appendice C. Listato del KaOS LCD_Init LDX BSET BSET LDAA BSR LDAA BSR LDAA BSR LDAA BSR LDY JSR LDAA BSR RTS #Registers CSCTL,X,#(B7+B6) CSSTRH,X,#(B7+B6) #$38 LCD_Command #$06 LCD_Command #$0C LCD_Command #$01 LCD_Command #MSG_startup LCD_Write_msg #$C0 LCD_Command * ----------------------------------------------------------------* LCD Command * ----------------------------------------------------------------LCD_Command LDAB $60,X ANDB #$80 BNE LCD_Command STAA $60,X RTS * ----------------------------------------------------------------* LCD Write Char * ----------------------------------------------------------------LCD_Write_ch LDAB $60,X ANDB #$80 BNE LCD_Write_ch STAA $61,X LCD_Write_ch_a RTS * ----------------------------------------------------------------* LCD Write Message * ----------------------------------------------------------------LCD_Write_msg LDAA $00,Y BEQ LCD_Write_ch_a JSR LCD_Write_ch INY BRA LCD_Write_msg * ----------------------------------------------------------------* LCD Write Y Using 5 Digits * ----------------------------------------------------------------Wri_Y_5_digit STY Char_temp_3 LDY #Display_buffer ABY LDD Char_temp_3 CLR Char_temp_2 TSTA BPL Wri_Y_5_digit_a BSET Char_temp_2,#$01 LDD #$0000 SUBD Char_temp_3 Wri_Y_5_digit_a LDX #$000A IDIV ADDB #$30 STAB $00,Y DEY XGDX LDX #$000A IDIV ADDB #$30 STAB $00,Y DEY XGDX LDX #$000A IDIV ADDB #$30 88 Appendice C. Listato del KaOS STAB DEY XGDX LDX IDIV ADDB STAB DEY XGDX LDX IDIV ADDB STAB DEY LDAB BRCLR LDAB Wri_Y_5_digit_b STAB RTS $00,Y #$000A #$30 $00,Y #$000A #$30 $00,Y #$A0 Char_temp_2,#$01,Wri_Y_5_digit_b #$2D $00,Y * ----------------------------------------------------------------* LCD Write Y Using 3 Digits * ----------------------------------------------------------------Wri_Y_3_digit STY Char_temp_3 LDY #Display_buffer ABY LDD Char_temp_3 CLR Char_temp_2 TSTA BPL Wri_Y_3_digit_a BSET Char_temp_2,#$01 LDD #$0000 SUBD Char_temp_3 Wri_Y_3_digit_a LDX #$000A IDIV ADDB #$30 STAB $00,Y DEY XGDX LDX #$000A IDIV ADDB #$30 STAB $00,Y DEY XGDX LDX #$000A IDIV ADDB #$30 STAB $00,Y DEY LDAB #$A0 BRCLR Char_temp_2,#$01,Wri_Y_3_digit_b LDAB #$2D Wri_Y_3_digit_b STAB $00,Y RTS MSG_startup fcc fcb ’KaOS 1.0 ART2000TH.FL.ON-IR KICK’ 0 MSG_cf fcc fcb ’CF: ’ 0 * ----------------------------------------------------------------* String to buffer * ----------------------------------------------------------------String_to_buf JSR Clear_buffer LDAB Char_31 String_to_buf_c LDY #Display_buffer ABY String_to_buf_b LDAA $00,X BEQ String_to_buf_a CMPB #$20 89 Appendice C. Listato del KaOS BGE STAA INCB INY INX BRA String_to_buf_a STAB RTS String_to_buf_a $00,Y String_to_buf_b Char_31 * ----------------------------------------------------------------* Clear buffer * ----------------------------------------------------------------Clear_buffer PSHX LDD #$0000 STAA Char_31 LDX #Display_buffer Clear_buffer_a STD $00,X INX INX CPX #(Display_buffer+$20) ;#$011F nel psos vecchio BLT Clear_buffer_a LDAA #$FF STAA Char_28 PULX RTS * ----------------------------------------------------------------* Write to LCD * ----------------------------------------------------------------Write_to_LCD LDAB LCD_Register_I ANDB #$80 BNE Write_to_LCD_a LDAB Char_28 BLT Write_to_LCD_b CMPB #$20 BGE Write_to_LCD_a LDY #Display_buffer ABY INCB CMPB #$10 BNE Write_to_LCD_c LDAB #$FE Write_to_LCD_c STAB Char_28 LDAB $00,Y BNE Write_to_LCD_d LDAB #$A0 Write_to_LCD_d STAB LCD_Register_D Write_to_LCD_a RTS Write_to_LCD_b ANDB #$01 BEQ Write_to_LCD_e LDAB #$02 STAB LCD_Register_I CLR Char_28 RTS Write_to_LCD_e LDAB #$C0 STAB LCD_Register_I LDAB #$10 STAB Char_28 RTS * ----------------------------------------------------------------* Delays 7 millisec. * ----------------------------------------------------------------Delay_7ms PSHY LDY #$1004 Delay_7ms_a DEY BNE Delay_7ms_a PULY RTS * ----------------------------------------------------------------* Delays register A /10 sec. with break 90 Appendice C. Listato del KaOS * ----------------------------------------------------------------Dly_A_10s_brk LDAB #$64 MUL ADDD Word_millisec LDX #Registers Dly_A_10s_brk_a BRCLR PORTA,X,#B2,Dly_A_10s_brk_b CPD Word_millisec BNE Dly_A_10s_brk_a LDAA #$00 RTS Dly_A_10s_brk_b LDAA #$01 RTS * ----------------------------------------------------------------* Delays register A /10 sec. * ----------------------------------------------------------------Delay_A_10s LDAB #$64 MUL ADDD Word_millisec Delay_A_10s_a CPD Word_millisec BNE Delay_A_10s_a RTS * ----------------------------------------------------------------* Disabilita il kicker se gli IR laterali sono attivi * ----------------------------------------------------------------Kick_disable LDAA DIGITAL_INPUT STAA Char_Dig_input BITA #$01 BEQ Kick_disable_a BITA #$04 BEQ Kick_disable_a Kick_disable_b LDAA Char_Dig_output ORAA #B0 STAA Char_Dig_output STAA DIGITAL_OUTPUT RTS Kick_disable_a LDAA Char_Dig_output ANDA #$FE STAA Char_Dig_output STAA DIGITAL_OUTPUT RTS * ----------------------------------------------------------------* Timer Output Compare 5 Interrupt * ----------------------------------------------------------------TOC5_Int LDX #Registers LDD #$0320 ;$03E8 ADDD $1E,X STD $1E,X BCLR $23,X,#$F7 LDAA $22,X PSHA ANDA #$10 STAA $22,X CLI BRCLR Char_IR_enable,#$01,TOC5_a BSR Kick_disable TOC5_a LDAA #$14 STAA $30,X LDX Word_millisec INX STX Word_millisec LDAA Char_Kicker BEQ TOC5_c BRCLR Char_Kicker,#B4,TOC5_a1 LDD Word_Rkick CPD Word_millisec BNE TOC5_a1 BSET Char_Dig_output,#B4 BCLR Char_Kicker,#B4 TOC5_a1 BRCLR Char_Kicker,#B3,TOC5_a2 91 Appendice C. TOC5_a2 TOC5_a3 TOC5_a4 TOC5_c TOC5_d TOC5_e TOC5_f TOC5_g TOC5_h TOC5_i TOC5_j TOC5_k Listato del KaOS LDD CPD BNE BSET BCLR BRCLR LDD CPD BNE BSET BCLR BRCLR LDD CPD BNE BSET BCLR LDAA STAA LDX LDD STX PSHA CLRA NEGB BGE LDAA LDX CMPB BGE LDX CMPB BGE LDX CMPB BGE LDX STX CMPB BLT LDX STX CMPB BGT LDX STX NEGB ADCA NEGA ADDD STD CLRA PULB TSTB BGE LDAA LDX CMPB BGE LDX CMPB BGE LDX CMPB BGE LDX STX CMPB BLT LDX STX CMPB Word_FRkick Word_millisec TOC5_a2 Char_Dig_output,#B3 Char_Kicker,#B3 Char_Kicker,#B2,TOC5_a3 Word_Lkick Word_millisec TOC5_a3 Char_Dig_output,#B2 Char_Kicker,#B2 Char_Kicker,#B1,TOC5_a4 Word_FLkick Word_millisec TOC5_a4 Char_Dig_output,#B1 Char_Kicker,#B1 Char_Dig_output DIGITAL_OUTPUT #$0000 Char_49 Char_49 TOC5_d #$FF #Array_4 #$0C TOC5_e #Array_3 #$00 TOC5_e #Array_1 #$F4 TOC5_e #Array_2 Word_30 #$19 TOC5_f #$001E Word_PWM_cycl_L #$E7 TOC5_g #$001E Word_PWM_cycl_L #$0 Word_49 Word_49 TOC5_i #$FF #Array_2 #$0C TOC5_j #Array_1 #$00 TOC5_j #Array_3 #$F4 TOC5_j #Array_4 Word_29 #$19 TOC5_k #$001E Word_PWM_cycl_R #$E7 92 Appendice C. TOC5_l TOC5_m TOC5_n TOC5_r TOC5_s TOC5_q TOC5_x TOC5_w TOC5_v TOC5_y TOC5_z TOC5_af TOC5_ai TOC5_ah TOC5_am TOC5_ao TOC5_aq Listato del KaOS BGT LDX STX NEGB ADCA NEGA ADDD STD JSR DEC BNE LDAA STAA LDAA STAA LDAA BEQ BITA BEQ JSR BRA BITA BEQ JSR LDAA DECA BGT DEC BGT LDD STD STD STD LDAA BNE STD STD LDD STD LDAA STAA CMPA BNE DEC CMPA BNE DEC CMPA BNE DEC CMPA BNE LDAA BEQ JMP LDX BRSET JMP BRCLR CMPA BNE JMP CMPA BNE JMP CMPA BNE JMP CMPA BNE BRCLR JMP TOC5_l #$001E Word_PWM_cycl_R #$0 Word_48 Word_48 Write_to_LCD Char_9 TOC5_q #$FF Char_28 #$C8 Char_9 Char_oper_flags TOC5_q #$02 TOC5_s Subroutine_49 TOC5_q #$04 TOC5_q Wri_mottst_data Char_70 TOC5_v Char_watcdg_cnt TOC5_w #$0000 Word_12 Word_14 Word_13 Char_motor_test TOC5_x Word_56 Word_57 Word_Thpos Word_ang_setpnt #$14 Char_70 #$14 TOC5_y Char_25 #$13 TOC5_z Char_45 #$12 TOC5_af Char_44 #$0A TOC5_ah Char_modo_test TOC5_ai TOC5_ak #Registers PORTA,X,#$04,TOC5_ak TOC5_test Char_58,#$04,TOC5_ak #$09 TOC5_am TOC5_an #$07 TOC5_ao TOC5_PID_ctr_L #$05 TOC5_aq TOC5_PID_ctr_R #$03 TOC5_ak Char_58,#$40,TOC5_ak TOC5_as 93 Appendice C. Listato del KaOS TOC5_ak LDD STD LDAA DECA ANDA BNE LDAB LSRB LSRB LDX ABX LDAB BEQ CLRA LSLD STD LSLD LSLD ADDD ORAB STD LDAA LSLA LSLA LSLA ANDA STAA LDAA ANDA ORAA STAA STAA BRCLR TST BGT LDAA STAA LDX BRSET BRA LDD STD LDD STD CPD BLE LDAA STAA LDD STD CPD BLE LDAA STAA LDD STD STD BRA CLRA LDAB TST BEQ LSRB ADDD STD CLRA LDAB TST BEQ LSRB ADDD STD * * * * * TOC5_at * * TOC5_aw TOC5_ax TOC5_ay TOC5_az TOC5_av TOC5_ba TOC5_bb #$0000 Word_22 Char_70 #$03 TOC5_at Char_70 #$01C3 $00,X TOC5_at Word_22 Word_22 #$01 Word_22 Char_70 #$E0 Char_81 Char_Dig_output #$1F Char_81 Char_Dig_output DIGITAL_OUTPUT Char_58,#$80,TOC5_au Char_44 TOC5_av #$19 Char_44 #Registers PORTD,X,#B4,TOC5_aw ; THERMAL FLAG TOC5_ax #$0000 Char_stall_L Word_intg_cur_L Word_mot_curr_L #$7FFF ;EE_Word_Stallmx TOC5_ay #$01 Char_stall_L Word_intg_cur_R Word_mot_curr_R #$7FFF ;EE_Word_Stallmx TOC5_az #$01 Char_stall_R #$0000 Word_intg_cur_L Word_intg_cur_R TOC5_au (Registers+ADR1_MOTOR_L) Char_87 TOC5_ba Word_intg_cur_L Word_intg_cur_L (Registers+ADR2_MOTOR_R) Char_88 TOC5_bb Word_intg_cur_R Word_intg_cur_R 94 Appendice C. Listato del KaOS TOC5_au BRCLR BRCLR LDAA DECA BGT LDAA STAA CMPA BNE JMP CMPA BNE JMP CMPA BNE JMP LDAA BGT LDAA STAA LDX LDAA EORA STAA BEQ LDAA STAA BCLR BRA LDAA STAA BSET JSR BRCLR LDAA CMPA BEQ TSTA BGT LDAA STAA JSR PULA STAA RTI TST BEQ TST BNE LDX STX LDAA STAA CLR LDAA STAA LDAA STAA BRA TOC5_bd TOC5_be TOC5_bg TOC5_bc TOC5_bk TOC5_bj TOC5_bl TOC5_bm TOC5_test BRCLR LDAA STAA LDD STD STD STD LDD STD LDX JSR JMP 95 Char_58,#$01,TOC5_bc Char_24,#$FF,TOC5_bc Char_89 TOC5_bd #$28 Char_89 #$02 TOC5_be TOC5_bc #$01 TOC5_bg TOC5_bc #$14 TOC5_bc TOC5_bc Char_25 TOC5_bj #$19 Char_25 #Registers Char_6 #$01 Char_6 TOC5_bk #$2A Display_char_31 PORTA,X,#$08 TOC5_bj #$A0 Display_char_31 PORTA,X,#$08 Write_to_LCD Char_58,#$20,TOC5_bl Char_45 #$03 TOC5_bm TOC5_bl #$05 Char_45 Data_packet (TMSK1+Registers) Char_15 TOC5_bl Char_2 TOC5_bl #$01D5 Word_50 Char_15 Char_36 Char_15 #$01 Char_2 #$AC (Registers+SCCR2) TOC5_bl PORTA,X,#$04,TOC5_test #$01 Char_modo_test #$0000 Word_ang_setpnt Word_Thpos Word_7 #$7FFF Word_Revcount #MSG_test String_to_buf TOC5_ak ; cuore (2A) ; cuore (A0) Appendice C. Listato del KaOS MSG_test fcc fcb ’Inizio modo test,premere il BOOT.’ 0 Subroutine_49 LDY LDAB JSR LDY LDAB JSR LDD SUBD XGDY LDAB JSR RTS Word_48 #$06 Wri_Y_5_digit Word_49 #$0F Wri_Y_5_digit Word_48 Word_49 #$16 Wri_Y_5_digit Set_mottst_flag JSR BSET LDX JSR RTS Set_motors_on Char_oper_flags,#$04 #MSG_PA String_to_buf Wri_mottst_data LDY LDAB JSR LDY LDAB JSR LDY LDAB JSR LDY LDAB JMP RTS Word_Right_vel #$04 Wri_Y_3_digit Word_Left_vel #$0B Wri_Y_3_digit Word_appl_R_pwr #$13 Wri_Y_3_digit Word_appl_L_pwr #$18 Wri_Y_3_digit MSG_PA fcc fcb ’P 0 Set_motors_on LDD STAA STD STD STD STD STD STAA STD STD STD STD STAA STD STD STD STD STD STD STD STD BSET RTS #$0000 Char_47 Char_49 Word_48 Word_49 Word_Right_vel Word_Left_vel Char_Stall_cont Word_PWM_cycl_L Word_PWM_cycl_R Word_56 Word_57 Char_70 Word_err_attu_R Word_err_prec_R Word_dposprec_R Word_tens_mot_R Word_err_attu_L Word_err_prec_L Word_dposprec_L Word_tens_mot_L Char_58,#$04 BCLR BCLR LDD STD STD LDAA JSR LDD Char_58,#$04 Char_oper_flags,#$04 #$0000 Word_PWM_cycl_L Word_PWM_cycl_R #$01 Dly_A_10s_brk #$0000 * CLOSE_MOTORS_a A’ 96 Appendice C. TOC5_PID_ctr_R TOC5_ct TOC5_cu TOC5_cu1 TOC5_cv TOC5_cw TOC5_cz TOC5_da TOC5_PID_ctr_L TOC5_db TOC5_dc Listato del KaOS STD STD RTS Word_PWM_cycl_L Word_PWM_cycl_R CLR LDD CPD BLT LDAA STAA STAA LDD BRA CPD BGT LDAA STAA STAA LDD SUBD LDX STD JSR CMPB BEQ BLT ADDB BRA ADDB STD LDX TSTA BPL BCLR NEGB ADCA NEGA BRSET LDD BRA BSET BRSET LDD STD JMP Char_88 Word_Right_vel #$0005 TOC5_ct #$03 Char_Motorstatu Char_88 Word_Right_vel TOC5_cu #$FFFB TOC5_cu #$03 Char_Motorstatu Char_88 Word_Right_vel Word_57 #Word_err_attu_R $00,X Motor_PID_ctr #$00 TOC5_cv TOC5_cu1 #$08 TOC5_cv #$F8 Word_appl_R_pwr #Registers LDAA STAA CLR LDD CPD BLT LDAA STAA STAA LDD BRA CPD BGT LDAA STAA STAA LDD SUBD LDX STD BSR CMPB BEQ BLT ADDB BRA #$02 Char_Motorstatu Char_87 Word_Left_vel #$0005 TOC5_db #$03 Char_Motorstatu Char_87 Word_Left_vel TOC5_dc #$FFFB TOC5_dc #$03 Char_Motorstatu Char_87 Word_Left_vel Word_56 #Word_err_attu_L $00,X Motor_PID_ctr #$00 TOC5_dd TOC5_de #$08 TOC5_dd 97 TOC5_cz PORTG,X,#$02 #$0 Char_Dig_input,#$04,TOC5_da #$0000 TOC5_da PORTG,X,#$02 Char_Dig_input,#$01,TOC5_da #$0000 Word_PWM_cycl_R TOC5_ak ; IR STOP ; IR STOP Appendice C. Listato del KaOS TOC5_de TOC5_dd ADDB STD LDX TSTA BPL BSET NEGB ADCA NEGA BRSET LDD BRA BCLR BRSET LDD STD JMP #$F8 Word_appl_L_pwr #Registers CLR LDD BGE INC NEGB ADCA NEGA STAA LDAA MUL STAA LDAA LDAB MUL ADDB ADCA TST BGT NEGB ADCA NEGA STD CLR LDD STD BGE INC NEGB ADCA NEGA STAA LDAA MUL STAA LDAA LDAB MUL ADDB ADCA TST BEQ NEGB ADCA NEGA ADDD STD CLR LDD STD BGE INC NEGB ADCA NEGA Char_temp_2 $04,X Motor_PID_ctr_a Char_temp_2 TOC5_df TOC5_di TOC5_dj Motor_PID_ctr Motor_PID_ctr_a Motor_PID_ctr_b Motor_PID_ctr_c Motor_PID_ctr_d 98 TOC5_di PORTG,X,#$01 #$0 Char_Dig_input,#$04,TOC5_dj #$0000 TOC5_dj PORTG,X,#$01 Char_Dig_input,#$01,TOC5_dj #$0000 Word_PWM_cycl_L TOC5_ak #$0 Char_temp_3 $08,X Char_temp_5 $08,X Char_temp_3 Char_temp_5 #$0 Char_temp_2 Motor_PID_ctr_b #$0 Word_temp_1 Char_temp_2 $02,X $04,X Motor_PID_ctr_c Char_temp_2 #$0 Char_temp_3 $07,X Char_temp_5 $07,X Char_temp_3 Char_temp_5 #$0 Char_temp_2 Motor_PID_ctr_d #$0 Word_temp_1 Word_temp_1 Char_temp_2 $00,X $02,X Motor_PID_ctr_e Char_temp_2 #$0 ; IR STOP ; IR STOP Appendice C. Listato del KaOS Motor_PID_ctr_e STAA LDAA MUL STAA LDAA LDAB MUL ADDB ADCA TST BGT NEGB ADCA NEGA Motor_PID_ctr_f ADDD ADDD CPD BLE LDD Motor_PID_ctr_g CPD BGE LDD Motor_PID_ctr_h STD RTS Char_temp_3 $06,X Char_temp_5 $06,X Char_temp_3 Char_temp_5 #$0 Char_temp_2 Motor_PID_ctr_f #$0 Word_temp_1 $09,X #$0048 Motor_PID_ctr_g #$0048 #$FFB8 Motor_PID_ctr_h #$FFB8 $09,X Subroutine_34 LDD STD STD STD BSET BSET RTS #$0000 Word_Thpos Word_7 Word_ang_setpnt Char_58,#$08 Char_59,#$02 Subroutine_35 BCLR BCLR RTS Char_58,#$08 Char_59,#$02 TOC5_an LDD STD ADDD STD LDD STD ADDD STD LDD STD STD LDD ADDD STD LDD SUBD BEQ CPD BLE LDD ADDD STD BRA ADDD BGE LDD SUBD STD BRA LDD STD LDD SUBD STD TST Word_48 Word_Right_vel Word_20 Word_20 Word_49 Word_Left_vel Word_19 Word_19 #$0000 Word_48 Word_49 Word_Right_vel Word_Left_vel Word_83 Word_14 Word_12 TOC5_dk Word_Acceleraz TOC5_dl Word_12 Word_Acceleraz Word_12 TOC5_dk Word_Acceleraz TOC5_dm Word_12 Word_Acceleraz Word_12 TOC5_dk Word_14 Word_12 Word_Right_vel Word_Left_vel Word_4 Word_Revcount TOC5_dl TOC5_dm TOC5_dk 99 ;$005C ;$005C ;$FFA4 ;$FFA4 Appendice C. TOC5_dn TOC5_do TOC5_dp TOC5_dq TOC5_dr TOC5_dt TOC5_du TOC5_dv TOC5_dw Listato del KaOS BLT ADDD BLT CPD BLT SUBD BRA ADDD BVS BGE CPD BLT TST BGE SUBD BRA ADDD STD LSRD LSRD LSRD LSRD LDX FDIV XGDX STD BRSET LDD STD JMP BRSET JMP LDD SUBD BLT CPD BLT SUBD BRA CPD BGT ADDD STD LDD STAA BGE NEGA ADCA NEGB LSRD LSRD LSRD LSRD LSRD TBA MUL STD LSRD LSRD LSRD LSRD TST BLT NEGB ADCA NEGA ADDD BLT CPD BLE CPD BLE TOC5_dn Word_7 TOC5_do Word_Revcount TOC5_dp Word_Revcount TOC5_dp Word_7 TOC5_dp TOC5_dp Word_Revcount TOC5_dp Word_7 TOC5_do Word_Revcount TOC5_dp Word_Revcount Word_7 Word_Revcount Word_Thpos Char_58,#$08,TOC5_dq Word_Thpos Word_ang_setpnt TOC5_ak Char_59,#$02,TOC5_dr TOC5_ds Word_ang_setpnt Word_Thpos TOC5_dt #$0800 TOC5_du #$1000 TOC5_du #$F800 TOC5_du #$1000 Word_6 Word_4 Char_temp_2 TOC5_dv #$0 Word_8 Char_temp_2 TOC5_dw #$0 Word_6 TOC5_dx Word_34 TOC5_dy Word_32 TOC5_dz 100 Appendice C. TOC5_dx TOC5_dy TOC5_dz TOC5_eb TOC5_ds TOC5_ea TOC5_ec TOC5_ed TOC5_ef TOC5_ee TOC5_eh TOC5_eg Listato del KaOS LDD BRA CPD BGE CPD BGT LDD BRA LDD ASRA RORB ASRA RORB STD SUBD BEQ CPD BLE LDD ADDD STD BRA ADDD BGE LDD SUBD STD BRA LDD STD LDD CLR LDD ADDD CPD BLE LDD INC BRA CPD BGE LDD INC STD SUBD SUBD CPD BLE BRSET SUBD STD LDD SUBD STD LDD BRA CPD BGE BRSET SUBD STD LDD SUBD STD LDD STD JMP Word_32 TOC5_dz Word_35 TOC5_dy Word_33 TOC5_dz Word_33 TOC5_dz #$0000 Word_51 Word_13 TOC5_ea #$0008 TOC5_eb Word_13 #$0008 Word_13 TOC5_ea #$0008 TOC5_ds Word_13 #$0008 Word_13 TOC5_ea Word_51 Word_13 Word_13 Char_temp_2 Word_12 Word_13 Word_36 TOC5_ec Word_36 Char_temp_2 TOC5_ed Word_37 TOC5_ed Word_37 Char_temp_2 Word_57 Word_13 Word_13 Word_36 TOC5_ee Char_temp_2,#$01,TOC5_ef Word_36 Char_81 Word_57 Char_81 Word_57 Word_36 TOC5_eg Word_37 TOC5_eg Char_temp_2,#$01,TOC5_eh Word_37 Char_81 Word_57 Char_81 Word_57 Word_37 Word_56 TOC5_ak TABELLA_sin fcb 0,0,1,001,002,002,002,003,003,004,004,004,005,005,005,006 fcb 006,007,007,007,008,008,009,009,009,010,010,011,011,011,012,012 fcb 013,013,013,014,014,014,015,015,016,016,016,017,017,018,018,018 fcb 019,019,020,020,020,021,021,021,022,022,023,023,023,024,024,025 101 Appendice C. fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb fcb Listato del KaOS 025,025,026,026,027,027,027,028,028,028,029,029,030,030,030,031 031,032,032,032,033,033,034,034,034,035,035,035,036,036,037,037 037,038,038,039,039,039,040,040,041,041,041,042,042,042,043,043 044,044,044,045,045,046,046,046,047,047,047,048,048,049,049,049 050,050,051,051,051,052,052,052,053,053,054,054,054,055,055,055 056,056,057,057,057,058,058,059,059,059,060,060,060,061,061,062 062,062,063,063,063,064,064,065,065,065,066,066,067,067,067,068 068,068,069,069,070,070,070,071,071,071,072,072,073,073,073,074 074,074,075,075,076,076,076,077,077,077,078,078,079,079,079,080 080,080,081,081,081,082,082,083,083,083,084,084,084,085,085,086 086,086,087,087,087,088,088,088,089,089,090,090,090,091,091,091 092,092,093,093,093,094,094,094,095,095,095,096,096,096,097,097 098,098,098,099,099,099,100,100,100,101,101,102,102,102,103,103 103,104,104,104,105,105,105,106,106,107,107,107,108,108,108,109 109,109,110,110,110,111,111,111,112,112,113,113,113,114,114,114 115,115,115,116,116,116,117,117,117,118,118,118,119,119,120,120 120,121,121,121,122,122,122,123,123,123,124,124,124,125,125,125 126,126,126,127,127,127,128,128,128,129,129,129,130,130,130,131 131,131,132,132,132,133,133,133,134,134,134,135,135,135,136,136 136,137,137,137,138,138,138,139,139,139,140,140,140,141,141,141 142,142,142,143,143,143,144,144,144,145,145,145,146,146,146,147 147,147,147,148,148,148,149,149,149,150,150,150,151,151,151,152 152,152,153,153,153,153,154,154,154,155,155,155,156,156,156,157 157,157,158,158,158,158,159,159,159,160,160,160,161,161,161,161 162,162,162,163,163,163,164,164,164,164,165,165,165,166,166,166 167,167,167,167,168,168,168,169,169,169,170,170,170,170,171,171 171,172,172,172,172,173,173,173,174,174,174,174,175,175,175,176 176,176,176,177,177,177,178,178,178,178,179,179,179,179,180,180 180,181,181,181,181,182,182,182,183,183,183,183,184,184,184,184 185,185,185,185,186,186,186,187,187,187,187,188,188,188,188,189 189,189,189,190,190,190,191,191,191,191,192,192,192,192,193,193 193,193,194,194,194,194,195,195,195,195,196,196,196,196,197,197 197,197,198,198,198,198,199,199,199,199,200,200,200,200,201,201 201,201,202,202,202,202,202,203,203,203,203,204,204,204,204,205 205,205,205,206,206,206,206,206,207,207,207,207,208,208,208,208 208,209,209,209,209,210,210,210,210,210,211,211,211,211,212,212 212,212,212,213,213,213,213,214,214,214,214,214,215,215,215,215 215,216,216,216,216,216,217,217,217,217,218,218,218,218,218,219 219,219,219,219,220,220,220,220,220,221,221,221,221,221,221,222 222,222,222,222,223,223,223,223,223,224,224,224,224,224,225,225 225,225,225,225,226,226,226,226,226,227,227,227,227,227,227,228 228,228,228,228,228,229,229,229,229,229,230,230,230,230,230,230 231,231,231,231,231,231,232,232,232,232,232,232,232,233,233,233 233,233,233,234,234,234,234,234,234,235,235,235,235,235,235,235 236,236,236,236,236,236,236,237,237,237,237,237,237,237,238,238 238,238,238,238,238,239,239,239,239,239,239,239,240,240,240,240 240,240,240,240,241,241,241,241,241,241,241,242,242,242,242,242 242,242,242,242,243,243,243,243,243,243,243,243,244,244,244,244 244,244,244,244,244,245,245,245,245,245,245,245,245,245,246,246 246,246,246,246,246,246,246,246,247,247,247,247,247,247,247,247 247,247,248,248,248,248,248,248,248,248,248,248,248,249,249,249 249,249,249,249,249,249,249,249,249,250,250,250,250,250,250,250 250,250,250,250,250,250,251,251,251,251,251,251,251,251,251,251 251,251,251,251,252,252,252,252,252,252,252,252,252,252,252,252 252,252,252,252,252,253,253,253,253,253,253,253,253,253,253,253 253,253,253,253,253,253,253,253,253,253,254,254,254,254,254,254 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254 254,254,254,254,254,254,254,254,255,255,255,255,255,255,255,255 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255 255,255 Subroutine_31 LDD STD STD STD STD STD BSET RTS #$0000 Word_Xpos Word_10 Word_11 Word_Thpos Word_7 Char_58,#$40 TOC5_as CLR Char_temp_2 102 Appendice C. TOC5_ei TOC5_ej TOC5_ek TOC5_el TOC5_em Subroutine_56 Listato del KaOS LDD BPL NEGB ADCA NEGA INC LSRD BCC ADDD STD LDD CPD BGE LDX BSR LDD SUBD LDX BSR JMP CPD BGE INC SUBD LDX BSR INC LDD SUBD LDX BSR JMP CPD BGE INC SUBD LDX BSR LDD SUBD LDX BSR JMP SUBD LDX BSR INC LDD SUBD LDX BSR JMP ADDD XGDY LDAA LDAB MUL BRCLR STD LDD SUBD STD LDAA SBCA STAA TST BEQ LDAB CLRA STD LDD Word_83 TOC5_ei #$0 Char_temp_2 TOC5_ej #$0001 Word_83 Word_Thpos #$0400 TOC5_ek #Word_Ypos Subroutine_56 #$0400 Word_Thpos #Word_Xpos Subroutine_56 TOC5_ak #$0800 TOC5_el Char_temp_2 #$0400 #Word_Xpos Subroutine_56 Char_temp_2 #$0800 Word_Thpos #Word_Ypos Subroutine_56 TOC5_ak #$0C00 TOC5_em Char_temp_2 #$0800 #Word_Ypos Subroutine_56 #$0C00 Word_Thpos #Word_Xpos Subroutine_56 TOC5_ak #$0C00 #Word_Xpos Subroutine_56 Char_temp_2 #$1000 Word_Thpos #Word_Ypos Subroutine_56 TOC5_ak #TABELLA_sin $00,Y Char_22 Char_temp_2,#$01,Subroutine_56_a Char_temp_3 $01,X Char_temp_3 $01,X $00,X #$00 $00,X Word_83 Subroutine_56_b $00,Y Char_temp_3 $00,X 103 Appendice C. Listato del KaOS SUBD STD RTS Subroutine_56_a ADDD STD LDAA ADCA STAA TST BEQ LDAB CLRA ADDD STD Subroutine_56_b RTS TOC4_Int TOC4_Int_b TOC4_Int_a TOC4_Int_c Array_1 fcb fcb fcb fcb LDX LDD ADDD STD BCLR LDAA ANDA ORAA TAB ANDB LDX ABX LDAB SUBB STAB CLC RORA RORA TAB ANDB RORA RORA RORA ANDA STAA LDX ABX LDAB SUBB STAB LDX BRSET LDD BEQ ADDD STD BCLR BSET BSET LDD BEQ ADDD STD BCLR BSET BSET BSET RTI Char_temp_3 $00,X $01,X $01,X $00,X #$0 $00,X Word_83 Subroutine_56_b $00,Y $00,X $00,X #Registers #$0050 TOC4,X TOC4,X TFLG1,X,#(B7+B6+B5+B3+B2+B1+B0) PORTE,X #(B3+B2+B1+B0) Char_47 #(B5+B4+B3+B2+B1+B0) Word_30 Char_48 $00,X Char_48 #(B5+B4+B3+B2+B1+B0) #(B7+B6+B5+B4) Char_47 Word_29 Char_49 $00,X Char_49 #Registers PORTD,X,#B4,TOC4_Int_a Word_PWM_cycl_L TOC4_Int_b TCNT,X TOC1,X OC1D,X,#B7 CFORC,X,#B7 OC1D,X,#B7 Word_PWM_cycl_R TOC4_Int_a TCNT,X TOC2,X TCTL1,X,#B6 CFORC,X,#B6 TCTL1,X,#B6 OC1D,X,#B7 000,255,001,254,000,255,001,254,000,255,001,254,000,255,001,254 001,000,254,255,001,000,254,255,001,000,254,255,001,000,254,255 255,254,000,001,255,254,000,001,255,254,000,001,255,254,000,001 254,001,255,000,254,001,255,000,254,001,255,000,254,001,255,000 Array_2 fcb 000,255,253,254,000,255,253,254,000,255,253,254,000,255,253,254 104 Appendice C. Listato del KaOS fcb 253,000,254,255,253,000,254,255,253,000,254,255,253,000,254,255 fcb 255,254,000,253,255,254,000,253,255,254,000,253,255,254,000,253 fcb 254,253,255,000,254,253,255,000,254,253,255,000,254,253,255,000 Array_3 fcb fcb fcb fcb 000,255,001,002,000,255,001,002,000,255,001,002,000,255,001,002 001,000,002,255,001,000,002,255,001,000,002,255,001,000,002,255 255,002,000,001,255,002,000,001,255,002,000,001,255,002,000,001 002,001,255,000,002,001,255,000,002,001,255,000,002,001,255,000 Array_4 fcb fcb fcb fcb 000,003,001,002,000,003,001,002,000,003,001,002,000,003,001,002 001,000,002,003,001,000,002,003,001,000,002,003,001,000,002,003 003,002,000,001,003,002,000,001,003,002,000,001,003,002,000,001 002,001,003,000,002,001,003,000,002,001,003,000,002,001,003,000 Subroutine_33 LDD STAA STD STD BSET RTS #$0000 Char_44 Word_intg_cur_L Word_intg_cur_R Char_58,#$80 Init_sonars LDAA STAA STAA STAA LDD STD LDAA STAA BSET RTS #$00 Char_89 Char_23 Char_sonar_rdng #$00EA Word_80 #$00 (Registers+PORTG) Char_58,#$01 * ----------------------------------------------------------------* Clear sonars * ----------------------------------------------------------------Clear_sonars BCLR Char_58,#$01 BCLR Char_oper_flags,#$01 LDAA #$00 STAA (Registers+PORTG) STAA Char_sonar_rdng RTS * ----------------------------------------------------------------* RS232 Init * ----------------------------------------------------------------RS232_Init LDAA #$FA STAA Char_32 CLRA STAA Char_33 STAA Char_34 LDAA #$04 STAA Char_Motorstatu LDAA #$01 STAA Char_35 STAA Char_36 CLR Char_2 LDAA #(B5+B3+B2) STAA (Registers+SCCR2) CLR (Registers+SCCR1) RTS * ----------------------------------------------------------------* RS232 Interrupt disable * ----------------------------------------------------------------RS232_R_int_dis JSR Subroutine_21 LDAA #(B3+B2) STAA (Registers+SCCR2) CLR (Registers+SCCR1) RTS 105 Appendice C. Listato del KaOS Subroutine_17 LDAA JSR LDX LDAA STAA LDAA STAA CMPA BEQ JMP PSHY INX INX LDY LDAA STAA BEQ INX INY BRA INX LDAA STAA INX LDAA STAA INX LDAA STAA INX LDAA STAA INX LDAA STAA INX LDAA STAA INX LDAA STAA INX LDAA STAA INX LDY LDAA STAA BEQ INX INY BRA INX XGDX SUBD STAB PULY JMP Subroutine_17_a Subroutine_17_b Subroutine_17_c Subroutine_17_d Subroutine_17_e 106 #$01 Delay_A_10s #Char_Byte_count #$03 $00,X Char_nr_comando $01,X #$02 Subroutine_17_a Data_packet_d #Array_name $00,Y $00,X Subroutine_17_c ;#EE_Array_Name Subroutine_17_b #$70 $00,X #$69 $00,X #$6F $00,X #$6E $00,X #$65 $00,X #$65 $00,X #$72 $00,X #$00 $00,X #Array_subcla $00,Y $00,X Subroutine_17_e Subroutine_17_d #$0120 Char_Byte_count Data_packet_d Array_subcla fcc fcb ’Pion1m’ 0 Array_name fcc fcb ’galavron’ 0 Subroutine_27 PSHY LDAB CMPB BLE INX CLRA XGDY $00,X #$02 Subroutine_27_a ;#EE_Array_Subcla Appendice C. Listato del KaOS DEY LDD Subroutine_27_c DEY BEQ DEY BEQ ADDD INX INX BRA Subroutine_27_b EORB INX Subroutine_27_a PULY RTS SCI_Int_b SCI_Int_e SCI_Int_c SCI_Int SCI_Int_a SCI_Int_d SCI_Int_f SCI_Int_h SCI_Int_j LDX LDAA STAA INX STX DEC BNE LDAA STAA CLR LDAA BITA BNE RTI LDAA LDAB BEQ BITA BNE BITA BEQ LDAA LDX LDAB PSHB ANDB STAB CLI LDAB CMPB BNE CMPA BNE LDAA STAA BRA CMPB BNE CMPA BNE LDAA STAA BRA CMPB BNE STAA BLT CMPA BGT STAA LDAA STAA BRA CMPB BNE LDY LDAB #$0000 Subroutine_27_a Subroutine_27_b $00,X Subroutine_27_c $00,X Word_50 $00,X (Registers+SCDR) Word_50 Char_36 SCI_Int_e #$2C (Registers+SCCR2) Char_2 (Registers+SCSR) #$28 SCI_Int_d (Registers+SCSR) Char_2 SCI_Int_a #$80 SCI_Int_b #$28 SCI_Int_c (Registers+SCDR) #Registers $22,X #$10 $22,X Char_32 #$FA SCI_Int_f #$FA SCI_Int_g #$FB Char_32 SCI_Int_g #$FB SCI_Int_h #$FB SCI_Int_i #$01 Char_32 SCI_Int_g #$01 SCI_Int_j $015D SCI_Int_i #$32 SCI_Int_i Char_33 #$02 Char_32 SCI_Int_g #$02 SCI_Int_i #$015D Char_35 107 Appendice C. SCI_Int_l SCI_Int_k SCI_Int_i SCI_Int_g Data_packet_d Data_packet_e Subroutine_28 Listato del KaOS ABY STAA INCB STAB DEC BGT LDX JSR DEY CPD BNE LDAA STAA BRCLR LDAA STAA BSR BRA LDAA STAA BRCLR LDAA STAA LDAA STAA LDAA STAA PULA STAA RTI TST BNE LDX STX INX INX JSR STD LDAA ADDA STAA LDAA STAA LDAA STAA RTS LDD STD LDX LDAA STAA INX LDAA INX CMPA BEQ CMPA BNE LDAA STAA INX LDAA STAA BRA Subroutine_28_b CMPA BNE LDAA STAA INX LDAA $00,Y Char_35 Char_33 SCI_Int_g #$015D Subroutine_27 $00,Y SCI_Int_k #$01 Char_34 Char_oper_flags,#$10,SCI_Int_l #$2B Display_char_16 Subroutine_28 SCI_Int_i #$02 Char_34 Char_oper_flags,#$10,SCI_Int_i #$2D Display_char_16 #$FA Char_32 #$01 Char_35 (Registers+TMSK1) Char_2 Data_packet_e #Word_Pak_header Word_50 Subroutine_27 $00,X Char_Byte_count #$3 Char_36 #$01 Char_2 #$AC (Registers+SCCR2) #$0000 Char_cmd_arg_1 #$015E $00,X Char_nr_comando $00,X #$FE Subroutine_28_a #$3B Subroutine_28_b $00,X Char_cmd_arg_2 $00,X Char_cmd_arg_1 Subroutine_28_a #$1B Subroutine_28_c $00,X Char_cmd_arg_2 $00,X 108 Appendice C. Listato del KaOS STAA LDD SUBD STD CMPA BNE LDAA STAA BLT CMPA BLE LDAA LDY INX LDAB INY STAB DECA BGT LDAA BRCLR ADDA STAA RTS Char_cmd_arg_1 #$0000 Char_cmd_arg_1 Char_cmd_arg_1 #$2B Subroutine_28_a $00,X Char_cmd_arg_2 Subroutine_28_a #$28 Subroutine_28_d #$28 #$00A0 Subroutine_32 BSET CLR CLR RTS Char_58,#$20 Char_45 Char_15 Subroutine_21 BCLR RTS Char_58,#$20 Data_packet LDX LDAA STAA INX LDAA ORAA STAA INX LDD ANDA STAB INX STAA INX LDD ANDA STAB INX STAA INX LDD ASRA RORB ASRA RORB STAB INX STAA INX LDD STAB INX STAA INX LDD STAB INX STAA INX #Char_Byte_count #$1B $00,X Subroutine_28_c Subroutine_28_d Subroutine_28_e Subroutine_28_a Subroutine_28_f $00,X $00,Y Subroutine_28_e Char_nr_comando Char_oper_flags,#$10,Subroutine_28_f #$30 Display_char_18 Char_Motorstatu #$30 $00,X Word_Xpos #$7F $00,X $00,X Word_Ypos #$7F $00,X $00,X Word_Thpos $00,X $00,X Word_Left_vel $00,X $00,X Word_Right_vel $00,X $00,X 109 Appendice C. Listato del KaOS Data_packet_b CLRA STAA INX LDAA STAA INX LDAA STAA INX LDD ASRA RORB ASRA RORB STAB INX STAA INX CLRA STAA INX STAA INX LDD LSRD STAB INX LDAA STAA INX TSTA BEQ LDY LDAA STAA INX LDD INY INY INY STAB INX STAA INX LDAA ADDA STAA DEC BGT LDD STD CLR LDD STAB INX STAA INX CLRA STAA INX LDAA STAA INX LDAA STAA INX JMP Data_packet_a Data_packet_c Subroutine_7 LDAA CLR CMPA BNE 110 ; Char_batt_level $00,X Char_stall_L $00,X Char_stall_R $00,X Word_ang_setpnt $00,X $00,X $00,X ; PTU Servo H $00,X ; PTU Servo L #$0000 ; Word_Compass $00,X Char_sonar_rdng $00,X Data_packet_a #Sonars_buffer $02,Y $00,X $00,Y $00,X $00,X Char_Byte_count #$3 Char_Byte_count Char_sonar_rdng Data_packet_b #$00EA Word_80 Char_sonar_rdng #$0005 $00,X $00,X ; ADR3 - Analog Input $00,X DIGITAL_INPUT $00,X Char_Dig_output $00,X Data_packet_d Char_34 Char_34 #$01 Subroutine_7_a Appendice C. Subroutine_7_a Subroutine_7_b SETV SETV_a SETV_b SETRV SETRV_a SETRV_b Listato del KaOS LDAA CMPA BNE ADDA STAA JSR LDAA INCA STAA CMPA BLE LDAB STAB RTS CLR LDAA STAA LDAB RTS LDD BLT LSRD CPD BLT LDD STD NEGB ADCA NEGA STD RTS LDD BLT LSLD LSLD CPD BLT LDD STD NEGB ADCA NEGA STD RTS Char_nr_comando Char_38 Subroutine_7_b #$30 Display_char_5 Subroutine_17 Char_38 Char_38 #$02 Subroutine_7_a #$00 Char_Motorstatu Char_38 #$33 Display_char_5 #$00 Char_cmd_arg_1 SETV_b #$01A0 SETV_a #$01A0 Word_36 #$0 Word_37 Char_cmd_arg_1 SETRV_b #$0100 SETRV_a #$0100 Word_32 #$0 Word_33 SET_ORIGIN LDD STD STD STD STD STD RTS #$0000 Word_ang_setpnt Word_Xpos Word_Ypos Word_Thpos Word_7 DIGOUT LDAA COMA ANDA LDAB ANDB STAB ORAA STAA STAA RTS Char_cmd_arg_1 BCLR LDAA STAA BSET LDD ADDD STD RTS Char_Dig_output,#B4 Char_Dig_output DIGITAL_OUTPUT Char_Kicker,#B4 Word_millisec #$01F4 Word_Rkick RIGHT_KICK Char_Dig_output Char_cmd_arg_2 Char_cmd_arg_1 Char_cmd_arg_1 Char_cmd_arg_1 Char_Dig_output DIGITAL_OUTPUT 111 Appendice C. Listato del KaOS VEL2 BCLR LDAA LDAB BGE LDAA LSLD STD LDAA LDAB BGE LDAA LSLD STD RTS Char_58,#$08 #$00 Char_cmd_arg_1 VEL2_a #$FF LDAA CLR CMPA BNE LDAA STAA LDAA CMPA BEQ CMPA BEQ CMPA BEQ CMPA BEQ CMPA BEQ CMPA BEQ CMPA BNE JMP CMPA BNE JMP CMPA BNE JMP CMPA BNE JMP CMPA BNE JMP CMPA BNE JMP RTS Char_34 Char_34 #$01 Command_exec_l #$64 Char_watcdg_cnt Char_nr_comando #$01 OPEN_MOTORS #$02 CLOSE_MOTORS #$07 SET_ORIGIN #$1E DIGOUT #$20 VEL2 #$30 RIGHT_KICK #$0B Command_exec_b VEL #$0D Command_exec_c DHEAD #$0C Command_exec_d HEAD #$15 Command_exec_j RVEL #$06 Command_exec_k SETV #$0A Command_exec_l SETRV CLOSE_MOTORS LDAA STAA LDD JSR JSR JSR JMP #$04 Char_Motorstatu #$0000 Clear_sonars Subroutine_35 Subroutine_21 CLOSE_MOTORS_a OPEN_MOTORS LDD STD STD STD STD STD STD STD STD #$0000 Word_12 Word_14 Word_51 Word_13 Word_ang_setpnt Word_Xpos Word_Ypos Word_Thpos VEL2_a VEL2_b Command_exec Command_exec_a Command_exec_b Command_exec_c Command_exec_d Command_exec_j Command_exec_k Command_exec_l 112 Word_56 #$00 Char_cmd_arg_2 VEL2_b #$FF Word_57 ;EE_Char_Watchdg Appendice C. VEL VEL_a VEL_b VEL_c VEL_d DHEAD DHEAD_a DHEAD_b DHEAD_c Listato del KaOS STD STD LDD STD LDD STD LDD STD LDD STD LDAA STAA LDAB STAB LDD STD LDD STD LDD STD LDD STD JSR JSR JSR JSR JSR JMP Word_7 Char_stall_L #$0100 Word_32 #$FF00 Word_33 #$01A0 Word_36 #$FE60 Word_37 #$02 Char_Motorstatu #$07 Char_24 #$0001 Char_41 #$0203 Word_53 #$0405 Word_54 #$0607 Word_55 Init_sonars Set_motors_on Subroutine_31 Subroutine_32 Subroutine_33 Subroutine_34 BRSET JSR LDD ASRA RORB STD ASRA RORB ASRA RORB NEGB ADCA NEGA ADDD CPD BLE LDD CPD BGE LDD STD RTS Char_58,#$08,VEL_a Subroutine_34 Char_cmd_arg_1 BRSET JSR BSET CLR LDD BGE NEGB INC LDAA MUL LSRD LSRD LSRD LSRD TST BEQ NEGB ADCA NEGA ADDD Char_58,#$08,DHEAD_a Subroutine_34 Char_59,#$02 Char_temp_2 Char_cmd_arg_1 DHEAD_b Char_cmd_arg_1 #$0 Char_cmd_arg_1 Word_36 VEL_c Word_36 Word_37 VEL_d Word_37 Word_14 Char_temp_2 #$B6 Char_temp_2 DHEAD_c #$0 Word_ang_setpnt 113 Appendice C. DHEAD_d DHEAD_e HEAD HEAD_a HEAD_b HEAD_c HEAD_d HEAD_e RVEL RVEL_a RVEL_b RVEL_c RVEL_d Test_Dig_in Test_Dig_in_a Test_Motors Listato del KaOS BLT CPD BLT SUBD BRA ADDD STD RTS DHEAD_d #$1000 DHEAD_e #$1000 DHEAD_e #$1000 Word_ang_setpnt BRSET JSR BSET CLR LDD TSTA BEQ BGT ADDD BRA INC LDAA MUL LSRD LSRD LSRD LSRD TST BEQ ADDD BLT CPD BLT SUBD BRA Char_58,#$08,HEAD_a Subroutine_34 Char_59,#$02 Char_temp_2 Char_cmd_arg_1 BRSET JSR BCLR LDD ASRA RORB STD ASRA RORB ASRA RORB NEGB ADCA NEGA ADDD CPD BLE LDD CPD BGE LDD STD RTS HEAD_d HEAD_c #$0168 HEAD_b Char_temp_2 #$B6 Char_temp_2 HEAD_e #$0B61 DHEAD_d #$1000 DHEAD_e #$1000 DHEAD_e Char_58,#$08,RVEL_a Subroutine_34 Char_59,#$02 Char_cmd_arg_1 Char_cmd_arg_1 #$0 Char_cmd_arg_1 Word_36 RVEL_c Word_36 Word_37 RVEL_d Word_37 Word_51 LDX BRCLR LDAA LDAB JSR LDAA JSR TSTA BEQ RTS #Registers $00,X,#$04,Test_Dig_in_a DIGITAL_INPUT #$07 Write_A_as_bin #$01 Dly_A_10s_brk LDX BRCLR #Registers $00,X,#$04,Test_Motors_a Test_Dig_in 114 Appendice C. Listato del KaOS JSR LDAA STAA LDD STD LDD STD LDAA JSR TSTA BNE LDD STD LDAA JSR TSTA BNE LDD STD LDAA JSR TSTA BNE Set_mottst_flag #$01 Char_motor_test #$0000 Word_56 #$0032 Word_57 #$64 Dly_A_10s_brk Test_Motors_a #$0078 Word_57 #$14 Dly_A_10s_brk Test_Motors_a #$FFC4 Word_57 #$32 Dly_A_10s_brk Test_Motors_a LDD #$0000 * Le due righe seguenti spengono il ciclo della PWM delle due ruote. PROVA. Test_Motors_a Test_CPU Test_CPU_a Test_CPU_b STD STD Word_PWM_cycl_L Word_PWM_cycl_R STD LDD STD LDAA JSR TSTA BNE LDD STD LDAA JSR TSTA BNE LDD STD LDAA JSR LDAA STAA JMP Word_57 #$0032 Word_56 #$64 Dly_A_10s_brk LDX JSR JSR LDAA STAA LDY LDD ADDD LDX INY BRCLR NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP Test_Motors_a #$0078 Word_56 #$14 Dly_A_10s_brk Test_Motors_a #$FFC4 Word_56 #$32 Dly_A_10s_brk #$00 Char_motor_test CLOSE_MOTORS_a #MSG_cpu_pct String_to_buf OPEN_MOTORS #$0A Char_temp #$0000 Word_millisec #$03E8 #Registers $00,X,#$04,Test_CPU_c 115 Appendice C. Listato del KaOS Test_CPU_c CPD BNE XGDY LDX IDIV XGDX XGDY LDAB JSR DEC BGT JMP #$0A Wri_Y_3_digit Char_temp Test_CPU_a CLOSE_MOTORS MSG_cpu_pct fcc fcb ’CPU %:’ 0 Subroutine_10 JSR TSTB BNE RTS JSR CMPA BLO CMPA BNE LDAA JMP PSHA JSR PSHX PULY JSR PULA CMPA BEQ CMPA BEQ CMPA BEQ CMPA BEQ CMPA BEQ CMPA BEQ CMPA BEQ RTS LDAA JSR BRA XGDY STAB BRA JMP XGDY ANDA STAA ORAB STAB LDAA BRA XGDY PSHB PSHX PULA PULB ABA PULB ABA STAA TSTB SCI_poll_A Subroutine_10_a Subroutine_10_b Subroutine_10_c Subroutine_10_d Subroutine_10_g Subroutine_10_e Subroutine_10_j Subroutine_10_f Word_millisec Test_CPU_b #$01F4 Subroutine_10_a SCI_send_A #$61 Subroutine_10 #$73 Subroutine_10_b #$3E SCI_send_A SCI_get_X SCI_get_X #$72 Subroutine_10_c #$77 Subroutine_10_d #$63 Subroutine_10_e #$62 Subroutine_10_f #$67 Subroutine_10_g #$70 Subroutine_10_h #$65 Subroutine_10_i $00,X SCI_send_A Subroutine_10_j $00,X Subroutine_10_j Startup $00,X $00,X $00,X $00,X #$3E SCI_send_A Char_temp_5 116 Appendice C. Listato del KaOS BEQ Subroutine_10_k JSR STAA STAA ADDA STAA INX DECB BNE DEX Subroutine_10_l LDAA CMPA BNE Subroutine_10_m LDAA JSR BRA Subroutine_10_h XGDX PSHB JSR CLR PULB BLT TBA BRA Subroutine_10_i XGDX CLR BRA Subroutine_10_m SCI_get_A $00,X Char_81 Char_temp_5 Char_temp_5 SCI_get_X JSR PSHA JSR TAB PULA XGDX RTS SCI_get_A SCI_get_A LDAA ANDA BEQ LDAA RTS (Registers+SCSR) #$28 SCI_get_A (Registers+SCDR) SCI_poll_A LDAB LDAA ANDA BEQ LDAB LDAA RTS #$00 (Registers+SCSR) #$28 SCI_poll_A_a #$01 (Registers+SCDR) SCI_poll_A_a SCI_send_A Subroutine_10_k $00,X Char_81 Subroutine_10_l Char_temp_5 SCI_send_A Subroutine_10_j Clear_sonars Char_oper_flags Subroutine_10_j Subroutine_10_j Char_oper_flags Subroutine_10_j SCI_get_A LDAB (Registers+SCSR) ANDB #$80 BEQ SCI_send_A STAA (Registers+SCDR) RTS * ----------------------------------------------------------------* LCD Write Register A As Bin * ----------------------------------------------------------------Write_A_as_bin LDX #Display_buffer ABX LDAB #$30 BITA #$80 BEQ W_A_as_bin_a LDAB #$31 W_A_as_bin_a STAB $00,X INX LDAB #$30 BITA #$40 BEQ W_A_as_bin_b LDAB #$31 W_A_as_bin_b STAB $00,X INX 117 Appendice C. W_A_as_bin_c W_A_as_bin_d W_A_as_bin_e W_A_as_bin_f W_A_as_bin_g W_A_as_bin_h W_A_as_bin_i Listato del KaOS LDAB BITA BEQ LDAB STAB INX LDAB BITA BEQ LDAB STAB INX LDAB BITA BEQ LDAB STAB INX LDAB BITA BEQ LDAB STAB INX LDAB BITA BEQ LDAB STAB INX LDAB BITA BEQ LDAB STAB INX LDAB PSHX LDX BRCLR LDAB PULX STAB RTS #$30 #$20 W_A_as_bin_c #$31 $00,X #$30 #$10 W_A_as_bin_d #$31 $00,X #$44 #$08 W_A_as_bin_e #$20 $00,X #$43 #$04 W_A_as_bin_f #$20 $00,X #$42 #$02 W_A_as_bin_g #$20 $00,X #$41 #$01 W_A_as_bin_h #$20 $00,X #$30 #Registers PORTD,X,#B4,W_A_as_bin_i #$31 $00,X Return_from_INT RTI RSEG JMP BOOTMODE Startup RSEG LSRD INX EFFE RSEG FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB IVECT Return_from_INT Return_from_INT Return_from_INT Return_from_INT Return_from_INT Return_from_INT Return_from_INT Return_from_INT Return_from_INT Return_from_INT Return_from_INT SCI_Int Return_from_INT Return_from_INT Return_from_INT Return_from_INT TOC5_Int 118 Appendice C. Listato del KaOS FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB end TOC4_Int Return_from_INT Return_from_INT Return_from_INT Return_from_INT Return_from_INT Return_from_INT Return_from_INT Return_from_INT Return_from_INT Return_from_INT Startup Return_from_INT Return_from_INT Startup 119 Ringraziamenti Ringrazio in primo luogo il prof. Giovanni Adorni per la disponibilità e l’attenzione con cui ha seguito lo sviluppo del lavoro descritto in questa tesi e per l’impegno messo nel coordinamento di Azzurra Robot Team nell’ambito del progetto RoboCup Italia, senza cui questo lavoro non sarebbe stato possibile. Desidero ringraziare anche l’ing. Stefano Cagnoni e l’ing. Monica Mordonini che hanno messo costantemente a disposizione il proprio tempo e le proprie competenze nella realizzazione dei robot. Ringrazio i colleghi studenti che hanno partecipato alla progettazione e realizzazione dei robot per la RoboCup, creando un sereno ambiente di collaborazione: Enzo Bocelli, Marcello Carletti, Frida Loprieno, Giovanni Remondini, Massimo Romano, Cristiano Rota. Voglio infine ringraziare i membri del Dipartimento di Ingegneria dell’Informazione e degli altri dipartimenti che hanno supportato con entusiasmo il nostro progetto, in particolare il prof. Giovanni Franceschini per la grande e continua disponibilità. 120 Bibliografia [1] ActivMedia Inc. Pioneer Mobile Robot Operation Manual. ActivMedia Inc., ott. 1997. [2] ActivMedia Inc. e Real World Interface Inc. Saphira Manual - Version 6.1. ActivMedia Inc., gen. 1998. [3] G. Adorni, S. Cagnoni e M. Mordonini. Genetic programming of a goalkeeper control strategy for the RoboCup middle size competition. Department of Computer Engineering, University of Parma. [4] N. Barkakati. I segreti di Red Hat Linux. Apogeo, 1999. ISBN 88-7303-482-9. [5] R. A. Brooks. A layered intelligent control system for a mobile robot. IEEE Journal of Robotics and Automation, vol. RA-2:pp. 14–23, apr. 1986. [6] F. Cappelli. Robot mobile PIONEER 1: Caratterizzazione dei servomotori e del carico. Modello dinamico del sistema. Università di Roma “La Sapienza”, dic. 1999. [7] G. Franceschini. Appunti di Azionamenti Elettrici per l’Automazione. Università di Parma, A.A. 1999-2000. [8] J. Iovine. Robots, Androids and Animatrons: 12 incredible projects you can build!. McGraw-Hill, 1998. ISBN 0-07-032804-8. [9] J. L. Jones, A. M. Flynn e B. A. Seiger. Mobile Robots: Inspiration to Implementation, 2nd ed.. AK Peters Ltd, nov. 1998. ISBN 1-56881-097-0. 121 Bibliografia 122 [10] H. Kitano e M. Asada. RoboCup: e ora in campo gli automi. Le Scienze, vol. 372:pp. 32–42, ago. 1999. [11] K. Konolige, K. L. Myers, E. H. Ruspini e A. Saffiotti. The Saphira architecture: A design for autonomy. Journal of Experimental and Theoretical Artificial Intelligence, 1997. [12] P. Maes e R. A. Brooks. Learning to coordinate behaviors. In AIII, pp. 796–802. Boston, MA, ago. 1990. [13] F. G. Martin. The 6.270 Robot Builder’s Guide, 2nd ed.. Massachusetts Institute of Technology, dic. 1992. [14] G. McComb. The Robot Builder’s Bonanza: 99 inexpensive robotics projects. TAB Books, a division of McGraw-Hill, 1987. ISBN 0-8306-2800-2. [15] Motorola Inc. HC11: MC68HC11 Technical Data. Rap. tecn., Motorola Inc., 1995. [16] Motorola Inc. Motorola M68HC11 Reference Manual Rev.3. Motorola Inc., 1996. [17] D. Nardi, G. Clemente e E. Pagello. ART - Azzurra Robot Team. Progetto RoboCup Italia. [18] M. Piaggio, A. Sgorbissa e L. Tricerri. ETHNOS Kernel User Manual. Rap. tecn., Università di Genova, gen. 1999. Dipartimento di Informatica, Sistemistica e Telematica. [19] M. Piaggio, A. Sgorbissa e R. Zaccaria. A programming environment for real time control of distributed multiple robot systems. Dipartimento di Informatica, Sistemistica e Telematica, Università di Genova. [20] S. J. Russel e P. Norvig. Artificial Intelligence. A Modern Approach. PrenticeHall, 1995. Bibliografia 123 [21] P. Stroppa. L’occhio, questo sconosciuto. Nuovo Orione, vol. 66:pp. 26–31, nov. 1997. [22] P. Zamperoni. Metodi di elaborazione digitale di immagini. Masson, Milano, Italy, 1990. Casa editrice
Documenti analoghi
GUIDA AL NOMAD XR4000
Roma Tor Vergata è stato prodotto nell'anno 2000 dalla Nomadic Technologies,
società con sede nella Silicon Valley, CA, USA. Tale società però è stata in seguito
assorbita dalla 3Com Technologies I...