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