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

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.


Arduino Forum > Using Arduino > Sensors > Reading encoder to count steps(solved)


arduino

Comments

Popular posts from this blog

opencv3, tbb and rasp pi 2 - Raspberry Pi Forums

small ethernet problem - Raspberry Pi Forums

Multithumb configuration params not working? - Joomla! Forum - community, help and support