Vai al contenuto
PLC Forum


Posizionatore Con Arduino


roberto8303

Messaggi consigliati

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

cosa vorresti fare? che applicazione in particolare? ora stanno andando molto i controlli per stampanti 3d con arduino e motori passo mi piacerebbe fare qualcosa ma il poco tempo da dedicarci è sempre l ostacolo piu difficile :(

anche se a breve vorrei fare anche io qualche applicazione con motori passo passo :whistling:;)

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

ti ringrazio walter, ormai sono circa 15 anni che il mio pane quotidiano sono i motori elettrici, quindi oltre ad essere il mio lavoro è diventata anche una passione perchè il campo è vastissimo e sempre in aggiornamento purtroppo essere esperti sia in motori che in programmazione informatica non è semplice richiede molto studio e tempo sopratutto se non si hanno basi di scuola informatica...

Comunque complimenti anche a te per la cultura in materia, alla tua sete di conoscenza ed ai progetti interessanti che hai postato.

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

io piu che altro ho sete :D :D :D

Mah , nessun progetto .Vorrei solamenta capire un po le tecnologie dei motori passo passo , vedere un po i drive e giocare un po

Stadio successivo capire bene le funzioni che usa arduino per gestire queste cose e studiare le librerie di piu basso livello

Dopo direi si potrebbe scaricare i software per generare GCode e giocare un po con le bandierine appiccicate all'albero del motorino

Cosi giusto per far qualcosa ....

Link al commento
Condividi su altri siti

Stadio successivo capire bene le funzioni che usa arduino per gestire queste cose e studiare le librerie di piu basso livello

le funzioni standard di arduino son piuttosto povere. Si può cercare di migliorare un poco le cose, come per il PWM, aumentando la frequenza di base agendo sul prescaler, ma solo per timer 1 e 2, perchè timer0 influenzerebbe anche le funzioni di delay.

Non so per arduino2 se le cose funzionano meglio.

Comunqie se si vogliono spremere bene gli stepper bisogna usarli in microstepping con controllo vettoriale, allora si ottengono prestazioni comparabili con quelle dei brushless trapezoidali.

Rimane il problema tipico degli stepper che generano la coppia massima a rotore bloccato e man mano che la velocità aumenta la coppia diminuisce, in modo simile ad un motore cc ad eccitazione serie o ad un motore universale (che particamente è la stessa macchina).

Basta ricercare con parole chiave "microstepping" ed ottieni tantissimo materiale.

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

con i dspic ricordo che agivo su un registro dedicato al pwm...bisogna approfondire e vedere soprattutto il DUE cosa dice....

Modificato: da walterword
Link al commento
Condividi su altri siti

ragazzi un problemino, voglio passare il setpoint con la seriale dal pc, ma siccome è in carattere ascii, come posso convertirlo in numero da 50 ad 800 che serve a me per il set point? se scrivo nella seriale z arrivo a 122 ma non basta...

Link al commento
Condividi su altri siti

puoi fare cosi

Dal pc ti arriva una stringa o meglio un flusso di byte

comunque metti di avere una stringa e di "trasformarla" in un array di caratteri '1234'

Prendi la prima cifra a destra , la converti in intero e la moltiplichi per uno .La seconda sempre a partire da destra la trasformi in decimale e la moltiplichi per 10 e cosi via .L'intero finale e' la somma degli interi parziali

comunque ho provato questa e testata ora e funziona .Un array di caratteri direttamente convertito in intero con atoi

char a[]="10";
int b;
b=atoi(a);
Serial.print(DEC,B);
Serial.print("\n");
delay(1000);
ciao
Link al commento
Condividi su altri siti

ma no quello l'ho messo io per fare il test e vedere sul monitor seriale se la conversione funzionava .....

tu hai in arrivo uno stream di bytes che puoi convertire facilmente in array di caratteri .Fai la conversione assicurandoti che i caratteri rappresentano numeri e non lettere seno' avrai errore e usi la atoi
char a[]="10";
int b;
b=atoi(a);
Alternativa come ti dissi ieri e' quella di sommare i contributi di ogni carattere moltiplicato per il rispettivo peso
char s_dato="1234";
int i_dato= [ atoi( s_dato[3]) * 10^3 ] + [ atoi( s_dato[2]) * 10^2 ] + [ atoi( s_dato[1]) * 10^1 ] + [ atoi( s_dato[1]) * 10^1 ] + [ atoi( s_dato[0]) * 10^0 ] ;
Come puoi ben vedere puoi sviluppare il tutto come serie numerica facendo la sommatoria da 0 a s_dato.len
for (int i=0; i < s_dato.lenght ; i++)
{
i_dato + = atoi( s_dato) * 10^i
}
L'ho messo giu di fretta e senza testartlo ma dovrebbe funzioanare....seno a cosa serve fare l'universita' ..... <_<
Link al commento
Condividi su altri siti

L'ho messo giu di fretta e senza testartlo ma dovrebbe funzioanare....seno a cosa serve fare l'universita' ..... dry.png

alla teoria...ora vediamo se funziona anche nella pratica :lol::thumb_yello:

Link al commento
Condividi su altri siti

funziona , sono quelle cose che anche s eno nle provi senti dentro che funzionano ;)

L'unico problema che puo' sorgere e' un errore di sintassi o distrazione

Modificato: da walterword
Link al commento
Condividi su altri siti

Ragazzi non c'è bisogno di fare conversioni lo fa direttamente la libreira di arduino.

Lo uso regolarmente per passare il duty cycle tra 1 e255.

void loop()
{
    if (Serial.available() > 0) {
    // leggi il valore d'ingresso
      inByte = Serial.parseInt();
      }
    if (inByte > 0)
       {
          Serial.println(inByte);
          if ((inByte >1000)&(inByte < 1256))
             {
               rifvel = inByte -1000;
               stat = HIGH;
             }
          if ((inByte >2000)&(inByte < 2256))
             {
               rifvel2 = inByte -2000;
               stat = HIGH;
             }
          inByte = 0;
       }
  if (stat == HIGH)
    {
       stat = LOW;
       analogWrite(upwm1, rifvel);
       analogWrite(upwm2, rifvel2);
       lcd.setCursor(12,0); // Set the cursor to col 12, row 0
       lcd.print("    ");   // Print the first word
       lcd.setCursor(12,0);   // Set the cursor to col 11, row 1
       lcd.print(rifvel);
       lcd.setCursor(12,1);   // Set the cursor to col 12, row 0
       lcd.print("    ");   // Print the first word
       lcd.setCursor(12,1);   // Set the cursor to col 12, row 1
       lcd.print(rifvel2);
       // Scrivi i riferimenti
       Serial.print("rivel1 =  " );
       Serial.println(rifvel);
       Serial.print("rivel2 =  " );
       Serial.println(rifvel2);
    }

Se il valore è >1000 è il primo canale di PWM

Se il valore è >2000 è il secondo canale PWM

Tolgo 1000 o 2000 ed ho l'uscita PWM tra 1 - 254

La butto anche sul display lcd in I2C.

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

come direttamente Livio non ho capito? se mando un numero dalla seriale nella variabile mi ritrovo 48, le lettere mi legge da a a x --->>100 a 122

Link al commento
Condividi su altri siti

Hai letto il mio codice?

Io scrivo nella seriale, ad esempio, 1155 perchè voglio avere il primo canale di PWM con duty di 155.

Tolgo 100' al valore ricevuto nella variabile "inByte" ed il risultato è il valore che scrivo in analog output

Link al commento
Condividi su altri siti

si e' il parseInt che fa tutto

Ma io intendevo fornire qualcosa che si potesse usare in qualcsiasi caso

Roberto , comunque quando Clint posta il codice e' un evento pericoloso ....era stufo di leggere le nostre porcherie ...peccato che non legga mai la posta :thumbdown:

Modificato: da walterword
Link al commento
Condividi su altri siti

comunque questo e' il codice per situazioni generiche

void loop() 
{
 // primo modo 
 char a[]="10";
 int b,i;
  b=atoi(a);
  
 // secondo modo   
 char car[]={'4','0','0','0'};
 int app=0,numero=0;

 for (i=0; i<4 ; i++) 
  {
     int c=car[i]-'0';
     app+=c*(pow(10,3-i)) ;
  }
   numero=app+1;
   Serial.print(numero);
   Serial.print("\n");
  delay(1000);
}

Nota 1 : il ciclo for parte da zero a <4 cioè loppa per 4 caratteri

Nota 2 : L'elevamento a potenza inizia con esponente 3 in quanto il '3' viene inteso con indice 0 nell'array di caratteri

Nota 3: Se conosci a priori la lunghezza dell'array di caratteri puoi usare quello in questo modo o seno te la calcoli con sizeof ...

void loop() 
{
 // primo modo 
 char a[]="10";
 int b,i,len;
  b=atoi(a);
  
 // secondo modo   
 char car[]={'4','0','0','0'};
 int app=0,numero=0;
 len=sizeof(car);
 for (i=0; i<len ; i++) 
  {
     int c=car[i]-'0';
     app+=c*(pow(10,len-1-i)) ;
     
  }
   numero=app+1;

   Serial.print(numero);
   Serial.print("\n");
  delay(1000);
}

se nel protocollo di comunicazione hai un pacchetto di dati che rappresentano varie cose , fai prima un substring e tiri fuori quello che ti serve in quel momento che e' una stringa , poi ricavi con ToCharArray il vettore di caratteri e poi fai quello che c'e' sopra .Questo se il protocollo e' in ASCII , se invece e' in binario devi convertire i bytes in caratteri o "montare " i tuoi dati dai bytes ricevuti

Esempio , se trasferisci un intero di 4 cifre in ascii vuol dire che spedisci 4 caratteri per quel numero , se invece vai in binario allora usando i byte ne userai solo due o 4 a seconda del tipo di intero ( short o long ) .Per cui prima di spedirli dovrai scindere l'intero in due byte con maschere e shift , e al ricevimento operazioni opposte .Io sto mettendo giu un protocollo tipo modbus per il mio progetto e traserisco circa 40-50 byte ad ogni colpo e lo faccio in binario

Modificato: da walterword
Link al commento
Condividi su altri siti

.peccato che non legga mai la posta

Cavolo dici? Se ti ho appena risposto.

Roberto , comunque quando Clint posta il codice....

Ma no, st facendomi una cultura di base su arduino e faccio un mare di prove.

Quando sarò arrivato a sapere quasi tutto passerò ad altro. :P

Link al commento
Condividi su altri siti

Quando sarò arrivato a sapere quasi tutto passerò ad altro. tongue.png

...prima faccelo sapere però ....cosi tramandiamo il tuo sapere ai posteri come fanno i buddisti

Link al commento
Condividi su altri siti

Comunque il codice è ok funziona bene grazie Livio

Non c'è di che.

Io in genere quello che pubblico lo provo prima, se non l'ho provato lo scrivo chiaramente, onde evitare che qualcuno impazzisca su di un problema dovuto alla mia proverbiale distrazione.

Link al commento
Condividi su altri siti

riguardo ai motori passo passo

La coppia e' proporzionale alle amper-spire , quindi proporzionale alla corrente

La velocità di rotazione dipende dalla frequenza del treno di impulsi che pilotano il motore

Pero' la reattanza induttiva dovuta agli avvolgimenti aumenta in funzione della frequenza , praticamente piu alta e' la frequenza e maggiore l'impedenza diciamo (considerata la resistenza degli avvolgimenti) e minore e' la corrente

In conclusione all'aumentare della velocità diminuisce la coppia

Mettiamo di sapere i dati di targa del motore in termini di velocità , quale sarebbe il limite massimo per garantire una buona velocità e la coppia ? Bisognerebbe calcolare gli attriti e le forze meccaniche che il motore deve muovere o no ?

In alcuni cnc che stampano pcb , la retroazione non c'e' in quanto la coppia e' bassa per quello che deve fare, spostare una punta per asportare 1-2 mm di rame da una basetta..... Eventualmente la chiusura dell'anello servirebbe per controlalre se lo spostamento e' avvenuto regolarmente e anche per controllare la coppia di conseguenza

Altra domanda , se devo muovere due assi interpolati con o senza retroazione , la tecnica come sarebbe ? Nel senso uno dei due assi deve essere master e l'altro insegue il master?

Senza retroazione ci si deve fidare dello stepper , tot. impulsi equivalgono a tot . spostamento dell'asse .Se ci fosse un encoder la posizione master da inseguire è quella calcolata tramite l'encoder , dico bene ?

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