“MINIWALK” UN SEMPLICE ED ECONOMICO WALKER ROBOT ( breve Tutorial e appunti vari, ad uso di esordienti e principianti, di Mini-ROBOTICA) di Gianni Bigi: [email protected] Premessa: Costruire un minirobot non è semplicissimo ma nemmeno difficile, tutti possono metterlo in pratica, è sufficiente avere normali capacità manuali, o qualche esperienza di modellismo o bricolage. Tutti coloro che volessero, in qualità di esordienti, cimentarsi nella realizzazione di un minirobot possono farlo tranquillamente, basterà seguire, con attenzione, le indicazioni e le nozioni che andremo ad esporre, certi che arriveranno a compimento dell’opera senza grandi difficoltà. Generalità del minirobot esapode “miniwalk” Il “miniwalk” è un minirobot esapode, paragonabile ad un ragno che, per la sua locomozione, si avvale di sei gambe invece delle normali otto zampe di tutti gli aracnidi. Si è preferito descrivere e illustrare un cosiddetto walker-robot anziché un tipo a ruote perché, a nostro avviso, più spettacolare nei suoi movimenti e più gratificante per chi lo realizza e presenta ad amici e conoscenti. La camminata, ottenuta con solo due servo-motori, è basata sul semplice principio di alternare l’appoggio a terra di tre gambe (delle sei in uso); la centrale e le due opposte laterali, permettendo con tale posizionamento l’effettuazione del movimento di spostamento in avanti di tutto il corpo del robot. La sequenza dei comandi, da impartire ai due servo-motori, per l’avanzamento e per il posizionamento alternato delle tre gambe, è regolata da un apposito programma scritto in linguaggio PicBasic Pro (descritto e illustrato più avanti) inserito (caricato) in un microcontrollore PIC 16F876 della Microchip, impiegato per lo scopo. La realizzazione di “miniwalk” dovrà iniziare costruendo prima le parti meccaniche (Fase 1) e successivamente quelle elettroniche (Fase 2), che, ripetiamo, saranno semplici e di facile esecuzione, l’esposizione sarà completata con l’illustrazione delle tecniche ardware e software di programmazione del robot (Fase 3). Nel corso dell’illustrazione saranno toccati diversi argomenti connessi alla minirobotica, ogni volta si cercherà, in modo semplice, di chiarirli e illustrarli, con descrizioni, note, consigli e suggerimenti di collegamento a link di Internet correlati all’argomento trattato. Sarà perciò utile, per integrare e arricchire gli argomenti trattati, disporre di un Personal Computer (PC) con Sistema Operativo Windows 2000 o Me o XP, con porta seriale e parallela, e preferibilmente anche, una o più, porte di tipo USB. Elenchiamo qualche link (dei migliaia presenti in rete) per un’iniziale informazione e documentazione sui walker robot: http://utenti.lycos.it/ulix/robotic/index.html sito in lingua italiana (selezionare-> costruire il bugbot) http://www.robotfactory.it sito in lingua italiana (selezionare:-> archivio: robotica: robot spider) http://www.lynxmotion.com/Category.aspx?CategoryID=31 (selezionare-> Assembly Guides Tutorials) Per chi volesse approfondire ulteriormente l’argomento, consigliamo di cercare su Internet (tramite Google), “mini walker robot” e/o altre varianti delle diciture walker robot, mini robot, ecc. 1 gli utensili necessari per la costruzione Per la costruzione del mini robot, sono necessari dei normali e usuali utensili es.: seghetto per ferro, seghetto per traforo, pinze, cacciaviti, tronchesino, trapano elettrico, punte da trapano, saldatore elettrico, martello, morsetto da tavolo, piccolo incudine da tavolo, calibro, bulino, chiavetta inglese da 5,5 mm, diverse lime da ferro, cesoia, forbice da elettricista, ecc.. Utensili normalmente presenti in ogni casa o di normale dotazione degli hobbisti. i materiali occorrenti per costruire il robot “miniwalk”: Nota di chiarimento: i materiali, elencati più sotto, possono essere reperiti nei normali negozi di ferramenta e di aeromodellismo, oppure, per alcuni di loro, se difficili da rintracciare, ad es. servo comandi, snodi Uniball, forcelle di plastica e/o tiranteria varia, si possono richiedere via Internet a: 1) www.modelweb.it (ricercare-> uniball e/o tiranteria) 2) www.f3modellismo.it (ricercare-> accessori R/C ->acc.rinvii) 3) www.modellismo.it (categoria: Utensili & accessori minuterie, ditta TM) (categoria: Elettronica, radiocomandi, servocomandi) Si sono elencati, solo tre dei numerosissimi siti e negozi on-line che Internet cataloga alla voce aeromodellismo (per eventuali preferenze, vi è solo l’imbarazzo della scelta). a) i materiali della parte meccanica: 1) 2) 3) 4) 5) 6) 7) 8) 9) 10) 11) 12) 13) 14) 15) 16) 17) 18) profilato angolare ad L in alluminio (20mm x 20mm spess. 1,5 mm, 1 mt di lungh.) profilato quadrangolare in alluminio (8mm x 8mm, 1 mt di lungh.) profilato quadrangolare in alluminio (6mm x 6mm, 1 mt di lungh.) barretta in alluminio (largh. 10mm x 2mm di spessore, 0,5 mt di lungh.) diverse viti da 3mm. (circa 80 o più) di diversa lunghezza (10,12,14,16 e 20mm) (a testa piana e per cacciavite a brugola, alcune a testa svasata) diverse rondelle (circa 60) per viti da 3mm diversi bulloncini per viti da 3mm (60 di tipo normale e 20 di tipo autobloccante) tavoletta o laminato di ottone o rame di 10mm x 10mm di 1 mm. di spessore tavoletta o laminato di ottone o rame di 10mm x 10mm di 0,5 mm di spessore astina quadrangolare in ottone da 1,5mm x 1,5mm lungh. 0,5 mt barretta filettata da 3mm lungh. 0,5 mt. n° 2 piccole cerniere con fori da 3mm (per il fissaggio al telaio delle gambe centrali) n° 4 distanziali lunghi 40mm (con vite da 3 mm) n° 4 giunti snodabili tipo Uniball, (per aeromodelli) n° 4 forcelle in plastica con vite (per aeromodelli) alcune fascette autoadesive in velcro (per il fissaggio al telaio dei porta batterie) una piccola filiera per viti da 3 mm tubetto di colla Loctite tipo Super Attak 2 b) i materiali della parte elettronica: 1) 2) 3) 4) 5) 6) 7) 8) 9) un paio di mt di filo elettrico rigido per i collegamenti elettrici (es. doppino telefonico) 1 mt di filo elettrico flessibile per i collegamenti elettrici 1 piastrina millefori (50mm x 100mm) per circuiti elettronici 1 microcontrollore PIC 16F876 o PIC 16F876A della ditta Microchip portabatterie 1 microcontrollore PIC 12F508 oppure 12F629 della ditta Microchip 1 integrato MAX 232 della ditta Maxim 1 portabatterie da 4 pile di tipo verticale (vedi foto a fianco) 1 sensore IS1U60 Sharp 2 IR Led codice SFH4802 Osram-Siemens sensori e Led possono essere richiesti a fornitori locali di componenti elettronici oppure via Internet a: www.rs-components.it [cod. 577-897 e 221-5131] http://it.farnell.com http://www.robot-italy.com (possono fornire anche i servocomandi Hitec) o in altri analoghi siti alla voce optoelettronica. 10) 2 servocomandi tipo HS - 635HB oppure tipo HS - 475HB della ditta Hitec 11) diversi componenti tipo resistenze, condensatori, connettori, interruttori ecc., (vedi elenco completo dallo schema del circuito di Fig. 4 e di Fig. 5 a pag. 14) 12) 1 tester, possibilmente digitale, per controllo e verifica del circuito elettronico - Piccola notazione di carattere economico: Il numero di attrezzature e di materiali elencati, configurerebbe il “miniwalk” non molto economico e in contrasto con quanto dichiarato dal titolo della pubblicazione, ma, per arrivare al compimento dell’opera, essi dovranno essere compresi nel budget del progetto. Si può far notare che molti di loro sono di basso costo e quindi accessibili a tutte le borse, s’ipotizza inoltre che diversi attrezzi e materiali siano già in possesso di chi s’interessa di piccoli lavori domestici, di bricolage, di modellismo, ecc. L’economicità di “miniwalk”, cui ci si riferisce, consiste nell’utilizzo di soli due servo motori (i componenti dei minirobot, di solito, più costosi) invece dei tre servo motori che, generalmente, sono impiegati nei walking-robot a sei zampe. 3 FASE – 1 (l’ardware meccanico) COSTRUZIONE degli elementi del telaio: Foto 1 (gli elementi del telaio) La prima cosa da fare è la preparazione degli elementi, in alluminio, del telaio di “miniwalk” (vedi Foto 1, a fianco) a) Longheroni del telaio: con il seghetto ritagliare, dal profilato angolare a L (in alluminio di 20 x 20mm), n° 2 pezzi lunghi rispettivamente 160mm, (vedi Foto 1) ed eseguire con il trapano (su ognuno), 9 fori da 3mm (dal n. 1 al n. 9), come indicato in Fig. 1 (sui fori, n° 3, eseguire anche una svasatura per potervi alloggiare una vite a testa svasata). b) Assali quadrangolari (posteriori) di collegamento ai longheroni ritagliare, dal profilato quadrangolare in alluminio (di 8 x 8 mm), n° 2 pezzi, lunghi ciascuno 60mm, (vedi Foto 1), ed eseguire su di loro, 4 fori da 3mm, come indicato in Fig. 1 (assicurarsi di spianare ortogonalmente con una lima, le teste di ogni assale) c) Assale quadrangolare (centrale) di collegamento ai longheroni ritagliare, dal profilato quadrangolare in alluminio (di 8 x 8 mm), n° 1 pezzo lungo 60mm, (vedi Foto 1), ed eseguire su un lato 2 fori da 3mm e, sul lato adiacente, altri 2 fori da 3mm, come indicato in Fig. 1 d) Assale piatto (anteriore) di collegamento ai longheroni ritagliare dalla barretta in alluminio (larga 10mm x 2mm di spessore) n° 1 pezzo lungo 60mm (vedi Foto 1), ed eseguire su di esso, 2 fori da 3mm, come indicato dalle quote di Fig. 1 Nota informativa sulla funzione dei fori da effettuarsi sui longheroni (vedi Fig. 1 e Foto 1) - i fori numerati 1, 3, 7 e 9 servono per l’unione degli assali ai longheroni - i fori numerati 2 servono per il montaggio (piazzamento) delle gambe motrici posteriori, - i fori numerati 5 e 6 servono per il montaggio delle cerniere delle gambe centrali, - i fori numerati 4 e 8 servono per il montaggio dei distanziali (di sostegno del circuito elettronico). 4 Fig. 1 quotazioni degli elementi del telaio (i fori sono tutti di 3mm di diametro) Allineamento (ortogonale) dei fori: Senza l’ausilio di apposite attrezzature (tipo trapano d’officina a colonna) i fori potrebbero risultare non perfettamente allineati. Per migliorare il loro allineamento agire, sui fori, con una piccola lima di tipo tondo-conico, di 2 mm di diametro. Foto 2 (veduta del telaio montato) Assemblaggio del telaio: (fare riferimento a Foto 2 e 2A) Unire fissandoli ai longheroni (con viti da 3mm): 1) i primi 2 assali quadrangolari, (ponendoli sotto ai longheroni), con viti lunghe 14mm (x i fori 3, usare quelle con testa svasata) Bloccare con dadi e rondelle, per dare rigidità al telaio. Per la sistemazione riferirsi a Foto 2 e ai fori 1 e 3 di Fig. 1) 2) il terzo assale, ponendolo sopra ai longheroni, (fori 7 di Fig. 1) 3) l’ultimo assale, ponendolo sotto i longheroni con viti lunghe 25mm, con dadi e controdadi di fissaggio, posti sopra ai longheroni, (Foto 2 e fori 9 di Fig. 1) 5 Ultimazione del telaio (con montaggio delle viti di ancoraggio delle gambe posteriori) (con piazzamento (di prova) dei distanziali di sostegno del circuito elettronico) Foto 2A (veduta del telaio ultimato) - Montare nei fori 2, n° 2 viti da 3mm lunghe 25mm, ponendo il dado e controdado di fissaggio sopra i longheroni del telaio, (vedi Fig. 1 e Foto 2A) - Montare (per prova) nei fori 4 e 8, i 4 distanziali di sostegno del circuito elettronico, fissandoli con i dadi, posti sotto il telaio, (vedi Fig. 1 e Foto 2A) La foto a fianco evidenzia chiaramente come deve presentarsi il telaio dopo queste ultime operazioni. Consiglio: Per facilitare le successive fasi di assemblaggio, smontare i 4 “distanziali” di sostegno del circuito” Saranno rimontati, successivamente, insieme al circuito elettronico. 6 Fig. 2 (quotazioni delle gambe) COSTRUZIONE DELLE GAMBE: Gambe posteriori (motrici ) Ritagliare, dal profilato quadrangolare in alluminio (6 x 6mm), n° 2 pezzi, lunghi ciascuno 125mm, ed eseguire su di essi i fori da 3mm e da 2,5mm (questi ultimi dovranno essere filettati per viti da 3mm) vedi quotazioni di Fig. 2, (avendo cura di spianare ortogonalmente le teste, con una lima). Eseguire sulle teste di ciascun pezzo, con un seghetto, la scanalatura indicata e quotata in Fig. 2, e spianarla con l’aiuto di una sottile lima piatta di 1 mm di spessore (vedi Foto 3) Effettuare su entrambe le gambe una curvature di circa 25° per il primo tratto e di circa 10° per il secondo tratto (vedi quotazioni di Fig. 2) Gambe centrali (di inclinazione robot): Ritagliare, dal profilato quadrangolare in alluminio (6 x 6 mm), n° 2 pezzi, lunghi ciascuno 90mm, (vedi Foto 3), ed eseguire su di essi i fori da 3mm come indicato dalle quote di Fig. 2 Effettuare le stesse curvature di quelle posteriori (vedi Foto 3). F Foto 3 prototipi delle gambe, (già curvate) Gambe anteriori (libere): Ritagliare, dal profilato quadrangolare in alluminio (6 x 6mm), n° 2 pezzi, lunghi ciascuno 11cm, ed eseguire su di essi i fori da 3mm e da 2,5 mm come indicato dalle quote di Fig. 2 Effettuare su entrambe le gambe le stesse curvature eseguite per quelle posteriori e centrali (vedi Foto 3) Nota: Successivamente (vedi più avanti “montaggio gambe”), per i possibili errori derivanti dalle operazioni di curvatura, potrebbe rendersi necessaria, una messa a punto dell’allineamento e dell’appoggio a terra, delle 6 gambe, sia nel senso verticale, che in quello orizzontale. Questa messa a punto potrà essere eseguita agendo nuovamente sulle curvature o limando la parte di appoggio a terra, di quella (o quelle) gamba che risultasse non perfettamente allineata nei confronti delle altre. 7 COSTRUZIONE degli elementi di collegamento alle gambe: Fig. 3 a) Bracci Motori (bilanciere in ottone e braccio plastico) (quotazioni degli elementi di collegamento-gambe) 1 - Ritagliare, dalla tavoletta di ottone o rame (di 1mm di spessore) un pezzo rettangolare di 34mm x 7,5mm. eseguendo su di esso un foro centrale di 3mm e due fori laterali di 1 mm (vedi quotazioni di Fig 3 e Foto 4) Infilare, in ogni foro laterale, un chiodino da 1 mm di diametro e saldarne la testa al rettangolo ritagliato in fase 1, (troncandoli alti circa 10mm). 2 - Eseguire, con il traforo, sul braccio di plastica (fornito in dotazione ai servo-motori) una scanalatura rettangolare larga 1,5mm, lunga 8,5mm come visibile in Fig. 3 e in Foto 4 b) Cerniere di attacco gambe centrali -Ritagliare e sagomare solo un lato, delle cerniere come indicato in Fig. 3 e Foto 4 - Montare le cerniere sulle gambe centrali con viti da 3mm lunghe 10mm fissandole con dado (vedi foto “gambe miniwalk” di pagina 10) c) Angolari di aggancio (delle forcelle di plastica) alle gambe centrali - Ritagliare dalla tavoletta di ottone o rame di 0,5 mm due piccoli rettangoli, di 9 x 6,5mm eseguendo su di essi due fori (uno da 3mm ed uno da 1mm) , come indicato in Fig. 3, piegandoli di 90° (ad L) (vedi Foto 4) Foto 4 (gli elementi di collegamento delle gambe) d) Asta di collegamento alle gambe centrali - Ritagliare, dalla tavoletta di ottone o rame (di 1mm di spessore) un pezzo rettangolare di 15mm per 8mm, eseguendovi un foro da 1mm, vedi quotazioni di Fig 3, e infilare in esso un chiodino da 1mm di diametro saldandone la testa al rettangolo. Saldare quindi al rettangolo l’astina quadrangolare in ottone di 1,5 x 1,5 mm lunga circa 120 mm. (vedi quotazioni di Fig 3) - Infilare sull’astina le relative forcelle in plastica (elementi visualizzati in Foto 4 e Foto b di pag. 10 ) e) Aste filettate (3mm) di collegamento alle gambe laterali (con snodi Uniball) - Avvitare sulle due aste filettate lunghe, ciascuna, circa 125mm gli snodi Uniball (vedi elementi in Foto 4 e Foto C di pag. 12 ) 8 Montaggio e installazione dei servo-motori: Dopo aver assemblato il telaio occorre montare sui rispettivi assali, i 2 servo-motori (tipo HS - 635HB o tipo HS - 475HB della ditta Hitec o di altre ditte similari tipo Futaba ecc.) utilizzando viti da 3mm, lunghe 16mm, con relativo dado e rondella di tenuta. (vedi Foto 5) I servo-motori (con i loro bracci motori) Questi (a fianco) sono i due servo-motori Hitec impiegati per il “miniwalk”, quello di sinistra, installato posteriormente, è adibito all’avanzamento, quello di destra, installato al centro, è destinato alla funzione di appoggio, alternato a terra, delle gambe del robot . Ogni servo-motore ha sul proprio asse di rotazione, i bracci motori, per il collegamento alle gambe. Foto 5 (installazione dei servo-motori) La Foto 5 a fianco illustra come devono essere installati e collocati i servo-motori sul telaio. (si fa notare che il servo-motore centrale è fissato verticalmente, al suo assale, con 2 sole viti). Suggerimento : per ottenere una perfetta aderenza dei servo-motori ai rispettivi assali, è necessario spianare, con una lima, la piccola nervatura presente tra i fori (di fissaggio) del servo. Vista dei 2 servo-motori (da sotto il telaio) La foto a fianco evidenzia i 2 servo-motori visti nel loro posizionamento sotto il telaio. 9 MONTAGGIO delle GAMBE Le sei gambe di “miniwalk” Dopo aver costruito, forato e curvato le 6 gambe, e dopo aver costruito gli elementi di collegamento (vedi Fig. 3 e Foto 4) effettuare le seguenti operazioni preliminari: a) Montare sulle gambe centrali con viti 3mm lunghe 12mm le cerniere e gli angolari di attacco asta, bloccandoli con dadi e rondelle. (vedi foto a fianco) Assicurarsi che nel foro 2 dei longheroni, siano state montate le viti da 3mm lunghe 20mm, come indicato a pagina 6 (ultimazione del telaio) e foto 2A . Montaggio gambe posteriori (di locomozione) Montaggio gamba posteriore sinistra (vedi foto a fianco) 1 – infilare una rondella, sopra il dado e controdado della vite 2 - infilare nella vite, la gamba, avendo cura di infilare nella scanalatura, della gamba, anche il nottolino del braccio di locomozione (vedi foto a fianco) 3 - infilare un’altra rondella, nella vite. 4 - bloccare il tutto con un dado autobloccante, lasciando un piccolo gioco alla gamba, che dovrà essere libera di muoversi agevolmente senza alcuna difficoltà Montaggio gamba posteriore destra: ripetere le operazioni precedenti, da 1 a 4, per la gamba destra Verificare che le due gambe siano libere di muoversi senza impedimenti e senza forzature assieme al braccio motorio. posizionamento e montaggio gamba posteriore sinistra Montaggio gambe centrali (di inclinazione del robot) Fissare al telaio, le 2 cerniere, con viti 3mm lunghe10mm con dado e rondella, (vedi sotto Foto a) Montare le due “forcelle in plastica” agganciando il loro nottolino agli angolari delle gambe centrali, e infilarle anche sull’asta di collegamento avendo cura di infilare inoltre il nottolino dell’asta, nella “scanalatura del braccio-motorio in plastica” del servo-centrale (vedi sotto Foto b) Nota: fissare leggermente sull’asta le viti delle forcelle in plastica (il loro definitivo fissaggio sarà regolato successivamente) Foto a veduta delle cerniere, delle gambe centrali e posteriori, montate Foto b veduta (da sotto il telaio) dell’asta di collegamento e delle forcelle in plastica collegate al servo centrale 10 Montaggio gambe anteriori veduta gambe anteriori (montate) Per ogni gamba, eseguire in sequenza le seguenti operazioni: 1 - infilare una rondella sopra il dado e controdado della vite 2 - infilare la gamba sulla vite, 3 - infilare un’altra rondella, 4 - fissare la gamba alla vite con un dado da 3mm autobloccante Nota importante: lasciare un piccolo gioco alle gambe, che dovranno essere libere di muoversi agevolmente senza alcuna difficoltà Controlli e verifiche: veduta complessiva (telaio,motori e gambe) Assicurarsi che tutte le gambe appoggino regolarmente a terra e che tutto il complesso sia allineato sul piano d’appoggio. Modificare leggermente, se necessario, le curvature delle gambe laterali per ottenere un perfetto appoggio e allineamento a terra, mentre per le gambe centrali, agire sulle viti di fissaggio delle forcelle in plastica, per ottenere un loro appoggio a terra identico a quelle laterali e un perfetto allineamento con esse. Consiglio: Per una buona aderenza al suolo delle sei gambe, incollare con colla di tipo Super Attak, dei piccoli tasselli di gomma morbida (su ogni estremità d’appoggio a terra). 11 Montaggio delle aste di collegamento (con snodi Uniball) alle gambe laterali Effettuare per ogni asta (da un lato del robot e poi dall’altro lato) le seguenti operazioni: 1) Controllare che ogni asta (comprensiva di snodi Uniball) sia lunga all’incirca 400mm (misurare dal centro di uno snodo, al centro dello snodo opposto) 2) Avvitare con una piccola chiave inglese del 5,5 la vite Uniball di 3mm nel foro filettato della gamba motrice posteriore, quindi avvitare nel foro filettato della gamba anteriore l’altra vite Uniball verificando che il braccio motorio del servo posteriore sia perpendicolare ai longheroni del telaio e che le gambe risultino tra loro allineate e non serrate o divaricate. In caso di mancato allineamento svitare la vite Uniball dal foro e agire sullo snodo avvitandolo o svitandolo dall’asta, in modo da ottenere l’allineamento cercato. (vedi foto Foto C ). Foto C veduta complessiva dell’assemblaggio ultimato Con questa operazione termina la Fase 1 di costruzione e assemblaggio delle parti meccaniche di “Miniwalk” 12 FASE – 2 (l’ardware elettronico) (l’elettronica di “miniwalk”) Nota introduttiva sulla “robotica”. La robotica è una disciplina che comporta la conoscenza, quantomeno minima, di diverse materie ad esempio (citandone solo alcune): la matematica, la fisica, la meccanica, l'elettronica, il disegno meccanico, il disegno dei circuiti elettronici, i linguaggi di programmazione dei computer e le tecniche di elaborazione dei dati, le caratteristiche ardware e software dei microcontrollori e le tecniche della loro programmazione, la conoscenza e padronanza d’uso dei Personal Computer (PC), la cognizione perlomeno scolastica della lingua inglese, e molte altre ancora. A tutti coloro che fossero digiuni di dette conoscenze, consigliamo di seguire con impegno e attenzione, le lezioni, le note e le descrizioni che saranno esposte e illustrate in questa fase. Il circuito elettronico di “Miniwalk” Per far camminare, in modo autonomo e intelligente l’apparato meccanico di miniwalk, è necessario dotarlo di un apposito circuito elettronico. La Fig. 4 illustra lo schema del circuito che bisogna costruire per ottenere questo scopo, si fa notare che è un circuito con pochi elementi, abbastanza semplice da realizzare. (stampare questa pagina per avere lo schema a portata di mano, durante la costruzione del circuito) Fig. 4 (circuito elettronico di “miniwalk”) 13 Il circuito è da intendersi composto da 4 principali sezioni: 1) la sezione “alimentazione” (con integrato 7805) 2) la sezione “collegamento con il PC” (con Max 232) per il caricamento dei programmi sul PIC16F876A 3) la sezione “esecuzione programma” (con PIC16F876A) 4) la sezione “gestione dei sensori IR” (Infra Rosso) (con PIC12F508 o 12F629) Elenco dei componenti (del circuito elettronico di Fig 4) componente (ritaglio) di piastra millefori condensatori elettrolitici 25V condensatori elettrolitici 50V condensatori ceramici 50V sigla (e informative) (dimensioni 65 x 105mm) c100, c103 c106, c107, c108, c110, c111 c104, c105, 100 uF 1 uF 22 pF 2 5 2 condensatori poliesteri 50V c101, c102, c109 .1 uF 3 resistenze ¼ watt 5% resistenze ¼ watt 5% resistenze ¼ watt 5% r102, r104, r109 r108 r101, r110 470 ohm 100 ohm 1 Kohm resistenze ¼ watt 5% r106, r107 10 Kohm 3 1 2 2 zoccolo x IC 28 pin zoccolo x IC 8 pin zoccolo x IC 16 pin microinterruttore a 2 vie micropulsante x PCB integrato 7805 (regolatore 5V) quarzo da 20 MHz diodo 1N4148 Led (3mm) verde connettore con viti a 3 poli connettore DB9 rs232 (femmina) strip connettori (maschio) x PCB detector IR (Sharp) IR Led 470mW/cm2 (Siemens) Microcontrllore (Microchip) Microcontrllore (Microchip) Microcontrllore (Maxim) portabatterie x 4 elementi pile stilo, 1,5V alcaline pila da 9V x PIC16F87A x PIC12F508 x Max 232 (oppure deviatore a 2 vie) (per il reset del PIC16F87A) (regolatore di tensione dei 5 V) (oscillatore x PIC 16F876) (per la segnalazione di off-on) (x il collegamento batterie) (x collegarsi al cavo ser. del PC) (x collegare i servo-motori) IS1U60 SFH4802 PIC16F876A PIC12F508 (o 12F509) MAX232 (tipo sovrapposto) (x alimentare i servo motori) (per alimentare il circuito) valore quantità note 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 4 1 valido x sk millefori valido x sk millefori valido x sk millefori valido x sk millefori valido x sk millefori 14 Costruzione della scheda elettronica (motherboard): Operazioni preliminari: -Eseguire sulla piastrina millefori (50 x 100mm) n° 4 fori da 3mm (per il suo posizionamento sul telaio) seguendo le quotazioni di Fig. 5 (vedere anche Fig. 1, per i fori 4 e 8, e Foto 2A) -Eseguire sulla piastrina un’altro foro da 3mm (per il collegamento a massa dell’integrato 7805) come specificato in Fig 5 -Eseguire altri due fori da 2mm per il fissaggio del connettore DB9 rs232 alla millefori. Fig. 5 (quotazioni piastrina millefori) A) LA SEZIONE “Alimentazione” (vedi Foto 6) (stabilizzazione 5 Volt con integrato 7805) Si consiglia, prima di iniziare, di consultare il datasheet dell’integrato 7805, scaricabile dal sito: http://www.fairchildsemi.com (Search LM7805) e di stampare lo schema del circuito di Fig. 4 Disporre sulla piastrina millefori i componenti: - 1 Connettore a 3 poli con viti (per il collegamento con le batterie) - 1 Microinterruttore a 2 vie (per l’off/on di tutto il circuito) - 1 Integrato 7805 fissandolo alla millefori con vite e dado da 3mm (vedi Foto 6) Saldare, alle piazzole della millefori, i terminali dei componenti sopra elencati. Montare, collegare e saldare , seguendo lo schema del circuito di Fig. 4 (parte bassa a sinistra), i 2 condensatori elettrolitici da 1000uF, la resistenza da 470 Ohm e il diodo da 3mm. (verde) Controlli e verifiche (vedi Foto 7). Dopo aver terminato (e controllato con il tester la validità delle saldature e dei collegamenti effettuati), mettere in OF l’interruttore e collegare al connettore a 3 poli una pila da 9Volt (con l’apposito connettore per pile da 9V). Mettere l’interruttore in ON e verificare (con il tester) che, al connettore (pin 3) di output dell’integrato 7805, siano presenti 5Volt e che il led verde sia acceso. Se non si riscontrasse detto voltaggio, riverificare tutte le saldature e le connessioni effettuate e il giusto collegamento (filo positivo e negativo) dei condensatori elettrolitici. Foto 6 Foto 7 15 B) LA SEZIONE “collegamento con il PC” (con integrato Max 232 e connettore BB9) - Si consiglia di scaricare dal sito: http://www.datasheetcatalog.net/it/ il dasheet dell’integrato Max232 (per la sua eventuale consultazione) Disporre sulla piastrina millefori (vedi Foto 8) i seguenti componenti: - 1 connettore DB9 rs232 (femmina) (per il collegamento al cavo seriale del PC) - 1 zoccolo a 16 pin, per Max 232 Saldare, i terminali di ancoraggio del connettore DB9 e i pin dello zoccolo alle piazzole della millefori. Foto 8 le sezioni: di alimentazione e di collegamento al PC Facendo riferimento allo schema del circuito di Fig. 4 parte alta a destra: - collegare e saldare, con spezzoni di filo, i pin 2 e 3 del connettore DB9 (i numeri dei suoi pin sono riportati sui fori in plastica del connettore) ai pin 7 e 8 dello zoccolo di Max232 e il pin 5, del connettore DB9, al negativo o massa del circuito. - collegare e saldare i 5 condensatori elettrolitici da 1uF ai pin 1,2,3,4,5,6 e 16 dello zoccolo di Max232, avendo cura di rispettare le polarità dei condensatori, come indicato nello schema. COMPLETAMENTO del circuito: C) SEZIONI: “esecuzione programma” (PIC16F876) “gestione dei sensori IR” (PIC12F508) Montare sulla piastrina lo zoccolo del PIC16F876 e lo zoccolo del PC12F508 saldando i relativi pin alle piazzole della millefori (vedi Foto 9 per la loro disposizione sul circuito) Foto 9 (disposizione zoccoli 16F876 e 12F508) Seguendo scrupolosamente lo schema di Fig. 4 montare, nell’ordine, i seguenti componenti: a) - il Quarzo da 20MHz con relativi condensatori da 22pF (collegare e saldare i componenti) b) - i 2 connettori – strip (maschio) da 3 pin ciascuno (collegare e saldare i componenti) c) - il micropulsante con diodo 1N4148 e resistenze (collegare e saldare i componenti) d) - il sensore IR IS1U60 e relativo condensatore (collegare e saldare i componenti) e) - i 2 IR Led (IRR e IRL) e relative resistenze (collegare e saldare i componenti) f) - i 2 led 3mm (D102 e D104 rossi) e relative resistenze (collegare e saldare i componenti) 16 Consiglio importante: Di ogni componente, prima di iniziare il collegamento del successivo, occorre completarne tutti i collegamenti specificati nel circuito, verificando con il tester la validità delle saldature eseguite, e di non aver causato “corto circuiti” accidentali, tra i componenti e gli altri collegamenti presenti. In particolare è necessario controllare, scrupolosamente, che i pin del PIC16F876, specificati nello schema, siano stati tutti correttamente collegati e saldati, cosi pure quelli del PIC12F508. Con Con queste queste ultime ultime operazioni operazioni il circuito il circuito di è“miniwalk” da considerarsi è da considerarsi ultimato e pronto ultimato per eessere pronto per essere sottoposto sottoposto alle prime alle prime proveprove di funzionamento di funzionamento il circuito di “miniwalk” completo di tutti i componenti Uno sguardo ai microcontrollori impiegati i due PIC (per il software) impiegati nel circuito La foto a fianco evidenzia, i due PIC, preposti alla gestione dei programmi esecutivi, di Miniwalk: - PIC16F876 A (ditta Microchip) - PIC12F508 (ditta Microchip) questi PIC possono essere richiesti, (non più di 3 per tipo), come campioni gratuiti (samples) -previa iscrizione- via Internet alla società: www.microchip.com (scegliere samples, PIC micro, digitare la sigla PIC, scegliere come package PDIP e seguire la procedura per ordinare i samples) Si consiglia in detta occasione di scaricare anche i relativi “datasheet” Le piedinature dei microcontrollori PIC 16F876 PIC 12F508 17 piazzamento delle batterie sul telaio Le foto 10 e 11 (sotto) illustrano come devono essere sistemate, sul telaio, le batterie di alimentazione da 6 e 9 Volt. Per la loro stabilità usare strisce di velcro incollate, su loro, e al telaio. Foto 10 (posizionamento delle batterie da 6Volt) Foto 11 (posizionamento della batteria da 9 Volt) alcune immagini di “miniwalk” ultimato “miniwalk” visto di fianco (lato sinistro) “miniwalk” visto dall’alto (e lato destro) La foto sotto evidenzia la caratteristica posizione di “Miniwalk” nel suo spostamento in avanti 18 FASE – 3 IL SOFTWARE In questa sezione saranno descritti e illustrati diversi argomenti riguardanti le tecniche e i metodi utilizzati per far camminare il robot in modo autonomo e per fargli prendere delle decisioni, quando nei suoi spostamenti, incontra degli ostacoli. Per rendere concreti questi obiettivi, occorrerà trasferire sui microcontrollori PIC16F876 e PIC12F508, (presenti sul circuito elettronico appena ultimato) degli “appositi programmi” (software), che impartiranno dei comandi ai servo-motori e interpreteranno i segnali provenienti dai sensori all’infrarosso. Di norma per realizzare questi “programmi” e per trasferirli sui PIC (citati) è necessario effettuare le seguenti operazioni: 1) Redazione (scrittura o copiatura) di un apposito programma per il PIC interessato 2) Compilazione del programma per ottenere il file con l’estensione “*.HEX” 3) Caricamento del file “.HEX” sul PIC tramite un apposito circuito elettronico denominato “programmatore di PIC” Si premette che: Per scrivere un programma è indispensabile conoscere il linguaggio di programmazione per PIC Per compilare un programma è indispensabile disporre di uno specifico software di compilazione Per caricare i file “.HEX” sui PIC è indispensabile disporre di un apposito “programmatore di PIC” Nei capitoli che seguono saranno descritti, il più semplicemente possibile, i seguenti argomenti: - i linguaggi di programmazione per PIC come apprenderli, impararli o comprenderli - presentazione (illustrazione) dei programmi “esapode.bas” e “nirprox.asm” di “Miniwalk” - i compilatori, i software applicativi per editare, scrivere e compilare i programmi per i PIC - i “programmatori di PIC” i dispositivi hardware per trasferire sui PIC i File “*.HEX” - i programmi per i “programmatori di PIC” gli applicativi software per gestire le operazioni di caricamento dei File “*.HEX” sui PIC, tramite i “programmatori di PIC” - i metodi di caricamento dei PIC, i diversi procedimenti per caricare sui PIC i file “*.HEX” informativa generale sui linguaggi: Tra i più noti linguaggi di programmazione per PIC, utilizzati in minirobotica possiamo citare: - l’assembler (o linguaggio macchina, relativamente difficile da imparare) - il PicBasic Pro (simile al linguaggio BASIC da cui deriva, molto facile da apprendere) - il Basic Stamp (simile e compatibile al linguaggio PICBASIC PRO, facile da apprendere) - il C (efficientissimo linguaggio di alto livello, relativamente difficile da imparare). 19 i “linguaggi” di programmazione per microcontrollori (PIC) (come conoscerli e impararli) Per scrivere o per modificare un programma per PIC occorre conoscere e aver imparato almeno uno dei linguaggi di programmazione sopra menzionati. Analogamente per leggere, capire e interpretare un listato di programma occorre conoscere il linguaggio con cui è stato scritto. Il linguaggio BASIC (nota informativa sul progenitore del linguaggio PICBASIC PRO) Il linguaggio BASIC, da cui il PicBasic Pro deriva, e stato sviluppato sin dal 1963 dai professori: John G. Kemeny e Thomas E. Kurtz dell'Università di Dartmouth, ottenendo un immediato successo e diffusione in tutto il mondo per la sua semplicità In questa sede non è fattibile, per ovvie ragioni, un insegnamento di questo linguaggio, ci limiteremo a segnalare alcuni libri e link dove si potranno reperire notizie e lezioni didattiche sull’argomento Conoscere i primi elementi di questo linguaggio sarebbe auspicabile per acquisire una maggiore comprensione e dimestichezza con il PICBASIC PRO Le pubblicazioni sul linguaggio BASIC (ormai molto datato) oggi Visual Basic erano numerose intorno agli anni 80-90, ormai però diventate di difficile rintracciabilità, in proposito citiamo, al solo scopo informativo, alcuni titoli per eventuali ricerche di reperimento: “IL BASIC teoria ed esercizi” di E. Spoletini (Franco Angeli Editore Milano 1978) “BASIC” di Kenneth E. Schoman, Jr. (edizioni C.E.L.I. Bologna 1982) “Programmare in BASIC” di Michel Plouin (Gruppo Editoriale Jackson Milano 1982) “Programmi pratici in BASIC” di Lon Poole (Gruppo Editoriale Jackson Milano 1982) “IL BASAIC e il PC IBM in pratica” di H. Peckham (McGRAW-HILL Milano 1984) “La Gestione Aziendale con il BASIC” (Gruppo Editoriale Jackson Milano 1984) “BASIC Personal Computer Hardware Reference Library” (Manuale Basic del PC IBM) * Link consigliati per un approccio e conoscenza del linguaggio Basic: http://en.wikipedia.org/wiki/BASIC_programming_language#The_language (tutor di Basic) http://it.wikipedia.org/wiki/BASIC (parziale traduzione italiana del tutor Basic inglese) http://sip.clarku.edu/tutorials/True_BASIC.html#intro un’introduzione al Basic (in inglese) A coloro che intendono apprendere i principi base dei linguaggi di programmazione consigliamo di consultare i seguenti siti (tutti in lingua italiana): * I seguenti link sono particolarmente indicati per i principianti: http://www.parallax.com/html_pages/downloads/siccurriculum/documentation_sic_curriculum.asp scaricare da Italian Language Downloads: "What's a Microcontroller (v2.1)" (346 pp.) (traduzione di cos’è un microcontrollore)L "IR Remote control for Boe-Bot (v1.0)" (192 pp.), (traduzione degli IR Remote control) Questi tutorials sono da ritenersi fondamentali per i principianti di robotica, essendo accompagnati da moltissimi e facili esercizi in linguaggio BasicStamp, paragonabile e compatibile al linguaggio PicBasic Pro (il linguaggio usato per “miniwalk”). http://www.tanzilli.com/?id=207 il più famoso tutorial sui PIC con il linguaggio assembler (Cliccare su Pic by Example (in basso a destra)) http://digilander.libero.it/mircose/pic/pic.htm (ottimo sito in. assembler per principianti) http://stor.altervista.org/main/main.htm (altro ottimo sito sulla programmazione in assembler) http://www.fisertek.it (vari appunti pratici e lezioni di programmazione con il linguaggio C) http://www.electroportal.net/vis_resource.php?section=Link&id=3998 (per programmare in C) 20 In Internet, i siti in lingua inglese, che trattano l’argomento dei linguaggi e della programmazione dei PIC sono numerosi. Segnaliamo solo alcuni di essi: http://www.parallax.com/index.asp (sito molto documentato per principianti di robotica) (il linguaggio BasicStamp di questa società è simile e perfettamente compatibile al PicBasic Pro) http://www.melabs.com/index.htm (per scaricare molti esempi di programmi in PicBasic Pro) http://www.grifo.it/SOFT/Pic_Basic/pbpdemo.htm (esempi di programmi in PicBasic Pro) http://www.mstracey.btinternet.co.uk/pictutorial/picmain.htm (un tutorial in inglese di assembler) http://tutor.al-williams.com/pic-intro.html (un’introduzione ai PIC) http://www.best-microcontroller-projects.com/pic-microcontroller.html (introduzione ai PIC) http://www.robotroom.com/index.html (interessante sito di minirobotica e di link correlati) http://www.laurtec.com/ (un ottimo tutorial per programmare in C, con MPLAB “free compiler”) (scegliere: tutorial e poi C18 step by step) 21 Presentazione e illustrazione del programma “esapode.bas” (in PBP) di “Miniwalk” In appendice A è presentato il listato del programma “esapode.bas” (in linguaggio “PicBasic Pro) con il quale (tramite il PIC16F876) si gestisce la camminata del robot e le azioni da intraprendersi quando i sensori all’infrarosso rilevano un ostacolo. Ogni riga di programma è commentata, per chiarire la funzione a cui l’istruzione è preposta. Il set delle istruzioni “PicBasic Pro” può essere visionato nel già citato link della soc. Melabs Il programma “esapode.bas” è abbastanza semplice da capire e interpretare. Gli inesperti del linguaggio, se seguiranno con attenzione le spiegazioni delle routine del programma (illustrate sotto), e cercheranno di comprendere le istruzioni con l’aiuto del manuale PBP, scaricato da: http://www.melabs.com/resources/index.htm#Manuals) potranno, senza grosse difficoltà, conoscere la logica e la semplicità del listato. Le routine del programma “esapode.bas” (sintesi descrittiva) Dopo le iniziali istruzioni di definizione [prescritte], di assegnazione delle variabili e delle costanti, il programma principia il suo svolgimento-ciclico, dalla routine “Inizio”: Routine: Inizio: Questa routine assolve il compito di smistare (rimandare) l’esecuzione del programma alle routine: “Avanti, Destra, Sinistra, Inverti”, dopo la verifica del valore contenuto nella variabile: “action”. Con l’istruzione: “action = IR_1 + IR_2 * 2” vengono trasferiti, nella variabile “action” i valori di IR_1 e di IR_2 rilevati (presenti) sui pin: 4(RA.2) e 5(RA.3) -di PIC16F876- connessi ai pin 2 e 3 di PIC12F508 (gestore degli IR sensor). Tali valori sono sommati e moltiplicati per 2 per ottenere, come valore risultante di “action”, i seguenti possibili valori: 0 (IR1_1 = 0 e IR_2 = 0) -> action = 0 + (0 * 2) = 0 (nessun ostacolo = vai a routine Avanti) 1 (IR1_1 = 1 e IR_2 = 0) -> action = 1 + (0 * 2) = 1 (ostacolo a sinistra = vai a routine Destra) 2 (IR1_1 = 0 e IR_2 = 1) -> action = 0 + (1 * 2) = 2 (ostacolo a destra = vai a routine Sinistra) 3 (IR1_1 = 1 e IR_2 = 1) -> action = 1 + (1 * 2) = 3 (ostacolo frontale = vai a routine Inverti) Lo smistamento di prosecuzione del programma alle varie routine, in base ai valori sopra riportati, viene eseguito dalla successiva istruzione: “Branch action, [Avanti, Destra, Sinistra, Inverti]” (“Branch” = dirama in base ad “action”) La routine termina con l’istruzione: “GoTo Inizio” per il rinvio del programma alla routine “Inizio” di ripresa del ciclo. 22 Routine: Avanti: Questa routine viene interessata e percorsa, quando il valore di “action” è = a 0 (zero), cioè quando il circuito di PIC12F508 (gestore dei segnali IR) non ha trasmesso nulla ai pin 4(RA.2) e 5(RA.3) di PIC 16F876 con i quali è collegato (vedi circuito elettronico di “miniwalk”). In questo caso il robot deve camminare in avanti. La routine inizia con l’istruzione: Pos_Servo1 = s1_Max, che assegna alla variabile (Pos_Servo1) il valore di 900 (valore di rotazione da impartire al servo-centrale (Servo1), quindi con la successiva istruzione: GoSub Esegui” il programma verrà fatto proseguire dalla routine “Esegui”, che realizzerà (fisicamente) la rotazione del servo interessato (per l’inclinazione del robot [sulle tre gambe]). Con l’istruzione Return (di routine Esegui) il programma verrà rimandato all’istruzione successiva di quella chiamante e cioè passerà all’esecuzione dell’istruzione: Pos_Servo2 = s2_Max. che assegnerà alla variabile (Pos_Servo2) il valore di 900 (valore di rotazione da impartire al servo-gambe, quindi con l’istruzione: GoSub Esegui” il programma verrà, di nuovo, fatto proseguire dalla routine “Esegui” per l’esecuzione di rotazione del servo-gambe (Servo2) (per lo spostamento in avanti del robot). A questo punto le istruzioni sopra descritte verranno ripetute per altre due volte, invertendo però i valori di rotazione ai servo-motori, allo scopo di effettuare il secondo movimento, di spostamento in avanti, del robot. Con l’ultima istruzione: “GoTo Inizio” la prosecuzione del programma verrà rimandata alla routine “Inizio” per effettuare, nuovamente, la lettura della variabile “action”. Se nel frattempo, detta variabile, non è stata caricata di nessun valore, il programma verrà, di nuovo, rimandato (con l’istruzione Branch action) alla routine “Avanti” per continuare la camminata in avanti. Routine: Esegui: Questa routine, continuamente richiamata da tutte le altre, trasmette ai servo-motori, appositi impulsi elettrici, per effettuarne la loro rotazione. L’istruzione che genera questi impulsi è l’istruzione: “Pulsout” che li invia a specifici pin del PIC16F876 (nel nostro caso pin 22=PortB.1 per il Servo1, e pin 23=PortB.2 per il Servo2) i quali (pin) sono collegati ai servo-motori interessati (vedi circuito elettronico di “miniwalk”). La durata di questi impulsi è stabilita dal valore impostato nelle variabili “s1_min, s1_max e s2_min, s2_max,” e, con il quale, il perno del servo, viene fatto ruotare di un certo angolo in un senso o nell’altro. L’entità di questo valore dipende dall’oscillatore impiegato nel circuito. Ad esempio con un oscillatore di 20 MHz per ottenere una completa rotazione del perno da un lato, il valore sarà = a 600, per farlo ruotare in modo completo dall’altro lato sarà = a 900, e per farlo ruotare in una posizione centrale sarà = a 750. Con un oscillatore di 4 MHz detti valori dovranno essere divisi per 5, per ottenere lo stesso risultato. Ogni impulso deve essere intervallato da una pausa di circa 20 microsecondi, inoltre, per dare continuità di rotazione al perno, è necessario l’invio ininterrotto, per un certo periodo, di una serie di questi impulsi. 23 La routine “Esegui” inizia con l’istruzione: For mcount = 1 to 12 che letteralmente significa: esegui per 12 volte tutte le istruzioni che seguono, fino all’istruzione Next (compresa). Ogni volta che l’istruzione “For mcount=1to12” viene eseguita, la variabile “mcount” è incrementata di 1, e poi verificata se il suo valore ha superato 12, in detto caso la prosecuzione del programma verrà rinviata all’istruzione successiva a quella di Next. Le istruzioni eseguite per 12 volte (periodo di invio continuato degli impulsi ai servi), sono: PulsOut Servo1, Pos_Servo1 (invio di impulsi a servo1 di durata =Pos_Servo1) PulsOut Servo2, Pos_Servo2 (invio di impulsi a servo2 di durata =Pos_Servo2) Pause Ritardo (pausa di ritardo tra gli impulsi) Ritardo = a 20ms (microsecondi) Next (rinvio del programma all’istruzione “For mcount = 1 to 12”) L’istruzione: Return (dopo la Next) rinvia il programma all’istruzione successiva a quella (istruzione) che aveva chiamato la routine “Esegui”. Routine: Destra: Questa routine viene interessata e percorsa, quando il valore di “action” è = a 1 (uno), cioè quando il circuito di PIC12F508 (gestore dei segnali IR) ha trasmesso al pin 4(RA.2) di PIC 16F876 un segnale di presenza ostacolo, rilevato alla sinistra del robot. La routine inizia con l’istruzione: GoSub Indietro che trasferisce il programma alla routine “Indietro” tramite la quale vengono attivati i servo-motori per un arretramento di alcuni passi (vedi routine Indietro), eseguiti i quali, il flusso del programma (di ritorno da routine Indietro) passa all’esecuzione delle seguenti istruzioni: For ncount = 1 To 6 (esegue 6 volte le istruzioni che seguono, fino all’istruzione Next compresa) Pos_Servo1 = s1_cen (la variabile “Pos_Servo1” viene caricata del valore 750 (con questo valore il robot non effettuerà la caratteristica inclinazione da un lato, [il destro]) GoSub Esegui (trasferimento del programma alla routine “Esegui” per eseguire il posizionamento al centro di servo1 [no inclinazione]) Pos_Servo2 = s2_min (la variabile “Pos_Servo2” viene caricata del valore 600 GoSub Esegui (esecuzione del movimento al servo2 [gambe], per il solo posizionamento [senza avanzamento], non essendoci l’inclinazione da un lato, [il destro]) Pos_Servo1 = s1_max (variabile “Pos_Servo1” caricata del valore 900 GoSub Esegui (esecuzione del movimento al servo1, per l’inclinazione da un lato, [il sinistro]) Pos_Servo2 = s2_max (variabile “Pos_Servo2” caricata del valore 900 GoSub Esegui (esecuzione del movimento al servo2, per uno spostamento in avanti, da un solo lato [il sinistro], per girare a destra) Next rinvio all’istruzione “For ncount = 1 To 6” per la ripetizione (6 volte) delle istruzioni GoTo Inizio con il termine delle 6 ripetizioni il programma viene rinviato alla routine “Inizio” per cominciare di nuovo il ciclo della camminata. Routine: Sinistra: Questa routine viene interessata e percorsa, quando il valore di “action” è = a 2 (due), cioè quando il circuito di PIC12F508 (gestore dei segnali IR) ha trasmesso al pin 5(RA.3) di PIC 16F876 un segnale di presenza ostacolo, rilevato alla destra del robot. La routine è identica alla routine “Destra”, vengono variati soltanto i valori da assegnare ai servi in modo da ottenere uno spostamento a sinistra, anziché a destra, del robot. 24 Routine: Inverti: Questa routine viene interessata e percorsa, quando il valore di “action” è = a 3 (tre), cioè quando il circuito di PIC12F508 (gestore dei segnali IR) ha trasmesso a entrambi i pin 4(RA.2) e pin 5(RA.3) di PIC 16F876 un segnale di presenza ostacolo, rilevato frontalmente al robot. Anche questa routine è identica alla routine “Destra” con la sola variante di essere ripetuta più volte per un’inversione di camminata del robot. Routine Indietro: Questa routine, richiamata dalle routine Sinistra, Destra e Inverti, ha lo scopo di far indietreggiare il robot, in presenza di ostacoli. Essa è pertanto identica alla routine “Avanti” differenziandosi da essa soltanto nell’assegnazione dei valori di rotazione, ai servi, che risulteranno pertanto invertiti. La routine inizia con l’istruzione: For ncount = 1 To 6 (esegue 6 volte le istruzioni che seguono, fino all’istruzione Next compresa, per un arretramento di alcuni passi [6] del robot) Pos_Servo1 = s1_max (assegna a “Pos_Servo1” il valore massimo d’inclinazione a sinistra) GoSub Esegui (esegue la rotazione di Servo1 per inclinare il robot sulla sinistra) Pos_Servo2 = s2_min (assegna a “Pos_Servo2” il valore minimo di spostamento gambe) GoSub Esegui (esegue la rotazione di Servo2[gambe lato sinistro] per spostare indietro il robot) Pos_Servo1 = s1_min (assegna a “Pos_Servo1” il valore minimo d’inclinazione a destra) GoSub Esegui (esegue la rotazione di Servo1 per inclinare il robot sulla destra) Pos_Servo2 = s2_max (assegna a “Pos_Servo2” il valore massimo di spostamento gambe) GoSub Esegui (esegue la rotazione di Servo2[gambe lato destro] per completare lo spostamento all’indietro del robot) Next rinvio all’istruzione “For ncount = 1 To 6” per la ripetizione (6 volte) delle istruzioni Return rinvio all’istruzione successiva, dell’istruzione, che aveva chiamato la routine “Indietro” ----------------------------------Queste le routine e le relative istruzioni del programma “esapode.bas” che come si è potuto costatare sono abbastanza semplici e intuitive. Notazione importante In “Appendice B” viene elencato il file “esapode.hex” ottenuto compilando il programma “esapode.bas” con il compilatore PicBasic Pro. Questo file potrà essere copiato con il “Blocco Note” e salvato con l’estensione “esapode.HEX” in una cartella del PC denominata, ad es., “Programmi Miniwalk” dove vi sarà stato salvato, con lo stesso sistema, anche il programma “bootldr-16876-20MHz-38400bps.HEX” elencato in “Appendice C”. Il programma “bootldr-16876-20MHz-38400bps.HEX” di appendice C, dovrà essere caricato sul PIC16F876, tramite un “programmatore di PIC” tipo “MiniPropic2 clone”, o altro tipo consigliato, quindi dopo aver effettuato detta operazione (con il cavo seriale e connettore DB9 collegato al circuito di miniwalk) si potrà caricare il programma “esapode.hex” sul PIC16F876, utilizzando il programma “PIC-Downloader”. Il procedimento sopra descritto, permetterà a chi non fosse in possesso del costoso compilatore “PicBasic Pro”, di effettuare ugualmente il caricamento del programma “esapode.hex” sul PIC16F876 per ottenere il funzionamento del robot. 25 Presentazione e illustrazione del programma “nirprox.asm” (in assembler) di “Miniwalk” Questo programma, scritto in linguaggio assembler, è il frutto di uno studio per il rilevamento (detector) di oggetti tramite sensori all’infrarosso. Lo studio, al quale rimandiamo per conoscenza e approfondimento, è presente sul sito Internet: http://users.frii.com/dlc/robotics/projects/botproj.htm (cercare 12C508 IR Obstruction Detector) Non ci è possibile in questa sede, per ragioni riguardanti il tipo di linguaggio usato, illustrare la logica e le istruzioni di tutte le routine che lo compongono. Per una loro interpretazione si consiglia di leggere, direttamente dal listato, le notazioni che l’autore ha inserito a fianco delle istruzioni. Si fa presente che il programma e il circuito sono stati provati e testati da diversi appassionati di minirobotica, con dichiarazioni e attestazioni di validità riguardo al loro impiego su minirobot. Consiglio per esperienze di compilazione: Con questo programma, essendo stato scritto in linguaggio assembler, si possono fare delle esperienze di “compilazione” per ottenere il file “nirprox.hex” utilizzando allo scopo il “compilatore gratuito”: MPASMWIN” scaricabile dal sito della Microchip. Nei capitoli successivi verranno illustrati i metodi e i sistemi per compilare i programmi e per caricare (inserire) sui PIC i programmi con estensione “*.HEX” ottenuti dalla compilazione. A puro scopo illustrativo, di un circuito per sensori all’infrarosso, presentiamo un esempio di schema di circuito per IR sensor con PIC12F629-675, o 12F508 (il sensore PNA4612M [Panasonic] corrisponde all’IS1U60 [Sharp]) 26 i Compilatori dei linguaggi di programmazione: Per trasformare il programma scritto in uno dei linguaggi precedentemente elencati, in un codice decifrabile dal PIC, occorre impiegare degli appositi software o programmi di compilazione. Sono dei programmi applicativi con il compito di produrre dei File speciali tipo ”*.HEX” da un elenco di istruzioni redatte in un linguaggio intelligibile e comprensibile all’uomo come ad es. il basic, l’assembler, il C, ecc. Elenchiamo alcuni siti per l’acquisto di questi programmi di compilazione: Compilatori a pagamento: “Il compilatore PICBASIC PRO (PBP)” (linguaggio di tipo Basic) Questo software di compilazione è offerto dalla Soc. Melabs a $ 249.95 ma anche da diverse altre ditte e società estere, di quelle italiane citiamo: http://www.robot-italy.com/product_info.php/cPath/12_27/products_id/590) http://www.grifo.it/SOFT/Pic_Basic/PB.htm che lo propongono al prezzo di circa € 220 (a cui vanno aggiunte le spese di spedizione): Prezzi abbastanza alti, accessibili a coloro che non abbiano problemi di carattere economico. Suggerimento: Solitamente, in mancanza della soluzione “acquisto”, si fa ricorso ad amici o conoscenti, possessori di detto software, per un “prestito d’uso”, in modo da poter effettuare prime esperienze di compilazione, oppure si scarica da Internet la versioni “trial” (in prova), per poi eventualmente deciderne l’acquisto. Si consiglia di visitare il seguente sito, per una panoramica generale sul PBP, sui programmatori (ardware) di PIC, e sui software di programmazione: http://www.pctuner.net/php/Articoli/Articolo.php?ID=422&PAG=1 scegliere dal menu a tendina: “ambiente di lavoro” per una panoramica del linguaggio PBP “Il compilatore MIKROBASIC” (linguaggio di tipo Basic) Viene offerto a € 129,00 (IVA esclusa) al seguente indirizzo: http://www.elettroshop.com/dettagli.asp?pid=823 (compilatore Mikrobasic) da integrare con l’acquisto del libro : http://www.elettroshop.com/dettagli.asp?pid=1148 (tutorial per programmare in Mikrobasic) offerto a € 24,90 (IVA esclusa) “Il compilatore PIC C” (linguaggio di tipo C) Viene offerto a $ 950 dalla soc.: http://www.hitech.com.au/ oppure a € 995 dalla ditta: http://www.elettroshop.com/prodotti.asp?cid=177&act=categoria&mid= 27 Compilatori gratuiti “freeware”: scaricabili da Internet (per alcuni, con delle limitazioni) Compilatori in linguaggio Assembler: http://www.microchip.com/ (senza limitazioni) cliccare su “MPLAB IDE” per scaricare tutto il software che comprende il compilatore: MPASMWIN da utilizzarsi per la compilazione dei programmi scritti in linguaggio Assembler Compilatori in linguaggio tipo Basic: http://www.picbasic.org/proton_lite.php compilatore gratuito limitato a 50 linee di programma e solo ad alcuni PIC, propedeutico per i primi esercizi e prove di compilazione da parte di principianti. Compilatori in linguaggio tipo C: http://www.hitech.com.au/ compilatore gratuito per programmi in linguaggio C. Scegliere download (previa iscrizione) per scaricare il compilatore PICC-Lite 28 I programmatori di PIC (hardware) utilizzati nel progetto “Miniwalk” Come già accennato, per programmare i PIC, occorre dotarsi di un apposito dispositivo (ardware) chiamato appunto “programmatore”. Per questo progetto si sono utilizzati (con piena soddisfazione) il programmatore (autocostruito) “MiniPropic 2 clone” con collegamento alla porta parallela (cavo DB25) (Foto 10) ed il programmatore (acquistato) “PICKit 2 Programmer” della Microchip con collegamento alla porta USB (Foto 11). Foto 10 (Programmatore MiniPropic 2 clone) (collegam. con porta parallela (DB25) e con alimentatore 14Volt) Foto 11 (Programmatore PICKit2 Microchip) (collegam. con porta USB e con basetta aggiuntiva x tutti gli zoccoli PIC) La schema (a fianco) illustra i collegamenti degli zoccoli da 8,18, 20,28 e 40 pin, della basetta aggiuntiva, per il programmatore PICKit2 per poter programmare l’intera gamma dei PIC della Microchip. (foto a fianco) Esempio di programmatore tipo minipipo “JDM programmer” per PIC a 18 pin (tipo PIC16F84) e con collegamento al PC con cavo seriale RS232 e connettore DB9 29 L’Autocostruzione di un programmatore per PIC: Di programmatori per PIC ne esistono di moltissimi tipi sia da autocostruire sia da acquistare. Volendo scegliere la via dell’autocostruzione suggeriamo di consultare i siti che seguono (tutti in lingua italiana) con schemi e indicazioni per costruire il programmatore “propic 2 clone o minipropic 2 clone” considerati fra i migliori programmatori per PIC: http://www.enetsystems.com/%7Elorenzo/propic2/ (per costruire il propic2 clone by L. Lutti) http://stor.altervista.org/pic/fcpic/fcpic.htm (per costruire il minipropic2 clone by C. Fin) http://www.pctuner.net/forum/showthread.php?threadid=65434 (per costruire il minipropic2 clone) http://www.pctuner.net/php/Articoli/Articolo.php?ID=422 (per costruire il minipropic2 clone) http://www.elettronicashop.com/he/PicSheets/PicNet/index.htm (idem come sopra) questi siti sono praticamente uguali fra loro, però le descrizioni e le note in essi contenute possono essere utili per una completa ed esaustiva integrazione dell’argomento. Può essere utile visitare anche il seguente sito: http://www.vincenzov.net/tutorial/spp/parallela.htm (interessante tutorial sulla porta parallela) Può essere inoltre opportuno, per iniziali esperienze in questo campo, costruire uno dei più semplici programmatori per PIC, tipo minipipo, che si può trovare in moltissimi siti fra i quali segnaliamo: http://www.belza.cz/digital/jdm.htm (per costruire un JDM programmer per PIC a 8 e 18 pin) http://feng3.cool.ne.jp/en/pg5v2.html (universal JDM programmer in lingua inglese)) http://www.elettronicashop.com/he/PicSheets/contributi_ext/picstartup/index.htm Con questo programmatore molto economico (da collegarsi alla porta seriale RS232 con connettore DB9) si potrà programmare un microcontrollore tipo PIC16F84 per eseguire semplici esperimenti propedeutici della materia “robotica”, esperimenti ampiamente descritti e illustrati, nei siti indicati per imparare i linguaggi e la programmazione dei PIC (vedi pag. 20). L’Acquisto di un programmatore per PIC: I programmatori per PIC si possono acquistare presso negozi specializzati di elettronica o di componentistica oppure tramite Internet, in questo caso le offerte e i costi sono diversissimi, si consiglia comunque di non comprare a prezzi inferiori ai 30 €. E di assicurarsi che il programmatore scelto sia in grado di programmare tutti i PIC della Microchip, in particolare quelli da 8 e 28 pin, (PIC12F508 e PIC16F876) impiegati nel “miniwalk” Elenchiamo solo alcuni dei numerosissimi siti dove è possibile acquistare on-line questi prodotti: http://www.parsicitalia.it/ashop/Default.asp http://www.picbasic.it/E-commerce/catalogo.asp http://www.artek.it/ http://stores.ebay.it/TELLAB-Tutto-per-i-PIC http://www.elettroshop.com/default.asp?cid=0 http://www.futurashop.it/ (cliccare programmatori) (cliccare programmatori) (cliccare programmatore per ogni tipo di PIC) (cliccare programmatori) (cliccare programmatori a basso costo) (cliccare software e sistemi di sviluppo) 30 i vari programmi (software) (tutti gratuiti) per i “programmatori di PIC” Scaricare dai seguenti siti internet: http://www.ic-prog.com/index1.htm (scegliere download e installare il programma sul PC) Questo è il classico software di tipo universale, adatto per moltissimi “programmatori di PIC”, collegati alla porta seriale o a quella parallela. Nei vari siti Internet suggeriti in precedenza (vedi ad es. capitolo precedente) viene ampiamente descritta e illustrata la sua installazione e la metodologia per programmare i PIC. http://www.melabs.com/support/progsoft.htm (scegliere “Download mePreog 4.20 Beta”) Altro software, molto valido, alternativo a Ic-Prog per programmare i PIC http://www.winpic800.com/ (scegliere Descargar e installare il programma) Questo software alternativo anch’esso a Ic-Prog è molto valido e interessante avendo la caratteristica di identificare e riconoscere il PIC montato sul programmtore I metodi di caricamento dei PIC Metodo di caricamento dei PIC “non in circuit” Con questo metodo si deve smontare il PIC dallo zoccolo del circuito “Miniwalk” dove è inserito, per montarlo sullo zoccolo del “programmatore di PIC” e collegato al PC con cavo di tipo seriale o parallelo (a seconda del tipo di programmatore autocostruito o acquistato). Con l’apposito programma, di gestione del caricamento, ad es. Ic-Prog o con gli altri consigliati (settati per il PIC che si vuole programmare e per il tipo di programmatore che si sta usando) dal menù File, di detto programma, selezionando “Apri” verrà aperta una finestra per la ricerca del File con estensione “*.HEX”, (dove è stato memorizzato dal compilatore), e dopo averlo individuato si cliccherà su di esso, quindi cliccando il pulsante “Apri” il file verrà evidenziato in Ic-Prog, A questo punto cliccando il pusante “Programma tutto” si darà inizio al trasferimento del File “.HEX” sul PIC. Dopo aver eseguito questa operazione, esente da errori, si smonterà il PIC dal programmatore per montarlo nel suo zoccolo del circuito “Miniwalk” Suggeriamo di visitare, per maggiori dettagli e informazioni sull’argomento, il sito: http://www.pctuner.net/php/Articoli/Articolo.php?PAG=1&id=422&access=&lang=ita&type= dove la procedura è ampiamente spiegata e illustrata. Metodo di caricamento dei PIC “in circuit” Questo metodo permette di programmare il PIC tutte le volte che si vuole,senza doverlo rimuovere dallo zoccolo di “miniwalk” e senza bisogno di dover utilizzare il “programmatore di PIC”. Si dovrà (una prima volta soltanto), caricare sul PIC con il metodo precedente, uno speciale File “.HEX” denominato “bootloader” il quale verrà caricato in una particolare area di memoria del PIC per essere successivamente riconosciuto dal programma di caricamento “PICdownLoader”. I file (gratuiti) di “bootloader” “.HEX” dovranno essere scaricati da: http://www.microchipc.com/PIC16bootload/ scegliere: Download Shane Tolmie PIC bootloader v9-30 per lo scarico. Da questi file scegliere : bootloader hex file for 16F87XA compatible bootloader e quindi il file: “bootldr-16f876A-20MHz-38400bps.HEX” (valido per il “Miniwalk”) Questo è il File che dovrà essere caricato sul PIC16F876 di “Miniwalk” per renderlo valido alla procedura di caricamento “in circuit” Il programma “PICdownloader” può essere scaricato gratuitamente dal sito: http://www.ehl.cz/pic/pic_e.htm (scaricare picdownloader version1.08 e installare il programma) 31 Procedura per caricare sul PIC16F876 il programma ““bootloader.HEX” (con il metodo “non in circuit”) Le cose necessarie: (vedere riferimenti e descrizioni nei precedenti paragrafi) 1) un programmatore per PIC (Tipo “minipropic2 clone” o “PICKit2” o analoghi) 2) un programma tipo “Ic-Prog” oppure “WinPic800” oppure “Melabs Programmer” 3) un File “bootloader.hex” (specifico per il PIC16F876) Inserire, nello zoccolo del programmatore, il PIC16F876, facendo molta attenzione al verso di inserimento del PIC, e collegare al programmatore, il cavo parallelo (DB25) del Personal Computer. Avviare il programma ad es. Ic-Prog o WinPic800 e scegliere dal menu a discesa (in alto a destra) “PIC16F876” quindi, (con Ic-Prog), cliccare sul menù “Settaggi” e poi su Hardware per impostare il tipo di programmatore “Propic2 Programmer” spuntando anche le caselle “Inverti “MCRL” e “Inverti Vcc” validando il tutto con il pulsante “OK”. Dopo aver impostato i settaggi cliccare sul pulsante di menù “File” e scegliere “Apri”, verrà aperta una finestra dove nella casella in alto è indicato il percorso (indirizzo) dei file elencati più sotto, se il file “bootldr-16F876A-20MHz-38400bps.HEX” è presente cliccare su detto file e poi sul pulsante “Apri” per caricarlo in Ic-Prog. Fatto ciò, si cliccherà sul pulsante “Programma Tutto” per eseguire il trasferimento sul PIC del File. Procedura per caricare sul PIC16F876 il programma “esapode.HEX” con il metodo “in circuit”: N.B. La seguente procedura presuppone che sul PIC16F876 sia già stato caricato il File “bootloader.hex” come illustrato in precedenza). Collegare il cavo seriale del PC, al connettore DB9, della scheda circuito di “Miniwalk”, l’operazione dovrà essere effettuata con l’interruttore di corrente in OFF (circuito spento ). Far partire il programma “PICdownloader” e impostare a 38400 la casella dei bd, quindi cliccando sul pulsante “Search (F2)” si aprirà una finestra per la ricerca dell’indirizzo del file .HEX (miniwalk.hex) che si intende caricare. Dopo aver effettuato la scelta dell’indirizzo si dovrà cliccare sul nome del file “.HEX” comparso nella finestra che si è aperta e quindi cliccare sul pulsante “Apri”. Nella finestra File del programmatore “PICdownloader” comparirà il nome del file .HEX selezionato, cliccando sul pulsante “WRITE (F4)” comparirà la dicitura: “Searching for bootloader”, questo è il momento di dare corrente al circuito di “Miniwalk”. Dopo aver dato corrente si vedrà la barra di “caricamento” scorrere e riempirsi, e alla fine comparire il messaggio con la dicitura:”All OK” che confermerà l’avvenuto caricamento, senza errori, del PIC. Questa procedura potrà essere effettuata ogniqualvolta si rendesse necessaria una modifica o un aggiornamento del programma “Miniwalk.bas” senza mai spostare il PIC16F876 dal suo zoccolo. 32 APPENDICE (A) (Listato del programma “esapode.bas”) '***************************************************************** '* Nome : esapode.bas (programma PBP per robot-esapode) * '* versione : 1.01 (novembre 2006) * '*------------:-----------------------------------------------------------------------------------* '* Process. : PIC16F876 o PIC16F876A * '* Autore : G. Bigi * '* Data : 14/11/2006 * '*------------:----------------------------------------------------------------------------------* '*Dispositivi : ----> per il rilevamento degli ostacoli: * '* installati : n° 2 Sensori emettittori infrarosso (IR) * '* : n° 1 Sensore IS1U60 Sharp (rilevatore IR) * '*-----------:-----------------------------------------------------------------------------------* '* Date Test : 16/03/2006 test movimento motori -> OK! * '* : 18/03/2006 test camminata -> OK! * '* ------------ : --------------------------------------------------------------------------------* '* legende : Sx = Sinistra * '* simboli : Dx = Destra * '* : Cx = Centro * '***************************************************************** ' ------------------- [ Definizioni ] -----------------------------------------DEFINE LOADER_USED 1 ' Definisce il caricamento tramite boot-loader DEFINE OSC 20 ' Definisce il Clock a 20MHz ADCON1 = %00000111 ' Imposta Porta A = Digitale (x lettura IR sensor) ' ------------------- [ Verso Porte ] -----------------------------------------TRISA = %00001100 ' Imposta i bit 2-3 Port A in Input gli alri in Output TRISB = %00000000 ' Imposta i bit di Port B in Output ' ------------------ [ Definizioni I/O ] --------------------------------------Servo1 VAR PORTB.1 ' RB.1=pin 22 x Servo 1(mot-centr) x inclinaz.robot Servo2 VAR PORTB.2 ' RB.2=pin 23 x Servo 2(mot-gambe) x locomoz. robot IR_1 VAR PORTA.2 ' RA.2=pin 4(di 16F876) x rilevam. valore IR Sx IR_2 VAR PORTA.3 ' RA.3=pin 5(di 16F876) x rilevam. valore IR Dx ' ---------------- [ Definizioni Variabili ]-----------------------------------Pos_Servo1 VAR WORD 'variab. x il posizionamento del servo1 (centrale) Pos_Servo2 VAR WORD 'variab. x il posizionamento del servo2 (gambe) mcount ncount k action VAR BYTE 'variab. di loop x routine "esegui" VAR BYTE 'variab. di loop (x le altre routine) VAR BYTE 'variab. di servizio VAR BYTE 'variab. di lettura valori degli IR sensor ' ---------------- [ Definizioni Costanti ]------------------------------------s1_max CON 900 'Kost. di Max posiz. a SX del servo1 centrale s1_cen CON 750 'Kost. di posizion. al Cx del servo1 centrale s1_min CON 600 'Kost. di Min Posiz. a DX del servo1 centrale s2_max s2_cen s2_min Ritardo CON 900 CON 750 CON 600 CON 20 'Kost. di Max posiz. a SX del servo2 gambe 'Kost. di posizion. al Cx del servo2 ganbe 'Kost. di Min Posiz. a DX del servo2 gambe 'Kost. (di microsecondi) per PULSOUT 33 ' --------------------- [ Inizializzazione ] -----------------------------------PORTA = 0 'settaggio iniziale a livello basso pin di PORTA PORTB = 0 'settaggio iniziale a livello basso pin di PORTB mcount = 0 'imposta a 0 la variab. mcount ncount = 0 'imposta a 0 la variab. ncount GoSub centra 'rinvia al posizionam. in-centro dei servo-motori ' --------------------- [ Inizio programma (ciclo continuo) ] -------------------Inizio: action = IR_1 + IR_2 * 2 ' valori degli IR_sensor in -> action Branch action, [Avanti, Destra, Sinistra, Inverti] ' scelta dei rinvii-routine GoTo Inizio ' a riinizio ciclo '-----------------------------------------------------------------------------------' ---- legenda valori di action (da IR_1(RA.2) e IR_2RA.3)) -----' valore di action = 0 (IR_1 = 0 & IR_2 = 0) nessun ostacolo -> vai avanti ' valore di action = 1 (IR_1 = 1 & IR_2 = 0) ostacolo a SX -> gira a Dx ' valore di action = 2 (IR_1 = 0 & IR_2 = 1) ostacolo a DX -> gira a Sx ' valore di action = 3 (IR_1 = 1 & IR_2 = 1) ost.frontale -> inverte il cammino '================== [ Subroutine di gestione della camminata ] ==================== ' -------- routine di esecuzione-impulsi (movimento) ai servo-motori ----------------Esegui: 'esecuz. impulsi di movimento ai servo-motori For mcount = 1 to 12 '12 esecuzioni del ciclo PulsOut Servo1,Pos_Servo1 'impulsi a servo centrale x inclinare il bot PulsOut Servo2,Pos_Servo2 'impulsi a servo locomotore x l'avanzamento Pause Ritardo 'Ritardo di 20 Ms (intervallo tra gli impulsi) Next 'a riesecuzione del ciclo (x 12 volte) Return 'ritorno alla routine chiamante '-------------------- va avanti (nessun rilevamento di ostacoli dai IR-Sensor) -------------Avanti: Pos_Servo1 = s1_max ' valore d'inclinazione a SX del servo centr. (900) GoSub Esegui ' rinvio alla routine-esecuzione del movimento Pos_Servo2 = s2_max ' val. spostam. gambe in avanti x servo locomot.(900) GoSub Esegui ' rinvio alla routine esecuzione del movimento Pause 5 ' attesa di ritardo di 5 Ms Pos_Servo1 = s1_min GoSub Esegui Pos_Servo2 = s2_min GoSub Esegui Pause 5 GoTo Inizio ' valore d'inclinaz. a DX del servo centr. (600) ' rinvio alla routine-esecuzione del movimento ' val. spostam. gambe indietro x servo locomot. (600) ' rinvio alla routine-esecuzione del movimento ' attesa di ritardo di 5 Ms (microsecondi) ' rinvio alla routine di lettura sensori IR '----------------------------- posizionamento al centro dei servo-motori ----------------centra: For ncount = 1 To 6 ' 6 esecuzioni del ciclo Pos_Servo1 = s1_cen ' val. x posizion. al Cx di servo1 (750) GoSub Esegui ' rinvio alla routine-esecuzione del movimento Pause 5 ' attesa di ritardo di 5 Ms Pos_Servo2 = s2_cen ' val. x posizion. al Cx di servo2 (750) GoSub Esegui ' rinvio alla routine esecuzione impulsi Pause 5 ' attesa di ritardo di 5 Ms Next ' alla riesecuzione del ciclo Return 34 '---------------------------------- routine di indietreggiamento ---------------------------------Indietro: For ncount = 1 to 6 ' 6 esecuzioni del ciclo Pos_Servo1 = s1_max ' valore d'inclinazione a SX del servo centr. (900) GoSub Esegui ' rinvio alla routine esecuzione del movimento Pos_Servo2 = s2_min ' val.spostam. gambe (indietro) x servo locomot.(600) GoSub Esegui ' rinvio alla routine esecuzione del movimento Pause 5 ' attesa di ritardo di 5 Ms Pos_Servo1 = s1_min ' valore d'inclinazione a DX del servo centr. (600) GoSub Esegui ' rinvio alla routine esecuzione del movimento Pos_Servo2 = s2_max ' val.spostam. gambe (avanti) x servo locomot. (900) GoSub Esegui ' rinvio alla routine esecuzione del movimento Pause 5 ' attesa di ritardo di 5 Ms Next ' a riesecuzione del ciclo Return ' ritorno alla routine chiamante '-------------------------------------- spostamento a SX del bot -------------------------------Sinistra: ' torna indietro e gira a sinistra per evitare ' l'ostacolo individuato dal sensore di destra (IR-DX) GoSub Indietro For ncount = 1 to 7 Pos_Servo1 = s1_cen GoSub Esegui Pos_Servo2 = s2_max GoSub Esegui Pause 5 Pos_Servo1 = s1_max GoSub Esegui Pos_Servo2 = s2_min GoSub Esegui Pause 5 Next GoTo Inizio ' rinvio alla routine di retrocessione ' 7 cicli x lo spostam. a SX ' val. x posizion. al Cx di servo1 (750) ' val.spostam. gambe (avanti) x servo2 locomot. (900) ' val. x inclinaz. a DX del servo1-centr. (900) ' val.spostam. gambe (indietro) x servo2 locomot. (600) 'rinvio alla routine di lettura sensori IR '---------------------------- spostamento a DX del bot --------------------------------------Destra: ' torna indietro di tre passi e gira a destra per evitare ' l'ostacolo individuato dal sensore di sinistra (IR-SX) GoSub Indietro ' rinvio alla routine di retrocessione For ncount = 1 to 6 Pos_Servo1 = s1_cen GoSub Esegui Pos_Servo2 = s2_min GoSub Esegui Pause 5 Pos_Servo1 = s1_max GoSub Esegui Pos_Servo2 = s2_max GoSub Esegui Pause 5 Next GoTo Inizio ' 5 cicli x spostam. a DX ' val. x posizion. al Cx di servo1-centr. (750) 'val.spostam. gambe (indietro) x servo2 locomot. (600) ' val. x inclinaz. a DX del servo1-centr.(900) ' val.spostam. gambe (avanti) x servo2 locomot. (900) 'rinvio alla routine di lettura sensori IR 35 '------------------------- Inversione della camminata (ostacolo frontale) -------------------------Inverti: ' torna indietro di tre passi e gira di 180 gradi per evitare ' l'ostacolo individuato da entrambi i sensori IR GoSub Indietro For k = 1 To 5 For ncount = 1 to 3 Pos_Servo1 = s1_cen GoSub Esegui Pos_Servo2 = s2_min GoSub Esegui Pause 5 Pos_Servo1 =s1_max GoSub Esegui Pos_Servo2 = s2_max GoSub Esegui Pause 5 Next Next GoTo Inizio 'retrocede ' 4 cicli x l'inversione di 180° ' 3 cicli di spostam. a DX 'rinvio alla routine di lettura sensori IR '------------------------------------------------------------------------------------------------------End 36 APPENDICE (B) (Listato del File “esapode.HEX”) :02000000432893 :10000800B60017202008210403193E28382084133D :1000180036088006640010281128A00A0319A10FC9 :100028000E2880063E28FF3A841780053E28A30143 :10003800A200FF30A207031CA307031C3E280330BD :10004800A100E63029201D28A101FC3EA000A1093D :10005800031C3428FF300000A00703182F28A0072E :100068006400A10F2E280800A009A109A00A0319FD :10007800A10A08008313031383126400080083167F :1000880007309F000C3085008601831285018601A8 :10009800C001C1018A110A12AE200230851D030178 :1000A800B2000030851D0301B30032080519013E76 :1000B800BE003E08033C8A110A12031C6B2800305C :1000C8008A003E08820791282C29FC285C298A018D :1000D80051280130C00064000D3040028A110A1214 :1000E800031890283A08A0003B08A10006308400B5 :1000F80002308A0104203C08A0003D08A100063017 :10010800840004308A01042014308A011B20C00AAC :100118008A110A12031D6F2808008430BA000330C0 :10012800BB008A016D208430BC000330BD008A0109 :100138006D2005308A011B205830BA000230BB0000 :100148008A016D205830BC000230BD008A016D2044 :100158008A0151280130C1006400073041028A1128 :100168000A120318CE28EE30BA000230BB008A010A :100178006D2005308A011B20EE30BC000230BD0026 :100188008A016D2005308A011B20C10A8A110A12D2 :10019800031DB02808000130C10064000730410287 :1001A8008A110A120318FB288430BA000330BB00F6 :1001B8008A016D205830BC000230BD008A016D20D4 :1001C80005308A011B205830BA000230BB008A0172 :1001D8006D208430BC000330BD008A016D200530DD :1001E8008A011B20C10A8A110A12031DD12808009E :1001F8008A01CF200130C1006400083041028A1111 :100208000A1203182A29EE30BA000230BB008A010C :100218006D208430BC000330BD008A016D2005309C :100228008A011B208430BA000330BB008A016D208C :100238005830BC000230BD008A016D2005308A01AB :100248001B20C10A8A110A12031D00298A0151289C :100258008A01CF200130C1006400073041028A11B1 :100268000A1203185A29EE30BA000230BB008A017C :100278006D205830BC000230BD008A016D20053069 :100288008A011B208430BA000330BB008A016D202C :100298008430BC000330BD008A016D2005308A011E :1002A8001B20C10A8A110A12031D30298A0151280C :1002B8008A01CF200130BF00640006303F028A1156 :1002C8000A12031898290130C10064000430410261 :1002D8008A110A1203189329EE30BA000230BB00C3 :1002E8008A016D205830BC000230BD008A016D20A3 :1002F80005308A011B208430BA000330BB008A0114 :100308006D208430BC000330BD008A016D200530AB :100318008A011B20C10A8A110A12031D6929BF0A12 :100328008A110A12031D60298A01512863008A0173 :020338009A2900 :02400E00753FFC :00000001FF 37 APPENDICE (C) (Listato del File “bootldr-16F876A-20MHz-38400bps.HEX”) :020000040000FA :0800000000008A150A16882E83 :103D00008A150A16802E8A018A150A16832E00004B :103D1000031E832E903098008316181598161F30B6 :103D2000990083120330FA00313090000C14EC2615 :103D3000EA3A031DAF2EFA01B62EEC26F900E33A5B :103D40000319B82E7908EA3A0319B62E7908ED3A24 :103D5000031D9D2EE430E7260330FA00EC26900187 :103D600098018316980183128C01832EEB30E52E87 :103D7000EC26F600EC26F500EC26F100FB00EC2624 :103D8000F300F20121308312031376020319D12EBE :103D900075080339FC00FD000310FC0D20307C0782 :103DA000D22E20308400EC268000F207840AFB0B20 :103DB000D32E72087306E830031DE52EE730E726A0 :103DC000FE260038E4300319E530E7269D2E640016 :103DD0000C1EE72E9900080064007A080319FA2ED9 :103DE0000C1CFA2E1010FA0BF62E00340C100B30AF :103DF0008F0010148C1EEC2E1A0808002130760259 :103E00000319502F831603178C1783120313750899 :103E1000FC3903178D000313760803178F00203039 :103E2000840003137D080319282F831603170C142D :103E30000000000083120E088000840A0C08800035 :103E4000840A8D0A0313FD03F503F10AF10A112F09 :103E50007108FC00203E84000310FC0C7608031758 :103E60008F000313750803178D0003137C080317D5 :103E70008D0703198F0A03170D0803390319502FF3 :103E800083160C140000000083120E088000840AC0 :103E90000C088000840A8D0A0313F10AF10A3B2FF3 :103EA0007508F7007608F800FB010230F40071088D :103EB0007B02031801347B08203E84002130780205 :103EC0000317831603196E2F8C1783011E30780297 :103ED0008030031977020318B62F702F8C138301DB :103EE000770803178D0003137808031D852F04300E :103EF00077020318852F031783168C1F822F8312D6 :103F000084308D0783011E30862F780803178F00B9 :103F100000088E00840A00088C0083160C155530AA :103F20008D00AA308D008C140000000083018316E0 :103F300003178C1BBE2F8312031364000D1E9D2FCD :103F40000D12831603170C110C14000000008312CD :103F5000840300080E06031DB22F840A00080C0615 :103F60000319B62F8301F40B572F00348312031368 :103F70000230FB07F70A0319F80A552F83120313BF :103F80000D12831603170C11831203170D08033942 :103F9000033C031DB62F03308D028312031304303C :103FA000FC00073084020000831603170C14000085 :103FB000000000000000000000000008831203174A :103FC0000E06031DE82F840A00080C060319EF2FC4 :103FD00083120313FC30F7050630FB02B22F831265 :103FE00003178D0A840A83120313FC0BD32FB62FF9 :084000000200010000000000B5 :02400E00323F3F :00000001FF 38 APPENDICE (D) (Listato del File “nirprox.asm” ) ; TITLE 'Infra Red Proximity Detector - uses Sharp 38 or 40KHz IRM ; ; I included the "include" file for the 508 for reference while programming ; LIST P = 12F508, F = INHX8M ; P12F508.INC Standard Header File, Version 1.02 Microchip Technology, Inc. ;========================================================================== ; Verify Processor ;========================================================================== ; ; ; IFNDEF __12F508 MESSG "Processor-header file mismatch. Verify selected processor." ENDIF ;========================================================================== ; Register Definitions ;========================================================================== W EQU H'0000' F EQU H'0001' ;----- Register Files ----------------------------------------------------INDF EQU H'0000' ; Uses FSR to address data mem. TMR0 EQU H'0001' ; 8 bit real time clock/counter PCL EQU H'0002' ; Low order 8 bits of PC STATUS EQU H'0003' ; STATUS FSR EQU H'0004' ; Indirect data memory addr pointer OSCCAL EQU H'0005' ; Calibration data for osc. GPIO EQU H'0006' ; General Purpose I/O ;----- STATUS Bits -----------Page 14-------------------------------------GPWUF EQU H'0007' ; GPIO reset bit PA0 EQU H'0005' ; Program Page preselect NOT_TO EQU H'0004' ; Time Out bit NOT_PD EQU H'0003' ; Power Down bit ZERO EQU H'0002' ; Zero bit DC EQU H'0001' ; Digit carry/*borrow bit CARRY EQU H'0000' ; carry/*borrow bit ;----- OPTION Bits -----------Page 15-------------------------------------NOT_GPWU EQU H'0007' ; Enable wake-up on pin change NOT_GPPU EQU H'0006' ; Enable weak pull-ups T0CS EQU H'0005' ; Timer0 clock source select T0SE EQU H'0004' ; Timer0 sources edge select PSA EQU H'0003' ; Prescalar assignment bit PS2 EQU H'0002' ;\ PS1 EQU H'0001' ; > Prescalar rate select bits PS0 EQU H'0000' ;/ ;========================================================================== ; RAM Definition ;========================================================================== __MAXRAM H'3F' ;========================================================================== ; Configuration Bits ;========================================================================== _MCLRE_ON EQU H'0FFF' 39 _MCLRE_OFF EQU H'0FEF' _CP_ON EQU H'0FF7' _CP_OFF EQU H'0FFF' _WDT_ON EQU H'0FFF' _WDT_OFF EQU H'0FFB' _LP_OSC EQU H'0FFC' _XT_OSC EQU H'0FFD' _IntRC_OSC EQU H'0FFE' _ExtRC_OSC EQU H'0FFF' __CONFIG ( _MCLRE_OFF & _CP_OFF & _WDT_OFF & _IntRC_OSC ) ;========================================================================== ; Program Variables ;========================================================================== #define LEFTDETECT #define RIGHTDETECT #define INHIBIT #define RIGHTLED #define IRDETECT #define LEFTLED #define LLIMIT #define LHITLIM #define UMISSLIM WAIT FAKEHIT LHITS RHITS FAKEHIST SLHITS SLMISS SRHITS SRMISS LIST EQU EQU EQU EQU EQU EQU EQU GPIO,5 GPIO,4 GPIO,3 GPIO,2 GPIO,1 D'20' ; Pin 2 = GP5 = Bit 5 ; Pin 3 = GP4 = Bit 4 ; Pin 4 = GP3 = Bit 3 ; Pin 5 = GP2 = Bit 2 ; Pin 6 = GP1 = Bit 1 GPIO,0 ; Pin 7 = GP0 = Bit 0 ; Lower limit of allowable hits in a window D'5' ; Lower hits limit ; Upper miss limit 9 EQU D'15' D'16' D'17' D'11' D'13' D'18' EQU ; Location for counter for time delay loop D'14' ; Counter for false detections ; Counter for detections found properly on the left ; Counter for detections found properly on the right ; History of bad hits to overcome noise ; Number of hits in a row ; Number of misses in a row ; Number of hits in a row D'19' ; Number of misses in a row D'30' ;================================ ; Main Code = ;================================ ORG 0x1FF ;MOVLW 0x50 ; My EPROM calibration value,remove for OTPs start ORG 0x000 MOVWF OSCCAL ; Store the factory osc. calibration value MOVLW B'11001010' ; Set pins 4,6 as inputs, 2,3,5,7 as outputs TRIS GPIO ; Configure pins as either I or O MOVLW B'01000000' ; Set OPTION bits (Weak pullups enabled) OPTION ; Implement OPTION bits CLRF FAKEHIST ; History of bad hits CLRF SLHITS ; Good hits "in a row" history CLRF SLMISS ; Misses "in a row" history CLRF SRHITS CLRF SRMISS MOVLW B'11001010' ; Make sure that GP1 and GP3 are '1' on read MOVWF GPIO main ;*************************************************************************** ; This version of my IR detector recognizes that there is background noise * ; out there that needs to be overcome to get good readings no matter what. * ; * ; It alternates readings of both the left and the right IR LEDs each of * 40 ; them cycled at 40KHz for 2.5ms on and 2.5ms off, a 50% duty cycle. * ; During the 'off' cycle we will look for false hits, denoting noise in * ; our environment. It saves these noise readings, if subsequent readings * ; are higher, then the higher reading is saved, if lower, then 1/4 of the * ; newer reading will be subtracted from the history. So noise levels are * ; reduced faster than they are raised so a signal can still sneak in there.* ; Then the IR LED is flashed at 40KHz and a reading is taken on every * ; cycle. These readings are taken in the same cycle "time slots" as the * ; ones taken in the 'off' cycle. In each case, 100 cycles are sampled. * ; After a full on/off cycle, a reading is considered good if there are more* ; good detections than false hits AND there are at least 20 good hits. * ; A counter is incremented every time there is a good hit on any given * ; side, at that time, a miss counter is decremented. When there is a bad * ; cycle, the miss counter for that side is incremented and the hit counter * ; is decremented. When the threshhold for hits is passed, the detect is * ; indicated on that side and the miss counter is zeroed out. Conversely, * ; if the miss threshhold is exceeded (always larger than the hit one) then * ; a detect is disabled and the hit counter is zeroed. In this way you get * ; a sort of lock on a good signal that takes effort to lose. Also, noise * ; is rejected better and you have a more solid result. * ; * ; Sampling times, threshholds and limits were arrived at completely by hit* ; and miss. Eventually, I stopped fiddling and declared "good enough" * ; because the more I fiddled, the worse it seemed to get... * ; * ; Revision 2.0 2/16/98 Copyright Dennis Clark and TTT Ent. * ;*************************************************************************** noflash BTFSC INHIBIT ; This needs an external pullup, not there yet. GOTO do_looks ; If /inhibit is one, do your thing. CLRF FAKEHIST ; History of bad hits CLRF SLHITS ; Good hits "in a row" history CLRF SLMISS ; Misses "in a row" history CLRF SRHITS CLRF SRMISS MOVLW B'11001010' ; Make sure that GP1 and GP3 are '1' on read MOVWF GPIO GOTO noflash do_looks call do_left ; deal with left looking stuff call do_right ; deal with right side stuff goto noflash ; look again ;================================ ; SUBROUTINES = ;================================ do_left CALL delayloop ; Look for false hits when IR LEDs are off CALL pulseleft ; Pulse the left IR LED at 40 KHz MOVF FAKEHIST,W ; Get current "noise" level SUBWF LHITS,W ; LHITS - FAKEHIST => W BTFSS STATUS,CARRY ; C=1 means LHITS >= FAKEHIST GOTO nlgood ; IR detector didn't get a hit through the noise MOVLW LLIMIT ; Get the lower limit for allowable hits SUBWF LHITS,W ; LHITS - LLIMIT => W BTFSS STATUS,CARRY ; C=1 means that LHITS >= LLIMIT = good hit GOTO nlgood ; Nope, not good enough - too noisy maybe clgood INCF SLHITS,F DECF SLMISS,F ; increment number of good hits ; decrement miss counter 41 MOVLW LHITLIM ; Lower hit limit SUBWF SLHITS,W ; enough good ones in a row? BTFSS STATUS,CARRY ; C=1 means SHITS >= limit GOTO lldone ; not yet lgood BSF LEFTDETECT ; Turn on the left Visible LED CLRF SLMISS ; clear miss counter GOTO lldone ; Now lets look right nlgood INCF SLMISS,F ; increment number of misses DECF SLHITS,F ; reduce hits counter MOVLW UMISSLIM ; Upper missed ones limit SUBWF SLMISS,W ; too many bad ones in a row? BTFSS STATUS,CARRY ; C=1 means SMISS >= limit GOTO lldone ; not bad enough yet no_left lldone BCF CLRF retlw ; No obstacle to the left, so LEFTDETECT ; Turn off the left visible LED SLHITS ; clear the hits counter 0 do_right CALL delayloop ; Look for false hits when IR LEDs are off CALL pulseright ; Pulse the right IR LED at 40 KHz MOVF FAKEHIST,W ; Get current "noise" level SUBWF RHITS,W ; RHITS - FAKEHIST => W BTFSS STATUS,CARRY ; C=1 means LHITS >= FAKEHIST GOTO nrgood ; IR detector didn't get a hit through the noise MOVLW LLIMIT ; Get the lower limit for allowable hits SUBWF RHITS,W ; RHITS - LLIMIT => W BTFSS STATUS,CARRY ; C=1 means that LHITS >= LLIMIT = good hit GOTO nrgood ; Nope, not good enough - too noisy maybe crgood INCF SRHITS,F ; increment number of good hits DECF SRMISS,F ; decrement miss counter MOVLW LHITLIM ; Lower hit limit SUBWF SRHITS,W ; enough good ones in a row? BTFSS STATUS,CARRY ; C=1 means SHITS >= limit GOTO lrdone ; not yet rgood BSF RIGHTDETECT ; Turn on the left Visible LED CLRF SRMISS ; clear miss counter GOTO lrdone ; start over nrgood INCF SRMISS,F ; increment number of misses DECF SRHITS,F ; reduce hits counter MOVLW UMISSLIM ; Upper missed one limit SUBWF SRMISS,W ; too many bad ones in a row? BTFSS STATUS,CARRY ; C=1 means SMISS >= limit GOTO lrdone ; not bad enough yet no_right BCF CLRF lrdone retlw ; No obstacle to the left, so RIGHTDETECT ; Turn off the left visible LED SRHITS ; clear the hits counter 0 delayloop MOVLW D'100' MOVWF WAIT CLRF FAKEHIT loop BCF LEFTLED BCF RIGHTLED ; ; This creates a delay ; Clear out for checking ; Make sure IR LEDs are off 42 NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP ; NOP ; NOP ; NOP ; NOP ; BTFSS IRDETECT ; Look for a false hit INCF FAKEHIT,F ; note the false detect NOP ; NOP ; DECFSZ WAIT,F ; goto loop MOVF FAKEHIST,W ;Get historic false readings SUBWF FAKEHIT,W ;FAKEHIT - FAKEHIST => W BTFSS STATUS,CARRY ;if C=1 then FAKEHIT >= FAKEHIST GOTO newless ;Go here if FAKEHIT < FAKEHIST MOVF FAKEHIT,W ;Get current # of false hits MOVWF FAKEHIST ;And save the new higher number GOTO bdone ;my job here is done newless RRF FAKEHIT,F ; ; RRF FAKEHIT,F RRF FAKEHIT,W ; ANDLW 0x3f ;divide by 4 SUBWF FAKEHIST,F ;FAKEHIST - (FAKEHIT/4) => FAKEHIST, save lower number bdone RETLW 0 pulseleft leloop MOVLW D'100' MOVWF WAIT CLRF LHITS BSF LEFTLED NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP BCF NOP NOP NOP NOP NOP ; Pulses the left IR led at 40 KHz ; Clear out the count for now ; ; ; ; ; ; ; ; ; ; ; ; LEFTLED ; ; ; ; ; ; 43 NOP ; BTFSS IRDETECT ; Look for a detection INCF LHITS,F ; And record them NOP ; NOP ; DECFSZ WAIT,F GOTO leloop RETLW 0 (moved this up a bit) pulseright MOVLW D'100' MOVWF WAIT ; Pulses the right IR led at 40KHz CLRF RHITS ; Clear out hit counter riloop BSF RIGHTLED ; NOP ; NOP ; NOP ; NOP ; NOP ; NOP ; NOP ; NOP ; NOP ; NOP ; NOP ; BCF RIGHTLED ; NOP ; NOP ; NOP ; NOP ; NOP ; NOP ; BTFSS IRDETECT ; Look for detections INCF RHITS,F ; and record them NOP ; NOP ; DECFSZ WAIT,F GOTO riloop RETLW 0 END 44 APPENDICE (E) (Listato del File “nirprox.hex”) :100000002500CA0C0600400C020071006B006D0058 :1000100072007300CA0C26006606160A71006B0097 :100020006D0072007300CA0C26000C0A190935090C :100030000C0A5109790911028F0003072C0A1E0CC2 :100040008F0003072C0AAB02ED00050C8B000307A1 :10005000340AA6056D00340AAD02EB00140C8D00C5 :100060000307340AA6046B0000085109960911021F :1000700090000307480A1E0C90000307480AB202CA :10008000F300050C92000307500A86057300500A1E :10009000B302F200140C93000307500A86047200A6 :1000A0000008640C29006E000604460400000000ED :1000B0000000000000000000000000000000000040 :1000C0000000000000000000000000000000260703 :1000D000AE0200000000E902540A11028E0003077C :1000E000740A0E023100780A2E030E033F0EB1008F :1000F0000008640C29006F000605000000000000E5 :1001000000000000000000000000000000000000EF :1001100006040000000000000000000000002607A8 :10012000AF0200000000E9027C0A0008640C29000C :100130007000460500000000000000000000000004 :100140000000000000000000000046040000000065 :1001500000000000000000002607B00200000000C0 :06016000E902990A000803 :021FFE00EA0FE8 :00000001FF 45