“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
Scarica

tutorial in pdf