Vai al contenuto
PLC Forum


Arduino E Stepper Motor


Jago

Messaggi consigliati

Ciao a tutti, avrei bisogno di un vostro consiglio.

Sono un appassionato di macrofotografia e per utilizzare la tecnica del focus stacking, mi sono costruito una interfaccia che regola gli spostamenti di un motore passo passo il quale avvicina e allontana il piano del soggetto secondo un numero di step predefiniti sia in numero che in misura.

http://reallysmall.github.io/Stackduino/

Tutto funziona perfettamente dal punto di vista elettronico, ma non capisco alcune cose:

- Il motore passo passo che utilizzo è un comune 1,8° 200 step. Il firmware caricato sull'Arduino fa selezionare fra tre unità di misura (mn, mm, cm). Facendo un test di rotazione ho verificato che, ad esempio, per fare uno spostamento da 1 mm il motore compie 10 giri precisi oppure 1 giro è composto da 10 passi da 10 mn (tutto torna…).

Ma se volessi mandare una madrevite da M6 che ha un passo da 1 mm giro, tutte le misure sarebbero sballate con una costante x10?!?!

Quindi per evitare di usare motoriduttori 10:1 (nema17 che costano abbastanza…) mi chiedevo se era possibile intervenire sul software per dare agli spostamenti una costante 0,1?

Non essendo abbastanza preparato a riguardo, ogni mia modifica al listato ha portato solo modifiche peggiorative…

Magari sbaglio anche dal punto di vista concettuale… consigli?

Indico il link dello sketch che ho caricato…

Vi ringrazio.

https://drive.google.com/file/d/0BxddEF_i_qGGdDFaejBPSll5ZUk/view?usp=sharing

Link al commento
Condividi su altri siti


Grazie Livio per la risposta, e in effetti è proprio quello che immaginavo… ma non è così semplice (almeno per me). Il problema sta nel fatto che non ho capito in quale parte del listato devo fare questa modifica e soprattutto se si tratta di una modifica che varia solo il dato visualizzato e quindi abbastanza "indolore"…

Il secondo problema è che l'unità di misura "mn" (la cui sigla è inventata come il regno di Mordor) ha una costante =1 e quindi la moltiplicazione per 0,1 genera un numero con la virgola… insomma un casino totale (…per me ovviamente).

Last but not least, di programmazione non ne so molto...

Comunque la cosa non ha veramente senso, e qui non importa saper programmare o no, come si può parlare di "misure" efficaci in un progetto che non contempla una variabile determinata dal meccanismo che viene azionato. Potrebbe essere una puleggia da 97,658 mm o una vite senza fine da 0,75 di passo. Che senso ha tutto ciò?

Ho letto e riletto 1000 volte il testo del sito del progetto e lo sketch di Arduino e non ho trovato alcuna risposta.

Come fa il display a comunicare "mi sposto di 1 mm…" quando potrebbe essere 27 mm, 15 cm o 1 m (se usassi un riduttore!)

Mistero.

Link al commento
Condividi su altri siti

Scusami ma io non il tempo di analizzare li sketch che usi.

Da qualche parte dovrai pure inserire il dato che da la posizione da raggiunere, quindi quel dato che inserisci lo moltiplichi per la cosatante.

Poi il problema è sempre il solito.

Quando si usa un lavoro altrui....capitan di queste cose.

Sfortunatamente a volte si pensa di rispiarmiar tempo ma se non si domina il problema o lo si usa "così come è", o si è in grado di apportare le opportune modifiche per adattarlo all proprie esigenze, oppure ci si fa il lavoro ex novo.

Link al commento
Condividi su altri siti

Ciao Livio, grazie lo stesso...

In effetti, come redarguisci, "usare" il lavoro altrui è deontologicamente discutibile, anche se cerco sempre di mettere del mio e di condividere il nuovo risultato ottenuto. Il fatto che la mia insana curiosità mi porta a entrare in ambiti effettivamente al di là della mia portata a volte mi da soddisfazioni e altre volte mi affligge. E' normale.

Però sono un testone e quindi sotto con le prove….

Buona serata

Link al commento
Condividi su altri siti

e' un bel programmino che merita di essere discusso , con lcd e tutto , direi un controllore assi con visualizzatore

comunque se ho capito bene , questa parte di codice potrebbe interessarti

switch (unit_of_measure){ 

            case 1:

            lcd.print ("Microns (mn)");
            unit_of_measure_multiplier = 1;
            break;

            case 2:

            lcd.print ("Millimetres (mm)");
            unit_of_measure_multiplier = 1000;
            break;

            case 3: 

            lcd.print ("Centimetres (cm)");
            unit_of_measure_multiplier = 10000;
            break;
          }


meriti ascolto e interesse in quanto sei l'unico in tutto il forum che per lo meno si interessa all'elettrornica e ai microcontrollori ;)

Per Livio non ti preoccupare , appena lo becco lo sistemo io :)

Link al commento
Condividi su altri siti

n effetti, come redarguisci, "usare" il lavoro altrui è deontologicamente discutibile,

No. La mia non è una reprimenda e non considero discutibile l'uso di un lavoro pubblico, solo ne sottolineo i problemi connessi.

Link al commento
Condividi su altri siti

Ciao Walterword, ti ringrazio del post e in effetti avevo notato quell'area dello sketch, ma modificandolo i risultati non sortiscono l'effetto desiderato. Credo perché la modifica si limiti alla visualizzazione dell'informazione...
Tra i DEFAULT SETTING c'è questa parte che forse potrebbe essere la responsabile del numero step > unità di misura….
int unit_of_measure = 1; //whether to use microns, mm or cm when making steps
int unit_of_measure_multiplier = 1; //multiplier to factor into step signals (1, 1000 or 10,000) depending on unit of measure used
Il problema è che l'unità minima, il micron, è uguale a 1… ma se modificassi solo "int unit_of_measure_multiplier = 0.1…….. boh! Oggi all'intervallo provo a casa questa modifica poi vi aggiorno sul risultato….
Dovrei mettere "float unit_of_measure_multiplier = 0.1" perchè si tratta di un numero con la virgola?
Lo so che per voi è l'ABC ma per me è un prezioso insegnamento.
Grazie
Link al commento
Condividi su altri siti

Aggiornamento….

Ho trovato questa porzione di programma che lascia ad intendere uno spazio di intervento… però non capisco cosa intende il commento ….

int i = 0; //counter for motor steps
while (i < slice_depth * 16 * unit_of_measure_multiplier && digitalRead(limit_switches) == HIGH){ //adjust the number in this statement to tune distance travelled on your setup. In this case 16 is a product of 8x microstepping and a 2:1 gearing ratio
stepper_step();
i++;
Mi sembra di aver letto che la scheda driver del motore (Easydriver 4.4 http://www.schmalzhaus.com/EasyDriver/ ) di default usa unità di spostamento di 8 microstepping… può centrare qualcosa? A questo punto dovrei trasformare quel "16" in un numero che mi consenta di fare un giro completo per uno spostamento di 1 millimetro, dato che vorrei usare in diretta il moto su una barra filettata M6 che ha come passo 1 mm appunto. Sragiono?
Sento che ci stiamo avvicinando alla soluzione...
Bye
Link al commento
Condividi su altri siti

Livio , lavori gia "fatti" se ne trovano ovunque , sui libri , sul web ect se poi sono di pubblico dominio non c'e' alcun problema riguardo la morale o altre puttanate.

E' chiaro che il ragazzo vuole realizzare qualcosa che a primo impatto non è in grado di fare e allora ha fatto ricerca e sviluppo postando qualcosa di gia fatto , sempre di pubblico dominio e arbitrio .

Non credo sia qua a chiedere cose senza sapere di cosa si tratti e per vendere prodotti contraffatti .

Jago ha già dimostrato grande interesse e disponibilità nell'altro progetto postando quello che aveva trovato e quello che aveva aggiunto , se ti ricordi bene

Ma purtroppo noi italiani preferiamo spendere tempo e parole per censurare e giudicare piuttosto che buttare un occhio e vedere o cercare di capire qualcosa.La cosa piu triste è che persone di alto livello come , con tanta esperienza e tanto sapere , non fanno proprio nulla o ben poco per lasciare ai posteri quanto hanno imparato e sviluppato vita natural durante.

Nessuno si ricorderà di te Livio se non incominci a pensare con un ottica più propensa epiù generosa all'open source e alla divulgazione di tecnologia.Tu che ti ostini a sopravvalutare gli americani e gli stranieri ....ti ricordo che quelli rendono noti codice , sistemi operativi , libri e quanto non si possa immaginare.Tu invece pensi sempre che la tua esperienza possa danneggiarti professionalmente gli incassi se qualcuno sa qualcosa , sei geloso del tuo sapere , secondo me e' sbagliato , e questo te lo dico da amico in totale trasparenza e serenità

Sono un po di post che ti seguo e non fai altro che censurare ;)

Condividi il tuo sapere , vivi e lascia vivere , posta codici , posta progetti , renditi utile al prossimo ;)

:D

ciao

Walter

Modificato: da walterword
Link al commento
Condividi su altri siti

il sig tanembaum ha scritto libri , articoli , minix , blogs gratuiti ed è tuttora attivo nello sviluppo e nella ricerca

Uno come lui e' superiore a qualsiasi altra forma umana presente qua nel forum e non solo .

Potrebbe tirarsela come fanno certi di qua ma non lo fa , ha uno spirito diverso .Io politicamente non condivido gli americani ma da un punto di vista tecnologico non sono avanti solo perche hanno 4 dollari marci in più di noi , ma perche lavorano e fanno lavorare , sviluppano , e rendono noto quasi tutto e danno modo a chiunque nel mondo di smanettare ed estendere con documentazioni ect

Ti ricordo solo linux che oramai e' diventato meglio di windows e compagnia bella .Nessunod ice che bisogna lavorare gratis in quanto i presupposti per lavorare e guadagnare , visto che in questi mondo ci vogliono i soldi per sopravvivere , ci sono e si trovano

Non fanno chiacchere come noi e onn censurano come noi , noi siamo rimasti ai tempi della sacra inquisizione e siamo rimasti e saremo sempre un paese di poveri bigotti falliti , dove i soliti 3 o 4 che sanno qualcosa fanno da padrone e la voce grossa su chiunque ed in qualsiasi momento , ma in confronto a chi veramente ha le palle in campo , siamo sempre dei poveri straccioni , mentalmente soprattutto

Cerchiamo di meditare e di fare qualcosa di utile

Modificato: da walterword
Link al commento
Condividi su altri siti

Ciao ragazzi, non volevo alzare un polverone simile e soprattutto non mi offendo se nessuno ha tempo e voglia di rispondermi… comunque resto grato a tutti per la possibilità di imparare che questo forum mi da e anche quello di condividere sia quello che ho imparato sia quello che è in effetti un lavoro di "equipe" se per "equipe" consideriamo l'intero WEB sempre prodigo di notizie e consigli.

Comunque. EUREKA!!!!!

Il premio dei testoni!!!!!

L'accrocchio ora fa 1 giro a millimetro come desideravo… è proprio il caso di dire: "Per un punto Martin perse la cappa!", me lo ripeteva sempre mia mamma maestra quando mi insegnava a usare la punteggiatura!

Cosa c'entra?

Semplice, ho lasciato tutto il listato così com'è e ho solo messo un punto fra l'uno e il sei del numero 16 nella formula (evidenziata nell'ultimo mio post) e voilà tutto fatto. Ora posso usare un M6 come madrevite.

Ora che ho adattato il progetto al mio uso, si parte con le migliorie, alcune credo fattibili, altre troppo radicali che comporterebbero anche modifiche hardware.

Il primo grande difetto, e mi stupisce… è che, una volta portato l'apparecchio coi tasti AVANTI / INDIETRO sul punto di partenza con il soggetto a fuoco, una volta dato il via, il motore gira e si porta su quello che lui chiama 1 stacking! In realtà il primo ce lo siamo perso perché la fotocamera non scatta al via!. Assurdo.

Teoricamente bisognerebbe scattare la prima foto manualmente, peccato che non si può scattare con il comando remoto (perché impegnato dal circuito stesso). Si può scattare col puntante sulla fotocamera il rischio di muovere tutto e altissimo.

L'altro difetto è che bisognerebbe introdurre un delay tra il termine del movimento della madre vite e lo scatto perché è in pratica istantaneo e non si da modo al soggetto di stabilizzarsi dopo lo spostamento. Altrimenti è d'obbligo utilizzare la funzione MIRROR UP che invia due segnali di scatto con 2 secondi di intervallo. Non essendo neppure nei setup di default è seccante doversene ricordare.

Introdurrei anche un breve delay tra il segnale di messa a fuoco (pulsante a mezza corsa nella fotocamera) e il segnale di scatto (fondo corsa pulsante) perché è più naturale e la fotocamera interpreterà sempre correttamente quello che deve fare.

Per il resto il software non può fare di più, ma non è così che dovrete funzionare una vera scheda FocusStacking "intelligente". In realtà secondo me dovrebbe ragionare così:

1) Mi porto sul punto di partenza della sequenza di scatti più vicino alla fotocamera (che chiamerei A), premo in tasto e azzero un contatore.

2) Mi sposto sul punto più distante dove terminerà la sequenza (che chiamerei B ), premo un tasto e ottengo un numero X di Step del motore effettuati.

3) Premo nuovamente il tasto A e mi riporto sul punto di partenza. Lo zero del contatore.

4) Setto con un encoder il numero di scatti che intendo realizzare e il microcontrollore divide il numero di step totali per il numero di step.

5) A questo punto la macchina scatta e si sposta ripetutamente nella misura ricavata. Fino alla fine.

Però è solo un desiderio...

Bye a tutti

Modificato: da Jago
Link al commento
Condividi su altri siti

se poi sono di pubblico dominio non c'e' alcun problema riguardo la morale o altre puttanate.

Walter ma tu leggi quello che scrivo?

A me sembra che, se non hai esagerato con gli alcolici, tu ti stia riferendo a qualcun altro. ;)

Poi se nesuuno si ricorderà di me, ma chissenefrega; quando son defunto son defunto sia che sia ricordato da un milione di persone o da nessuno.

Cerchiamo di meditare e di fare qualcosa di utile

Walter sarebbe meglio collegare anche il cervello prima di premere sui tasti. Scusami ma questa volta hai superato il limite. Prima di scrivere a ruota libera leggi, cerca di comprendere quello che hanno scritto gli altri e poi scrivi a tua volta, magari rileggendo quello che hai scritto. :angry:

Semplice, ho lasciato tutto il listato così com'è e ho solo messo un punto fra l'uno e il sei del numero 16 nella formula (evidenziata nell'ultimo mio post) e voilà tutto fatto. Ora posso usare un M6 come madrevite.

Bravo hai trovato il coefficiente diviso per 10 o moltiplicato per 0.1 ;)

Ci doveva essere per forza il punto in cui si scala la quota.

Link al commento
Condividi su altri siti

Ciao a tutti, eccomi coi risultati. Software modificato e migliorato, ora il primo scatto lo fa all'avvio dello stacking senza spostare il motore. Ho introdotto le brevi pause fra la messa a fuoco e lo scatto e fra lo stop del motore e lo scatto stesso. Ho consentito di scegliere un numero preciso degli scatti senza andare di dieci in dieci come nel software originale. Tutto funziona egregiamente, ora non resta che costruire il binario con la madrevite.

Vi allego i link delle immagini dell'accrocchio, la PCB che ho realizzato con Eagle e il software... se mai a qualcuno dovesse servire...

Chiedo scusa alla comunità di elettronici per il cavallotto a X che si vede a sinistra dell'Encoder, ma non sopportavo che i valori diminuissero in senso orario e aumentassero in senso anti orario… (è una fobia mia), non è elegante ma funziona senza toccare il SW. Nella foto si vede anche l'Arduino UNO "Handmade minimal" che ho costruito con un ATmega a cui ho caricato il suo bootloader. Gli sketch li carico direttamente con un cavetto USB>Seriale in FTDI.

Grazie a tutti e buona giornata

https://drive.google.com/file/d/0BxddEF_i_qGGRkJxZ1FVMExzS2s/view?usp=sharing

https://drive.google.com/file/d/0BxddEF_i_qGGdFlSNTJtSnc2UTA/view?usp=sharing

https://drive.google.com/file/d/0BxddEF_i_qGGMW54dmRkdGZUbEU/view?usp=sharing

https://drive.google.com/file/d/0BxddEF_i_qGGXzBBSkhNendCN00/view?usp=sharing

Link al commento
Condividi su altri siti

Grazie per l'apprezzamento, il driver è un Easydriver 4.4 http://www.schmalzhaus.com/EasyDriver/ da pochi euro. Comunica col Arduino, messo sotto, tramite i soli segnali DIR / STEP / GND. Si alimenta con la tensione che va al motore (in questo caso 12 v) perché ha un regolatore integrato, dal quale è possibile prelevare anche i 5v (e i 3,3) se si vuole alimentare anche un processore. Il cs l'ho "stirato" come faccio solitamente...

https://drive.google.com/file/d/0BxddEF_i_qGGeUVZd1hEZ29rbUk/view?usp=sharing

Ora vorrei provare anche a collegare il tutto a un blocco motore/madrevite di un lettore CDROM smontato e usare il blocco testa/lente come piano per appoggiare il soggetto. Binari e supporto belli e pronti. Spostamenti di micron dovrebbero essere collaudati...

Bye

Link al commento
Condividi su altri siti

  • 4 weeks later...

Gentile Jago buona sera,

condivido appieno le modifiche da te effettuate al listato originale,

ho preso la tua versione 1.1 e l'ho caricata sul mio sistema ma non vuole funzionare. Con la v.1 non ci sono problemi ( a parte quelli gia' menzionati), se carico la tua (V1.1) l'LCD mi da' strani segni e niente funziona. Ovviamente nulla e' cambiato nella parte hardware. Hai qualche idea per risolvere il problema?

Ti ringrazio in anticipo

Link al commento
Condividi su altri siti

Jago scusa ma l'ora tarda mi ha fatto prendere un abbaglio. Mi riferisco al messaggio precedente.

La piedinatura dell'LCD era invertita rispetto alla mia.

Sarebbe possibile, comunicare con te in privato? La mia mail e' *******

Ti ringrazio comunque per la disponibilita'.

Walter

****** N.d.M. *****

Per ragioni di riservatezza non è consentito pubblicare indirizzi email se non nella forma xy@plcforum.it.

Se necesario è possibile inviare MP ad un utente, tenendo rpesente che sono regolamentati (leggere bene il regolamento del forum).

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

Ciao ho letto ora del tuo problema...

Credo sia semplice. Dato che la PCB dell'oggetto l'ho rifatto secondo le mie esigenze, l'LCD è connesso all'arduino con i pin in un altro ordine.

Ho visto che l'inizializzazione dell'LCD originale Stackduino era:

#include <LiquidCrystal.h> //LCD library
LiquidCrystal lcd(8, 9, 10, 11, 12, 13); //lcd pins
mentre nel mio caso è:
#include <LiquidCrystal.h> //LCD library
LiquidCrystal lcd(13, 12, 11, 10, 9, 8); //lcd pins

Quindi se vuoi che tutto funzioni, ripristina la sequenza dei PIN come l'originale (che ti funzionava…) con quell'ordine. 8, 9, 10, 11, 12, 13

Prova e fammi sapere….

Link al commento
Condividi su altri siti

Scusa Jago,

ho problemi con il 4n35, collegato in maniera corretta peidino 1 riceve segnale da Arduino passando per una resist. da 220 K piedino due a massa. Piedino 4 e 5 chiudono il circuito per lo scatto.

Se collego un led sui piedini 1 e 2 quando Arduino da' l'inpulso si accende il led.

Sui piedini 4 e 5 non succede nulla. Ho provato a collegare un led su 4 e 5 ma neanche con quello si ha nulla.

Suggerimenti?

Per l'LCD tutto risolto. Una buona letta al listato e tutto risolto, ma data l'ora tarda.....

Grazie comunque.

Se sei di Roma birra pagata......

Grazie comunque.

Walter


Aggiungo,

inutile dire che ho provato a cambiare il 4n35 almeno 3 volte ma il risultato e' lo stesso.

Water

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...