Vai al contenuto
PLC Forum


Posizionatore Con Arduino


roberto8303

Messaggi consigliati

Da come ho anticipato nel titolo della discussione sto sperimentando un sistema di posizionamento con arduino uno, una scheda di controllo motore

http://www.vellemanusa.com/downloads/0/modules/usermanual_vma03.pdf

il tutto è composto da un motoriduttore dc 4,5vdc 15vdc ridotto 5:1,una catena di 30cm e all estremita un potenziomentro multigiro 10giri, che mi da la posizione della catena agganciata tra i l motore e il potenziometro. la catena effettua uno spostamento di 30cm e il potenziometro in ingresso all arduino sul canale A0 da il segnale minimo 50 max 840 punti su 1024(5volt).

All accensione comando la direzione e la velocita al motore in senso negativo per portare il valore del potenziometro a 50 punti quindi alla condizione di partenza.

Esco dal void iniziale e ora dovrei procedere con il funzionamento di posizionamento. Con due pulsanti incremento e decremento la quota set point.

Mettiamo che memorizzo la quota a 500 punti, come posso gestire il funzionamento del motore? ovviamente do' il senso per ruotare in avanti ma la velocita vorrei che fosse in rampa e non fissa per raggiungere la quota.

Il motore si sposta con un segnale di uscita almeno 60 il massimo è 255 (5volt).Vorrei realizzare un profilo di velocita...come fare?

Link al commento
Condividi su altri siti


  • Risposte 142
  • Created
  • Ultima risposta

Top Posters In This Topic

  • walterword

    59

  • Livio Orsini

    42

  • roberto8303

    39

  • gabri-z

    2

Non ho capito come fai a dare la quota.

Immaginiamo che tu visulazzi la posizione su display e la imposti con i pulsanti aumenta/diminuisci, poi dai il comando di marcia.

Il tou riferimento sarà pari a zero. Fai un timer che corrisponda a circa 1/255 del tempo di accelearazione che vuoi ottenere. Ad ogni scadenza del timer incremeti il valore di riferimento sino a che sei arrivato o a 255 o a metà della strada. se sei giunto a metà strada incominci a decrementare, se invece hai raggiunto il massimo tieni conto dello spazio eprcorso, sottrai questo valore alla quota di arrivo ed avrai la quota di inizio decelerazione.

Ovviamnte con il presupposto che accelerazione e decelerazione siano eguali.

Link al commento
Condividi su altri siti

Farò o anche un video per capire meglio come funziona anche se è solo una prova, comunque la quota viene memorizzata in una variabile. La imposto con un due pulsanti.Tenendo premuto il pulsante incrementa esso cambia la variabile incrementa con incrementa++ dopo che millis conta 100ms. E quindi mi fermo con il pulsante quando nella variabile Set point leggo esempio 500. La quota reale cioe la posizione del potenziometro all inizio è 50. Quindi quando do start il motore deve partire verso destra per portarsi da 50 a 500 quota memorizzata nel set point. Ovviamente questo è uguale per l avanzamento all indietro.

Io avevo pensato di sottrarre la quota 500 del set point con la quota potenziometro 50. quindi 450 è il riferimento di velocita, man mano che il motore si avvicina alla quota essa diminuisce facendo rallentare il motore. Ovviamente dovrei sommare questa differenza (set point-quota reale) + riferimento base velocita motore esempio 50 pwm il massimo è sempre 255.

Fai un timer che corrisponda a circa 1/255 del tempo di accelearazione che vuoi ottenere. Ad ogni scadenza del timer incremeti il valore di riferimento sino a che sei arrivato o a 255 o a metà della strada. se sei giunto a metà strada incominci a decrementare, se invece hai raggiunto il massimo tieni conto dello spazio eprcorso, sottrai questo valore alla quota di arrivo ed avrai la quota di inizio decelerazione.

Ovviamnte con il presupposto che accelerazione e decelerazione siano eguali.

invece cosi non ho capito bene puoi farmi un esempio con le variabili da considerare per capire meglio...grazie Livio

Link al commento
Condividi su altri siti

Questo è un esempio di come ottenere 2 rampe, una in accelerazione e l'altra in decelerazione.
Link al commento
Condividi su altri siti

grazie Livio, una domanda perche ci sono due motori? comunque devo modificarlo perche non ho la libreria del display... ma se cancello i comandi per il display posso comunque provarlo?

Link al commento
Condividi su altri siti

Ogni timer fa una coppia di PWM, io ho usato quel programma per provare una scheda con LM298 che pilota2 motori.

Il display che ho impiegato ha una interfaccia I2C, quindi lo piloti con 2 fili soli. Ticonsiglio di usare eventualmente la libreria "Testato", la reperisci nel forum-sito ufficiale di arduino.

Se noti è stato cambiato il prescalere del timer per portare la fequenza di PWM vicino a 4 kHz, in modo da avere una miglior regolazione ed un miglior pilotaggio dei motori.

Le 2 rampe vanno avanti ed indietro solo. per realizzare il roofilo di velocità che ti ho descritto devi mettere le comparazioni con le quote.

Link al commento
Condividi su altri siti

Allora adesso ho capito, pero ci sono dei punti che voglio chiarire meglio.

Per quanto riguarda il display devo procurarlo per farlo funzionare con solo due fili. Ho gia scaricato la libreria.

Per quanto riguarda l esempio: Generare una rampa che va da 0 a 255 non è difficile nell esempio è usato l interrupt ma per questa applicazione penso posso farla anche un un temporizzatore millis.

Il dubbio che ho è sulla gestione della posizione che deve seguire la rampa.

Esempio:

Allo start faccio partire la rampa che s incrementa di 1 ogni 10ms nello stesso istante parte il motore che da quota 0 deve arrivare a quota 500 (quota che va da 0 a 1024 la stessa misurata dal potenziometro) Quindi, penso di procedere cosi, set point =500, quota reale 0 ; errore di posizione = set point-quota reale=500-0=500 e questo risultato come posso modificarlo per mandarlo all uscita del pwm riferimento velocita motore che va da 1-255 punti 5volt.??

poi all arrivo fermo il motore con il confronto del set point e la quota reale se è tra un valore minimo massimo fermo il motore.

é simile all antenna motorizzata che mi hai spiegato tempo fa, ma voglio capire anche se posso fare una rampa senza interrput cioe con un semplice contatore millis...

Link al commento
Condividi su altri siti

per questa applicazione penso posso farla anche un un temporizzatore milli

E' meglio evitare di usare questi temporizzatori, perchè sono bloccanti.

L'uso di interrupt non blocca il processore e i permette di lavarare tranquillamente interrompendo il programma solo per pochi µs.

Per prima cosa l'uscita PWM va filtrata. ti avevo messo anche lo schema quando abbiamo discusso il sommatore. Il filtro ci vuole sempre e comunque, quindi realizza il sommatore senza la parte relativa la verniero.

Io faccio prima perchè piloto direttamente in PWM il motore.

Comunque vediamo come fare per generare il rpofilo di velocità. Qui le cose son differenti da quello con encoder che avevamo visto con il 200.

ogni 10 ms, p.e., entri nella rampa leggi la posizione; se è <della metà della posizione da raggiungere e la rampa è <254, incrementi il valore di duty cycle. Se la posizione è >= a metà della quota da raggiungere decrementi il valore di duty Cycle. Se sei arrivato a termine rampa, memorizzi la quota raggiunta, la sottrai alla quota da raggiungere ed ottieni la quota da cui iniziare il rallentamento.

Esempio. Se hai impostato 550 partendo da 50, il punto di mezzo si trova a 300. Tutte le voklte che entri in rampa controlli se la posizione del momento è <300; se à così incrementi la rampa sino a raggiungere 254 (perchè a 255 hai uscita sempre alta). Se invece sei arrivato a 300, inizi a decrementare il valore di PWM. Se raggiungi 254 con quota, ad esempio, pari a 250 devi fre 550 -250 - 50 (che è l'offset di zero); quindi quando raggiungi 350 inizierai a diminuire il PWM.

Link al commento
Condividi su altri siti

vabbene ora non mi resta che iniziare a provare la sera dp il lavoro :smile:

però se utilizzo questa scheda http://www.vellemanusa.com/downloads/0/modules/usermanual_vma03.pdf

perche devo filtrare l uscita pwm da arduino? questo controller vuole il segnale di direzione Alto dx Basso sx e poi il riferimento di velocita da 0 a 255pwm in analoWrite.

Link al commento
Condividi su altri siti

Se usi quella scheda non devi far altro che connettere arduino e scaricare lo sketch che ti ho passato. L'ho usato per provare una scheda simile,

Link al commento
Condividi su altri siti


#include <Wire.h>
int setpoint=1000;
int posizione=100;
int rampa;
void setup()
{
pinMode(4, INPUT_PULLUP);
pinMode(8, INPUT_PULLUP);
noInterrupts(); // disable all interrupts
TCCR2B = (TCCR2B & 0b11111000 | 0x2); // 2 prescaler
TCCR1A = 0;
TCCR1B = 0;
//timer1_counter = 34286;
TCNT1 = 6491; // preload timer
TCCR1B |= (1 << CS12); // 256 prescaler
TIMSK1 |= (1 << TOIE1); // enable timer overflow interrupt
interrupts(); // enable all interrupts
Serial.begin(9600);
}
ISR(TIMER1_OVF_vect) // interrupt service routine
{
TCNT1 = 64911; // preload timer per interrupts ogni 10 ms
//prova con setpoint 1000 ed incremnto posizione partendo da 100 chiudendo il pin 8.
if
((posizione<= setpoint/2)&&(rampa<254)){ // ogni 10 ms, p.e., entri nella rampa leggi la posizione;
// se è <della metà della posizione da raggiungere e la rampa è <254, incrementi il valore di duty cycle. //
rampa++;}
else{
if((posizione >= setpoint/2)){ //Se la posizione è >= a metà della quota da raggiungere decrementi il valore di duty Cycle.//
rampa--;}}
//Se sei arrivato a termine rampa, memorizzi la quota raggiunta,
//???? // la sottrai alla quota da raggiungere ed ottieni la quota da cui iniziare il rallentamento.
if(digitalRead(8)){ //prova per simulazione potenziometro incremento //
posizione++;}
else{
posizione=posizione;}
}
void loop(){
Serial.print(rampa);
Serial.print(" ");
Serial.println(posizione);
}
Sono arrivato qui...ho commentato nel programma quello che mi hai indicato puoi spiegarmi la parte con i punti interrogativi come farla? :P
Link al commento
Condividi su altri siti

devi fare un posizionamento tenendo in considerazione un errore che e' dato dalla sottrazione del punto che vuoi raggiungere dal punto dove ti trovi nell'istante attuale , nell'interrupt .

Quando l'errore e' minore di un certo valore oppure di una certa % , se hai normalizzato , allora inizi a rallentare .Quando guidi la macchina cosa fai ? Un po prima del semaforo o di un ostacolo inizi a rallentare no ?

Se la posizione attuale la dividi per la posizione da raggiungere e la moltiplichi per 100 vuol dire che hai normalizzato la variabile posizione attuale in % .Per cui se raggiungi per esempio il 80 % inizi a rallentare

Rallentare cosa significa nel tuo sistema ? Cambiare direzione ? Cambiare set point di velocità ? Decrementare ? O cosa altro ?

Ecco in base a quello che hai stabilito farai in modo che il tuo oggetto inizi a rallentare per cui cambierai il tuo set point di velocità .

Fallo bene che poi lo posti e lo trasformiamo in libreria arduino

Modificato: da walterword
Link al commento
Condividi su altri siti

GRazie Walteword la teoria è molto chiara ora cerco di scrivere il codice perfetto e poi lo posto ovviamente metterò anche il video se tutto funziona bene :smile:

Link al commento
Condividi su altri siti

Ecco in base a quello che hai stabilito farai in modo che il tuo oggetto inizi a rallentare per cui cambierai il tuo set point di velocità .Oppure invece di cambiare il set point di velocità puoi iniziare a decrementare di un certo tot , passo , in modo tale che dopo un certo spazio percorso ti trovi a velocità zero o minima .Sono concetti della cinematica spazio - tempo - velocità - accelerazione ect

In un intervallo di interrupt , dove fai i calcoli , se vuoi puoi anche calcolarti le grandezze di cui sopra .considera che il tuo dt e' il tempo di interrupt .Se hai lo spazio , la sua prima derivata rispetto al dt è la velocità mentre la derivata seconda dello spazio rispetto al tempo ossia la derivata prima della velocità rispetto al tempo (tempo che considerato due volte e' il quadrato) ti dà l'accelerazione

In questo modo puoi lavorare con grandezze fisiche reali e sapere se stai acelerando , se stai andando a velocità costante (accelerazione zero ) oppure se stai decellerando e cosi via

Pero' per adesso cerca di capire come ti dice Livio , mica di fare confusione e perderti via , dopo puoi affinare un vero e proprio controllo di posizionamento , con lcd per intrduzione set point ect

Fallo bene che poi lo posti e lo trasformiamo in libreria arduino e poi magari lo estendiamo ;)

Modificato: da walterword
Link al commento
Condividi su altri siti

Se segui quello che ti ho scritto alla posizione ci arrivi tranuillamente.

Quello che ho scritto è il classico algoritmo tirangolare-trapezoidale di posizionamento<, mancherebbe solo l'ultimo piccolo tratto in lento nel caso non raggiungesse la posizione solo in decelerzione.

Quando l'errore e' minore di un certo valore oppure di una certa % , se hai normalizzato , allora inizi a rallentare

Walter non va bene così. Ci sono tantissime condizioni in cui devi rallentare prima di aver terminato l'accelerazione. Sono i classici casi di profilo triangolare.

Poi, di norma, accelerazione e decelerazione hanno il medesimo tempo, tempo che sistabilisce in base alle possiiblità della macchina ed alle caratteristiche di lavorazione, quindi lo spazio percorso in accelerazione è eguale a quello in decelerazione; di norma si decelera un poco prima per avere un minimo di amrgine di sicurezza e si percorre l'ultimo tratto in lento.

Link al commento
Condividi su altri siti

Vabbene Livio vedo oggi se riesco a trovare un po di tempo per mettere in pratica. In effetti pensandoci bene devo per forza avere un rampa che se arriva al massimo prima della meta della quota set point devo iniziare a decrementare quando sono alla posizione della rampa massima sotraendola a quella di arrivo. Cosi ho il motore che per un certo tempo gira alla massima velocita e poi inizia a rallentare.. la teoria e tutto chiaro devo solo scrivere bene il programma

Link al commento
Condividi su altri siti

io non ho dato instruzioni precise ma solo indicazioni generali ,Il classico trapezio triangolare lo conosco anche io , lo conoscono tutti .Per i rallentamenti ci sono le soglie , per i posizionamenti ci sono gli intorni dei punti di posizione desiderati ect

Per i rallentamenti prima dei punti di posizionamento ci sono intorni piu grandi di quelli di rallentamento ...ne ho fatti di posizionamenti nel mondo della movimentazione , navette , shuttle , trasporti , nastri ....

Se hai 10 punti di posizionamento puoi avere 10 zone di rallentamento e 10 zone di posizione .Se carichi tutto in vettori , array , scrivi la logica una volta sola e in base al setpoint caricato fai quello che devi fare

Se lo interpreti cosi avrai 10 soglie , non errori , di posizionamento e 10 errori di posizionamento , per errore intendo SP - Pos_Attuale

Link al commento
Condividi su altri siti

Walter fai un po' di mente locale a circa una quindicina di anni fa quando ti spiegavo come fare un posizionatore ed un PID. ;)

Per prima cosa devi pensare sempre cosa ne sa l'interlocutore e cosa gli serve.

Link al commento
Condividi su altri siti

il tuo posizionatore faceva riferimento ad un encoder simulato che incrementava e dovevi inseguirlo

Il pid l'ho scritto di mia natura in SCL , anzi PI , ora inserisco anche il derivativo come variazione dell'errore rispetto al tempo di interrupt

Nozioni apprese in quesot periodo nel corso di teoria dei sistemi e controlli automatici ;)

comunque poi non ho piu usato il concetto di encoder virtuale .A cosa serve l'interlocutore ...be prima di tutto sapere un po di teoria e ragionare

Ma a lui credo interessi di piu l'applicazione finale sul micro che la teoria in quanto qualcosa la sa

Link al commento
Condividi su altri siti

allora vi aggiorno, ho solo provato a fare la rampa di incremento posizione<= set point/2 accelero, e se posizione>=setpoint/2 decremento.

Siccome il sistema è un po duro da muovere il motore inizia a ruotare con 150 punti... :toobad: e allora la rampa arriva a massimo circa 200 e il motore fa una rincorsa passa per la meta e il segnale si abbassa ma comunque si ferma prima della quota set point cioe SEt point 589 e posizione reale 374... e la rampa è a 0 ora devo finire di completare ma prima di andare avanti volevo capire se il motore è troppo frenato da spostarsi solo con 150 punti pwm posso continuare o meglio modificare prima la meccanica? C è una catena con due ruote dentate che muove il tutto.

Link al commento
Condividi su altri siti

Accidenti devi arrivare al 60% per poter muovere.

C'è qualche cosa che non quadra.

Come ben sai un motore in cc è in grado di erogare la coppia nominale gia da fermo, mentre la tensione di armatura non deve incidere sulla coppia ma solo sulla velocità.

Una domanda. Se hai notato nel set iniziale avevo cambiato il prescalere del contatore del PWM per aumentare la frequenza base a oltre 3900 Hz; hai verificato che la frequenza sia ancora questa?

Altrimenti hai un problemq di attrito di primo distacco, anche se dovrebbe influire solo sull'assorbimento di corrente.

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...