Movimento controllato con encoder
Descrizione
Semplice controllo di rotazione con motoriduttore che ha un encoder a due fasi montato sull’albero del motorino elettrico. Durante le prove ho bruciato i 16F84A che avevo e per questo ho usato un 16F628A. Il programma sta comunque nella memoria di un 16F84A, con l’apposita versione.
Progetto
Non giudico questo un progetto finito a sé, ancora ho poche idee per una ubicazione dove poterlo utilizzare per i miei scopi. L’ho fatto sospinto dalla curiosità quando lessi questa discussione.
Avendo iniziato un tipo di lavoro simile alla discussione, sono riuscito a ricomporre questo progetto. Son stato coinvolto in ritardi dovuti nel voler aggiungere qualche altra funzione.
Messo insieme i componenti, il video dimostra come l’assemblaggio riesca a fare il suo compito.
Il programma è stato sviluppato con Proton Basic, ma direi in modo ibrido, dato che contiene tante parti scritte in assembly, per risparm1are spazio e migliorare la resa del tutto.
Inizialmente è stato scritto per un 16F84A a 4 Mhz, con la speranza che si può adattare anche per altri micro pin compatibili con le sole variazioni della configurazione. Non sono sicuro che si adatta ai micro della classe ehnanced del tipo 16F18xx. Ho qualche dubbio che l’assembly potrebbe essere diverso per alcuni punti.
Una cosa buffa che mi succedeva, era che non sapevo che il micro che stavo usando era da 4 Mhz ed mettevo il quarzo a 20 Mhz. Alcune volte riusciva anche a funzionare.
|
Questo progetto utilizza questo tipo di motoriduttore che conta 11 impulsi per ogni giro del motorino, che vengono quindi ridotti con un rapporto 1:600 dal riduttore a vite senza fine. Per fare i due giri come la discussione del forum, occorre contare 13200 impulsi. Il calcolo sarebbe:
2 giri x 600 x 11 = 13200.
Almeno questo è quello che posso notare dal rapporto della seriale, con il motoriduttore che sto usando.
A parte l’idea di far fare 2 giri, come nella richiesta, le capacità sono ben superiori, permettendo di contare oltre 65500 impulsi, che sarebbero prossimi ai 10 giri dell’alberino lento.
Si può pensare di accoppiare ad una madrevite all’albero lento per far fare un movimento lineare, che consente una risoluzione di 1:6600, col vantaggio di arresto senza rischiare la reversione del moto. Infatti il riduttore è irreversibile e anche se caricato l’ albero lento non gira indietro.
Potrebbe usarsi come un servo, facendogli fare anche pochi gradi di movimento.
Il programma è adatto anche con un altro assemblaggio e che ha diverso rapporto di riduzione o di conteggio d’ impulsi. Sembra che si possa raggiungere frequenze di conteggio alquanto elevate.
In programma accetta alcuni comandi comodi, che associati con un altro dispositivo master si riesce a coordinare movimenti per alcuni di questi progetti. Avendo anche la possibilità di memorizzare fino a sedici comandi più frequenti nella EEPROM del controllo.
Come per esempio il puntamento di una parabola per satellite, o controllo porticina di una stia per polli.
Lo schema
Lista materiale
È stato progettato di poter salvare la posizione dell’encoder appena in tempo nella EEPROM, quando dovesse mancare la tensione di alimentazione. Permettendo poi di recuperare il dato ultimo e poter muoversi con buona precisione dallo stesso punto che si era fermato.
Il diodo al piedino del microcontrollore serve per mantenere i 5 Volt anche durante un brusco calo di tensione al circuito, tramite il condensatore C3. Facendo uno studio, ho rilevato che servono al massimo 8 ms per salvare un byte in EEPROM. Per questo caso sarà necessario salvare 4 bytes. Con i 100 µF si riesce a salvare tutti i dati necessari a ripartire. Comunque meglio stare abbondanti e per non sbagliare ho scelto 330 µF.
Con l’utilizzo dei relè è possibile lavorare con motori in corrente continua o in alternata, a scapito che non si può aver un controllo di velocità. Ad ogni modo è facile con piccola modifica montare un controllo di velocità e usufruire delle due uscite per attivare il senso di rotazione.
Il software
Istruzione di utilizzo del firmware
Premessa:
Il sorgente del programma è commentato abbondantemente per aiutare capire cosa si è scritto, e magari, in un periodo successivo eseguirne la manutenzione.
Nell’ultima versione ho dovuto aggiustare molto per far stare il meglio e per questo che ci sono molte parti in assembly. S’è tenuto conto anche di mettere il watchdog, che nel caso si bloccasse il programma in qualche punto allora, il micro viene resettato. In particolar modo per quando è stato rilevato una perdita di alimentazione, necessario per poter riavviare il micro dopo aver salvato i dati in EEPROM.
Ho adottato una particolare attenzione che il conteggio dell’encoder non superi i valori definiti come minimo e massimo, quali sono DRIFT e MAXLIMIT (vedere sotto le definizioni).
L’ho commentato in inglese, perché il video è in visione per tutto il mondo e magari di utilità non solo agli italiani.
In Headerxx.Inc ci sono molte definizioni in un modo che permette di variare le impostazioni in un solo punto senza rischiare di averne dimenticata qualcuna nelle altri parti del programma. (xx è una numerazione della versione in uso). Stesso stile segue anche per il nome del programma.
Ce ne sono due per poter usare il 16F84A oppure 16f628A, in modo che si può usare tutta la EEPROM. Questo si deve scegliere prima di compilare.
Da notare le due definizioni all’inizio che determinano una compilazione in modo differenziato di utilizzo dell’hardware.
Le opzioni sono:
DOTOGGLE |
Serve per permettere al pulsante o contatto di attivazione, (RUN nello schema) a operare in modo ciclico. In questo metodo si permette di avviare e fermare il movimento, anche prima di aver raggiunto il finecorsa software. |
WITH_RS232 |
Determina l’aggiunta di comunicazione seriale ai piedini TXD e RXD. Sono permesse eventuali modifiche nella assegnazione dei piedini da usare con la seriale, ma lo sconsiglio. Infatti ho previsto che il circuito permetterà di montare anche altri micro-controllori che sono pin compatibili con il 18F84A. In tal modo si potrà ampliare le funzioni di programma e magari migliori prestazioni con un micro-controllore di classe superiore. |
WITH_OSC |
Serve per far oscillare il movimento entro i due limiti. Vedere la descrizione del comando di seguito. Qui viene posta la condizione di escluderla dalla compilazione per poter attivare una opzione diversa, come l’uso dei timer. Visto che non c’è posto a far stare tutto. |
WITH_GOTO |
Opzione che permette di dare un comando di movimento ad una specifica posizione. Se non interessati all’utilizzo, si potrà escludere. |
WANTWDT |
Opzione che determina se far uso del watcdog. Una opzione che costa qualche istruzione in più per una maggior sicurezza, ma potrebbe impedire di compilare un’altra opzione. |
Altre definizioni di rilievo:
MAXLIMIT |
Serve a determinare i limiti massimi dei valori dell’encoder. È utile impostarlo correttamente, dopo le prove iniziali, per poter definire il valore di punto medio (MIDDLE) |
MIDDLE |
Automaticamente calcolato. Serve a definire un valore iniziale da impostare nella EEPROM. |
DRIFT |
Valore che tiene conto di calcolare l’arresto prima che il contatore dell’encoder superi il limite di una word (che sono 16 bit). Il caso da evitare che dopo lo spegnimento del motore, il conteggio continua, data l’inerzia in movimento. Quindi se il conto, per esempio, è prossimo a zero e si continua a diminuire, si arriverebbe al punto che diventa 65535 e diminuisce. Il perché è proprio di questo calcolo. |
WAITTIME |
Valore che si usa per un periodo in millisecondi di attesa che il motore sia completamente fermo. In caso si rileva altri impulsi dall’ encoder, allora il ciclo si ripete. |
DEBUGGING |
Serve per fare alcune prove di verifica nei casi di riscontrare problemi. |
Modalità di utilizzo
Primo metodo Comandi da pulsante.
Un ingresso unico è predisposto per avviare il moto verso un punto definito come arresto. Chiudendo il contatto a massa, il programma deciderà il percorso al finecorsa software più distante.
Come succitato, anche già programmato, il contatto può arrestare il moto prima di aver raggiunto il finecorsa. Volendo si può disabilitare questa funzione di arrestare durante il moto.
Appena il contatto viene chiuso, con magari qualche millisecondo di ritardo, si avvia il movimento e il LED (LED0 dello schema) si accende per il periodo che sta girando il motore. Nel mio esperimento ho utilizzato un LED tricolore, per questo LED0 è blu.
Se si presenta una certa inerzia prima della completa immobilità, questo LED lampeggia per indicare la fase di attesa al completo arresto. Magari è solo un piccolo lampo, quando la decelerazione è veloce.
Arrivato al finecorsa software, si accende un dei due LED di finecorsa. Col mio LED tricolore il LED2 è rosso e LED1 è verde. Il verde si accende a fine della posizione A ed il rosso per la posizione B.
Fare ben attenzione alla direzione della rotazione del motore. Infatti è previsto che quando il conteggio dell’encoder decresce il moto si sposta nella posizione A. Il suo comando d’impostazione da seriale è la lettera p minuscola.
Quando l’encoder aumenta il conteggio, il moto si sposta nella posizione B. Il suo comando d’impostazione da seriale è la lettera P maiuscola.
Sarà importante nella prima fase di collegamento del motore e determinarne il senso di rotazione.
Secondo metodo Comandi da seriale.
È stato previsto la comunicazione con il micro, tramite seriale. Questa può essere un adattatore USB-RS232 e compatibile coi livelli di tensione del micro. Sarà possibile anche utilizzare un modulo Bluetooth, che magari necessita una attenzione sui livelli di tensione del micro. Io ho messo un partitore di tensione per adattare ai 3,3 Volt del piedino RX del modulo Bluetooth. Il piedino TX non crea problemi severi.
Rimane disponibile al funzionamento anche l’ingresso per iniziare il movimento, che determina il movimento a secondo della distanza ai finecorsa. Questo ingresso si vede nello schema con una definizione del pulsante RUN.
Elenco Comandi da seriale
Il modello dei comandi si basa su una lettera iniziale seguita da cifre, se sono necessarie.
Per questo il comando sarà della fattispecie:
Xnnnnn |
X si intende una lettera (miniscola o maiuscola) e con n una o più cifre di un numero intero, solo positivo. Qualsiasi altro simbolo o carattere termina l’immissione valida, fino al raggiungimento di 6 caratteri immessi. Per completare il comando ci sono le seguenti condizioni:
|
Tutti i segnali della seriale, arrestano il movimento.
Il motivo scelto di arrestare quando arriva un carattere è dato dal fatto che i periodi di pausa per la ricezione di un bit vengono corrotti dagli interrupt che sono necessari per stare al passo all’encoder. Questo causa la perdita di misura di un bit e quindi il carattere ricevuto non è più valido.
Appena sente un carattere si ferma, ma non è pronto subito a ricevere ulteriori comandi, perché subentra la fase di decelerazione del motore. A secondo anche di come è stato impostato la definizione WAITTIME.
I comandi senza numeri sono le lettere A, B, S, V, O, C. Con la lettera V, non ha importanza se inviata maiuscola o minuscola si avranno le informazioni più rilevanti.
Per tutte le lettere, vedere il dettaglio sotto.
Per errori di battitura, il comando di cancellare un carattere (backspace) interrompe l’immissione del valore.
Comandi in dettaglio dalla seriale:
A |
Indifferente attiva il moto e decresce il conteggio dell’ encoder |
B |
Indifferente attiva il moto per aumentare il conteggio dell’ encoder. Tutti gli altri caratteri arrestano il moto quando avviato. Per questo, meglio aspettare che il moto sia fermo e reimmettere il comando. |
C |
In maiuscolo sposta il puntatore in EEPROM dei finecorsa alla prima locazione salvata. Infatti anche spegnendo, i dati rimangono. In minuscolo, reimposta i valori di difetto, alla locazione corrente. Vedere N per dettagli. |
G |
Indistintamente se minuscolo o maiuscolo, fa muovere il motore alla posizione dello encoder scritta nelle cifre che lo seguono. |
M |
Indifferente, permette la modifica del valore di conteggio dell’encoder. Quindi si può definire un nuovo valore della posizione dell’encoder. Può essere utile per rimettere il conteggio entro i limiti consentiti ed eliminare la costrizione di essersi spostato oltre il limite. Oppure per correggere un certo slittamento. |
O |
Maiuscolo, imposta la funzione di oscillazione tra i due finecorsa software. Qualsiasi carattere in ingresso ferma l’ oscillazione, ma per rimuovere l’opzione si deve mandare il comando in minuscolo. |
P |
Minuscolo imposta il finecorsa nel conteggio a diminuire. Bisogna fare attenzione a immettere un valore coerente per poter essere accettato. Questo sta nella direzione che l’encoder decrementa il conteggio con il comando A. Maiuscolo vale per il finecorsa opposto. Questo sta nella direzione che l’encoder incrementa il conteggio con il comando B. |
N |
Comando per cambiare la posizione della memoria EEPROM. Si accetta una o due cifre, se maggiore allora viene scelta la memoria disponibile più alta. Facendo così si utilizza una differente limitazione dei finecorsa. |
S |
Molto simile al comando P, solo che si ordina di salvare la posizione corrente del contatore, per questo non sono previsti numeri a seguito della lettera. Utile per vedere la posizione corrente è vicina al finecorsa e quindi si stabilisce quella come valida. Se la lettera è minuscola si vorrà salvare per il lato A, ammesso coerenza coi valori immessi. |
T |
Opzionale, sacrificando altre opzioni, come il watchdog, oscillazione e il comando G. Si potrà anche compilare questa opzione. |
V |
Indifferente, visualizza le informazioni riguardanti ai Valori dei finecorsa e dell’encoder, più il numero di locazione della EEPROM. |
Messaggio di fine comando:
Alla fine di ogni comando appare un messaggio d’informazione. La memoria del programma è al limite, non conviene fare modfiche, senza sapere come.
I mesaggi sono “OK” se tutto è fatto giusto oppure “ERR n” se c’è stato un errore di operazione.
Per n esiste una spiegazione di errore possibile. Vedasi lista di seguito.
1 |
Segnala che si cerca di muovere oltre i limiti di difetto (DRIFT o MAXLIMIT) |
2 |
Il valore immesso è fuori dai limiti inferiori, determinati dal limite di finecorsa e la posizione mediana della corsa. (infatti c’è un MIDDLE che è il valore mediano) |
3 |
Il valore immesso è fuori dai limiti superiori, determinati tra MIDDLE e il finecorsa alto. |
4 |
Il valore deve essere sopra MIDDLE |
5 |
Il valore deve essere sotto MIDDLE |
6 |
Il primo carattere inviato non è valido, forse corrotto. |
7 |
La locazione che si cerca di scrivere in EEPROM non è corretta |
Comandi attivi con la compilazione senza RS232
Si può compilare anche senza l’opzione di utilizzo della seriale.
Per questo s’è previsto di utilizzare l’impulso di comando con un sol pulsante con divese funzioni.
Le funzioni sono nel programma aggiunto OneButton.Inc il quale può utilizzare una cadenza di misura dei periodi tramite il Timer0, usato anche per far lampeggiare i LED. Questa cadenza determina il periodo valido per la pressione del pulsante, per filtrare eventuali vibrazioni di impulso meccanico.
C’è una possibilità d’impostare un periodo tramite ritardo software, che purtroppo non permetterebbe l’ uso del lampeggio dei LED durante le operazioni. Direi che non conviene cambiare queste parti.
Non tutte le funzioni sono attivate, permettendo di tenere il programma in poco più di 600 istruzioni macchina. Si usa solo le definizioni utili per questo programma, sebbene il programma OneButton.Inc ne offra qualcuna altra.
Vediamo quelle che sono attive:
Click |
Usato per salvare su EEPROM, nella fase di programma. Oppure per muovere in una direzione, che il programma sceglie quella più distante. Vale anche per arrestare il moto (se si usa la sua opzione). |
Doppio click |
Usato per iniziare e terminare la fase di programmazione. Si potrà evitare di salvare in EEPROM se premuto una seconda volta senza avere dato un click per la memorizzazione. I limiti saranno validi solo in RAM. Non sono salvati in EEPROM. |
Pressione Lunga |
Usata per muovere in direzione A, durante la fase di programmazione. Il finecorsa viene posto al massimo definito con DRIFT. |
Click corto e pressione lunga |
Usato per muovere in direzione B, durante la fase di programmazione. Il limite viene posto al massimo. Il finecorsa viene posto al massimo definito con MAXLIMIT. |
Con queste possibilità si può pensare di programmare le posizioni di limiti con la sequenza che richiede un doppio click per iniziare la fase di programmazione. Il LED0 (blu) inizierà a lampeggiare velocemente. A quel punto si sarà in grado di agire per muovere il motore nella posizione di arresto. Con una pressione lunga si inizierà a muovere verso il limite A. Quando si rilascerà il pulsante si otterrà la memorizzazione in RAM del limite. Conviene comunque muovere dal punto mediano al punto di arresto necessario.
Similmente si potrà fare per l’altro senso di rotazione, il qual comando in questo caso sarà un click seguito da una pressione lunga, mantenuta bassa. Quando la pressione lunga sarà a sufficienza il motore inizierà il moto nella direzione B, rimanendo in moto fintanto che si terrà il pulsante premuto. Conviene quindi eseguire il comando dopo aver espletato il primo. In questo caso si dovrà tener premuto fino a raggiungere il limite desiderato.
A questo punto si avranno i limiti memorizzati in RAM, ma che si potranno sempre variarli ripetendo l’ operazione. Per renderli definitivi si potrà salvarli in EEPROM con un comando di un click semplice.
Questo click avrà solo effetto durante il periodo d’impostazione che è delimitato da una sequenza di doppio click, ovvero uno doppio all’inizio e uno doppio al termine della programmazione.
Riassumendo, si nota che la fase di comandi in programmazione sono iniziati e vengono conclusi con il doppio click. Al di fuori dei quali non avranno effetto. Fatta eccezione del click che serve ad avviare il moto.
Si potrà scaricare il pacchetto e/o vedere il video
NOTA
Usare il progetto implica le proprie responsabilità, che l’ autore non assume per cause di danno a persone o cose.
Lascia un Commento
Vuoi partecipare alla discussione?Fornisci il tuo contributo!