Appunti da e per chi si vuole auto-costruire un posizionatore

:p

DSC03249.jpg

DSC03251.jpg

DSC03252.jpg

DSC03258.jpg
 
:p

Il primo link pare solo in ceco :crybaby2: mentre l'appnote della Eutelsat dice solo come utilizzare un PIC per implementare uno switch DiseqC, che io ho già sotto forma di un ottimo Spaun 2.0 4x1 ;).

Intanto ho finalmente risolto il bug che mi ha fatto perdere ore e ore :lol: (mi ero dimenticato un'istruzione in mezzo al codice, rimasuglio di uno dei primi tentativi di risoluzione :lol:). Ma non solo: ho riorganizzato il programma dividendolo al meglio nelle 4 pagine di memoria del PIC ed ovviamente ho implementato la funzione di autocalibrazione dei motori, semplicemente conta quanti impulsi mi forniscono spazzolando tutto l'intervallo manovrabile :D. Ora manca solo da integrare a queste procedure il salvataggio dei dati essenziali nella EEPROM per tenerli anche in caso di spegnimento del sistema :D. Al momento ho la (lunghissima) routine di gestione dell'interrupt (obbligatoriamente) in pagina 0 assieme alle routine che vengono eseguite quando si fornisce tensione al circuito e quando lo si accende o spegne con lo standby. In pagina 2 risiedono tutte le altre routine, e con le 2 principali (gotoX/step e continuous move) è quasi piena. In fondo a ogni pagina di memoria ho replicato le procedure essenziali per la gestione dei ritardi calcolati e dell'output utente (display), solo perchè occupano 104 righe per pagina (su 2048), così non devo impazzire con le chiamate incrociate inter-pagina che sui PIC16Fxxx sono manuali ;). Nella pagina 1 credo che ci dovrebbe stare tutto il codice necessario alla gestione della memorizzazione delle posizioni: avendo già integrato la gestione contatori nelle 2 procedure maestre in pagina 2, devo solo ricevere le cifre della posizione da richiamare o memorizzare, gestire di conseguenza la lettura/scrittura in memoria non volatile e chiamare gotoX per portarmi a destinazione :D:D, le procedure maestre pensano già a tutto (contatori, limiti e condizioni d'errore).
Questo dovrebbe lasciare tutta la pagina 3 di memoria programma libera, aprendo orizzonti molto interessanti: i PIC16F87x possono leggere/scrivere autonomamente non solo nei 256 byte di EEPROM dati integrata, ma anche nelle 8192 parole di memoria programma tipo Flash. Non ho detto byte di proposito: le locazioni della memoria programma sono numeri a 14 bit e non 8 ;), poichè il conteggio degli impulsi non supererà mai 16383, è possibile memorizzare l'intero valore di posizione di un motore in una sola locazione di memoria Flash, ciò vuol dire che nella pagina 3 posso memorizzare 1020 posizioni satellitari (1020 coppie di valori AZ-EL più 8 locazioni per i dati non perdibili ;)) :5eek::5eek:, contro le "appena" 62(+8) utilizzando la EEPROM dati :lol:.
Se mi accontento di 60 satelliti memorizzabili in un arco polare teorico da 60W a 80E la pagina 3 può essere adibita a un altro uso: potendo contenere fino a 4096 caratteri in ASCII ridotto (ogni locazione 2 caratteri a 7 bit) è utilizzabile per memorizzare i nomi di tutti i satelliti :D:D:D:D. In questo caso però dura sarà sviluppare il software capace di sfruttare le stringhe :D.

P.S.
Il motore H-H con i limiti di fabbrica (circa 90° di rotazione) fornisce 1019 impulsi, il pistone ottico EL invece nei suoi 6" di corsa mi risponde 424 volte ;). Nonostante un calcolo ibrido del conteggio per motivi di programma (conteggio manuale del valore assoluto nella gotoX, conteggio dell'offset in background sul timer1 con somma o sottrazione finale nella muovi continuo), la precisione di movimento sull'H-H è tutto sommato apprezzabile: +/- un impulso :D, vale a dire circa 0.09° angolari :happy3::D.
 
Ultima modifica:
:p

Bene tenetevi pronti perchè in questo post esporrò per bene l'ultima revisione del programma, dato che ormai tutti i blocchi operativi che al momento include sono a posto e funzionanti, potremmo chiamare questa versione "milestone 1" :lol::lol:.

Iniziamo dal microprocessore fresco di programmazione :D. Una volta inserito nel suo zoccolo e fornita tensione al grosso trasformatore tramite l'interruttore sul retro, impiega meno di 1 secondo per avviare il programma, impostare tutto e portarsi nella condizione di standby:
DSC03264.jpg


Basta premere il relativo tasto del telecomando a infrarossi o il tasto frontale per svegliare il tutto :lol:, il LED passa da rosso a verde :D
DSC03266.jpg


La memoria è vuota, quindi sul display compare la scritta "No Cal!", comunque anche in questa condizione posso muovere manualmente i motori, ovviamente il programma non attiva i contaimpulsi nè memorizza nulla. Il simbolo (carattere giapponese) in alto a destra sul display indica che il circuito sta ricevendo e decodificando un segnale dal telecomando :D
DSC03269.jpg


Per poter passare al bello :lol:, prima devo procedere a calibrare i motori ;), ci sono 2 tasti separati sul telecomando, cominciamo con il motore H-H
DSC03270.jpg


La calibrazione è completamente automatica, provvede a portare il motore prima al fine corsa Ovest (conteggio 00000). Notare la "[" sotto la W per indicare l'arrivo a fine corsa
DSC03268.jpg


Quindi attiva il contaimpulsi, lo azzera e porta il motore all'estremo Est
DSC03272.jpg


Una volta raggiunto (notare la "]" sotto la E) visualizza il numero di impulsi conteggiati e memorizza i dati nella memoria EEPROM interna
DSC03273.jpg


Stessa cosa per il motore EL: prima viene allungato completamente (D)
DSC03275.jpg


Quindi fatto rientrare completamente (alza parabola)
DSC03276.jpg


Mostra il numero contato e memorizza
DSC03277.jpg


Ora la scritta "No Cal!" scompare dal display e il sistema è pronto per fare i fuochi :lol:. Per il momento ogni volta che muovo un motore visualizzo sul display il valore di entrambi i contaimpulsi interni. A motori fermi i dati sono sempre salvati al sicuro nella EEPROM (prima di uscire dalla routine di comando salvo sempre)
DSC03280.jpg


Per verificare la ritenuta dei dati, basta spegnere tutto, togliere il microprocessore dallo zoccolo, inserirlo nel programmatore e leggerne il contenuto
PPRG800.jpg

Spulciando nella memoria EEPROM, possiamo vedere come nelle ultime 2 righe siano effettivamente stati scritti dei numeri (le celle vuote contengono sempre 255 o FFh). Partendo dall'ultima cella della penultima riga, troviamo il conteggio massimo del pistone (01A6h=422), seguito dal conteggio massimo del motore H-H (03FCh=1020); a seguire, troviamo il valore che aveva il contaimpulsi del pistone dopo l'ultimo movimento (118h=280) e l'ultimo valore del motore H-H (0330h=816). L'ultimo byte (indirizzo FFh) contiene l'ultimo stato del sistema, al momento utilizzato solo nella metà inferiore (la prima lettera sarà sempre F): partendo dal bit più alto, memorizzo se la calibrazione del pistone è stata eseguita con successo (ELCALSTA, 1=no 0=sì), quindi se ho fatto e finito la calibrazione del motore H-H (AZCALSTA, 1=no 0=sì), a seguire il bit globale di stato delle calibrazioni (CALSTA, 1=no 0=sì) e infine lo stato di accensione del sistema (POWER, 0=spento 1=acceso) :D. Togliendo il micro dal programmatore e reinserendolo nel circuito e riaccendendolo ho tutto esattamente come prima con i contatori caricati con il numero giusto :D.
Devo ancora provare a fondo, ma dovrei anche essere riuscito a correggere quel problemino per cui il motore H-H ogni volta che arrivava a un fine corsa si mangiava un conteggio sballando tutto dopo qualche corsetta. Certo, ho utilizzato un "trick" che è un compromesso abbastanza brutale, ma se funziona agirebbe come una correzione automatica del conteggio, che unita all'arresto istantaneo anche ai fine corsa dovrebbe quasi eliminare la necessità di ri-eseguire la calibrazione.

Per finire, la scheda sperimentale che per il momento fa da telecomando :lol:. Notare che il diodo trasmittente all'infrarosso (in alto a destra) non è rivolto verso il ricevitore (ospitato nel foro grande nel frontale) eppure la ricezione è ottimale e non ha mai perso un dato :D
DSC03281.jpg


Il telecomando definitivo avrà ovviamente più tasti (20) e sarà ospitato nel mobile del kit LX1570 di n.E., per il quale ho già progettato la scheda :D. Siccome io non voglio rimanere a piedi se mi si rompe il telecomando, gli stessi tasti saranno replicati sul tastierino alloggiato al posto della fessura per la smartcard, dietro allo sportello :lol:.

Occupazione memoria: 3.150 linee di programma, 37%. Al momento non ho altri dati di servizio da salvare in EEPROM quindi il resto della memoria può essere utilizzato per memorizzare un massimo di 61 satelliti :D. Sempre che non voglia memorizzarli nella Flash programma allora il numero sale a 1020 come già detto :lol:
 
Ultima modifica:
Ti sei inventato un posizionatore, che gestisce il Jaeger SMR1224-EL con il GOTO-X? Ho capito male? :eusa_think:
Se è cosi', brevetta subito quel coso, :D chiama la Jaeger, e diventerai Milionario. :lol:
 
:p

No non ho implementato il GOTOX nell'accezione dell'USALS, cioè metti le coordinate e lui calcola dove si trovano i satelliti avendo la parabola verso sud. Una volta memorizzato l'arco del motore (0-1020 ma ovviamente se allungo i limiti mi arrivano più impulsi ;)), il micro sa sempre dove si trova perchè quando viene abilitato il movimento allo stadio finale viene sempre conteggiato e memorizzato tutto. Devo ancora implementare la gestione delle memorie, comunque utilizzeranno sempre la stessa procedura (muovi N impulsi): in base al conteggio corrente, verifico se devo andare avanti o indietro (semplice sottrazione) e calcolo il nuovo conteggio da raggiungere (somma se in avanti, sottrazione se indietro). La procedura richiede di fornire 2 parametri prima di essere chiamata: la direzione (W,E,U,D) e il numero di conteggi da effettuare prima di arrestare il motore e uscire automaticamente. Avendola divisa in 4 blocchi (uno per direzione), una volta entrato in un blocco so per certo verso dove mi sto muovendo, quindi ho implementato l'incremento o decremento del registro di posizione a ogni impulso. Però ho un secondo contatore: utilizzo il timer1 hardware, indipendente dal programma, per sapere quando ho contato tutti gli impulsi (arriva un interrupt), così mi sono risparmiato di controllare ogni volta a mano se il registro ha raggiunto il valore (XOR). L'altra procedura (muovi finchè tengo premuto) per motivi di complessità (devo leggere molteplici I/O) non può incrementare o decrementare a ogni impulso. Quindi uso il timer1 come contatore di offset: lo azzero a ogni partenza e gli faccio contare quanti impulsi sono arrivati nel tempo in cui ho tenuto premuto il tasto. Alla fine basta sommare o sottrarre l'offset dal valore presente in memoria ;).
 
:p

Martedì 19 agosto 2008, ore 5:30 AM

In questo momento, annuncio ufficialmente che è nata la versione 1.0 del software di controllo principale :D:D:D:D a quando i festeggiamenti? :lol:.

V1.0 vuol dire che tutti i blocchi operativi principali sono stati sviluppati, compilati e collaudati :happy3:.

Standby accensione/spegnimento
Gestione della memoria non volatile
Gestione I/O utente (display, tastiera, telecomando)
Gestione movimento a step o continuo
Rilevamento malfunzionamento motore (non gira)
Rilevamento malfunzionamento contaimpulsi
Rilevamento di tutti i limit switch
Memorizzazione di una posizione (che comprende entrambi i motori)
Puntamento (richiamo di una posizione, la mia versione del GOTO X)

Figo il puntamento perchè è completamente automatizzato, basta solo specificare la memoria da richiamare e premere RCL :happy3:.

Le prossime revisioni del programma (1.1 eccetera) saranno orientate all'affinamento della rudimentale interfaccia grafica e all'aggiunta di piccole funzionalità accessorie che migliorano nell'insieme il software :D. Ad esempio la prima sarà il puntamento automatico all'ultima posizione richiamata all'accensione del posizionatore :D.

Sto anche sperimentando la precisione di movimento del tutto, tranne quel problemino ai limiti, grazie a una scelta accurata dei (tanti) timeout di scansione, il conteggio via software (istruzioni di programma) o via hardware (timer1) non ha ancora perso un impulso :D. Rimane l'errore "fisiologico" di mezzo step in base alla direzione da cui mi avvicino alla posizione bersaglio :happy3:.

Con questa V1.0 posso memorizzare 60 satelliti più la posizione "00" (che adibirò a posizione di sicurezza meccanica :D), un valore tutto sommato rispettabile, una volta messo il tutto in servizio in terrazza, se 60 memorie non dovessero bastare ho ancora mezza memoria programma libera per memorizzare quanti satelliti voglio. Un interessante upgrade potrebbe essere quello di memorizzare in pagina 3 (max 4096 caratteri) una tabellona con le stringhe dei nomi di tutti i satelliti, solo che sarebbe un'impresa poi gestire l'associazione del nome X con la memoria Y ;).
 
:p

Ora lo sviluppo coinvolge aggiunte marginali o correzioni di bug che ancora non si erano manifestati, ad esempio il bug colossale dell'incremento di 1 di un valore a 16 bit in cui non tenevo conto del riporto :5eek: :lol: :happy3: che mi mandava in palla mezzo programma :lol:.

Intanto però proseguono le prove di precisione :D. Dopo varie tornate di modifiche e perfezionamenti ho raggiunto una precisione inferiore a 1/2 step nell'intervallo entro i fine corsa. Al raggiungimento di questa precisione concorre anche il sistema di avvicinamento "per gradi" alla posizione richiamata, in grado di neutralizzare (entro un certo limite :D) eventuali inerzie che fanno "scappare" il motore qualche step oltre o fermare qualche step prima. Possiamo paragonarlo a un sistema ad amplificazione d'errore, l'eventuale errore nel posizionamento viene automaticamente calcolato per raggiungere nuovamente la posizione entro un massimo di 4 tentativi (ci sarebbe un modo per correggere finchè l'errore non è 0 ma è complicato, mi accontento di questo ;))

Purtroppo arrivando al fine corsa Est (o Up), massimo conteggio, può introdurre un errore anche di qualche step perchè il fine corsa ovviamente interviene "quando vuole" e mai uguale :icon_rolleyes:. Per il momento con un minimo d'accortezza nel comando si può minimizzare anche questo ;).

V1.2, 4.000 linee di programma, per il momento mantengo la visualizzazione continua dei contatori per vedere che tutto vada liscio ;).

Ora il grosso del programma è finito, rimane solo da costruire il telecomando quando mi arriveranno scatolina e pulsanti (il software è già pronto). Già così utilizzando il tastierino a scomparsa tutte le funzioni sono sfruttabili, quindi ora potrei anche passare all'implementazione meccanica del motore :D, compresa l'installazione (finalmente da febbraio :lol:) dei 2 barattoli C :D.
 
:p

Eseguito un piccolo intervento di "restyling" dei cablaggi interni ai motori, sostituite un paio di morsettiere e aggiunta qualche serigrafia anti-imbranato :D:lol:.
Ora dopo 2 giorni di prove con la prima installazione 2 settimane fa (ora fissa, in attesa del palo 60x3+tiranti) ci sono 2 cosette da correggere nel software. Veramente solo una è da correggere, sarebbe il blocco del programma che si verifica se riceve un codice da un telecomando "estraneo" con codifica completamente differente dal suo :eusa_think:. L'altra cosetta è soltanto scambiare l'ordine di posizionamento quando richiamo una memoria: prima EL poi AZ ;), onde evitare di piegare qualcosa contro il cornicione :lol::evil5:. Una volta risolto questo bug del ricevitore finalmente ordinerò scatola e pulsanti e costruirò questo bel telecomando :D...
L'ora X del debutto finale si sta avvicinando... :lol::lol::D
 
:D :D ottimo, ma il telecomando a che serve?non va bene quello del dec? poi voglio essere utile a questa tua impresa:D hehehehe:eusa_whistle: io ti spedisco il mio aston ds 200:eusa_whistle: tu te lo studi:eusa_whistle: eventualmente lo ripari, a un piccolo bug:lol: dovuto a fulmine:lol: e poi me lo rimandi giu da me(io pagando tutte le spese naturalmente);) ciao:icon_bounce:
 
:p

EHilà dopo 2 anni resuscito... :D:D:D:D
PErchè dopo essermi dedicato all'HTPC e alla workstation ora è il momento di un bel restyling di questo coso :p l'hardware principale rimane lo stesso, cambia il display (più grande e retroilluminato in verde), il trasformatore (28V 5A ma senza l'inutile secondario da 14V 4A, al suo posto un più consono 10V 0.5A ;) ), cambia anche il mobile, niente DTT riciclato ma un bel mobiletto in lega nero e argento.
Cambiano leggermente anche i comandi: con una piccola logica combinatoria (un 4001 :D) ora sul davanti abbiamo il "joystick", i 4 tasti direzionali diretti senza 2nd function :)

Sperando che il motore di sopra si muova ancora... :lol:
 
:p

Ho giusto finito di preparare il nuovo mobile... provo a collegare il display e funziona, è già qualcosa... :D. Però provo a premere il tasto rosso di accensione... e non si accende! :crybaby2:. Controllo col tester se tutti i fili sono a posto, e al micro arrivano tutti i segnali... :crybaby2: che mi si sia bruciato il PIC? :-(
 
:p

Non era il PIC comunque ne ho ordinati un paio di scorta non si sa mai ;)
Vedi cosa succede a lasciar fermo un progetto a metà per un anno? :D
Nel progetto della nuova scheda frontale, per comodità, avevo invertito 2 linee dei pulsanti di comando diretti, quindi continuavo a premere il tasto sbagliato :D :D :D :D adesso l'ho risolto cambiando 2 costanti nel programma, comunque una bella passata di debug al software non guasta ;)
 
:p

Ecco ci siamo :D



Nuovo mobile, più spazioso in altezza, nuovo trasformatore, più piccolo (da 230 a 150W) ma che non ronza e comunque ha sempre i suoi 4A a 28V ;).
Ovviamente nuovo frontale con nuovo display a caratteri grandi, peccato che i pulsanti li ho trovati solo rossi verdi e neri :eusa_wall:


Mettiamo il coperchio...


Sul retro, presa IEC di alimentazione con fusibile, interruttore di accensione (un po' grande... ma avevo solo quelli da riciclare ;) ), presa DB9 per segnali e i soliti morsetti per la potenza. I portafusibili non sono più quelli 6.3x32 a vite ma a baionetta incassati nel pannello per fusibili 5x20


Attacchiamo il pannello davanti...


E diamo il contatto :D :D :D per ora il motore è scollegato, adesso salgo di sopra a provarlo dal vivo :D
 
Sono finalmente riuscito a risolvere anche il bug per cui ricevendo segnali a infrarossi da altri telecomandi il PIC andava in loop... :D andava in loop l'interrupt: mentre per azzerare i bit overrun e framing error basta resettare la USART, per togliersi di mezzo l'interrupt in ricezione bisogna leggere almeno 3 volte lo shift register, così la logica interna provvede ad azzerare l'interrupt. Se non lo si fa, e il codice ricevuto non corrisponde a nessuno di quelli programmati, all'uscita dalla routine l'interrupt rimane attivo e il PIC ci rientra dentro :lol:

Intanto, parabola scassata ma comunque a caso ho puntato il 9E :D
 
Dopo il piccolo incidente di percorso ho ripreso in mano il software per togliere roba che non serviva, tipo la "calibrazione" per memorizzare il valore massimo dei contaimpulsi. Tanto ogni volta che arrivo al fine corsa W o D li impostavo già a zero, quindi ammesso che perdo impulsi basta andare a 0 e il sistema è ricalibrato :D
Devo anche fare il preamplificatorino analogico, per cercare di scongiurare le lamentele dell'amperometro interno ;)
 
:p

Piccolo appuntino che ho scoperto solo ora dopo aver smontato il motorino dal telaio perchè si era inchiodato...
La trasmissione dell'SMR1224 non è tantissimo demoltiplicata, nonostante la vite senza fine della riduzione finale sul perno parabola. Togliendo il motorino dal suo alloggiamento la parabola si riesce a spostare di pochino e visto che il motorino non è durissimo anche quando è montato e ha i morsetti aperti in presenza di moderate sollecitazioni (vento) potrebbe spostarsi. Questo comporta una necessità per chi costruisce un posizionatore dotato di azionamento a stato solido, con ponte a H transistor o Mosfet, di dotarlo di un sistema di blocco meccanico: quando il ponte a H è alimentato, l'avvolgimento del motorino è in cortocircuito quindi non si muove, però togliendo l'alimentazione allo stadio di potenza (metto il posizionatore in standby o lo spengo del tutto), viene a mancare il cortocircuito sull'avvolgimento, quindi così il motorino è libero di girare e potrebbe portare a un lieve spostamento dell'antenna, spostamento del quale il posizionatore non se ne accorgerebbe essendo spento.
Per ovviare a questo ho pensato a un relè collegato direttamente tra i 2 morsetti di uscita del posizionatore, dopo il fusibile di sicurezza. I morsetti vanno collegati al contatto normalmente chiuso del relè e la bobina, nel caso del mio circuito, va collegata in parallelo al relè che fornisce tensione allo stadio di potenza: quando il posizionatore è in standby o spento (stadio di potenza spento) il relè provvede a tenere in corto l'avvolgimento del motore, accendendo lo stadio di potenza il relè toglie il cortocircuito "meccanico" e il controllo passa allo stadio di potenza con il suo cortocircuito "elettronico". Semplice ma dovrebbe essere efficace :D
 
Indietro
Alto Basso