Visualizzazione post con etichetta Microcontrollori. Mostra tutti i post
Visualizzazione post con etichetta Microcontrollori. Mostra tutti i post

giovedì 3 agosto 2017

Progetto CNC KSO-NC-1 #5

Oggi sono riuscito ad assemblare i vari elementi della CNC e a fare alcune prove di incisione su cartone. L'utensile montato sull'asse Z è un simil-Dremel molto economico, ma dalle prestazioni sufficienti per essere utilizzato in questo progetto, reperibile come al solito su Amazon.
Una volta realizzato l'assieme definitivo ho registrato le guide per assicurare il massimo di planarità, parallelismo e ortogonalità dei vari elementi e ho alimentato i motorini tramite la scheda elettronica. Per rendere tutto più sicuro e maneggevole ho racchiuso scheda, alimentatore e relè di comando utensile in una scatola plastica da impianti elettrici che ho recuperato nei vari cestoni dei miei labs (se non altro questo è un ottimo progetto "svuota-cassetti"...) e ho collegato il tutto ad un vecchio portatile con installato Mach3. Le prime prove con questo software, dopo le opportune impostazioni, si sono limitate per ora alla movimentazione manuale degli assi (jog) e alla esecuzione di qualche semplice riga di codice ISO G-Code.
Ho inoltre recuperato un comodo carrellino trasportabile sul quale sistemare tutti gli elementi coinvolti in modo da creare un piccolo centro di lavoro.
I prossimi passi previsti sono il reperimento di un set di frese e l'approfondimento degli aspetti software e dei passaggi operativi per passare dal disegno al programma per NC. 
Intanto un po' di foto del lavoro di oggi.






giovedì 27 luglio 2017

Progetto CNC KSO-NC-1 #4

Dopo alcuni esperimenti ho rilevato alcuni errori strutturali che potrebbero compromettere la precisione delle lavorazioni effettuate con la CNC. In particolare ho riscontrato la possibilità di rotazioni della tavola mobile quando l'utensile taglia all'interno del materiale da lavorare, soprattutto quando questo si troverà ad operare lontano dall'asse principale della tavola. Questo fenomeno è dovuto alla scelta di fissaggio delle guide della tavola che non presentano la necessaria rigidità per impedire tali indesiderate rotazioni. Lo schemetto seguente illustra bene la situazione e propone la soluzione che ho implementato per correggere questo problema, ovvero collegare le guide agli elementi mobili nello stesso modo seguito per gli assi Y e Z.


La nuova versione mi ha consentito di aumentare un pochino l'area di lavoro, ma ha limitato la corsa dell'asse Z a 90mm, perdendo cioè circa 30mm dal range progettato. Ho inoltre incollato dei metri di carta sugli elementi mobili degli assi e previsto degli indici su acetato per avere un rapido riscontro delle quote dei movimenti, sistema sicuramente non preciso, ma molto comodo durante la fase di taratura dei vari elementi. Adesso devo recuperare un elettro utensile sufficientemente potente da collegare sull'asse Z e poi potrò fare un po' di polvere...




venerdì 14 luglio 2017

Progetto CNC KSO-NC-1 #3

Oggi mi è arrivata la scheda per il controllo dei motori della fresetta e ho fatto subito alcune prove. Devo dire che il manualetto contenuto nella confezione forniva tutte le informazioni necessarie per la corretta e completa configurazione dei vari segnali. La scheda è disponibile su Amazon e non costa neanche tanto tenendo conto che consente il pilotaggio di 3 motori con la tecnica del micro-stepping. Utilizza dei driver TB6560A della Toshiba e consente di scegliere la risoluzione degli step voluta: ho provato subito con 1/16 di passo e devo dire che il risultato è veramente notevole, sembra quasi di lavorare con motori in DC da quanto è fluida la rotazione. Sono inoltre disponibili delle comode morsettiere con tutti i segnali di ingresso per la completa gestione della macchina tramite il software Mach3.
Appena riesco a fissare tutti gli assi proverò a fare qualche disegno con il pennarello prima di passare al montaggio dell' elettro utensile.

mercoledì 12 luglio 2017

Progetto CNC KSO-NC-1 #2

Dopo diversi mesi ho ripreso la costruzione della mia piccola CNC montando i motorini per la movimentazione degli assi. Ho scelto dei motori piccoli ed economici che sviluppano una coppia di circa 0.5Nm, più che sufficiente per gli scopi del progetto, che ho acquistato da Amazon. Per l'accoppiamento con la vite filettata ho utilizzato un manicotto metallico filettato M8 al quale ho praticato due forellini per fissare gli elementi con due piccole viti M3.  Per rendere più robusto l'accoppiamento con l'alberino del motore (che ha diametro 5mm) ho usato un pezzetto di guaina plastica in modo da conferire anche una utile elasticità. Appena riesco a implementare l'elettronica di pilotaggio farò un po' di prove per verificare la fluidità e la precisione dei movimenti. 
Per adesso qualche foto del lavoro.





sabato 10 dicembre 2016

Progetto CNC KSO-NC-1 #1

In questi giorni ho finalmente deciso di cimentarmi nella realizzazione di una piccola fresa a controllo numerico per effettuare in maniera automatica alcune lavorazioni che di solito svolgo in modo manuale come il taglio di cartone, compensato, plexiglass e la realizzazione dei circuiti stampati per i miei progetti elettronici. 
Sono veramente parecchi anni che desideravo realizzare un dispositivo del genere, ma la progettazione e costruzione delle parte meccanica mi aveva sempre dissuaso dall'iniziare il lavoro, essendo io notoriamente approssimativo e incapace nelle lavorazioni meccaniche che richiedono un minimo di precisione (e macchinette del genere ne richiedono invece un bel po'...).
Dopo aver visionato vari progetti trovati in rete, alcuni dei quali veramente notevoli, ho deciso di provare a progettare da me la parte strutturale, avendo come obiettivo un compromesso decente tra precisione e costo. Infatti tutta la parte meccanica voglio realizzarla con elementi a basso costo e reperibili facilmente senza bisogno di rivolgersi a fornitori particolari.
La struttura che ho scelto è del tipo a tavola mobile (asse X) e ponte fisso, in modo da minimizzare le problematiche relative alla movimentazione del ponte che trasporta l'utensile per la lavorazione (assi Y e Z) ed è realizzata in economico MDF da 19 e 16 mm.
Gli elementi mobili sono montati su delle guide in metallo per cassetti e movimentati da delle viti M8 calettate sugli alberi di 3 motori passo-passo.
Posto alcune foto delle parti realizzate in questi giorni.

L'asse X (tavola mobile)


L'asse Y (il ponte)


L'asse Z


L'assieme degli assi X e Y



L'assieme dei 3 assi montati





domenica 12 luglio 2009

Controller IR - Relays

Oggi ho terminato la programmazione ed il collaudo di un controller per relè comandato da un telecomando Infra Red di un vecchio impianto stereo. In realtà il progetto è stato realizzato diversi anni fa e originariamente doveva essere un controller per l'azionamento di motori asincroni trifase comandato via bus, ma la cosa non ha avuto molto seguito ed è rimasto per parecchio tempo inutilizzato in un cassetto dei miei labs. Ultimamente mi si è presentata la necessità di comandare dei carichi domestici in modo semplice e coreografico attraverso l'uso di un semplice telecomando ad infrarossi: è stato sufficiente recuperare i vecchi schemi, riscrivere in pochi minuti un programmino ad hoc ed ecco pronto il device che fa al caso mio. Il progetto è sviluppato su due schede sovrapponibili: una contenente il microcontrollore (un vetusto Atmel AVR 8515) e un'altra con gli 8 relè per attivare i vari carichi. Avendo inoltre a disposizione tutti i pulsanti delle varie funzioni previste dal telecomando ho potuto sbizzarrirmi a implementare i giochetti più divertenti, come le sequenze di luci e i simulatori di presenza. Per quanto riguarda il software, le cose sono state molto semplificate dal fatto che avevo già da tempo scritto una libreria per la decodifica dei codici IR emessi dai chip NEC ed è stato quindi sufficiente interfacciare il ricevitore IR (un TSOP1838) al uC e integrare la routine con il resto delle funzioni previste dal programma. Un giorno forse realizzerò un progettino completo da pubblicare nel sito.




giovedì 21 agosto 2008

MultiTasking con micro controllore AVR


Introduzione
Quando si progettano schede con microcontrollori spesso si rimane piacevolmente sorpresi da come queste risultino semplici dal punto di vista elettronico, constatando come aspetti, quali lo sviluppo delle piste del pcb, la disposizione dei componenti, l'accessibilità dei connettori, risultano molto agevolati. Questo è ovviamente dovuto al fatto che molta della logica funzionale dell'intero sistema è demandata e gestita dal uControllore, o meglio dal firmware contenuto al suo interno. Non è raro però notare come, in alcune occasioni, ad una semplificazione nella realizzazione hardware non si affianchi un' altrettanta semplicità nell'organizzazione e nell'implementazione del software. Avere infatti a disposizione un gran numero di linee di I/O, UART, convertitori ADC, timers, e molte altre periferiche rende difficile la loro gestione all'interno del programma principale. Una soluzione elegante è offerta dal meccanismo delle interruzioni hardware, che consente alle varie periferiche di interrompere autonomamente il flusso di elaborazione a fronte di particolari eventi, permettendo così alla CPU di eseguire tutte le istruzioni necessarie alla loro gestione, in maniera totalmente asincrona. Non sempre, però, è possibile applicare questo meccanismo: basti pensare a quando si ha la necessità di eseguire porzioni di codice simultaneamente al fine di valutarne complessivamente gli effetti nel main-program. Con l'avverbio "simultaneamente" si intende che le istruzioni costituenti queste porzioni di codice (TASK - Processi) vengono comunque eseguite sequenzialmente una alla volta, ma la CPU distribuisce il suo tempo totale di elaborazione tra tutti i processi che viene chiamata ad eseguire, saltando continuamente da un task ad un altro (Context Switch). Se la frequenza di clock che alimenta il uC è abbastanza elevata e la complessità dei task limitata, si avrà l'impressione che tali processi siano eseguiti appunto simultaneamente. Questo tipo di architettura è nota come MultiTasking. Obiettivo di queste note non è certo quello di approfondire un argomento sul quale molto è stato scritto, ma di capire come implementare questa tecnica nell' ambito dei microcontrollori, in modo da poter strutturare e semplificare la programmazione, un po' come avviene per gli aspetti hardware.
A questo punto è utile un esempio: si pensi alla programmazione di un centralino d'allarme di un sistema anti-intrusione domestico che deve testare lo stato degli ingressi (porte, finestre, ecc.), gestire una tastiera remota, interagire con una interfaccia telefonica (combinatore e decoder DTMF) ed infine comandare la sirena dall'arme. Sarebbe ben poco sicuro se durante la lettura del codice battuto sulla tastiera il programma smettesse di testare gli ingressi o non spegnesse la sirena eventualmente attiva. E' quindi necessario che tutti i processi vengano eseguiti sempre e comunque, assegnando maggior tempo di elaborazione a quelli che si reputano più importanti e minore a quelli ritenuti meno critici, introducendo cioè una priorità nell'esecuzione dei task.
Implementazione
Per implementare un framework MultiTasking, per quanto elementare lo si possa concepire, si devono prevedere i seguenti elementi fondamentali:

- Il codice dei singoli Task
- Uno Scheduler
- Un Dispatcher

Ogni Task è costituito dalla sequenza di istruzioni che ne identificano il compito come ad esempio testare lo stato di ingressi digitali, acquisire livelli analogici, leggere lo stato di sensori, ecc.
Lo Scheduler (Schedulatore) è la parte di codice che supervisiona l'esecuzione dei task da parte della CPU e decide quale task deve essere attivo in un determinato istante. E' inoltre in questo modulo che è possibile impostare la priorità dei vari processi, definendo quanto tempo CPU assegnare ad ogni task. A seconda di quale strategia di servizio (algoritmo di scheduling) venga seguita, lo scheduler controlla la ripartizione del tempo di CPU tra tutti i processi attivi e lo stato di questi ultimi, i quali possono trovarsi attivi, fermi o in attesa.
Il Dispatcher è la porzione di codice che passa effettivamente il controllo della CPU ai processi scelti dallo scheduler realizzando lo switch tra i vari task attivi.

Come è intuibile, il componente più importante di questa struttura è lo scheduler, che costituisce la "base dei tempi" di tutto il sistema. Infatti, la prima cosa che bisogna introdurre per realizzare uno scheduler è proprio un meccanismo che tenga conto dell'evolvere del tempo e che sia legato al tempo di elaborazione della CPU. Questa informazione non deve essere necessariamente il tempo di clock o di ciclo macchina della CPU, ma è sufficiente un segnale temporale ottenuto da uno dei timer presenti all'interno del uControllore, è lo si può pensare intorno ai millisecondi. Questo intervallo di tempo sarà il quanto temporale con il quale verranno misurati i tempi di esecuzione di ogni task. E' bene ricordare che il processo di generazione di questi tempi avviene tramite una interruzione hardware sollevata dall' overflow di un timer e quindi è completamente asincrona alla esecuzione delle istruzioni del main-program. Una volta abilitate le interruzioni hw e avviato il timer, la CPU sarà costretta ad interrompere il flusso del programma principale per saltare alla routine di servizio dell'interrupt dell' overflow del timer (ISR) che sarà costituita dal codice per la gestione dei task. In questa routine si potrà cambiare lo stato dei vari task, regolarne la priorità e soprattutto decidere la loro sequenza di esecuzione. La traccia dello scorrere dei quanti temporali è mantenuta semplicemente da una variabile intera che viene incrementata ogni qualvolta viene eseguito il codice dello schedulatore. Il valore contenuto in questa variabile sarà poi utilizzato per decidere qual è il task da porre in esecuzione e quali invece da sospendere. Tali decisioni vengono attuate impostando degli appositi flags che verranno successivamente gestiti dal Dispatcher, il quale, in una versione molto primitiva, può essere realizzato con una sequenza di blocchi decisionali con lo scopo di saltare verso le label di inizio del task da porre (o mantenere) in esecuzione.
Le differenze tra gli istanti (espressa in quanti temporali di eleborazione) in corrispondenza dei quali si attivano i task riflettono la priorità di esecuzione di un processo rispetto ad un altro.
Multitasking su uC Atmel AVR
Tutte le considerazioni fatte finora possono concretizzarsi in un semplice progettino per rendersi conto di come sia possibile implementare il multitasking anche su dei microcontrollori che non dispongono di particolari risorse. L'esempio che segue è stato scritto e provato su un uC Atmel AVR AT90S8515 e compilato con BASCOM-AVR, ma può essere facilmente esteso a tutti i uC e tradotto in tutti i linguaggi più diffusi. E' composto da 3 task costituiti da semplici istruzioni: incremento di una variabile intera e successiva stampa tramite UART. Il quanto temporale è di circa 2 ms, con un quarzo da 10MHz. Lo schedulatore incrementa ad ogni interruzione del Timer0 la variabile intera T e testa quando è il momento di far partire l'esecuzione dei task, aggiornando 3 flags. Alla fine del codice di ogni task si trova un gruppo di 3 costrutti if..then che consentono di deviare il flusso di esecuzione da un task ad un altro (context switch). In questo esempio il task 1 ha una durata di 15-10=5 quanti, il task 2 dura 45-15=30 quanti, mentre il task 3 occupa la CPU per 10-0=10 quanti. I rapporti dei tempi di esecuzione sono quindi:

- Task2/Task1 = 30/5 = 6
- Task2/Task3 = 30/10 = 3
- Task3/Task1 = 10/5 = 2

La struttura riportata è molto semplice, ma la si può estendere a piacimento replicando quanto fatto per ognuno dei 3 task qui considerati. In una versione ancora più evoluta è inoltre possibile gestire anche lo stato dei task, eseguendo solo quelli attivi e saltando quelli posti in stato di stop.
Risultati ottenuti
Una volta compilato e mandato in esecuzione il programma su una qualsiasi scheda munita di interfaccia RS232, sono stati ottenuti i seguenti risultati:


Come si può vedere dalla schermata del terminale, i valori delle variabili interne ai task (a,b,c) riflettono la durata di esecuzione dei singoli processi, e risultano essere coerenti con i valori teorici attesi, e cioè:

- Task2/Task1 = 54/10 = 5,4 [6 teorico]
- Task2/Task3 = 54/18 = 3 [3 teorico]
- Task3/Task1 = 18/10 = 1,8 [2 teorico]

Agendo sui tempi dello schedulatore e sulle priorità dei vari processi sarà possibile pianificare un programma in grado di gestire in maniera modulare e strutturata quelle routines di gestione di tutti gli eventi che non sono direttamente "agganciabili" a interruzioni hardware, consentendo di concentrarsi su ogni singolo blocco funzionale, un po' come avviene nella programmazione ad oggetti ed eventi nei sistemi operativi più evoluti.
Conclusioni
Queste note sono state pubblicate al solo scopo di introdurre brevemente le problematiche e i vantaggi dell'uso della tecnica multi-processo e time-sharing applicabili al mondo dei uControllers. In rete sono ovviamente disponibili moltissime versioni di sistemi multitasking per microcontrollori, alcuni anche free, che consentono di sfruttare a pieno le potenzialità di questa architettura, fornendo addirittura dei piccoli sistemi operativi (micro-kernel) che offrono un vastissimo panorama di utili funzioni e servizi.

giovedì 10 luglio 2008

Pic-Pong & Tetris

In questi giorni, curiosando nei miei archivi, ho scovato un vecchio progettino con PIC16F84 molto semplice ma estremamente simpatico: un completo video gioco da collegare al televisore di casa. Consente di giocare a ping-pong e a Tetris, sintetizzando, oltre che il segnale video, anche un rudimentale segnale sonoro. Il firmware prevede la gestione di due joystick a switch tipo Commodore (C-64, Amiga), ma essendo ormai di difficile reperibilità mi sono disegnato i due pad con 5 switch da circuito stampato. Nel sito dell'autore del progetto si possono trovare tutte le informazioni ed il materiale per la realizzazione oltre ad un ottimo tutorial sulla generazione dei segali video tramite uControllori.
http://www.rickard.gunee.com/





sabato 7 luglio 2007

Programmatore AVR ISP

Questo semplice adattatore consente di programmare i microcontrollori Atmel AVR tramite l'interfaccia ISP direttamente nella board che li ospita.
Il software compatibile con questo cavo di programmazione è reperibile in: AVR Tools:

Programmatore di PIC


Questo schema l'ho messo in pratica e funziona molto bene con il programma IC-PROG settato come ProPic2 con l'inversione del segnale MCLR e del segnale Vcc.
Richede un PC con porta parallela Centronics. Le tensioni per la programmazione le ho ottenute con due stabilizzatori serie 7805 e 7812 mettendo in serie al piedino di massa di quest'ultimo due diodi 1n41 48 con i catodi verso GND.
I transistor possono essere sostituiti con qualunque PNP tipo BC557, BC308, ecc.

venerdì 6 luglio 2007

Programmare i PIC16F687/689


Mi sono trovato di fronte la necessità di programmare PIC 16f687 con il programmatore Propic2 e software IC-Prog versione 1.05e, che non supporta questo tipo di micro.

Qualcuno sa come poter ovviare a questo problema?