driftking Inserito: 23 giugno 2017 Segnala Inserito: 23 giugno 2017 Buongiorno a tutti, sono nuovo del forum, scrivo perchè ho sinceramente bisogno di voi e del vostro prezioso aiuto. Vi spiego, ho uno stepper controllato da un modulo l298n e pilotato da un econder rotativo, fino a qui funziona tutto nel senso che sono riuscito a fargli fare ciò che volevo. Lo stepper serve per aprire una saracinesca del flusso dell'aria quindi ha un movimento massimo e minimo, qui ho bisogno di voi. Ho anche preso un circular led per sapere la posizione http://wiki.seeedstudio.com/wiki/Grove_-_Circular_LED A questo punto vi chiedo come poter fare due cose: 1° impostare i limiti dello stepper cioè al raggiungimento delle due posizioni min e max ad ogni movimento dell'encoder nella stessa direzione non succede nulla; 2° configurare i led circolari per impostare la scala con il min e max dell ostepper e monitorare i movimenti intermedi casomai con 5 step Vi sono molto grato, di seguito vi metto il codice attuale che dovrei integrare. Grazie Tanto Claudio Questo è il codice che ora mi fa funzionare lo stepper con l'encoder rotativo #include <Stepper.h> const int encoderPinA = 2; // right const int encoderPinB = 3; // left const int encButton = 0; // encoder push button int encoderPos = 0; // counter unsigned int lastReportedPos = 1; // change static boolean rotating = false; // debounce boolean A_set = false; boolean B_set = false; const int stepsPerRevolution = 150; Stepper myStepper(stepsPerRevolution, 4, 5, 6, 7); //h-bridge pins void setup() { myStepper.setSpeed(50); pinMode(encoderPinA, INPUT_PULLUP); //enabling pullups pinMode(encoderPinB, INPUT_PULLUP); pinMode(encButton, INPUT_PULLUP); attachInterrupt(0, doEncoderA, CHANGE); //pin 2 attachInterrupt(1, doEncoderB, CHANGE); //pin 3 Serial.begin(9600); } void loop() { rotating = true; // reset the debouncer if (lastReportedPos != encoderPos) { Serial.println(encoderPos); lastReportedPos = encoderPos; if (digitalRead(encButton) == LOW ) { encoderPos = (encoderPos * 50); //change the 100 to how many steps } //you want the stepper to move when myStepper.step(encoderPos); //the button is pushed down encoderPos = 0; } } void doEncoderA() { // debounce if ( rotating ) delay (50); // wait a little until the bouncing is done // Test transition if ( digitalRead(encoderPinA) != A_set ) { // debounce once more A_set = !A_set; // adjust counter + if A leads B if ( A_set && !B_set ) encoderPos += 90; //change the 1 to steps to take when encoder turned rotating = false; // no more debouncing until loop() hits again } } // Interrupt on B changing state void doEncoderB() { if ( rotating ) delay (1); if ( digitalRead(encoderPinB) != B_set ) { B_set = !B_set; // adjust counter - 1 if B leads A if ( B_set && !A_set ) encoderPos -= 90; //change the 1 to steps to take when encoder turned rotating = false; } }
Livio Orsini Inserita: 24 giugno 2017 Segnala Inserita: 24 giugno 2017 Non c'è bisogno di codice ma di...altro. presumo che l'encoder sia del tipo incrementale, se invece fosse assoluto cambierebbe tutto. Se ho compreso correttamente, l'encoder non da la posizione effettiva, ma da solo il riferimento di posizione. Il metodo più sicuro, per limitare la corsa, è quello di mettere 2 switches che siano impegnati dalla serranda quando ha raggiunto uno dei 2 limiti di posizione. Se non è possibile montare i due sensori, allora è un ......problema insolubile. A meno di poter mandare a zero la serranda in battuta meccanica e poi contare il numero di impulsi corrispondenti alla completa escursione. Per la scal dei LEDs è abbastanza banale, però è necessario conoscere quanto vale in termini di angolo un passo di stepper. Una volta che hai azzerato la posizione dello stepper e quindi sai a quale posizione angolare corrisponde lo zero delle serranda individui il LEDs corrispondente. Tutto l'angolo di 360° corrisponde a 24 LEDs, quindi ogni LED dista dal precedente e dal seguente di 15 gradi. A questo punto quando lo stepper si è spostato di un numero di passi corrispondente a 15° accendi il LED successivo, e così via. Idem per il moto in senso inverso, spegni i LEDs ad intervalli di 15°
driftking Inserita: 26 giugno 2017 Autore Segnala Inserita: 26 giugno 2017 Livio grazie mille per il contributo......ti aggiorno sugli sviluppi Scusami quindi installa due micro switch che quando scattano inibiscono il movimento del motore in quella direzione, invece quando l'encoder gira dalla parte opposta riabilitano il movimento!! In teoria dovrebbe essere così.....sembra facile tradurlo per un "novellino" Claudio
Livio Orsini Inserita: 26 giugno 2017 Segnala Inserita: 26 giugno 2017 Si la filosofia è questa. In più dovresti azzerare il conteggio quando incontri lo switch del limite minimo
driftking Inserita: 26 giugno 2017 Autore Segnala Inserita: 26 giugno 2017 Cosa intendi di preciso......scusami se ti chiedo anche stupidità ma sono veramente un neofita, infatti vorrei chiederti anche indicazioni visto il mio codice base su come poter procedere x impostare i limiti dati dagli switch. Veramente grazie mille x il contributo Claudio
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora