MauPre75 ha scritto: ↑mercoledì 20 dicembre 2023, 11:54
Ti giro lo sketch di un divisore se cosi vogliamo chiamarlo ,quando mi cimentai l'ho definito cosi , ma realmente puo' anche essere un moltiplicatore di giri o altro, non prevede accelerazione ne decellerazione quindi fin quando restiamo su un motore nema17 ed una ruota con celle realizzato in plastica e piccoli pezzi non dovremmo avere il problema derivante dalle inerzie preannunciato da torn24, ma se si tratta di un prototipo in scala da realizzare successivamente in grande scala il problema dell' accelerazione esiste e dovra' includere la libreria acceler step e forse ben altro.
fai copia ed incolla del codice cosi com'è ,stai attento a non aggiungere o togliere spazi dai righi.
E' preimpostato che il motore faccia una rivoluzione con 200 passi ma suppongo che imposterai sul driver il micropasso quindi sostituisci 200 con il micropasso che adotterai.
Per impostare la divisione che vuoi al penultimo rigo di codice " step(direzione = true,stepNumber*2);" devi sostituire il *2 che indica di fare due rivoluzioni con *1/10 se hai 10 celle ,tecnicamente la frazione del giro intero, se usassi un riduttore di giri invece dovresti calcolare di effettuare piu' rivoluzioni quindi *10 per fare 10 giri per esempio.
Sono previsti 4 pulsanti due per incrementare o decrementare il numero di movimenti ma a te serve il solo incremento e due per la direzione ma a te serve che vada in un solo senso , sei libero di scegliere o meno di collegare i pulsanti che ti servono .
La velocità è stabilita dai due delay in void step impostati a (5) se vuoi rallentare aumenta questo valore ,per accelerare diminuisci ma stai attento che potrebbe stallare il motore e perdere passi, da provare e testare ,per la velocità finale puoi giocare con il micropasso in fin dei conti.
L' ultimo delay a fine codice è il tempo di pausa da effettuare tra un ciclo e l'altro se ti servono tempi lunghi non ricordo bene ma arduino ha un metodo particolare per gestirli quindi inserire un 15000 potrebbe non essere corretto , non sono ferrato in arduino quindi potrei aver detto una cavolata, però quel tempo è utilizzato se premi due volte il pulsante buttpiu ma se viene premuto una sola volta il ciclo si ferma in attesa del prossimo segnale di ciclo ,fai i primi test e valuta se non è necessario modificarlo.
Non sono ferrato in programmazione , arrivai a questo skecth scopiazzando in rete quindi se qualcuno ha critiche o suggerimenti sono bene accetti per migliorare, a suo tempo fu testato quindi lo do per funzionante .
Spero possa esserti d' aiuto.
Codice: Seleziona tutto
/*
stepper control logic
*/
int dirPin = 8;
int stepperPin = 3;
int buttOrario =5;
int buttAntior =4;
int buttPiu =6;
int buttMeno =7;
int stepNumber =200;
int direzione = true;
void setup() {
pinMode(dirPin, OUTPUT);
pinMode(stepperPin, OUTPUT);
pinMode( buttOrario, INPUT );
pinMode(buttAntior, INPUT );
pinMode(buttPiu, INPUT );
pinMode(buttMeno,INPUT );
}
void step(boolean dir, int steps){
digitalWrite(dirPin,dir);
delay(50);
for(int i=0;i<steps;i++){
digitalWrite(stepperPin, HIGH);
delay(5);
digitalWrite(stepperPin,LOW);
delay(5);
Serial.begin(9600);
}
}
void loop(){
if (digitalRead(buttPiu) == HIGH ){
stepNumber = (stepNumber + 100);
} else if (digitalRead(buttMeno) == HIGH ){
stepNumber = (stepNumber - 100);
}
if (stepNumber <= 0) stepNumber = 0;
if (digitalRead(buttOrario) == HIGH ){
direzione = true;
} else if (digitalRead(buttAntior) == HIGH ){
direzione = false;
}
step(direzione = true,stepNumber*2);
delay(1500);
}