Vai al contenuto
PLC Forum


Posizionatore Con Arduino


roberto8303

Messaggi consigliati

La lunghezza della missione è 550 - 50 = 500; metà della missione 500/2 = 250. Il punto di mezzo della missione è 250 + 50 di offset = 300.

Dai la classica finestrella su .... :smile:

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

int posizione;
int rampa;
int velocita=3;
int direzione=2;
int start=5;
int aumenta=7;
int diminuisce=6;
unsigned int errore;
unsigned long tempo=0;
int setpoint=300;
int contatore;
boolean a=0;
void setup()
{
  Serial.begin(9600);
  pinMode(5,INPUT); 
  pinMode(7,INPUT);
  pinMode(6,INPUT);
  pinMode(3,OUTPUT);
  pinMode(2,OUTPUT);
 
   noInterrupts();           // disable all interrupts
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 64886;            // preload timer 65536-16MHz/256/100Hz
  TCCR1B |= (1 << CS12);    // 256 prescaler 
  TIMSK1 |= (1 << TOIE1);   // enable timer overflow interrupt
  interrupts();}           // enable all interrupts
// interrupt service routine 
ISR(TIMER1_OVF_vect)        
{
  TCNT1 = 64886;            // preload timer
 int posizione=analogRead(A0);
 
 
if(a==1){    // entro nella condizione solo dopo l homing quando la variabile a è passata da 0 ad 1.
  
 if((setpoint-posizione)<=(5)){        // se la posizione ha un errore minimo di 5 porto la rampa a 0
    rampa=0;}
  else{                             // altrimenti  incremento la rampa per raggiungere il setpoint
 if((posizione<=(setpoint/2+50))&&(rampa<=254)){
     rampa++;
  if(rampa>=253){
     rampa=254;}}
else{                                 //altrimenti superata meta quota piu 50 decremento la rampa 
  if((posizione)>=(setpoint/2+50)){
  rampa--;}
if (rampa<=40){                       // se la rampa arriva al di sotto di 40pwm è uguale a 40pwm
   rampa=40;}}
}}}
   
void homing(){                       //homing per portare all accensione l asse a posizione 50.
  int posizione=analogRead(A0);
if((posizione>=55)&&(a==0)){
digitalWrite(2,LOW);
analogWrite(3,38);}
else{
  int posizione=analogRead(A0);
  analogWrite(3,0);
  if(posizione<=55){                //se posizionato a 50 porto il pwm a0 e la variabile A ad 1 per uscire dall homing 
   a=1;}                                  //e non entrarci fino alla prossima accensione 
  
}}
                                      // continuare per la quota di rallentamento e discesa rampa  quando setpoint sara minore della posizione.......
 
void comandi(){                        //utilizzo millis per incrementare alla pressione del tasto aumenta il valore del setpoint ogni 80ms
 
 if(digitalRead(aumenta)==1){
     if(millis()>=tempo+80){
     setpoint++;
     tempo=millis();}}
    
  if(digitalRead(diminuisce)==1){    //utilizzo millis per decrementare alla pressione del tasto diminuisce il valore del setpoint ogni 80ms
      if(millis()>=tempo+80){
     setpoint--;
     tempo=millis();}}
 
 if(setpoint>=850){
     setpoint=850;}
     if(setpoint <=50){
     setpoint=50;}
}
 
void loop(){
 int posizione=analogRead(A0);
 comandi(); 
  
   if(a==0){
   homing();}// all accensione effettuo l homing portando il cursore a posizione 50
  
  if(a==1){                    //dopo l homing porto la variabile a 1 e piloto il motore con il riferimento rampa
 if(setpoint>posizione){
   analogWrite(3,rampa);
   digitalWrite(2,HIGH);}
   else{
    digitalWrite(2,LOW);
    analogWrite(3,rampa); }}
 
Serial.print(rampa);              //stampe seriale di prova
Serial.print("   ");
Serial.print("posizione");
Serial.print("  ");
 Serial.print(posizione);
 Serial.print("   ");
 Serial.print("setpoint");
 Serial.print("  ");
 Serial.println(setpoint);
}
 

Allora eccomi per il poco tempo a disposizione sto facendo una pezzo alla volta, per prima cosa ho terminato l homing che mi serve all accensione per portare il cursore a posizione 50 iniziale. poi ho verificato la routine di interrputs che è tarata a 10ms, ho utilizzato un alimentatore di 12vdc che mi permette di spostare il motore con pwm di 35, anche se ha qualche punto duro colpa del disallineamento delle pulegge.

Ho messo il setpoint a 300 nella dichiarazione delle variabili per partire direttamente con il posizionamento dopo l homing. ma ho un effetto troppo brusco, devo assolutamente posizionare con la quota di rallentamento...come dici tu Livio, poi mi resta fare la rampa al contrario quando scendo con il setpoint rispetto la posizione. e poi lo start per far partire il posizionamento ad ogni sua pressione. Ci vorra ancora un bel po tra le feste e il poco tempo che posso dedicarci...ma non ci rinuncio dovra funzionare almeno diciamo... bene :smile: ora posto anche il video per mostrare la reazione brusca con il setpoint a 300 e il motore che arriva e si ferma a 370 circa...devo modificare il programma.. ah all inizio il primo valore in video è la rampa essa arriva per un istante a 60 pwm...

Modificato: da roberto8303
Link al commento
Condividi su altri siti

:thumb_yello:

Poi quando hai testato tutto fai un bel report

Io intanto sto facendo delle prove con Arduino Due e DS3231 real time clock , va che è una meraviglia :smile:

Link al commento
Condividi su altri siti

eh si ....ho preso il secondo DUE perchè e' veramente un piacere lavorarci.La mega non e' male come risorse pero' e' sempre un 8 bit , comunque va benissimo per moltissime applicazioni

Con la DUE c'e' veramente un sacco di cose belle da fare , io la sto usando per il progetto tesi ...il WSystem

Mi sono appena costruito un bel hub I2C al quale connettero' tutti i sensori , temperatura , umidità , umidità terreno , RTC DS3231 , MCP23017 ect barometro , accelerometro , luxometro ....

Bisogna stare un po attenti con le librerie perche la DUE ha un ARM Cortex e nonostante la multipiattaforma arduino predisipone la compilazione multi ci sono delle accortezza da fare

Per esempio con il DS3231 che e' il RTC clock con allarmi programmabili e temperatura , la libreria funziona con UNO e Mega senza problemi , mentre con due devi modificare delle cose , per esempio la dichiarazione del tempo ...che lui usa time e ti da errori inquanto e' una parola chiave del due ma non degli altri ....poi ho preso i traslatori di livello I2C , seriali e lenti per I/O ....

Per 14 euro direi che ne vale proprio la pena ,poi hai 2 DAC 12 bit , can bus , funzioni implementate in HW come la Fast fuorier trasform , insomma se vuoi divertirti e imparare ce ne da fare

Arduino uno va bene per giocare e/o imparare un po il sistema , poi lo puoi usare per gestire un TFT, o lcd o due rele remotati per aprire cancello e accendere le luci sul luogo oppure gestire una parte di rete bluetooth che e' proprio quello che gli sto facendo fare

Sto verificando ora che il mio DS3231 e' una bomba , la batteria e' buona e l'ora e' perfetta .... :smile: adesso scremo un po di cose dalla libreria , gli allarmi li faccio via sw , una votla che ho il tempo ....

Ecco il mio hub I2C per dispositivi a 5V e 3.3V

a8baa4c104c31125c28882634c6e8029.png

DS3231 circa 1 euro .Poi ho preso 5 schedine RS485/TTL che sono una favola , no nvale piu nemmeno la pena di star li a mettere insiemte i MAX485 su millefori .Costo di 5 RS485 module circa 4 euro ...pfffff

Ho qua uno scatolone pieno di roba :D :D :D

Modificato: da walterword
Link al commento
Condividi su altri siti

Io ho provato a "giocare" un po' con l'ARM Coretex TI, che puoi programmare simil arduino con la piattaforma Energia.

Avevo anche iniziato a fare qualche cosa la suite di programamzione TI, però ho troppo da fare e sempre meno tempo perchè divento semnpre più lento. :(

Comunque per me, ora, il problema maggiore di arduino sono i connetori, devo trovare un modo per avere una connessione stabile e sicura.

Quei cogl..... che fanno gli adattotori con morsettiera fanno sti cavoli di 2 arnesi che si infilano e basta. Se invece di farne 2 metà ci fosse uno che realizzasse la scheda intera con 2 fori di correispondenza con quelli dui arduino, allora si che sarebbe abbastanza sicura la connessione.

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

si ho visto che c'e' anche kitPic32 e Ti come piattaforma arduino

E infatti gli adattatori morsetto che hai preso tu sono proprio una cacata , li inserisci e si piegano su di un lato

Cmw ce ne sono anche di interi , se guardi bene trovi quelli del micro arduino e stanno iniziando a fare anche quelli del UNO

http://www.aliexpress.com/premium/screw-adapter-arduino.html?ltype=wholesale&SearchText=screw+adapter+arduino&d=y&origin=y&initiative_id=SB_20150404030517&isViewCP=y&catId=0

Io ho due esami per il 17 aprile che sono rognosi ...comunicazioni elettriche , teoria dei sistemi + controlli automatici , poi un altro esame meno pesante a maggio e se dio vuole l'ultimo a luglio e tra maggio -giugno iniziero' a dedicarmi per bene ad android e arduino DUE , in modo professionale almeno 8 ore al giorno

Modificato: da walterword
Link al commento
Condividi su altri siti

Hai scelto tu il 17?

Io sono scaramantico perchè secondo me vale sempre il detto "non è vero ma ci credo", e mai il 17. Fortuna che è venerdì e non martedì. :lol:

Gli adatatori sono solo per il "nano", purtroppo. Sto pensando di fare un adattatore per l'adattatore. :smile:

Link al commento
Condividi su altri siti

nono , scelto loro .Mica scegli tu quando fare gli esami al'università ....venerdi 17 azzzz

Per gli adattatori si potrebbe anche usare i pin header con pirletto lungo , ma si trovano a fatica .

Potresti progettare un pcb e farli stampare :smile:

Link al commento
Condividi su altri siti

Ho trovato dell protoshield tipo millefori, con terminali a morsettiera; costano poco più dei soli traslatori e, alla bisogna, ci puoi montare sopra qualche cosa. ;)

Link al commento
Condividi su altri siti

si l'idea e' quella di usare i pn header con pistolino lungo oppure le strisce header e sopra alla millefori metterci rele o morsetti o quello che serve

Daltronde essendo un giocattolo per studio non si puo' pretendere che vi sia una scelta commerciale in tal senso ....comunque posta le tue shields

Link al commento
Condividi su altri siti

buona Pasqua a tutti ho terminato il programma sembra andare bene solo la meccanica è un po imprecisa..

int posizione;
int rampa;
int velocita=3;
int direzione=2;
int start=5;
int aumenta=7;
int diminuisce=6;
unsigned long tempo=0;
unsigned long tempo1=0;
unsigned long tempo2=0;
int setpoint=50;
int contatore;
int pausa;
boolean a=0;
void setup()
{
  Serial.begin(9600);
  pinMode(5,INPUT); 
  pinMode(7,INPUT);
  pinMode(6,INPUT);
  pinMode(3,OUTPUT);
  pinMode(2,OUTPUT);
 
  noInterrupts();           // disable all interrupts
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 64886;            // preload timer 65536-16MHz/256/100Hz
  TCCR1B |= (1 << CS12);    // 256 prescaler 
  TIMSK1 |= (1 << TOIE1);   // enable timer overflow interrupt
  interrupts();}           // enable all interrupts
// interrupt service routine 
ISR(TIMER1_OVF_vect)        
{
  TCNT1 = 64886;            // preload timer
int posizione=analogRead(A0);
start=digitalRead(5);
 
if(start==1){
if((setpoint-posizione)>=(1)){
if(a==1){    // entro nella condizione solo dopo l homing quando la variabile a è passata da 0 ad 1.
  
 if((setpoint-posizione)<=(2)){        // se la posizione ha un errore minimo di 1 porto la rampa a 0
    rampa=0;}
   else{                             // altrimenti  incremento la rampa per raggiungere il setpoint
if((posizione<=(setpoint/2-50))&&(rampa<=240)){
     rampa++;
  if(rampa>=240){
     rampa=240;}}
   else{                                 //altrimenti superata meta quota -50 decremento la rampa 
if((posizione)>=(setpoint/2-50)){
  rampa--;}
  if (rampa<=35){                           // se la rampa arriva al di sotto di 35pwm è uguale a 45pwm
    rampa=35;}
if ((setpoint-posizione)<= (60)){          // se il setpoint- posizione ha la differenza di 60 o meno avanzo con la rampa lenta              
   rampa=35;}                              // altrimenti con la rampa 30% piu veloce per coprire la distanza piu velocemente.
   else{rampa=45;}}
}}}
 
 //decremento la posizione rispetto al setpoint per tornare indietro porzione di progamma uguale alla rampa di salita.
 if((posizione-setpoint)>=(1)){
 if(a==1){
 if((posizione-setpoint)<=(2)){
   rampa=0;}
   else{
if((setpoint<=(posizione/2-50))&&(rampa<=240)){
      rampa++;
   if(rampa>=240){
      rampa=240;}}
   else{
if((setpoint)>=(posizione/2-50)){
       rampa--;}
   if (rampa<=35){
       rampa=35;}
if((posizione-setpoint)<=(60)){
  rampa=35;}
  else{rampa=45;}}
 }}}}
 else{
 rampa=0;}
 }
 
 void homing(){                       //homing per portare all accensione l asse a posizione 50.
  int posizione=analogRead(A0);
 if((posizione>=55)&&(a==0)){
    digitalWrite(2,LOW);
    analogWrite(3,38);}
else{
  int posizione=analogRead(A0);
  analogWrite(3,0);
  if(posizione<=55){                //se posizionato a 50 porto il pwm a0 e la variabile A ad 1 per uscire dall homing 
   a=1;}                                  //e non entrarci fino alla prossima accensione 
  
}}
                                      
void comandi(){                        //utilizzo millis per incrementare alla pressione del tasto aumenta il valore del setpoint ogni 80ms
 
 if(digitalRead(aumenta)==1){
     if(millis()>=tempo+pausa){
     setpoint++;
     tempo=millis();}}
    
if(millis()>=tempo1+3000){           // se il pulsante aumenta è premuto per piu di 3 secondi incremento
   pausa=15;                         // il valore del setpoint piu velocemente
if(digitalRead(aumenta)==0){
   pausa=150;
   tempo1=millis();
}}
 if(digitalRead(diminuisce)==1){    //utilizzo millis per decrementare alla pressione del tasto diminuisce il valore del setpoint 
     if(millis()>=tempo+pausa){    //con pausa che sara =a 20 quando il tasto o aumenta o discesa è premuto piu di 3 secondi,
     setpoint--;                    //altrimenti sara= 150 per settare il setpoint con piu precisione.
     tempo=millis();}}
 
  if(millis()>=tempo2+3000){       // se il pulsante diminuisce è premuto per piu di 3 secondi incremento
  pausa=15;                        // il valore del setpoint piu velocemente
if(digitalRead(diminuisce)==0){
  pausa=150;
  tempo2=millis();
}}  
  
 if(setpoint>=800){              //limiti massimo e minimo di setpoint-
     setpoint=800;}
     if(setpoint <=50){
     setpoint=50;}
}
 
void loop(){
 int posizione=analogRead(A0);
 comandi(); 
  
   if(a==0){
   homing();}// all accensione effettuo l homing portando il cursore a posizione 50
  
  if(a==1){                    //dopo l homing porto la variabile a 1 e piloto il motore con il riferimento rampa
 if(setpoint>posizione){
   analogWrite(3,rampa);
   digitalWrite(2,HIGH);}
   else{
    digitalWrite(2,LOW);
    analogWrite(3,rampa); }}
Serial.print("rampa");
Serial.print(" ");
Serial.print(rampa);              //stampe seriale di prova
Serial.print("  ");
Serial.print("posizione");
Serial.print(" ");
 Serial.print(posizione);
 Serial.print("  ");
 Serial.print("setpoint");
 Serial.print(" ");
 Serial.print(setpoint);
 Serial.print("  ");
 Serial.print("pausa");
 Serial.print(" ");
 Serial.println(pausa);
}
 

https://youtu.be/P6jxCw_KB3s

Link al commento
Condividi su altri siti

sembrerebbe buono ....se e' gia tutto montato

Guarda qui

http://www.aliexpress.com/premium/ITEAD-%25252d-PROTO-SCREW-SHIELD.html?ltype=wholesale&SearchText=ITEAD+-+PROTO+SCREW+SHIELD&d=y&origin=y&initiative_id=SB_20150405041011&isViewCP=y&catId=0

:D :D :D

Come prezzi non dici niente , non ne vale la pena se non per le tasse e il viaggio

Però quella da poco piu di 1 euro con i pin da saldare sarebbe da valutare <_<

Modificato: da walterword
Link al commento
Condividi su altri siti

il programma sembra andare bene solo la meccanica è un po imprecisa..

Roberto non analizzato lo sketch. Però se dici che la meccanica è imprecisa comincia, se non lo hai fatto, a fare l'homing mettento "in tiro" la meccanica. Ovvero vai a quota <50 poi inverti e arrivi a 50 in lento; in questo modo recuperi quasi tutti i giochi.

Poi c'è il problema dei rapporto Vmax-Vmin che non è elevato; hai un motore che è dato per 3:1, un asse decente, in genere, fa almeno 100:1. Se un motore ha Vmax = 3000 rpm con 200 V di armatura, gira ancora perfettamente a 30rpm con 2 V circa di armatura.

Link al commento
Condividi su altri siti

Come prezzi non dici niente ,

Quella che ho visto la vendono a <7€.

Quelle a cui fai riferimento le avevo viste, ma a me scoccia comprare direttamente extra CE, tempi di consegna simili ad ere geologiche, poi hai le tasse, devi pagarle al corriere che ci aggiunge i suoi diritti die sazione, devi pagare in contanti quando arriva, se non hai il denaro contato sei costretto, in pratica, a lasciare il resto perchè non hanno mai da dartelo.

Poi tu sai dove abito, se il corriere mi arriva in un giorno di pioggia proprio mentre sono a pranzo mi va tutto di traverso. Mi è successo così con l'acquisto ultimo che fatto in Cina; il correire è arrivato quando ero a metà del primo, pioveva e tirava anche una tramontana gelata; fortunatamente avevo almeno la cifra esatta.

Link al commento
Condividi su altri siti

Livio il rapporto e 5:1, il problema della meccanica non e per il gioco ma che durante la corsa c e qualche punto duro e la rampa si incrementa un po oltre e il motore poi e come prendesse un po di rincorsa..quindi mn segue in maniera lineare

Link al commento
Condividi su altri siti

si si infatti intendevo dire che come prezzi , questi articoli non dicono niente .... non ne val ela pena

Roberto , ricorda che giochi che elimini mettendo in tiro a termine homing , li devi compensare ad ogni inversione di marcia

Link al commento
Condividi su altri siti

Si lo so ma questo avevo per la prova l implatante e aver fatto funzionare il programma a me interessa piu questo per i motori non ho problemi☺

Link al commento
Condividi su altri siti

  • 2 weeks later...

Roberto se ti interessa il mondo del motion control ti consiglio di dare un'occhiata a questi

https://github.com/grbl

https://github.com/grbl/grbl

e Arduino GCode interpreter

Sono progetti open source di controllori cnc .Il GCode e' il linguaggio che viene usato da tutte le macchien utensili e da molti robot specialmente quelli cartesiani

Stavo dando uno sguardo e noto una professionalità spaventosa

Ci sono anche i progetti java per l'ambiente di gestione ect

Merita

Link al commento
Condividi su altri siti

ciao walter grazie si mi interessa, anche se per le cnc e il g code preferisco usare altri tipi di motori e controlli, perchè molto piu affidabili dei passo passo, comunque per piccole applicazioni con interpolazioni questi che hai trovato sono ottimi e da provare appena posso :thumb_yello:

Tempo fa mi sono costruito una cnc e non usai per scelta i passo passo ma i brushless questa era la mia cnc in fase di costruzione e prove ora è diversa.. :smile:

https://www.youtube.com/watch?v=yleu8faiT7k

Modificato: da roberto8303
Link al commento
Condividi su altri siti

e' spaventoso cosa si possa fare con queste diavolerie.... purtroppo le mie uniche esperienze risalgono a piu di 10 anni , precisamente 15 ....ho lavorato per un piccolo costruttore di centri di lavoro con taglio ad acqua e sabbia del deserto australiano

I cnc erano della osai , con brushless e azionamenti della selema .Resolver acquisito dall'azionamento ed uscita encoder simulato alla scheda assi , ambiente dos , compilazione dall'awl al C , cosa mai capita , probabilmente il sistema era basato su piattaforme di genere diverso ed usava linguaggi intesi come testi per poi essere buildati in C e poi compilati nel suo linguaggio nativo ....un macello ...

Ho ordinato due piccoli stepper motor con relativo drive dai cinesi , giusto per giocare un po ed iniziare a capire questo mondo

Se hai qualche link su stepper motor e brushless linkamelo che appena riesco approfondisco

comunque complimenti per il lavoro che hai fatto con arduino , mi riferisco al codice qua sopra

E' sempre ammirabile ed apprezzabile un impegno ed un interesse tale

:clap:

Modificato: da walterword
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...