Go Down

Topic: 2 stepper motors running at the same time ?library (Read 569 times) previous topic - next topic

adrien

Aug 01, 2009, 05:27 pm Last Edit: Aug 01, 2009, 07:26 pm by adrien Reason: 1
i am using 2 easydrivers( using 2 pins, one for direction and the other for the number of steps), and i am trying to build a library which allow you to make the motor run at the same time with different speed, but i 
couldn't manage how to ignore the delay() between 2 steps in the main loop()  ?? for now only one stepper is moving and then the other one start. it's my first library.
a little help would be more than welcome.


here is the library

Code: [Select]


#ifndef Mot_h
#define Mot_h


#include "WProgram.h"


class Mot
{
 
public:
   Mot(int pindir, int pinstep);

  void move(int step,int del, boolean dir);//del=delay();

     

 private:
 


 int dirpin;
   int steppin;
 int step;
int del;
boolean dir;
};


#endif

//////////////////////////////////////////////////////////////////////////////
#include "WProgram.h"
#include "Mot.h"

Mot::Mot(int pindir, int pinstep)
{
 pinMode(pindir, OUTPUT);
 pinMode(pinstep, OUTPUT);
 
dirpin = pindir;
steppin=pinstep;
}


void Mot::move(int step,int del, boolean dir)
{
int i;

if(dir==false){
digitalWrite(dirpin,HIGH);
for(i=0;i<step;i++){
 digitalWrite(steppin, HIGH);
delayMicroseconds(del);  
 digitalWrite(steppin, LOW);
delayMicroseconds(del);  
}
}
if(dir==true){
digitalWrite(dirpin,LOW);

for(i=0;i<step;i++){
 digitalWrite(steppin, HIGH);
delayMicroseconds(del);  
 digitalWrite(steppin, LOW);
delayMicroseconds(del);  
}
}

}




here's the arduino code

Code: [Select]
#include <Mot.h>
Mot motx=Mot(2,3);
Mot moty=Mot(5,6);
int deltaxneg=0;
int deltayneg;
int mess [15];
int deltax=0;
int deltay=0;
int delx=0;
int dely=0;
int dess=0;
boolean dirx;
boolean diry;
int pindir=2;
int pinstep=3;

void setup() {
Serial.begin(115200); // Initiate Serial Communication
pinMode(pindir,OUTPUT);
pinMode(pinstep,OUTPUT);
establishContact();

}
void loop() {
int i;
int j;
int r;
 if ( Serial.available() ) {

  for (i=0;i<15;i++){
  mess[i]=0;
 
mess [i]=Serial.read()-48;
delayMicroseconds(100);

  }
 
  deltax=mess[0]*100+mess[1]*10+ mess[2] ;  
  deltay=mess[3]*100+mess[4]*10+ mess[5] ;  
  delx=mess[6]*1000+mess[7]*100+ mess[8]*10+mess[9]  ;  
  dely=mess[10]*1000+mess[11]*100+ mess[12]*10+mess[13] ;
  dess=mess[14];
 
   if((deltay>0)&&(deltay<500)){
     diry=true;
     moty.move(deltay*5,dely,diry);
  }
  if((deltay>500)&&(deltay<1000)){
    diry=false;
    deltayneg=deltay-500;
    moty.move(deltayneg*5,dely,diry);
    }

   
   
     
     if((deltax>0)&&(deltax<500)){
 dirx=true;
    motx.move(deltax*5,delx,dirx);

  }
  if((deltax>500)&&(deltax<1000)){
    dirx=false;
   
    deltaxneg=deltax-500;
  motx.move(deltaxneg*5,delx,dirx);
     
    }
Serial.flush();
Serial.print('A', BYTE);

}}
void establishContact() {
 while (Serial.available() <= 0) {
   Serial.print('A', BYTE);   // send a capital A
   delay(300);
 }
}
 



rusew

I didn't have a chance to look at your code too closely, but you could probably use the millis() function instead of delays.

Go Up