Vai al contenuto
PLC Forum


Stepper Motor controllato da Encoder Rotativo


driftking

Messaggi consigliati

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;
}
}
Link al commento
Condividi su altri siti


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°

Link al commento
Condividi su altri siti

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

RedBoard_circuit_05_01.png

Link al commento
Condividi su altri siti

Si la filosofia è questa. In più dovresti azzerare il conteggio quando incontri lo switch del limite minimo

Link al commento
Condividi su altri siti

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

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