Reading encoder to count steps(solved)
in project use stepper motor , spindle compress spring.
to measure position/displacement spring compressed placed on axle of stepper motor encoder disk 300lpi resoltuion.
a full steppermotor turn 200 steps , 2 mm displacement of compression.
i need know value @ 1 mm displacement need increment/decrement encoder value of 1070.
so motor turning 1 step or constant rotation stepcounter not increment/decrement.
i guess overlooking basics after 10 hours of struckle. :-)
any idea how simple solution be?
thanks, paco
to measure position/displacement spring compressed placed on axle of stepper motor encoder disk 300lpi resoltuion.
a full steppermotor turn 200 steps , 2 mm displacement of compression.
i need know value @ 1 mm displacement need increment/decrement encoder value of 1070.
so motor turning 1 step or constant rotation stepcounter not increment/decrement.
i guess overlooking basics after 10 hours of struckle. :-)
any idea how simple solution be?
thanks, paco
code: [select]
#include <stepper.h>
//left = down
//right = up
// stepper has 200 revolutions 360 degrees = 2 mm pitch use 1 mm steps = 100 steps = 1070 pulses encoder
const int stepsperrevolution = 100;
stepper mystepper(stepsperrevolution, 4,5,6,7); // use digital pins 4,5,6,7 l298 stepper driver
boolean leftturnsingle = 0;
boolean rightturnsingle = 0;
boolean leftturnconstant = 0;
boolean rightturnconstant = 0;
boolean startstate = 0;
boolean recordingstate = 0;
boolean returnstate = 0;
int incomingbyte = 0; // incoming serial data
int stepcounter = 100;
int analog2 = 16; // use analog port on shield push button control movement , direction
int analog3 = 17; // use analog port on shield push button control movement , direction
int enablepin10= 10; //pin enable/disable coil power
int enablepin11= 11; //pin enable/disable coil power
///////////////////////////////
enum pinassignments
{
encoderpina = 2, // rigth
encoderpinb = 3, // left
};
long encoderpos = 100000; // starting counterposition encoder
long encoderposold = 100000;
unsigned int lastreportedpos = 1; // change management
static boolean rotating = false; // debounce management
// interrupt service routine vars encoder disk
boolean a_set = false;
boolean b_set = false;
///////////////////////////////
void setup()
{
serial.begin(9600);
pinmode(enablepin10,output);
pinmode(enablepin11,output);
mystepper.setspeed(400); // set stepperspeed @ xxx rpm:
pinmode(encoderpina, input);
pinmode(encoderpinb, input);
// turn on pullup resistors encoder
digitalwrite(encoderpina, high);
digitalwrite(encoderpinb, high);
// encoder pin on interrupt 0 (pin 2)
attachinterrupt(0, doencodera, change);
// encoder pin on interrupt 1 (pin 3)
attachinterrupt(1, doencoderb, change);
}
void loop()
{
leftturnsingle = digitalread(analog3);
rightturnsingle = digitalread(analog2);
serial.print("a,");
serial.println(stepcounter);
serial.print("b,");
serial.println(encoderpos,dec);
//serial.print("c,");
//serial.println("datafromloadcell");
if (encoderpos >= (encoderposold + 1070)) //if value 1070 higher last known raise stepcounter 1
{
stepcounter = stepcounter + 1;
}
if (encoderpos <= (encoderposold - 1070)) //if value 1070 lower last known reduce stepcounter 1
{
stepcounter = stepcounter - 1;
}
if (leftturnsingle == 1)
{
digitalwrite(enablepin10,high);
digitalwrite(enablepin11,high);
mystepper.step(stepsperrevolution); // left turn of 100 steps
}
else if (rightturnsingle == 1)
{
digitalwrite(enablepin10,high);
digitalwrite(enablepin11,high);
mystepper.step(stepsperrevolution * -1); // right turn of 100 steps
}
else
{
digitalwrite(enablepin10,low);
digitalwrite(enablepin11,low);
}
encoderposold = encoderpos;
}
// interrupt on changing state
void doencodera(){
// debounce
if ( rotating ); //removed 1 delay // wait little until bouncing done
// test transition, did things change?
if( digitalread(encoderpina) != a_set ) { // debounce once more
a_set = !a_set;
// adjust counter + if leads b
if ( a_set && !b_set )
encoderpos += 1;
rotating = false; // no more debouncing until loop() hits again
}
}
// interrupt on b changing state, same above
void doencoderb(){
if ( rotating ); //removed 1 delay
if( digitalread(encoderpinb) != b_set ) {
b_set = !b_set;
// adjust counter - 1 if b leads a
if( b_set && !a_set )
encoderpos -= 1;
rotating = false;
}
}
anything modify in interrupt , use elsewhere, such encoderpos, should declared volatile.
i'd inclined (if haven't already) write simpler ensure can read encoders correctly before trying debug full sketch.
i'd inclined (if haven't already) write simpler ensure can read encoders correctly before trying debug full sketch.
Arduino Forum > Using Arduino > Sensors > Reading encoder to count steps(solved)
arduino
Comments
Post a Comment