UNIVERSITÀ DEGLI STUDI DI PADOVA
DIPARTIMENTO DI TECNICA E GESTIONE DEI
SISTEMI INDUSTRIALI
CORSO DI LAUREA TRIENNALE IN INGEGNERIA MECCANICA E
MECCATRONICA
PROGETTAZIONE E REALIZZAZIONE DI UNA MACCHINA TRATTRICE A
PROPULSIONE ELETTRICA
DESIGN AND IMPLEMENTATION OF A TOWING VEHICLE WITH ELECTRIC
PROPULSION
Relatore: Ch.mo Prof. MATTAVELLI PAOLO
Correlatore: Ing. GIRLANDA CLAUDIO
Laureando: RIGHETTI FABIO – 614265 IMM
ANNO ACCADEMICO 2013/2014
Sommario
In questo elaborato ho riportato i risultati del mio lavoro di tesi triennale.
Ho svolto il primo stadio di sviluppo di un nuovo prodotto presso Girtech srl, azienda della
provincia di Verona che mi ha ospitato e seguito durante il progetto.
Grazie all'unione delle competenze che ho acquisito durante gli studi presso il Dipartimento
di Tecnica e Gestione dei Sistemi Industriali, al know-how aziendale, alla collaborazione di
fornitori e di possibili clienti, siamo arrivati al prototipo oggetto di questa tesi.
Nel primo capitolo ho illustrato il metodo della Lean Startup, descritto i Minimum Viable
Product e gli anelli Build-Measure-Learn.
Nel secondo capitolo ho fatto un'analisi di mercato per capire le fasce di prezzo in cui si
posizionano le soluzioni già esistenti.
Il terzo capitolo riguarda la scelta dei componenti per la realizzazione del prototipo.
Nel quarto e quinto capitolo spiego i princìpi che hanno guidato la programmazione,
rispettivamente, della pagina web contenente il joystick per guidare il robot e del PLC.
Nel sesto capitolo ho descritto i test effettuati prima di procedere all'assemblaggio e le
principali norme a cui il progetto afferisce.
L'ultimo capitolo, il settimo, riporta le conclusioni del mio operato e alcune possibili strategie
perseguibili dall'azienda per proseguire con lo sviluppo di questa soluzione.
III
Indice
Sommario
p. III
Indice
p. V
Introduzione
p. 1
CAPITOLO 1: Obiettivo e Lean Startup
p. 2
1.1 Obiettivo di progetto
p. 2
1.2 Lean Startup
p. 4
1.3 Primo ciclo Build-Measure-Learn
p. 6
CAPITOLO 2: Analisi di mercato
p. 8
2.1 Spazzaneve
p. 9
2.2 Rasaerba
p. 9
2.3 Rasaerba autonomi e telecomandati
p. 10
2.4 Agricoltura di precisione
p. 11
CAPITOLO 3: Componenti
p. 13
3.1 Ruote
p. 13
3.2 Mozzi
p. 14
3.3 Corone, pignoni, catene
p. 15
3.4 Motori
p. 15
3.5 Batterie
p. 16
3.6 Driver
p. 17
3.6.1 Schema di funzionamento del Sabertooth
p. 18
3.7 Antenna Wi-Fi
p. 19
3.8 PLC
p. 19
V
3.9 Relè
p. 21
3.10 Microswicth
p. 21
3.11 Paraurti
p. 22
CAPITOLO 4: Interfaccia utente
p. 23
CAPITOLO 5: Programmazione del PLC
p. 25
5.1 Dal joypad al controllo dei motori
5.1.1 Modello cinematico
p. 25
p. 28
5.2 Stati di funzionamento
p. 29
5.3 Codice IL
p. 30
CAPITOLO 6: Test e debug, inquadramento normativo
p. 33
CAPITOLO 7: Conclusioni e sviluppi futuri
p. 35
7.1 Conclusioni
p. 35
7.2 Sviluppi futuri
p. 35
RIFERIMENTI
p. 37
APPENDICE A
p. 38
A.1 Listato IL – Main
p. 38
A.2 Listato IL – Engine
p. 40
Introduzione
Si vuole costruire un robot elettrico atto a trainare o spingere altri dispositivi. Il robot in
questione dovrà lavorare all’aperto e sarà radiocomandato via smartphone o tablet.
Il progetto nasce dopo aver constatato che molti macchinari da giardino (turbina spalaneve,
rasaerba, ecc.) funzionano perfettamente dal punto di vista meccanico ma non sono orientati
ad un utente generico. Sono degli oggetti inerti, strumenti che hanno bisogno dell'uomo per
funzionare e che grazie all'intelligenza e spesso all'abilità di chi li usa possono esprimere la
loro funzionalità. Il prototipo costruito vuole essere il primo passo verso la realizzazione di
una macchina che sia in grado di eseguire i suoi compiti in modo autonomo, reagendo agli
stimoli ambientali e interagendo col mondo di internet: una pedina dell' Internet of thing.
Questo robot potrebbe diventare un prodotto da immettere sul mercato oppure potrebbe
essere usato per cercare partnership con le aziende produttrici di strumenti “statici”,
intenzionate a completare i loro prodotti con questa tecnologia.
Prodotti di questo tipo non rientrano all’interno dei prodotti/servizi offerti abitualmente da
Girtech srl perciò, oltre alle difficoltà tecniche, si celano dubbi sull’accoglienza da parte del
mercato della soluzione proposta. Si è scelto così di affrontare il percorso con il metodo della
Lean Startup.
“A startup is a human institution designed to create a new product or service under condition
of extreme uncertainty”. [1]
Illustrazione 1: Primo concept design del progetto
1
CAPITOLO 1
Obiettivo e Lean Startup
1.1 Obiettivo di progetto
Obiettivo di questo progetto è la creazione di una macchina trattrice ad uso generico che,
con l'ausilio di attrezzi specializzati, renda più agevole l'esecuzione di compiti gravosi molto
diffusi tra l'utenza comune. In particolare si fa riferimento alla pulitura di viali, scivoli e cortili
dalla neve e alla manutenzione e cura del giardino.
La cura del giardino richiede un taglio frequente dell'erba che diventa via via più impegnativa
al crescere della dimensione del giardino stesso e della pendenza del terreno. In questo
caso si vuole agganciare alla trattrice un rasaerba così da eliminare il controllo fisico del
movimento da parte dell'utente.
Anche se meno diffuso, il problema della pulizia dalla neve, risulta più ostico ed impegnativo,
a causa delle condizioni ambientali e della densità della neve.
Entrambe queste operazioni possono essere effettuate, in modo analogo, dalla stessa
trattrice combinata con gli opportuni attrezzi.
Queste esigenze sono diffuse e sentite da un'utenza eterogenea perciò il sistema, nel
complesso, deve essere particolarmente semplice e spontaneo.
Si è cercato di rendere intuitivo il movimento del sistema a fronte dell'interazione con il
joypad di comando. Il modello più diffuso di movimento di una macchina è quello
dell'automobile e della bicicletta (biciclo):
–
le rotazioni non possono avvenire senza avanzamento;
–
la capacità di sterzare si riduce all'aumentare della velocità;
–
il comando è impartito tramite un solo input (rappresenta la direzione di
avanzamento, non richiede sincronismo tra comandi);
–
si ritiene che l'utente segua l'attrezzo così da mantenere equiversi gli assi del sistema
di riferimento dell'utente e di quello della macchina.
2
Dal punto di vista delle dimensioni, la prima esigenza è quella di ottenere una larghezza
totale della trattrice inferiore a quella degli attrezzi più comuni. Soprattutto in uso combinato
con una turbina spalaneve, è importante che le ruote siano all'interno dello spazio pulito.
La lunghezza e l'altezza della trattrice non rappresentano una criticità, perciò non richiedono
un'ottimizzazione preliminare.
Il peso deve essere sufficientemente elevato per garantire un'ottima trazione anche su
superfici scivolose ed inclinate. Attualmente la trattrice ha un peso di circa 30kg: potrebbero
non essere sufficienti per garantire la spinta richiesta dalla turbina spazzaneve.
Nei successivi cicli tipici della lean startup, sarà necessario approfondire questo aspetto.
Sono state selezionate due ruote pneumatiche con battistrada scolpito adatte alle superfici
caratteristiche di giardini e viali carrabili. L'equilibro dell'insieme trattrice/attrezzo è garantito
dall'asse proprio dell'attrezzo e da quello del robot. Per questo primo prototipo si ritiene
accettabile trascurare moti diversi dal puro rotolamento delle ruote come lo strisciamento.
È stato scelto un sistema di propulsione elettrica per la semplicità complessiva della
macchina ed allo stesso tempo perché adatta ad una gestione domestica.
Dimensionamento propulsione:
–
autonomia superiore alle due ore;
–
bassa tensione di sicurezza;
–
componenti funzionanti a 24V, standard e facilmente reperibili;
–
fino a 500W erogabili;
–
bassa velocità di esercizio
Si vuole ottenere un sistema intrinsecamente sicuro, lasciando all'utente solo le decisioni che
abitualmente affronta con altri mezzi di spostamento:
–
valutazione di eccessiva pendenza;
–
moderazione della velocità a seconda dell'ambiente circostante;
–
raggiro di percorsi accidentati, gradini, ecc;
–
idoneità del terreno su cui si opera.
È stato aggiunto un sistema di sicurezza perimetrale che azzera la spinta propulsiva in caso
di contatto con un ostacolo.
3
1.2 Lean Startup
La Lean Startup è un approccio utilizzato durante lo sviluppo di un prodotto o di un servizio
nuovo.
Questa procedura si può sintetizzare nella frase “Sii sicuro di costruire la cosa giusta prima
di costruirla per bene” [2]. Per “essere sicuri” è necessario validare due ipotesi:
•
l’ipotesi di valore;
•
l’ipotesi di crescita.
Per effettuare queste operazioni Eric Ries, padre della Lean Startup, [1] propone di seguire
un anello: il “Build-Measure-Learn loop”.
Iterando questa procedura si possono individuare le caratteristiche di un prodotto che
permettano all’azienda di poter operare con soddisfazione sul mercato. Citando Ries: “The
question is not "Can this product be built?" In the modern economy, almost any product that
can be imagined can be built. The more pertinent questions are "Should this product be
built?" and "Can we built a sustainable business around this set of products and services?".
To answer those questions, we need a method for sistematically breaking down a business
plan into its component parts and testing each part empirically.”
E ancora: “We need to focus our energies on minimizing the total time through this feedback
loop. This is the essence of steering a startup.”
E’ importante concentrarsi sul valore aggiunto che offre la nuova soluzione: individuare le
caratteristiche innovative da immettere mercato, così da poter definire un target d’utenza ben
preciso.
Conoscere i propri clienti è fondamentale per poter affrontare lo sviluppo in più tappe,
evitando di investire onerose risorse nel progettare un oggetto per renderlo perfetto dal punto
di vista tecnico, senza aver prima verificato l'effettivo bisogno di tale prodotto da parte del
mercato.
4
Illustrazione 2: Cortesia di Eric Ries - The Lean Startup
Soprattutto in campo tecnologico, le nuove soluzioni vengono inizialmente acquistate dagli
“early adopter” ovvero da una fascia di utenti che recepiscono in modo particolarmente
elevato il valore aggiunto offerto dal prodotto e che sono disposti a trascurare qualche
carenza in termini di caratteristiche e prestazioni. Gli early adopter consentono di instaurare
un flusso di cassa in grado di far sopravvivere l'azienda e di ricevere i primi feedback
riguardo prestazioni e miglioramenti fondamentali da apportare prima di uscire su larga
scala.
L’anello Build-Measure-Learn serve per capire cosa è ritenuto importante dal consumatore e
cosa invece è di secondo piano. Questo anello deve essere molto veloce e ripetuto ogni
volta che vengono apportate modifiche importanti al prodotto.
“The point is not to find average customer but to find early adopters: the customers who feel
the need for the products most acutely. Those customers tend to be more forgiving a
mistakes and are especially eager to give feedback.” [1]
Il progetto complessivo deve evolvere molto velocemente per minimizzare il “cycle time”.
Ries parla di “Continuous deployment” ovvero un processo “whereby all code that is written
for an application is immediately deployed into production”.
5
1.3 Primo ciclo Build-Measure-Learn
Per iniziare il primo anello si è deciso di partire da un modellino CAD 3D semplificato del
robot, costruendo un piccolo sito web dedicato [3]. La pagina conteneva un paio di disegni,
una breve descrizione del progetto e un piccolo questionario.
Il questionario è servito per capire quali sono le caratteristiche che il consumatore ritiene
importanti così da poterle valorizzare fin dalla versione prototipale del dispositivo.
Le persone che hanno compilato il questionario, hanno considerano particolarmente
importanti le seguenti caratteristiche:
–
la durata delle batterie;
–
la possibilità di scegliere tra diverse configurazioni hardware;
–
la possibilità di riparare facilmente il robot in caso di guasto;
–
la possibilità di avere un veicolo autonomo, in grado di muoversi e lavorare senza la
necessità di avere un operatore umano a guidarlo o sorvegliarlo.
Altre caratteristiche gradite emerse: un tempo di ricarica delle batterie abbastanza breve,
dimensioni contenute e peso ridotto. Il design invece non è considerato particolarmente
importante.
Fondamentali, infine, si rivelano essere la tenuta alla polvere e all'acqua.
Solo due di queste voci di discostano sensibilmente da quello che era stato pensato
inizialmente: peso e guida autonoma.
All'inizio era stato ipotizzato un veicolo piuttosto pesante al fine di ottenere una buona
trazione su ogni superficie; evidentemente chi ha visitato il sito ha pensato che il robot debba
essere leggero per essere trasportato agilmente.
In ogni caso, per quanto riguarda il peso, verrà adottato un approccio empirico andando a
testare il robot su diversi terreni, condizioni e pendenze.
Nel caso della guida autonoma, invece, è stata scartata in partenza l'ipotesi di implementarla
nel breve periodo. Questo tipo di controllo richiede molto lavoro di sviluppo, perciò si
interverrà su questo fronte solo quando ci sarà la necessità di farlo o si troveranno le risorse
e le competenze adatte.
6
Prendendo queste risposte come linee guida si è progettato e costruito il robot come
illustrato in seguito. Naturalmente anche la progettazione di una struttura resistente a polvere
e ad acqua richiede un certo tempo per cui nel prototipo realizzato sono state poco
enfatizzate, lasciandole alla fase di ingegnerizzazione.
Illustrazione 3: Questionario con le risposte più cliccate
7
CAPITOLO 2
Analisi di mercato
Non sono state individuate sul mercato soluzioni simili prodotte a livello industriale; si trovano
prototipi e altri progetti autocostruiti ma nulla che sia presente a livello commerciale.
In alternativa è possibile trovare soluzioni complete come tagliaerba autonomi o una turbine
spalaneve motorizzate che richiedono la presenza dell'uomo solo per la guida.
Un esempio di robot autocostruito è il RC Robot Tractor [4].
Illustrazione 4: RC Robot Tractor - Cortesia di
isodesign.fr
Questo robot dispone di due batterie da 12V e due motori in corrente continua da 350W; è
controllato tramite il Sabertooth 2x25 (soluzione simile a quella adottata, si veda il cap.3) e
viene guidato con un telecomando RC.
Il progettista di questo oggetto è un ragazzo francese e, il fatto che ci siano altri costruttori di
dispositivi simili, rafforza l'idea che il bisogno individuato sia sentito da più persone.
Prendendo come riferimento i prodotti dell'azienda McCulloch, colosso nel settore delle
macchine da giardino, si sono analizzate una serie di combinazioni per valutare il denaro da
spendere per ottenere un risultato analogo.
8
2.1 Spazzaneve
Il robot è stato pensato per poter controllare
la McCulloch SB121, la turbina spazzaneve
più piccola del catalogo McCulloch.
Questo mezzo è dotato di un motore a
combustione interna per far ruotare la
turbina
frontale
totalmente
mentre
manuale
la
e
guida
è
gestita
dall'operatore.
Il costo di questa soluzione è di 450-500€.
La sorella maggiore della SB121, la PM55,
Illustrazione 5: McCulloch SB121 – Cortesia di
McCulloch
costa tra i 1000 e i 1100€ ed è dotata di un
motore a combustione interna di dimensioni maggiori che si occupa anche della trazione,
lasciando all'operatore solo lo sterzo, il controllo della velocità e il senso di marcia.
Le top di gamma, invece, si posizionano su fasce di prezzo superiori ai 1500€. Non sono
direttamente confrontabili perché offrono superfici di lavoro più ampie della SB121
2.2 Rasaerba
McCulloch produce anche strumenti per il taglio dell'erba, come il trattorino M40-125.
Quest'ultimo si presta ad essere guidato dal robot oggetto dell'elaborato poiché il motore di
cui dispone viene usato solo per azionare le lame. La spinta è totalmente manuale.
Si trova in commercio a circa 200€.
Una soluzione concorrente alla combinazione robot + M40-125 è rappresentata dal trattorino
M95-66X che costa circa 1000€.
9
Illustrazione 7: McCulloch M95-66X – Cortesia di
McCulloch
Illustrazione 6: McCulloch M40-125 – Cortesia di
McCulloch
2.3 Rasaerba autonomi e telecomandati
Altra categoria di macchine concorrenti è
costituita da robot rasaerba totalmente
autonomi. Questi oggetti sono in grado di
gestire la rasatura di un prato o un
giardino senza bisogno di un umano.
Quando la batteria è quasi scarica
tornano alla stazione di ricarica da cui
ripartono
appena
possibile
per
proseguire il loro lavoro. Sono molto
Illustrazione 8: Ambrogio Line 60B
apprezzati perché il loro continuo girovagare mantiene sempre l'erba in ottimo stato.
Le versioni più semplici, come il robot Ambrogio Line 60 B, costano 1200€ e sono in grado di
gestire fino a 400m^2 di terreno. Per robot di dimensioni maggiori, in grado di mantenere
appezzamenti fino a 5000m^2 si raggiungono i
4000€ di prezzo.
Ultima soluzione che può essere competitiva col
sistema sviluppato è lo Spider Mini: si tratta di
un tagliaerba telecomandato di circa un metro di
lato in grado di lavorare su pendii molto elevati.
Illustrazione 9: Spider Mini
10
Il costo di questo prodotto è considerevole, parimenti alla sua produttività, poiché rivolto ad
un'utenza professionale: oltre 6000€. È possibile gestire più di 400m^2 di terreno in un'ora di
lavoro.
I vantaggi offerti dal robot che si è sviluppato sono molteplici e risulterebbe riduttivo limitarsi
a confrontare produttività e prezzo. Il dispositivo nato in casa Girtech consente non solo di
motorizzare uno strumento che spesso è già disponibile, ma anche di controllarlo a distanza.
In futuro verranno progettati una serie di adattatori per poterlo agganciare alle macchine più
diffuse sul mercato e in settori non previsti originariamente.
Intregrazione tra meccanica, elettronica e attrezzi specializzati permette di realizzare
strumenti in grado di affrontare compiti specifici e gravosi in modo ottimale anche per i non
addetti ai lavori. Parimenti allo Spider Mini, esiste una moltitudine di strumenti in grado di
eseguire i propri compiti perfettamente e indefessamente ma richiedono spesso di essere
usati da personale esperto o con determinate competenze.
2.4 Agricoltura di precisione
L’esigenza di questi piccoli trattori è stata evidenziata anche durante la tavola rotonda
“Agricoltura 2.0, applicare le tecnologie più avanzate al settore primario per produrre meglio
consumando meno” che si è tenuta il 09 Gennaio 2014. La serata è stata organizzata da
Associazione Innoval in collaborazione con l’Università degli Studi di Verona e il Laboratorio
Altair.
Si è parlato di agricoltura di precisione e della possibilità futura, o anche imminente, di usare
l’automazione e la robotica in ambito agricolo. Il robot oggetto di questa trattazione, grazie
alle sua flessibilità, sarebbe particolarmente adatto ad operare nel territorio agricolo
pedemontano, caratterizzato da proprietà di piccole dimensioni e terreni scoscesi rispetto
alle grandi macchine automatiche pensate per le sconfinate pianure americane o australiane.
Dotandolo di sensori opportuni sarà possibile usare questo dispositivo per monitorare il pH
del terreno, l’umidità, la presenza di parassiti, ecc. Gli scenari di utilizzo sono molteplici, ma
richiedono tutti un importante investimento per poter essere raggiunti. Il robot sviluppato sarà
soltanto un primo, importante passo.
11
La serata si è conclusa con la volontà di creare uno o più gruppi di lavoro per poter
sviluppare coltivazioni sperimentali. L'uso della robotica nell'agricoltura è molto interessante
dal punto di vista economico e molto stimolante dal punto di vista tecnico; nei prossimi anni
potrebbe essere addirittura obbligatorio per soddisfare i requisiti di alcune normative [5] in via
di definizione come il dosaggio massimo di pesticidi e diserbanti con cui trattare i terreni
agricoli: questa funzione può essere effettuata e soprattutto certificata solo usando dei mezzi
autonomi.
Illustrazione 10: Iocandina della serata "Argicoltura 2.0"
“Dal 1° gennaio 2014 è in vigore il Piano di azione nazionale (Pan) per l'uso sostenibile dei
prodotti fitosanitari, con l’obbligo per gli agricoltori di adottare, almeno, tecniche colturali
integrate
e
approcci
alternativi
(http://www.legambiente.emiliaromagna.it, 10/01/2014).
12
alla
difesa
chimica”
CAPITOLO 3
Componenti
Nel seguente capitolo si illustrano i componenti meccanici ed elettronici utilizzati per costruire
il robot.
Per poter ottenere un prototipo economico e rapido da sviluppare si sono utilizzate al meglio
le risorse già disponibili: PLC, driver ed altri componenti sono spesso utilizzati in Girtech srl.
Sono stati acquistati componenti dedicati alla prototipazione che, grazie alla flessibilità che
offrono, permettono di effettuare modifiche rapidamente fino al raggiungimento della
configurazione migliore.
Molti degli strumenti informatici utilizzati sono di natura open source, affidabili e pienamente
controllabili, veloci da implementare grazie alla vasta documentazione disponibile e, in caso
di necessità, piuttosto semplici da adattare alle proprie esigenze.
3.1 Ruote
Sono state acquistate due ruote da 38cm di diametro e cerchioni da 18cm con camera d’aria.
Sulla parte frontale del robot si è installata una pivottante pneumatica con camera d'aria da
20cm di diametro.
Mozzo
Flangia
Cuscinetto
Semiasso
Corona
Illustrazione 11: Esploso del sistema ruota-albero
13
Adottando
illustrazione
la
soluzione
11
è
riportata
possibile
in
adagiare
mozzo e flangia all'interno dello spessore
del cerchione, risparmiando molto spazio
in larghezza. La compattezza del sistema
risulta
fondamentale
per
un
uso
combinato con una turbina spalaneve. Il
robot infatti deve essere di larghezza
inferiore o tuttalpiù uguale a quella della
turbina per poter percorrere la strada che
ha appena pulito. Questo problema esiste
in parte anche con i rasaerba perché, se il
Illustrazione 12: Le ruote usate
robot fosse più largo della larghezza di
lavoro dell'utensile, andrebbe a piegare a terra delle fasce di erba che poi risulterebbero
difficili da tagliare.
3.2 Mozzi
Grazie all'aiuto di un'officina meccanica che ha condiviso il desiderio di realizzare questo
progetto, sono stati creati dei mozzi ad hoc. Questi oggetti consistono in due flange (una per
il cerchione e una per la corona) collegate da un cilindro forato; all'interno del cilindro sono
adagiati dei cuscinetti a sfera che ospitano l'assale.
Illustrazione 14: L'assale al completo
Illustrazione 13: Il mozzo con la corona
14
3.3 Corone, pignoni e catene
Sul motore è stato installato un pignone da 13
denti mentre sulla ruota è stata montata una
corona da 53 denti ottenendo così un rapporto
di riduzione di 13:53. La trasmissione è stata
realizzata con una catena; questi componenti
sono venduti in kit come ricambi per moto
50cc.
Illustrazione 15: Trasmissione
3.4 Motori
Sono stati scelti due motori a spazzole in corrente continua da 250W, alimentati a 24V e con
velocità nominale di 2650giri/min.
Questi motori consentono di contenere il costo del dispositivo dal momento che, in fase di
prototipazione, le prestazioni offerte dall’azionamento elettrico sono di importanza
secondaria.
La velocità massima è molto elevata e, per evitare l'installazione di riduttori multistadio nella
trasmissione, si è preferito limitare la tensione di alimentazione via software.
Illustrazione 16: Uno dei motori utilizzati
È noto dalla teoria delle macchine elettriche [6] che nei motori in corrente continua vale la
relazione ω*Ke*Ø = U quando il motore lavora a vuoto. Questa formula lega la tensione di
15
alimentazione del motore U con la velocità di rotazione del rotore ω tramite il flusso al
traferro Ø e un coefficiente Ke che riassume varie informazioni sul tipo degli avvolgimenti e
sul numero di conduttori attivi (cioè non posti in cortocircuito dalle spazzole).
Se al motore viene fornita una tensione variabile a rampa anche la velocità angolare ω
dell'albero avrà un andamento a rampa. L'accelerazione angolare α sarà a gradino,
presentando un punto di discontinuità. Per non gravare sulla trasmissione e sull'azionamento
elettrico si è scelto di fornire sempre variazioni di tensione a rampa parabolica ottenendo
quindi accelerazioni a rampa rettilinea. Nel paragrafo 5.3 e nell'Appendice A.2 è descritta
3
3
1,5
2
2
1
1
1
α
ω
V
l'implementazione nel dettaglio.
0
0
-1
0
1
0
-1
2
0
1
t
2
-1
1,5
3
1
1
2
0
α
0,5
0
-1 0 0,2 0,4 0,6 0,8 1
-1 0 0,2 0,4 0,6 0,8 1
t
t
1
2
1
2
t
1,5
0,5
0
t
ω
V
0,5
1
0
-1
0
t
3.5 Batterie
Si sono utilizzate due batterie a gel prodotte da FAM BATTERIE. Le batterie forniscono una
tensione di 12V, pertanto sono state poste in serie per ottenere i 24 V necessari per
alimentare PLC, driver e motori.
Con un peso di circa 10kg l’una dovrebbero garantire la massa necessaria al robot per poter
affrontare terreni scivolosi senza slittare.
16
Illustrazione 18: Cortesia di fam batterie
Illustrazione 17: Batteria BEG 12033 CY Cortesia di fam batterie
Le batterie consentono di accumulare fino a 30Ah di energia ovvero di 30Ah*24V = 720Wh,
questo significa che il robot avrà un’autonomia di un paio d'ore perché i motori assorbono
fino a 250W di potenza l'uno a cui va aggiunto l’assorbimento di driver e PLC.
Le batterie al gel si rivelano particolarmente adatte a questo utilizzo perché sono in grado di
sopportare numerosi cicli di ricarica e sono esenti da manutenzione (www.fambatterie.it,
15/01/2014). Non contengono acidi e se vengono rovesciate non creano problemi. Tale
scenario si può verificare in caso di ribaltamento del robot durante i test su terreni molto
accidentati o eccessivamente inclinati.
La casa produttrice consiglia vivamente di monitorare la tensione erogata dalle batterie
durante la scarica per impedire che scenda al di sotto di 1.9V per cella. Le batterie in
questione sono composte di 6 celle da 2V, fornendo così i 12V di tensione di targa. Si
imposta quindi in limite di funzionamento di
22.8V sulla serie delle due batterie.
3.6 Driver
Il driver scelto per il controllo dei motori è il
Sabertooth 2x12, ovvero un dispositivo adatto
a controllare due motori CC a 24V e 12A.
La scheda utilizzata è dotata di 8 connettori:
due per l'alimentazione a 24V, due per ogni
17
Illustrazione 19: Sabertooth 2x12 – Cortesia di
dimensionengineering
motore e due per i segnali di controllo dei motori.
Tramite un selettore posto sul PCB è possibile scegliere varie modalità di utilizzo.
3.6.1 Schema di funzionamento del driver
Il cuore di questo dispositivo è un microcontrollore ATMEL, l'ATMEGA 88V 10AU 1030; si
tratta di un'architettura RISC a 8 bit che permette l'accesso a tutta una serie di funzionalità
che in parte non sono necessarie. Il Sabertotth2x12, infatti, è una scheda molto flessibile che
risulta ottima per la prototipazione ma decisamente sovradimensionata per la produzione.
Motore 1
Segnali di
controllo
Motore 2
Illustrazione 20: Schema a blocchi del Sabertooth 2x12
Il chip richiede una tensione di alimentazione compresa tra 1.8V e 5.5V, per questo motivo
sulla scheda è installato un convertitore DC-DC buck (step-down) che fornisce i 5V necessari
a fronte dei 24V generati dalle batterie. Il Sabertooth mette a disposizione altri due connettori
per poter alimentare dispositivi esterni a 5V come i ricevitori R/C.
Si è scelto di controllare questo driver in modalità analogica: fornendo una tensione ad un
ingresso compresa tra 0 e 2.5V si ottiene una rotazione “indietro” del motore; con 2.5V si ha
“motore fermo” mentre tensioni comprese tra 2.5 e 5V permettono di ottenere una rotazione
“avanti”.
In modalità analogica, esistono tre ulteriori configurazioni ottenibili tramite il selettore.
È disponibile l'opzione “Mixed mode” in cui l'ingresso S1 si occupa del verso della marcia,
mentre l'ingresso S2 controlla lo sterzo in modo differenziale.
L'opzione “Exponential response” consente di ottenere una maggiore controllabilità del robot
18
grazie all'uso di usa scala non lineare bensì esponenziale, garantendo così una maggiore
precisione attorno allo zero.
Infine esiste l'opzione “4x sensitivity” che permette di ottenere una sensibilità più elevata
(ovvero a deboli escursioni del segnali di ingresso corrispondono ampie escursioni del
segnali d'uscita) restringendo l'intervallo di tensioni applicabili da 0-5V a 1.875-3.125V.
Ai fini del robot che si è costruito si è scelto di evitare tutte le possibilità offerte dalla scheda e
di lavorare esclusivamente sulla programmazione del PLC. Questo permetterà di passare
rapidamente ad una produzione con un driver molto più semplice ed economico e mantenere
tutto sotto controllo, sapendo come funziona il sistema e potendo apportare modifiche in
caso di necessità.
3.7 Antenna Wi-Fi
Si è aggiunta alla configurazione
hardware una Picostation di casa
Ubiquity,
esterni
un'antenna
(certificata
wi-fi
IP55)
da
per
permettere il collegamento senza
fili con il dispositivo di controllo
usato dall'utente.
L'antenna
si
alimenta
a
24V
compatibilmente con la tensione
Illustrazione 21: Antenna Wi-Fi - Cortesia di Ubiquity
generata dalle batterie.
All'interno è installato OpenWRT, un sistema embedded con kernel Linux adatto per gestire il
traffico nelle reti telematiche.
Questa soluzione permette di creare e gestire la rete locale a cui ci si aggancia l'utente col
suo dispositivo mobile.
3.8 PLC
Saia Burgess Controls è un’azienda svizzera che produce PLC. Grazie alle prestazioni
19
eccellenti e al costo competitivo delle soluzioni che offre si è selezionato un PLC dal loro
catalogo. Questi prodotti sono controllori di natura industriale che sono stati sviluppati con un
occhio di riguardo al mondo web e all'internet of thing. Uno slogan Saia recita: PLC+IT=PCD.
Si è scelto il PCD1.Room, dispositivo nato per la building automation, che mette a
disposizione, tra l'altro, due uscite analogiche per pilotare il driver e dispone di sei ingressi
digitali.
Un'uscita digitale andrà a pilotare un relè inserito a monte del driver per poter portare il robot
in stato di “DriverPowerDown” (si veda il capitolo 5). Altri due ingressi digitali saranno usati,
rispettivamente, per il monitoraggio della tensione della batteria e il monitoraggio dello stato
dei microswitch che sono stati disposti sul fronte e sul retro del robot. Gli interruttori in
questione, in caso di urto apriranno il circuito e il PLC procederà a bloccare immediatamente
il robot.
Illustrazione 14: PCD1.Room - Cortesia di Saia Burgess
La tensione di alimentazione è di 24V mentre le tensioni delle uscite analogiche sono
comprese tra 0 e 10V con una risoluzione di 12 bit.
Dal momento che il driver accetta tensioni tra 0 e 5V si sono limitate le uscite a 5V perdendo
quindi un bit di risoluzione.
Per quanto riguarda il monitoraggio della tensione erogata dalle batterie, si è usato un
partitore di tensione costituito da tre resistori da 1kOhm in serie. Misurando la tensione ai
capi di uno dei resistori si ottiene un valore massimo di 8V, quando le batterie sono cariche:
20
8V rappresenta una tensione compatibile coi 10V che possono essere forniti agli input
analogici.
3.9 Relè
Si è selezionato un relè bistabile a singola bobina per poter così disporre di un’interruzione
sul rail positivo di alimentazione del driver sulla base di necessità che verranno illustrate in
seguito.
Il relè è stato connesso in modo da mantenere il
driver alimentato solo quando viene portato ad 1 il
valore logico di un'uscita digitale.
La forte integrazione tra interfaccia di comando e
driver fisico dell'architettura progettata permette di
modificare lo stato del relè direttamente dalla pagina
web, grazie ad un pulsante apposito. Quando il
Illustrazione 22: Relè - Cortesia di TE
Connectivity
circuito è aperto ci si trova in uno stato di sicurezza
poiché il PLC è attivo mentre la parte di potenza è
disalimentata.
3.10 Microswitch
Sulla parte posteriore e anteriore del robot sono stati
installati dei paraurti contenenti dei micro-interruttori
cablati come normalmente chiusi, in vantaggio di
sicurezza. In caso di distacco di un cavo o apertura del
circuito per qualsiasi motivo (oltre ad un urto) il robot si
fermerà.
In caso di guasto, se gli interruttori fossero stati usati
come normalmente aperti, non ci sarebbe modo rilevare il
guasto stesso.
Per segnalare lo stato del circuito all'utente si è
posizionata un'immagine a forma di LED sulla pagina web
21
Illustrazione 23: Microswitch - Cortesia
di Omron
(si veda capitolo successivo) che diventa rossa quando il circuito viene aperto.
3.11 Paraurti
Sono stati disegnati dei paraurti da posizionare sugli spigoli del robot; questi oggetti
consistono in due molle unite da un arco di circonferenza. Internamente, ad un paio di
millimetri di distanza, è posizionato un microswitch.
In caso di urto le molle si comprimono entrando in contatto con la barra del microswitch ed
aprendo il circuito.
Queste parti sono state stampate 3D usando una Makerbot Replicator 2X, macchina basata
su tecnologia FDM che consente di realizzare versioni prototipali rapidamente e a basso
costo. Il materiale usato è ABS, un terpolimero a base di acrilonitrile, butadiene e stirene.
Illustrazione 25: CAD del supporto
Illustrazione 24: fotografia del supporto
La realizzazione è stata affidata a Plumake srl, che in breve tempo ha realizzato un prodotto
custom da usare sul prototipo. La stampa 3D è un processo produttivo che si è sviluppato in
seno alla prototipazione rapida. Questa tecnologia è particolarmente adatta alla lean startup
poiché i costi sono molto contenuti e i tempi di progettazione, realizzazione e verifica molto
ridotti. [7]
22
CAPITOLO 4
Interfaccia utente
La progettazione dell'interfaccia utente è fondamentale per progetti che, come in questo
caso, vogliono essere dedicati ad un'utenza eterogenea. Si è scelto di offrire la possibilità di
usare come telecomando il proprio smartphone o il proprio tablet perché sono strumenti
estremamente diffusi.
L'interfaccia creata è una pagina HTML5, compatibile con tutti i browser che rispettano gli
standard W3C, che è supportata da tre librerie JavaScript. In alternativa alla pagina web si
sarebbero potute scrivere delle app da rendere disponibili sui vari cataloghi. Le app,
purtroppo, presentano due problemi ovvero la necessità di essere scritte per ogni piattaforma
disponibile (Android, Windows Phone, iOS, ecc.) e la necessità di essere aggiornate per
renderle adatte alle sempre nuove specifiche offerte dai produttori hardware e alle richieste
degli sviluppatori dei sistemi operativi mobile.
Si è scelto di effettuare sul dispositivo dell'utente solo le operazioni strettamente necessarie
cioè la lettura dell'input immesso e la visualizzazione di alcune informazioni relative allo stato
del robot.
Illustrazione 26: Interfaccia utente
23
Nella pagina è presente un quadrato di 300x300 pixel sul quale è stato posto un sistema di
riferimento cartesiano nell'angolo in basso a sinistra (le pagine HTML posizionano il sistema
di riferimento in alto a sinistra con la coordinata Y crescente verso il basso).
All'interno del quadrato è stata inserita l'immagine di un disco arruzzo/blu per rendere la
grafica piacevole. Quando si tocca lo schermo del tablet viene visualizzato un bollino rosso
in corrispondenza delle coordinate selezionate.
In alto si trova una riga che riporta a schermo le coordinate che si stanno inviando al robot e,
ancora sopra, è presente un log che informa l'utente circa l'ultimo stato assunto dal
dispositivo.
Il sistema di coordinate, come già detto, ha lo zero nell'angolo in basso a sinistra del
quadrato; la coordinata massima raggiungibile in X e in Y è 5000. Sono stati scelti questi
valori perché corrispondono all'intervallo di tensioni in millivolt ammesse dall'ingresso del
driver.
Oltre al joypad, nella pagina web vengono riportate delle altre informazioni in basso a
sinistra: lo stato della batteria (si veda il capitolo successivo) e lo stato dei microswitch.
In alto a sinistra è presente un pulsante per attivare e disattivare il relè che fornisce la
potenza al driver.
Nel prossimo capitolo viene spiegato il modo con cui sono state elaborate le coordinate per
trasformarle in comandi da fornire ai motori.
Tramite una “HttpRequest” viene effettuata una chiamata al PLC che si trova sulla stessa
rete locale. Viene trasferita una stringa contenente un parametro di otto caratteri: i primi 4
relativi alla coordinata X e gli ultimi 4 relativi alla coordinata Y. La stringa contiene gli indirizzi
dei registri e dei flag in cui scrivere i valori immessi dall'utente.
Il tutto viene effettuato decine di volte al secondo consentendo un'ottima reattività del robot.
24
CAPITOLO 5
Programmazione del PLC
5.1 Dal joypad al controllo dei motori
Il PLC (Programmable Logic Controller) riceve le coordinate tramite l'antenna wi-fi e poi le
elabora. Dapprima vengono separati gli otto caratteri ottenendo così le coordinate X e Y, poi
viene riportato il sistema di riferimento nel centro del cerchio. In questo modo si hanno valori
compresi tra -2500 e +2500 sia in X che in Y. Sommando i valori massimi e minimi alla
tensione di “TensioneNulla” si ottengono 0V e 5000mV.
Quando il PCD (nome commerciale del PLC in questione) è attivo e l'utente non sta fornendo
un input, il PLC mantiene le uscite analogiche ad una tensione di 2500mV (si veda il
paragrafo successivo).
Quando l'utente vuole muovere il robot, invece, fornisce un input diverso dalla coppia (0,0)
che si andrà a sommare o sottrarre ai 2500mV di tensione iniziale. I valori delle coordinate
della pagina HTML sono stati impostati tra 0 e 5000 per ottenere da subito dei numeri
compatibili con le uscite analogiche.
Successivamente le coordinate vengono trasformate in coordinate polari.
Si è scelto di implementare un metodo di guida che fosse il più possibile user friendly dove il
sistema di riferimento che orienta i versi di velocità di trazione e velocità di sterzo sia fisso
sul robot. Questo avviene tipicamente sulle macchinine radiocomandate.
Con questa scelta si sono eliminate alcune possibilità offerte dalla cinematica dell'uniciclo
differenziale (si veda il capitolo 5.1.1) come la capacità del robot di roteare su sé stesso
fornendo tensioni opposte ai due motori.
Le manovre realizzabili devono essere il più possibile naturali e spontanee, così da non
richiedere né studio né allenamento all'utente.
A questo punto si è sintetizzata una curva di controllo sulla base dei seguenti ragionamenti:
- quando la coordinata y è nulla il robot deve rimanere fermo;
- quando la velocità di trazione del robot è elevata lo sterzo deve essere poco sensibile;
- lo sterzo è di tipo differenziale, perciò le curve devono essere piuttosto vicine tra loro per
evitare cambi di direzione troppo bruschi;
25
- le curve devono essere funzione solo della fase del vettore individuato dall'utente;
- la velocità di trazione deve essere ridotta per velocità di sterzo elevate.
Ragionando in coordinate polari, quando la fase è di 0 rad e π rad il robot deve essere
fermo, cioè la caduta di tensione sui motori deve essere nulla. Ovviamente la richiesta di
avere la massima sterzata quando la velocità tende a zero non è compatibile con le altre
specifiche. È stato perciò necessario individuare un compromesso.
Subito dopo il calcolo del modulo del vettore, è stato inserito un controllo che, nel caso in cui
il modulo sia inferiore a 200 (circa 32 pixel), porti il modulo a 0.
Si tratta cioè di una regione dello spazio di controllo che tiene fermo il robot: una "Dead
Zone".
Il risultato è il grafico di illustrazione 27. In ascissa è riportata la fase del punto indicato
dall'utente e in ordinata si ricava un valore che andrà a moltiplicare il modulo.
Questa operazione è stata effettuata per consentire una migliore governabilità del robot e un
controllo più sicuro.
Illustrazione 27: Calcolo del coefficiente di riduzione della tensione in funzione della fase
Nel grafico successivo è riportato il diagramma precedente in coordinate polari. Si immagini
di averlo come sfondo della pagina HTML.
26
Individuato lo spazio di controllo ci si rende subito conto che negli angoli del quadrato (ad
esempio nel punto (5000,5000) dell'interfaccia utente) il modulo è maggiore di 2500mV,
perciò tutti i punti che presentano un modulo superiore a 2500 vengono riportati al valore
massimo. Successivamente, in funzione della fase come spiegato precedentemente, il
modulo subisce un'ulteriore scalatura che restituisce il valore da applicare sul driver.
Prendendo come esempio il vettore rosso in figura, se l'utente indica come coordinata sul
joypad la punta della freccia, il motore di sinistra (M-Sx) riceverà una tensione inferiore cioè
quella individuata dal bollino blu analogamente al motore di destra (M-Dx) la cui tensione è
individuata dal bollino nero.
Illustrazione 28: Funzione di mixing in coordinate polari
27
Per i dettagli sulla definizione delle curve e la realizzazione dell'implementazione si veda
l'allegato A.2.
La trattazione matematica, oltre ad essere laboriosa, potrebbe rivelarsi non esatta perché
deve essere validata sul campo sia per verificarne l'efficacia, sia per ricevere feedback dagli
utenti.
5.1.1 Modello cinematico
Un robot di questo tipo è conosciuto come uniciclo differenziale.
"Un uniciclo è un veicolo avente una sola ruota, orientabile" [8].
Sempre dallo stesso testo si apprende che “la velocità di trazione v, cioè il modulo (con
segno) del vettore velocità del punto di contatto tra la ruota e il suolo, è pari a v=r(ωR+ωL)/2
mentre la velocità di sterzo ω=r(ωR-ωL)/d è pari alla velocità angolare del robot intorno al suo
asse verticale. Nelle formule precedenti si considera r uguale raggio delle ruote e d pari alla
distanza tra i centri delle ruote stesse.”
Le velocità di trazione e di sterzo sono riconducibili alle velocità angolari delle singole ruote
che dipendono a loro volta dalle tensioni applicate ai motori.
Purtroppo non sono noti molti dati di targa dei motori che sarebbe necessari per esprimere la
relazione che lega tensione e velocità. Per questo motivo non è stato possibile creare i
grafici delle velocità di trazione e di sterzata in funzione del modulo del vettore immesso
dall'utente.
Sotto opportune ipotesi [6] è possibile ricavare il prodotto del coefficiente Ke e del flusso ϕ
mettendo a rapporto la tensione applicata al motore e la velocità angolare del rotore.
Si potrebbe effettuare questa operazione applicando una rampa di tensione al motore e
misurandone la velocità con un encoder; riportando i valori su un grafico velocità-tensione
Ke*ϕ rappresenta il coefficiente angolare della retta di migliore approssimazione.
Invertendo le formule del modello cinematico si ottengono le seguenti:
ωR = (2v+ωd) / 2r; ωL = (2v-ωd) / 2r.
Si sarebbero potute considerare la velocità di sterzo e la velocità di trazione come,
rispettivamente, asse delle ascisse e delle ordinate sulla circonferenza di controllo presente
sulla pagina web; in questo modo, ipotizzando di poter effettuare un controllo in velocità,
sarebbe stato sufficiente usare le formule di cui sopra per controllare il robot.
Questo però avrebbe portato ad avere delle possibilità di movimento poco familiari alla
maggioranza dell'utenza.
28
Come mostrato in illustrazione 29, per ω≠0 e v=0 risultano ωR = ωd / 2r e ωL = - ωd / 2r: se
le ruote girano a velocità uguale e con verso opposto il robot inizierà a roteare
vorticosamente su sé stesso.
v
ω
Illustrazione 29: Caso particolare
Si è scelto di eliminare questa possibilità per evitare situazioni simili, operando come
spiegato nel paragrafo 5.1.
5.2 Stati di funzionamento
A livello di logica di funzionamento, il robot si può trovare in quattro stati differenti: Spento,
Marcia, DriverPowerDown e TensioneNulla.
Lo stato di Marcia sarà attivo quando l’operatore che guida il dispositivo starà muovendo il
joystick sul display del suo dispositivo mobile; in queste condizioni sarà tutto attivo e
funzionante, il controllo del mezzo sarà ad opera del suo pilota.
Per mantenere questo stato attivo il dispositivo di comando dovrà inviare un segnale di
controllo al PCD per ogni chiamata effettuata, confermando continuamente la volontà di
proseguire con l’operazione in corso. Questa operazione è effettuata tramite una chiamata
HttpRequest: ogni volta che avviene si carica un timer di 100ms all'interno del COB 0 del
PCD (si vedano il capitolo 5.3 e l'Appendice A.1) che consente al robot di funzionare. Se il
timer raggiunge lo 0 il robot viene fermato automaticamente.
Lo stato di TensioneNulla subentrerà allo stato di Marcia non appena il joystick sarà a riposo.
Il timer sarà interno al PLC, quindi questa funzione permetterà anche di gestire in sicurezza
situazioni come la scarica della batteria del tablet, la perdita di connessione, ecc.
In questo stato il PLC fornirà una tensione nulla ai capi dei motori CC.
29
Lo stato DriverPowerDown si ha all'accensione del robot: quando viene premuto l'interruttore
di accensione del robot per prima cosa si avvia il PCD, mentre il driver viene mantenuto
spento da un relè che interrompe il circuito di alimentazione del driver stesso.
Successivamente, quando l'operatore preme l'apposito bottone sulla pagina web, vengono
portate le uscite analogiche del PLC a 2.5V e viene eccitata la bobina del relè. In questo
modo la tensione impressa sui motori è nulla, cioè il robot viene portato nello stato
TensioneNulla.
Lo stato DriverPowerDown è attivabile in ogni momento dal pilota, garantendo così una
funzione di sicurezza.
5.3 Codice IL
I PLC Saia vengono forniti assieme ad un ambiente di sviluppo completo che permette di
scrivere il codice, effettuare debug online, caricare librerie, ecc.
E' stata utilizzata, in particolare, la programmazione Istruction List (IL) che permette il
massimo controllo dell'hardware e delle interazioni con il mondo esterno.
Si identificano quattro stati operativi del sistema:
–
Spento;
–
DriverPowerDown;
–
TensioneNulla;
–
Marcia.
STATO SISTEMA
STATO
PDC
STATO
DRIVER
STATO MOTORI
STATO CIRCUITO
ANTI-URTO
STATO
BATTERIA
Spento
0
0
Liberi
0
0
DriverPowerDown
1
0
Liberi
1
1
TensioneNulla
1
1
Liberi
1
1
Marcia
1
1
Controllo utente
1
1
Per prima cosa sono stati impostati i valori di reset ovvero i valori a cui si portano le varie
uscite del PLC ogni volta che avviene un errore o qualche anomalia. Questo è di
fondamentale importanza, oltre che richiesto dalla Direttiva Macchine, dal punto di vista della
sicurezza del sistema. La routine che effettua questa operazione è uno XOB di
inizializzazione, sezione del codice che il PCD richiama in caso di start o cold restart.
30
Nell'IL si definiscono delle routine dette COB che effettuano ripetutamente, ogni volta che
vengono chiamate o che terminano altri COB, delle operazioni.
Si è definito un COB 0 come quel processo che si occupa di effettuare tutti i controlli relativi
alla sicurezza, dal fatto che ci sia un input in ingresso da parte dell'utente al controllo dello
stato dei microswitch.
In caso di necessità questo tratto di codice carica nelle IO.Slot1.AnalogueOutput0/1 il valore
2500 che, come già spiegato, applica una tensione nulla ai capi dei motori. Altro controllo
che viene effettuato nel COB 0 è il valore di tensione che va applicato alle uscite analogiche.
Il DAC del PLC è in grado di raggiungere valori compresi tra 0 e 10V, a fronte della tensione
massima ammessa dal driver che consiste in 5V. In caso di errori di programmazione oppure
ricezione dati non coerenti le uscite analogiche potrebbero danneggiare il driver o creare
situazioni pericolose, si è scelto così di mettere dei limiti che in caso di valori oltre il
consentito riportino le uscite entro i valori ammissibili in tempi strettissimi.
Successivamente vengono effettuati i controlli sullo stato delle batterie e del circuito del
paraurti.
Tutta la parte di codice che non riguarda la sicurezza è stata inserita all'interno del COB 1.
In questa parte di codice vengono trasformate le coordinate immesse dall'utente in
coordinate polari e, in funzione della fase, viene scelto il quadrante in cui calcolare i
coefficienti di riduzione del modulo per i due motori.
A questo punto si attiva la routine di rampa che porta la tensione applicata sui motori al
valore desiderato seguendo una traiettoria parabolica.
Per il calcolo delle rampe è stato scritto un ciclo for con la sintassi prevista da questo
linguaggio macchina.
31
Il ciclo prende i valori attuali sulle uscite analogiche, li incrementa usando degli intervalli
calcolati opportunamente, calcola i valori relativi alla rampa parabolica e trasferisce i valori
sulle uscite. Prima di eseguire il ciclo successivo attende 10ms. L'attesa è stata inserita
perché l'esecuzione delle operazioni risulta troppo rapida, tale da essere pressoché
istantanea anche usando un numero di intervalli molto elevato.
Spento
Accensione
tasto fisico
DriverPowerDown
Pulsante
web - ON
NO
TensioneNulla
Monitoraggio
batterie
Monitoraggio
microswitch
Input utente?
SI
Input utente?
Pulsante
web - OFF
SI
Marcia
HARDWARE
PCD
Illustrazione 30: Diagramma di flusso
32
TABLET/SMARTPHONE
CAPITOLO 6
Test e debug, inquadramento normativo
Illustrazione 31: Schema elettrico
Dopo aver scelto i vari componenti si è proceduto ad una serie di test su banco per verificare
la correttezza di alcuni ragionamenti riguardanti, in modo particolare, la sicurezza del
dispositivo.
Sono stati testati numerose volte i vari modi di arresto del prototipo: usando il pulsante sulla
web-page, i microswitch (simulando quindi un urto), inserendo coordinate appartenenti alla
“Dead zone” ed evitando di fornire ingressi.
Una volta completato il debug del codice si è verificata la coerenza tra gli input immessi e la
risposta dei motori eseguendo dei test sul banco di lavoro con dei motori di prova di
dimensioni più contenute rispetto a quelli selezionati per il robot.
Successivamente si sono inseriti i componenti all'interno di un involucro IP 55 da installare
sul telaio del dispositivo; anche in questo caso è tornata utile la stampante 3D per realizzare
il supporto per il driver. In 45 minuti è stato preparato il CAD ed è stato realizzato l'oggetto.
Questo consente di avere un'installazione molto pulita all'interno dell'involucro evitando l'uso
di adesivi e colle.
33
Illustrazione 32: Il supporto del Sabertooth
stampato 3D
Il relè è stato inserito su un apposito porta-relè che, come il PLC, è stato montato su guida
DIN.
Dal punto di vista normativo, il robot risponde alla definizione di macchina ai sensi della
Direttiva Macchine 2006/42/CE:
“insieme equipaggiato o destinato ad essere equipaggiato di un sistema di azionamento
diverso dalla forza umana o animale diretta, composto di parti o di componenti, di cui almeno
uno mobile, collegati tra loro solidamente per un'applicazione ben determinata”.
La 2006/42/CE include [9] anche la Direttiva Bassa Tensione 2006/95/CE, pertanto è
opportuno applicare le normative vigenti all'equipaggiamento elettrico di bordo.
Lo studio e l'applicazione delle norme è un lavoro laborioso che deve essere effettuato per
poter garantire i Requisiti Essenziali di Sicurezza e applicare il marchio CE al robot. Il
marchio CE è indispensabile per poter mettere in commercio questo dispositivo.
Ci si è attenuti ai principi di progettazione della sicurezza elettrica per quanto riguarda
l'equipaggiamento elettrico di bordo [10] anche se il prototipo non è stato costruito per essere
venduto. Questo è avvenuto perché le normative forniscono delle linee guida utili per snellire
la progettazione; altresì contribuiscono ad eliminare dei gradi di libertà nella scelta di alcuni
componenti. Ultimo importante vantaggio offerto dalle normative è quello di offrire la
possibilità di lavorare in sicurezza anche a tutti gli operatori che si avvicenderanno allo
sviluppo di questa soluzione partendo dal prototipo costruito.
34
CAPITOLO 7
Conclusioni e sviluppi futuri
7.1 Conclusioni
Si ritiene che il prototipo sviluppato sia adatto al perseguimento del fine preposto. Il
dimensionamento e la scelta dei componenti si sono rivelati piuttosto buoni anche se si
raccomanda di effettuare molti test in situazioni reali.
L'interfaccia utente è risultata semplice e intuitiva poiché si è riusciti ad organizzare al meglio
l'informazione e la gestione della stessa. Una grafica più accattivante offrirà all'utente una
guida ancora più piacevole.
Particolare attenzione è stata posta alla sicurezza della macchina. Si considera il dispositivo
estremamente sicuro grazie alla struttura e alla logica del programma del PLC e grazie al
sistema anti-urto che è stato creato. Anche in questo caso è opportuno stressare a fondo i
componenti per verificare e validare l'efficacia della soluzione individuata.
7.2 Sviluppi futuri
L'evoluzione di questo progetto è molta articolata e si presta particolarmente bene ad essere
sviluppata e raffinata utilizzando gli anelli Build-Measure-Learn tipici della lean startup.
Quando si sarà raggiunta una configurazione adatta e si sarà sufficientemente sicuri di stare
costruendo la “cosa giusta” si potrà passare alla fase di ingegnerizzazione.
Si suggeriscono delle linee guida da seguire nelle prossime fasi.
Completato l'assemblaggio sarà terminato un altro passo dell'anello Build-Measure-Learn; la
successiva raccolta dati dovrà essere pensata per misurare l'efficacia del progetto sviluppato
fino ad ora (in particolare gli algoritmi di guida e le caratteristiche geometriche come
ingombro e peso) e per indirizzare le scelte future. A questo punto diventa importante
scegliere il settore in cui partire con la progettazione dei componenti che rendano il robot
compatibile con gli strumenti già presenti sul mercato.
Dal punto di vista tecnico si suggerisce di valutare l'uso di motori BLDCM [6] per poter
controllare separatamente coppia e velocità erogate dai motori stessi. Si ritiene utile l'uso di
encoder per poter controllare il sistema in catena chiusa. Gli encoder, inoltre, consentono di
35
controllare i motori in velocità evitando che il robot si muova trascinato dal carico quando, ad
esempio, si trova in stato di “TensioneNulla” su pendii con pendenze elevate.
Potrebbe essere interessante anche l'installazione di una webcam che consenta di vedere
quello che si presenta di fronte al robot.
Ulteriori parti da sviluppare sono il telaio e l'involucro. Il telaio va progettato utilizzando gli
strumenti studiati nei corsi di Costruzione di Macchine mentre l'involucro va progettato
considerando l'importanza di conseguire una certificazione IP opportuna.
In ottica di riduzione dei costi sarebbe importante individuare un driver ottimizzato per i
motori che verranno scelti, evitando di usare flessibili ma costose schede per la
prototipazione.
L'ultima nota riguarda le normative. In particolare la Direttiva Macchine richiede la presenza
di un fungo rosso su sfondo giallo di emergenza presente sul telecomando della macchina.
Da una prima e rapida indagine di mercato non è stato trovato un prodotto di questo tipo:
potrebbe nascere una startup!
36
Riferimenti
[1] Ries E., 2011, The Lean Startup, Crown Pub
[2] Savoia A., 2012, Pretotype it – Pretotipare, traduzione italiana a cura di Zangrando L.
[3] http://www.plumake.it/robo-tractor/
[4] http://www.instructables.com/id/RC-Robot-tractor/
[5] http://giornatefitopatologiche.unibo.it/
[6] Appunti del corso di Macchine e Azionamenti Elettrici – M. Zigliotto
[7] tesi triennali di Grotto M., Prototipatrice rapida Lom Helisy s 1015, Padua Thesis
[8] Oriolo G., Sciavicco L., Siciliano B., Villani L., 2008, Robotica. Modellistica, pianificazione
e controllo, The McGraw-Hill Companies
[9] Direttiva Macchine 2006/42/CE
[10] Appunti del corso di Sicurezza Elettrica nei Sistemi Meccatronici – D. Dainese
37
APPENDICE A
A.1 Listato IL – Main
;*** XOB ***
$INIT
;==========================
; Porto le uscite analogiche a 2500mV (=motore fermo)
;==========================
RES
RES
RES
IO.DigitalOutput0 ; gestione DRIVER_POWER_DOWN
FEngineStatus ; gestione ENGINE_STOP
FBatteryLow ; gestione batteria
LD
IO.Slot1.AnalogueOutput0
K 2500
LD
IO.Slot1.AnalogueOutput1
K 2500
COPY
RDefaultEngineRequest
REngineRequest ; 25002500 in esadecimale
$ENDINIT
COB
0
0
;========================================
; Uscite analogiche: range 0-10000, pongo il reset 2500
; Abbiamo corsa tra 0 e 5000 mV all'ingresso del driver che si traducono in
; -24, ..., +24V
;
; Indirizzo per scrittura valore dal web al Saia:
; http://192.168.90.28/nome_stazione/cgi-bin/writeVal.exe?PDP,,R2007,d+1200
;
; IO.DigitalOutput0 è il comando del relay principale sulla alimentazione
; del driver
;
; Mettere in ENGINE_STOP http://192.168.90.28/nome_stazione/cgi; bin/writeVal.exe?PDP,,F1500,d+1
;
; Lettura stato batteria http://192.168.90.28/nome_stazione/cgi; bin/readVal.exe?PDP,,F1501,d'
; Lettura stato microswitch http://192.168.90.28/nome_stazione/cgi; bin/readVal.exe?PDP,,F1502,d'
;
; Tempo di ciclo di 0.1s
;========================================
; Controllo range di sicurezza
CFB
FBCheckAnalogRange
; CFB FBTcpLogStatus
; Controllo ENGINE_STOP
STH
FengineStatus
CFB
H FBEngineStop
38
; Monitoraggio batteria
COPY IO.Slot1.AnalogueInput0
RVBattery
MUL
RVBattery
K 3
CMP
ACC
JR
RVBattery
RVLimite
P
H END_COB
ACC
SET
H
FBatteryLow
END_COB: ECOB
;========================================
; FB CHECK ANALOG RANGE
; Con questa FB effettuo un ulteriore controllo per verificare che il
; l'uscita analogica sia compresa tra i valori che ammette il driver
;========================================
FB
CHK_0_DOWN: CMP
ACC
JR
LD
CHK_0_UPPER: CMP
ACC
JR
LD
CHK_1_DOWN: CMP
ACC
JR
LD
CHK_1_UPPER: CMP
ACC
JR
LD
FBCheckAnalogRange
IO.Slot1.AnalogueOutput0
KAnalogMin
P
H CHK_0_UPPER
IO.Slot1.AnalogueOutput0
KAnalogMin
KAnalogMax
IO.Slot1.AnalogueOutput0
P
H CHK_1_DOWN
IO.Slot1.AnalogueOutput0
KAnalogMax
IO.Slot1.AnalogueOutput1
KAnalogMin
P
H CHK_1_UPPER
IO.Slot1.AnalogueOutput1
KAnalogMin
KAnalogMax
IO.Slot1.AnalogueOutput1
P
H END_CHK
IO.Slot1.AnalogueOutput1
KAnalogMax
END_CHK: EFB
;========================================
39
; FB ENGINE_STOP
; Con questa FB porto l'uscita sul driver a 2500mV (=motori fermi)
; Rimane comunque tutto operativo, è un caso particolare di "Marcia"
;========================================
FB
FBEngineStop
SET
IO.DigitalOutput0 ; Driver alimentato
LD
IO.Slot1.AnalogueOutput0 ; motore 1 fermo
K 2500
LD
IO.Slot1.AnalogueOutput1 ; motore 2 fermo
K 2500
LD
REngineRequest
017D8204H
RES
FEngineStatus ; reset del flag
EFB
;========================================
; FBCheckMicroSw
; Con questa funzione controllo lo stato dei microswitch
;========================================
FB
FBCheckMicroSw
ACC
STH
JR
H
IO.DigitalInput0
L RES_Switch
ACC
SET
H
FStatoMicroSw
CFB
FBEngineStop
JR End_FB
RES_Switch: ACC
RES
End_FB:
H
FStatoMicroSw
EFB
A.2 Listato IL - Engine
COB 1
0
;=========================
; Arrivano 8 caratteri dalla richiesta web POST tipo 1234'5678
; Divido per 10'000, diventa 1234.5678
; Separo la parte intera (coordinata x del punto successivo) dal resto
(coordinata y del punto successivo)
; Sottraggo ad entrambi 2500 ottenendo un valore compreso tra -2500 e +2500
; Imposto i valori base
;=========================
ACC
H
40
STH
TCmdReceived
JR
H START_CYCLE
LD
REngineRequest
017D8204H
START_CYCLE: DIV REngineRequest
K 10000
REngineWebRequestX
REngineWebRequestY
SUB
REngineWebRequestX
K 2500
REngineRequestX
IFP
REngineRequestX
0
SUB
REngineWebRequestY
K 2500
REngineRequestY
IFP
REngineRequestY
0
LD
REngineSpeedRgt
K 2500
LD
REngineSpeedLft
K 2500
;================================
; Mix dei segnali
; Trasformo le coordinate cartesiane in coordinate polari
; Modulo=sqrt(x^2+y^2)
; Se il modulo >2500 (negli angoli del quadrato) lo forzo a 2500
; Se il modulo <200 (32 pixel) creo una zona morta => non mi interessa la
; fase, mando I valori base ad entrambi I motori
;================================
FMUL REngineRequestX
REngineRequestX
REngineRequestX2
FMUL
REngineRequestY
REngineRequestY
REngineRequestY2
FADD
REngineRequestY2
REngineRequestX2
REngineRequestY2PlusX2
FSQR
REngineRequestY2PlusX2
REngineModule
FPI
REngineModule
0
CMP
REngineModule
K 2500
ACC
JR
JR
P
H MaggModuloMax
L CheckMinModuloMin
41
MaggModuloMax:
LD
JR
REngineModule
K 2500
SkipCheckMod
CheckMinModuloMin:
CMP
REngineModule
K 200
ACC
P
JR
H SkipCheckMod
JR
L DeadZone
DeadZone:
LD
REngineWantedRgt
K 0
LD
REngineWantedLft
K 0
JR SET_SPEED
;===========================
; Calcolo della fase
; Non è disponibile l'ATAN2, quindi devo invertire la tangente stando
; attendo al quadrante in cui mi trovo perché voglio la fase sempre (!)
; positiva
; Occhio che se X=2500 => theta=+-Pi/2
;===========================
SkipCheckMod: LD
FCMP
ACC
JR
JR
X_ZERO:
FCMP
ACC
JR
JR
X_ZEROeY_POS: LD
FADD
JR
X_ZEROeY_NEG: LD
FADD
JR
CALC_X:
FCMP
ACC
JR
JR
RTmpFloatRgt
0.0E0
REngineRequestX
RTmpFloatRgt
Z
H X_ZERO
L CALC_X
REngineRequestY
RZeroValue
P
H X_ZEROeY_POS
L X_ZEROeY_NEG
RTmpFloatRgt
0.0E0
R1d2Pi
RTmpFloatRgt
REnginePhase
SECT_SEL
RTmpFloatRgt
0.0E0
R3d2Pi
RTmpFloatRgt
REnginePhase
SECT_SEL
REngineRequestX
RTmpFloatRgt
P
H X_POS
L X_NEG
42
X_POS:
FCMP
JR
JR
X_POSeY_POS:
FDIV
REngineRequestY
RTmpFloatRgt
ACC P
H X_POSeY_POS
L X_POSeY_NEG
REngineRequestY
REngineRequestX
REngineArg
FATAN REngineArg
REnginePhase
JR
X_POSeY_NEG:
FDIV
SECT_SEL ; Salto ai settori
REngineRequestY
REngineRequestX
REngineArg
FATAN REngineArg
REnginePhase
X_NEG:
FADD
REnginePhase
R2xPi
REnginePhase
JR
SECT_SEL ; Salto ai settori
FDIV
REngineRequestY
REngineRequestX
REngineArg
FATAN REngineArg
REnginePhase
FADD
REnginePhase
RPi
REnginePhase
JR SECT_SEL ; Salto ai settori
;===========================
; Ho modulo e fase, ora scelgo il quadrante in funzione della fase
;===========================
SECT_SEL:
LD
RTmp
01H
PUT
RTmp
TXTLogDesc
; CFB FBTcpLogStatus ; FB di supporto per il debug
IFP
0
REngineModule
FCMP
REnginePhase
RZeroValue
P
ACC
43
JR
JR
H FirstCheck
L ErroreDiFase
ErroreDiFase: JR
END_COB
FirstCheck: FCMP
REnginePhase
R1d2Pi ; PI/2
P
H SecondCheck
L Settore1
ACC
JR
JR
SecondCheck: FCMP REnginePhase
RPi ; PI
ACC
P
JR
H ThirtCheck
JR
L Settore2
ThirtCheck: FCMP REnginePhase
R3d2Pi ; 3/2*PI
ACC
P
JR
H FourthCheck
JR
L Settore3
FourthCheck: FCMP REnginePhase
R2xPi ; PI*2
ACC
P
JR
H END_COB
JR
L Settore4
Settore1:
; Motore Dx
FSIN
REnginePhase
REnginePhaseRgt ; qui ho sin(theta)
FMUL
REnginePhaseRgt
REnginePhaseRgt
REnginePhaseRgt1 ; sin^2
FMUL
REnginePhaseRgt
REnginePhaseRgt1
REnginePhaseRgt1 ; sin^3
FSQR
REnginePhaseRgt1
REnginePhaseRgt ; sin^(3/2)
FSIN
REnginePhase
REnginePhaseLft ; qui ho sin(theta)
FSQR
REnginePhaseLft
REnginePhaseLft ; [sin(theta)]^.5
; Motore Sx
; Moltiplico per il modulo
FMUL REnginePhaseRgt
REngineModule
REngineWantedRgt
FMUL
REnginePhaseLft
REngineModule
REngineWantedLft
44
JR SET_SPEED
Settore2:
; Motore Dx
FSIN
REnginePhase
REnginePhaseRgt ; qui ho sin(theta)
FSQR
REnginePhaseRgt
REnginePhaseRgt ; [sin(theta)]^.5
FSIN
REnginePhase
REnginePhaseLft ; qui ho sin(theta)
FMUL
REnginePhaseLft
REnginePhaseLft
REnginePhaseLft1 ; sin^2
FMUL
REnginePhaseLft
REnginePhaseLft1
REnginePhaseLft1 ; sin^3
FSQR
REnginePhaseLft1
REnginePhaseLft ; sin^(3/2)
; Motore Sx
; Moltiplico per il modulo
FMUL REnginePhaseRgt
REngineModule
REngineWantedRgt
FMUL
REnginePhaseLft
REngineModule
REngineWantedLft
JR SET_SPEED
Settore3:
; Motore Dx
; Motore Sx
FADD
REnginePhase
RPi
REnginePhaseRgt
FSIN
REnginePhaseRgt
REnginePhaseRgt ; qui ho sin(theta+Pi)
FSQR
REnginePhaseRgt
REnginePhaseRgt ; [sin(theta+Pi)]^.5
FADD
REnginePhase
RPi
REnginePhaseLft
FSIN
REnginePhase
REnginePhaseLft ; qui ho sin(theta+Pi)
FMUL
REnginePhaseLft
REnginePhaseLft
REnginePhaseLft1 ; sin^2
FMUL
REnginePhaseLft
45
REnginePhaseLft1
REnginePhaseLft1 ; sin^3
FSQR
REnginePhaseLft1
REnginePhaseLft ; sin^(3/2)
; Moltiplico per il modulo
FMUL REnginePhaseRgt
REngineModule
REngineWantedRgt
FMUL
REnginePhaseLft
REngineModule
REngineWantedLft
FMUL
REngineWantedRgt
RMenoUno
REngineWantedRgt
FMUL
REngineWantedLft
RMenoUno
REngineWantedLft
JR SET_SPEED
Settore4:
; Motore Dx
; Motore Sx
FADD
REnginePhase
RPi
REnginePhaseRgt
FSIN
REnginePhase
REnginePhaseRgt ; qui ho sin(theta+Pi)
FMUL
REnginePhaseRgt
REnginePhaseRgt
REnginePhaseRgt1 ; sin^2
FMUL
REnginePhaseRgt
REnginePhaseRgt1
REnginePhaseRgt1 ; sin^3
FSQR
REnginePhaseRgt1
REnginePhaseRgt ; sin^(3/2)
FADD
REnginePhase
RPi
REnginePhaseLft
FSIN
REnginePhase
REnginePhaseLft ; qui ho sin(theta+Pi)
FSQR
REnginePhaseLft
REnginePhaseLft ; [sin(theta)]^.5
; Moltiplico per il modulo
FMUL REnginePhaseRgt
REngineModule
REngineWantedRgt
46
FMUL
REnginePhaseLft
REngineModule
REngineWantedLft
FMUL
REngineWantedRgt
RMenoUno
REngineWantedRgt
FMUL
REngineWantedLft
RMenoUno
REngineWantedLft
JR SET_SPEED
;==============================
; Esco da questo pezzo di codice con REngineWantedRgt e REngineWantedLft
; Voglio raggiungere quei valori con due rampe paraboliche, una per motore
; Le rampe devo essere eseguite nello stesso numero di passi
;==============================
SET_SPEED: CFB FBRampa
END_COB: ECOB
;====================================
; FB Rampa
;
; Servono i moduli (che poi sono i valori della tensione) sulla ruota
; destra e sulla ruota sinistra, ogni ruota ha una velocità attuale e una
; voluta
; La transizione deve avvenire a rampa parabolica sia sulla ruota dx che su
; quella sx
;
; Devo fare la procedura una volta per la ruota dx e una volta per la sx
; Calcolo a=y2/x2^2, cioè fisso l'apertura
; Calcolo b=-2ax0, cioè fisso l'ascissa del vertice
; Calcolo ycappello=ax0^2+bx0, cioè fisso l'intera parabola
; Con RNumDivisioni scelto in quanti step eseguire la rampa parabolica
;====================================
FB
FBRampa
FPI
REngineWantedRgt
0
FPI
REngineWantedLft
0
ADD
REngineWantedRgt ; ADD BASE SPEED 2500
REngineSpeedRgt
REngineWantedRgt
ADD
REngineWantedLft ; ADD BASE SPEED 2500
REngineSpeedLft
REngineWantedLft
COPY
IO.Slot1.AnalogueOutput0
REngineActualRgt
47
COPY
IO.Slot1.AnalogueOutput1
REngineActualLft
LD
RDeltaModuloRgt
K 0
LD
RDeltaModuloLft
K 0
SUB
REngineWantedRgt
REngineActualRgt
RDeltaRgt
DIV
RDeltaRgt
RNumDivisioni
RLunghezzaIntervalliRgt
RTmp
IFP
RDeltaRgt
0
SUB
REngineWantedLft
REngineActualLft
RdeltaLft
DIV
RDeltaLft
RNumDivisioni
RLunghezzaIntervalliLft
RTmp
IFP
RDeltaLft
0
FDIV
RFloat1
RDeltaRgt
RARgt ; Ho calcolato aDx
FDIV
RFloat1
RDeltaLft
RALft ; Ho calcolato aSx
FMUL
RARgt
RConstMinus2
RBRgt
COPY
REngineActualRgt
RTmpFloatRgt
IFP
RTmpFloatRgt
0
FMUL
RBRgt
RTmpFloatRgt
RBRgt ; Ho calcolato bRgt=-2ax0
FMUL
RALft
RConstMinus2
RBLft
COPY
REngineActualLft
48
RTmpFloatLft
IFP
RTmpFloatLft
0
FMUL
RBLft
RtmpFloatLft
RBLft ; Ho calcolato bLft=-2ax0
FMUL
RTmpFloatRgt
RTmpFloatRgt
RYCappelloRgt ; x0^2
FMUL
RYCappelloRgt
RARgt
RYCappelloRgt ; ax0^2
FMUL
RBRgt
RTmpFloatRgt
RYCappello1Rgt ; bx0
FADD
RYCappelloRgt
RYCappello1Rgt
RYCappelloRgt ; YCappelloDx=ax0^2+bx0
COPY
REngineActualRgt
RTmpFloat2Rgt
IFP
RTmpFloat2Rgt
0
FSUB
RTmpFloat2Rgt
RYCappelloRgt
RCRgt ; c = y0-ycappello
FMUL
RTmpFloatLft
RTmpFloatLft
RYCappelloLft ; x0^2
FMUL
RYCappelloLft
RALft
RYCappelloLft ; ax0^2
FMUL
RBLft
RTmpFloatLft
RYCappello1Lft ; bx0
FADD
RYCappelloLft
RYCappello1Lft
RYCappelloLft ; YCappelloSx=ax0^2+bx0
COPY
REngineActualLft
RTmpFloat2Lft
IFP
RTmpFloat2Lft
0
FSUB
RTmpFloat2Lft
RYCappelloLft
RCLft ; c = y0-ycappello
49
;===================================
; Eseguo un ciclo for in cui, ad ogni passo, aggiungo l'intervallo alla
; coordinata x e mi calcolo la relativa y
; Il ciclo viene eseguito RNumeroDivisioni volte, l'indice del ciclo è
; "RStoreIndex", un registo interno che può essere preso ed usato
; "momentaneamente"
; In IL non ci sono altri modi per costruire cicli di questo tipo,
; l'alternativa è scriverlo "srotolato"
; Per calcolare il valore YRgt e YLft uso due FB chiamate
; FBCalcYPointRgt/Lft che si riferiscono ai valori
; a, b e c calcolati precedentemente e copiati in appositi registri
;===================================
LOOP:
wait:
COPY
REngineActualRgt
RIncremRgt
COPY
REngineActualLft
RIncremLft
STI
SEI
RStoreIndex
K 1
ADD
RIncremRgt
RLunghezzaIntervalliRgt
RIncremRgt
ADD
RIncremLft
RLunghezzaIntervalliLft
RIncremLft
CFB
FBCalcYPointRgt ; Calcolare la Y
CFB
FBCalcYPointLft
COPY
RNextRgt
IO.Slot1.AnalogueOutput0
COPY
RNextLft
IO.Slot1.AnalogueOutput1
ACC
LD
H
TNextCycle
T#10MS
STH
TNextCycle
NCOB
JR
H wait
INI
JR
RSI
EFB
RNumDivisioni
H LOOP
RStoreIndex
;=========================================
; RY = RA*RIncremX^2 + RB*RIncremX + RC
;=========================================
50
; FB per la ruota sinistra
FB
FBCalcYPointRgt
COPY
RIncremRgt ; x
RTmpFloatRgt
IFP
RTmpFloatRgt ; x float
0
FMUL
RTmpFloatRgt
RBRgt
RTmpFloat2Rgt ; xb float
FADD
RCRgt ; c float
RTmpFloat2Rgt ; xb float
RTmpFloat2Rgt ; xb+c
FMUL
RTmpFloatRgt
RTmpFloatRgt
RTmpFloat3Rgt ; x^2 float
FMUL
RTmpFloat3Rgt
RARgt
RTmpFloat3Rgt ; ax^2 float
FADD
RTmpFloat2Rgt ; xb+c float
RTmpFloat3Rgt ; ax^2 float
RNextRgt ; ax^2+bx+c float
FPI
RNextRgt
0
EFB
; FB per la ruota sinistra
FB
FBCalcYPointLft
COPY
RIncremLft ; x
RTmpFloatLft
IFP
RTmpFloatLft ; x float
0
FMUL
RTmpFloatLft
RBLft
RTmpFloat2Lft ; xb float
FADD
RCLft ; c float
RTmpFloat2Lft ; xb float
RTmpFloat2Lft ; xb+c
FMUL
RTmpFloatLft
RTmpFloatLft
RTmpFloat3Lft ; x^2 float
FMUL
RTmpFloat3Lft
RALft
RTmpFloat3Lft ; ax^2 float
51
FADD
RTmpFloat2Lft ; xb+c float
RTmpFloat3Lft ; ax^2 float
RNextLft ; ax^2+bx+c float
FPI
RNextLft
0
EFB
52