Buongiorno!
Sto cercando di realizzare una sorta di sincronizzazione tra un motore a spazzole ed un motore passo-passo e per il momento funziona solo per multipli tra passi rilevati dall'encoder (40 passi/giro montato sul motore a spazzole... che diventeranno almeno 400) ed i microstep del motore (400/800/1600, ecc).
Il codice del programma l'ho recuperato in internet e ho semplicemente aggiunto in while un ciclo for che per ogni passo rilevato dall'encoder fa fare un certo numero di passi al motore passo-passo. Tutto funziona bene, ma avrei la necessità di non lavorare con gli interi... l'obbiettivo sarebbe quello di far fare, ad esempio, 4 passi al motore passo-passo per ogni 3 passi rilevati dall'encoder (questo rapporto sarà variabile).
Avevo pensato ad un sistema che contasse gli impulsi dell'encoder ed ogni tot mandasse un impulso al motore passo-passo, ma le mie conoscenze non sono così approfondite...
Mi potreste dare uno spunto per capire quale funzione/procedura potrei utilizzare?
Grazie in anticipo!
/* Digital Pin 2 accepts external interrupts. Pin1 of a rotary encoder
is attached to DigitalPin2. An interrupt routine will be called
when pin1 changes state, including noise.
This will be made more efficient with hardware debouncing.
*/
int pin1 = 2;
int pin2 = 3;
long counter;
boolean goingUp = false;
boolean goingDown = false;
//parte relativa al motore
const int Enable = 6; // pin enable (blu)
const int Direzione = 7; // pin direzione (verde)
const int Pulsazione = 8; // pin pulsazione (grigio)
int sync = 20;
void setup()
{
counter = 0;
//Serial prints for debugging and testing
Serial.begin(9600);
/* Setup encoder pins as inputs */
pinMode(pin1, INPUT); // Pin 2
pinMode(pin2, INPUT); // Pin 4
// encoder pin on interrupt 0 (pin 2)
attachInterrupt(0, decoder, FALLING);
//parte relativa al motore
pinMode(Enable, OUTPUT); //pin 6
pinMode(Direzione, OUTPUT); //pin 7
pinMode(Pulsazione, OUTPUT); //pin 8
pinMode(Enable, OUTPUT); //pin 6
pinMode(Direzione, OUTPUT); //pin 7
pinMode(Pulsazione, OUTPUT); //pin 8
digitalWrite(Enable, LOW); //acceso
}
void loop()
{
//using while statement to stay in the loop for continuous
//interrupts
while(goingUp==1) // CW motion in the rotary encoder
{
goingUp=0; // Reset the flag
counter ++;
for(int i=0;i<sync;i++){
digitalWrite(Direzione, LOW);
digitalWrite(Pulsazione, HIGH);
digitalWrite(Pulsazione, LOW);
delayMicroseconds(350);
}
Serial.println(counter);
}
while(goingDown==1) // CCW motion in rotary encoder
{
goingDown=0; // clear the flag
counter --;
for(int i=0;i<sync;i++){
digitalWrite(Direzione, HIGH);
digitalWrite(Pulsazione, HIGH);
digitalWrite(Pulsazione, LOW);
delayMicroseconds(350);
}
Serial.println(counter);
}
}
void decoder()
//very short interrupt routine
//Remember that the routine is only called when pin1
//changes state, so it's the value of pin2 that we're
//interrested in here
{
if (digitalRead(pin1) == digitalRead(pin2))
{
goingUp = 1; //if encoder channels are the same, direction is CW
}
else
{
goingDown = 1; //if they are not the same, direction is CCW
}
}