spacer.png, 0 kB

Torna indietro   Roboitalia.com - Il primo portale in Italia sulla robotica amatoriale > Robotica Avanzata > Motori e azionamenti

Rispondi
 
Strumenti discussione Modalità  visualizzazioe
  #1  
Vecchio 27-09-2015, 19.53.44
potter potter non è collegato
Nuovo robottaro
 
Data registrazione: 12-09-2015
Residenza: lombardia
Messaggi: 11
Potenza reputazione: 0
potter E' per ora ancora un mistero
Predefinito motore stepper

Salve a tutti, sono un nuovo iscritto e principiante ( anche di forum) per quanto riguarda arduino e motori stepper .
Sto tentando di far funzionare come si deve un motore passo passo con corrente di targa 1,4 A e tensione 6,02V .
Sto usando un alimentatore 24VCC 10A , e un pololu 8825 .
Lo scopo sarebbe anche abbastanza banale : marcia avanti -indietro (con due pulsanti ) e regolazione velocità con potenziometro .
Per quanto riguarda marcia avanti -indietro , con velocità fissa non ci sono stati grossi problemi , questo e' il codice :


int Step=7;
int Dir=8;
int EN=12; //a livello alto disabilita la marcia
int puls1=10; // pulsante avanti
int puls2=11; //pulsante indietro
int puls1State=0;
int puls2State=0;

void setup(){

pinMode (7,OUTPUT);
pinMode (8,OUTPUT);
pinMode (12,OUTPUT);
pinMode(10,INPUT);
pinMode(11,INPUT);

}
void loop(){

digitalWrite(EN,HIGH); //alla prima alimentazione tiene spento il motore
puls1State=digitalRead(10);
puls2State=digitalRead(11);
if (puls1State==1){
digitalWrite(EN,LOW);
digitalWrite(Dir,HIGH);
}
if (puls2State==1){
digitalWrite(EN,LOW);
digitalWrite(Dir,LOW);
}

digitalWrite (Step,HIGH);
delayMicroseconds(700);
digitalWrite (Step,LOW);
delayMicroseconds(700);
}



il motore gira bene ,silenzioso (non posso scendere sotto i 700 microsecondi
altrimenti si impalla ), comunque come velocita' massima puo' andare .

il problema sorge quando modifico lo sketch per inserire il potenziometro (da 10K)
il codice e' il seguente :



const int Step=7;
const int Dir=8;
const int EN=12; //a livello alto disabilita la marcia
const int puls1=10; //pulsante avanti
const int puls2=11; //pulsante indietro
int puls1State=0;
int puls2State=0;
int sensor=A3;
int sensorValue=0;

void setup(){

pinMode (7,OUTPUT);
pinMode (8,OUTPUT);
pinMode (12,OUTPUT);
pinMode(10,INPUT);
pinMode(11,INPUT);
Serial.begin(9600);
}
void loop(){
int sensorValue=analogRead(A3);
sensor= map(sensorValue,0,1023,0,10);
Serial.println(sensorValue);
delay(1);
digitalWrite(EN,HIGH); //alla prima alimentazione tiene spento il motore
puls1State=digitalRead(10);
puls2State=digitalRead(11);
if (puls1State==1){
digitalWrite(EN,LOW);
digitalWrite(Dir,HIGH);
}
if (puls2State==1){
digitalWrite(EN,LOW);
digitalWrite(Dir,LOW);
}

digitalWrite (Step,HIGH);
delayMicroseconds(sensorValue);

digitalWrite (Step,LOW);
delayMicroseconds(sensorValue);

}


in questo caso il motore non gira piu' fluido , e' molto rumoroso, vibra , la velocita' massima e' molto bassa e la regolazione della stessa non uniforme.
Ho provato a cambiare i dati della "map" ( l’ultimo paremetro) senza risultati apprezzabili ,
sapreste indicarmi qualche soluzione ?

Vi ringrazio in anticipo e Saluto
Rispondi citando
  #2  
Vecchio 02-10-2015, 23.46.13
potter potter non è collegato
Nuovo robottaro
 
Data registrazione: 12-09-2015
Residenza: lombardia
Messaggi: 11
Potenza reputazione: 0
potter E' per ora ancora un mistero
Predefinito

Ciao a tutti e grazie per avermi risposto ,
sono ritornato alle prese col mio stepper e arduino .
Ho cambiato la parte di codice che mi ha fatto notare -leleastro- ,
ho provato anche a cambiare gli ingressi digitali e quello del potenziometro ,
sostituito il potenziometro con un lineare multigiro ( cosi e' piu' sensibile la regolazione ) ,
il funzionamento del motore e' pero' sempre molto irregolare :

const int Step=7;
const int Dir=8;
const int EN=12;//a livello alto disabilita la marcia
const int puls1=4;
const int puls2=5;
int puls1State=0;
int puls2State=0;
int sensor=A1;
int sensorValue=0;

void setup(){

pinMode (7,OUTPUT);
pinMode (8,OUTPUT);
pinMode (12,OUTPUT);
pinMode(4,INPUT);
pinMode(5,INPUT);
Serial.begin(9600);
}
void loop(){
int sensorValue=analogRead(A1);
sensor= map(sensorValue,0,1023,0,700);
Serial.println(sensor);
delay(1);
digitalWrite(EN,HIGH);//alla prima alimentazione tiene spento il motore
puls1State=digitalRead(4);
puls2State=digitalRead(5);
if (puls1State==1){
digitalWrite(EN,LOW);
digitalWrite(Dir,HIGH);

}
if (puls2State==1){
digitalWrite(EN,LOW);
digitalWrite(Dir,LOW);

}

digitalWrite (Step,HIGH);
delayMicroseconds(sensor);

digitalWrite (Step,LOW);
delayMicroseconds(sensor);

}


(controllando il serial monitor , dove vedo la variazione del pot da 0 a 700)
succede questo :
- pigio un pulsante di rotazione
- valore a zero e il motore gira ( ????...), adagio e vibrante
- valore a 2 di colpo la velocita' aumenta
- poi da 2 a 10 la velocita' non varia
- da 10 a 100 un altro cambio di velocita'
- da100 a 700 non succede piu' nulla

( spero si capisca qualcosa da questa spiegazione )

e' come se la mappatura del potenziometro non venisse "riconosciuta "
in modo corretto o qualcosa del genere ,non saprei ....
forse il codice non e' giusto …..
inolte il motore risulta sempre molto rumoroso e vibrante ,provato anche in half - step ; niente a che vedere con il funzionamento a velocita' fissa (silenziosissimo e regolare nella rotazione )

Ringrazio in anticipo chiunque vorra' intervenire in mio aiuto .

Saluti
Rispondi citando
  #3  
Vecchio 03-10-2015, 14.16.11
L'avatar di Extar
Extar Extar non è collegato
Robottaro senior
 
Data registrazione: 11-10-2011
Residenza: lucca
Messaggi: 76
Potenza reputazione: 36
Extar E' per ora ancora un mistero
Predefinito

Attenzione, stai utilizzando la pausa fra un passo e l'altro in maniera completamente sbagliata.
Se la pausa aumenta il motore gira più lento, se la pausa diminuisce il motore gira più veloce.

Nel programma hai scritto:
Codice:
int sensorValue=analogRead(A1);
sensor= map(sensorValue,0,1023,0,700);

[...]

digitalWrite (Step,HIGH);
delayMicroseconds(sensor);

digitalWrite (Step,LOW);
delayMicroseconds(sensor);
Quindi, con il potenziometro "al massimo" hai una pausa di 700, e il motore gira alla sua massima velocità. Ruotando il potenziometro la pausa continua a scendere e il motore tende sempre ad incrementare la sua velocità. Dato che la velocità massima che hai testato è di 700, il motore va oltre le sue capacità e questo causa le vibrazioni e gli altri effetti.
Devi fare in modo che ruotando il potenziometro la pausa possa aumentare da un minimo di 700 fino ad un massimo da te definito, che rappresenta la velocità minima. A questo proposito fai attenzione perché l'assorbimento medio di uno stepper aumenta con il diminuire della velocità.

Saluti.
__________________
Le cronache di un laboratorio tormentato: T.S Labs


Store Tindie
Rispondi citando
  #4  
Vecchio 04-10-2015, 20.38.43
potter potter non è collegato
Nuovo robottaro
 
Data registrazione: 12-09-2015
Residenza: lombardia
Messaggi: 11
Potenza reputazione: 0
potter E' per ora ancora un mistero
Predefinito

Grazie Extar per la replica,

problema ( quasi ) risolto !!!

ho rivisto la parte di codice da te segnalata e l'ho modificata con questa sotto
( non e' perfetta ma almeno adesso il concetto e' un po' piu' chiaro)
daltronde ho appena finito di leggere lo Starter Kit , figuratevi quindi a che livello e' la mia preparazione .


Codice:
void loop(){
  
  int sensorValue=analogRead(A1);
  int sensor= map(sensorValue,0,1024,900,0);


comunque , ritornando al punto , dopo tale modifica il funzionamento era pressochè simile
al precedente ( motore rumoroso , gracchiante , pochissimo controllo della velocita’) .
Quindi da “non piu’ “ giovane smattone ho cominciato ad eliminare parti di programma
che secondo me potevano in qualche modo influire sul malfunzionamento del sistema .
Sono giunto alla conclusione ,con non poco stupore , che la causa era SERIAL.BEGIN(9600);


Codice:
void setup(){

pinMode (7,OUTPUT);
pinMode (8,OUTPUT);
pinMode (12,OUTPUT);
pinMode(4,INPUT);
pinMode(5,INPUT);
//Serial.begin(9600);
}
void loop(){
  
  int sensorValue=analogRead(A1);
  sensor= map(sensorValue,0,1024,900,0);
  Serial.println(sensor);
eliminando quella riga di programma il motore ha iniziato a comportarsi “ come un motore “ :
start e stop in avanti e indietro ma soprattutto una regolazione omogenea della velocità e motore silenzioso senza vibrazioni .
Il perche’ di questo non me lo so spiegare ………e poi……….
siete voi i cervelloni robotici ……… o no ?

E comunque , non e’ finita qui perché come dicevo all’inizio : “ problema (quasi ) risolto !!! ”
Infatti mi succede che , seppur la velocità del motore è proporzionale alla rotazione del potenziometro , quando metto quest’ultimo a zero , il motore continua a girare ; adagio …ma
continua a girare .
E questo al momento rimane ancora un mistero ........

Un Grazize e un Saluto
Rispondi citando
  #5  
Vecchio 05-10-2015, 10.09.25
L'avatar di Extar
Extar Extar non è collegato
Robottaro senior
 
Data registrazione: 11-10-2011
Residenza: lucca
Messaggi: 76
Potenza reputazione: 36
Extar E' per ora ancora un mistero
Predefinito

Citazione:
eliminando quella riga di programma il motore ha iniziato a comportarsi “ come un motore “ :
start e stop in avanti e indietro ma soprattutto una regolazione omogenea della velocità e motore silenzioso senza vibrazioni .
Il motivo effettivamente non è molto facile per uno alle primissime armi.
Vedrò di dare una mia spiegazione, magari non sarà precisissima, ma non dovrebbe essere un'eresia
Il problema non è tanto il Seria.begin ma il Serial.printLn.
Con Serial.printLn invii sulla seriale la variabile sensor, dato che è un intero (int), su arduino occupa 16 bit. A questi si aggiungono i caratteri Line Feed e Carriage Return che occupano ciascuno 4 bit. (sono i caratteri per il comando "a capo e nuova linea")
In totale stai inviando sulla seriale 24 bit. Con la velocità di trasmissione a 9600bit/sec (impostata su Serial.Begin(9600); ) ci metti:

24/9600 = 0.0025 s = 2.5 msec

Questo tempo non è nient'altro che un'ulteriore "pausa" che va ad inserirsi prima del primo passo che fai nel programma. in pratica è come scrivere:
Codice:
[...]

delayMicroseconds(2500);

digitalWrite (Step,HIGH);
delayMicroseconds(sensor);

digitalWrite (Step,LOW);
delayMicroseconds(sensor);
Eliminando Serial.begin hai implicitamente eliminato anche Serial.println e il programma ha funzionato.
Forse ti ho solo ingrabugliato le idee.. Se è così lasciamo stare, è un concetto non molto immediato. Se proprio hai bisogno di usare la seriale puoi aumentare la velocità di trasmissione e aumentare il tempo della prima pausa.

Citazione:
Infatti mi succede che , seppur la velocità del motore è proporzionale alla rotazione del potenziometro , quando metto quest’ultimo a zero , il motore continua a girare ; adagio …ma
continua a girare .
E questo al momento rimane ancora un mistero ........
Semplice, se il potenziometro è a zero, la variabile sensor assume il valore massimo, ovvero 900. La pausa fra un passo e l'altro è di 900, e il motore gira comunque. Per farlo fermare devi usare qualcosa di diverso quando il potenziometro va a zero. Ma lascio a te cercare di capire come fare, le testate contro la scrivania per capire cosa non va e come risolverlo fanno parte di arduino

Saluti.
__________________
Le cronache di un laboratorio tormentato: T.S Labs


Store Tindie
Rispondi citando
  #6  
Vecchio 05-10-2015, 10.40.34
L'avatar di sergio_camici
sergio_camici sergio_camici non è collegato
Administrator
 
Data registrazione: 24-05-2002
Residenza: Binasco (MI)
Età : 55
Messaggi: 2,665
Potenza reputazione: 304
sergio_camici La sua reputazione è oltre la sua famasergio_camici La sua reputazione è oltre la sua famasergio_camici La sua reputazione è oltre la sua famasergio_camici La sua reputazione è oltre la sua famasergio_camici La sua reputazione è oltre la sua famasergio_camici La sua reputazione è oltre la sua famasergio_camici La sua reputazione è oltre la sua fama
Predefinito

Concordo con l'analisi ma non con il dato quotato.

Citazione:
Orginalmente inviato da Extar Visualizza messaggio
A questi si aggiungono i caratteri Line Feed e Carriage Return che occupano ciascuno 4 bit. (sono i caratteri per il comando "a capo e nuova linea")
i caratteri trasmessi via seriale sono tutti lunghi 8bit.
__________________
ciao
Sergio
---
Hai deciso di costruire un robot? Bene...
Cominciamo dalle brutte notizie: non e' facile...
Rispondi citando
  #7  
Vecchio 28-09-2015, 14.10.55
L'avatar di marnic
marnic marnic non è collegato
Administrator
 
Data registrazione: 24-05-2002
Residenza: Monselice (PD)
Età : 58
Messaggi: 5,458
Potenza reputazione: 423
marnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua fama
Predefinito

lo stepper usato a passi interi è spesso rumoroso e funziona "vibrando" molto e questo perchè normalmente parte e si ferma ad ogni step

con i 700 microsecondi di pausa hai raggiunto la velocità massima (visto che dopo si impalla)

non ho fatto i conti ma nel tuo listato, con il potenziometro per la velocità massima, quanto è la pausa?

Il potenziometro è lineare o logaritmico?
__________________
Marnic
Roboitalia Staff
www.fabbrimarco.com
Rispondi citando
  #8  
Vecchio 28-09-2015, 21.15.51
potter potter non è collegato
Nuovo robottaro
 
Data registrazione: 12-09-2015
Residenza: lombardia
Messaggi: 11
Potenza reputazione: 0
potter E' per ora ancora un mistero
Predefinito motore stepper

Ciao Marnic e grazie per avermi risposto.

Diciamo quindi che, seppur a tentativi, mi sono trovato la velocita'
massima del motore , con i 700 microsec.
Per scrupolo ho controllato anche la tensione dell'alimentatore = 27,4V

La pausa che leggevo sul monitor , con potenziometro al massimo , era superiore a 700 .......credo ...
( purtroppo non posso verificarlo ora perche' sono in giro per lavoro )

era riferito a questo la tua domanda ?

dovrei forse far lavorare la MAP da 0 a 700 ?
credo non mi sia chiaro il concetto .

Il potenziometro che sto usando e' un logaritmico da10k ; ne avevo provato anche uno ( sempre rotativo) multigiro da 20K , ma non cambiava nulla .


Grazie e Saluti
Rispondi citando
  #9  
Vecchio 29-09-2015, 09.06.24
leleastro leleastro non è collegato
Robottaro senior
 
Data registrazione: 28-08-2006
Residenza: Italia
Età : 30
Messaggi: 52
Potenza reputazione: 152
leleastro La sua reputazione è oltre la sua famaleleastro La sua reputazione è oltre la sua famaleleastro La sua reputazione è oltre la sua famaleleastro La sua reputazione è oltre la sua famaleleastro La sua reputazione è oltre la sua fama
Predefinito

Citazione:
Orginalmente inviato da potter Visualizza messaggio
Codice:
sensor= map(sensorValue,0,1023,0,10);
dopo però continui ad usare sensorValue.
Inoltre se ho capito quello che vuoi fare map ti deve cacciare come minimo 700.
__________________
"Physics is like sex. Sure it may give some practical results but that's not why we do it." Richard Feynman
Rispondi citando
  #10  
Vecchio 29-09-2015, 10.31.52
L'avatar di marnic
marnic marnic non è collegato
Administrator
 
Data registrazione: 24-05-2002
Residenza: Monselice (PD)
Età : 58
Messaggi: 5,458
Potenza reputazione: 423
marnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua fama
Predefinito

il potenziometro logaritmico ha appunto una variazione del valore... logaritmica in pratica vai da 0 al 90% con pochi gradi di rotazione
__________________
Marnic
Roboitalia Staff
www.fabbrimarco.com
Rispondi citando
Rispondi


Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti)
 
Strumenti discussione
Modalità  visualizzazioe

Regole di scrittura
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code è Attivato
Le smilies sono Attivato
[IMG] è Attivato
Il codice HTML è Disattivato

Vai al forum

Discussioni simili
Discussione Autore discussione Forum Risposte Ultimo messaggio
Help arduino ---> Motore stepper linux177 E. Digitale 3 19-07-2010 12.23.26
Controllo Motore Stepper con micro Gotta89 E. di Potenza 0 11-03-2009 14.33.24
Gestione fine corsa motore stepper linuxdrake Elettronica 9 23-01-2009 18.11.15
Motore stepper controllo coals Motori e azionamenti 5 23-02-2005 16.17.58
Come posso dimensionare un motore Stepper??? elia Motori e azionamenti 4 10-09-2003 12.34.06


Tutti gli orari sono GMT. Adesso sono le: 22.37.40.


Basato su: vBulletin Versione 3.8.8
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
Realizzazione siti web Cobaltica Foligno
spacer.png, 0 kB