Go Down

Topic: Accelstepper Lib and Menwiz Lib problem (Read 543 times) previous topic - next topic

Silverdog63

Hi,
I can't focus the proble very well, the same commands do the correct calculation but the stepper does not execute the corect movement.
Let's start with the complete code:
Code: [Select]

#include <Wire.h>
#include <LiquidCrystal.h>
#include <buttons.h>
#include <MENWIZ.h>
#include <EEPROM.h>
#include <AccelStepper.h> //instead of Stepper.h

// Create global object for menu and lcd
menwiz menu;
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

//***** Stepper Motor Parameters *****
AccelStepper stepper(4, 2, 3, 4, 5);
const int stepsPerRevolution = 200;

boolean wr=0;                         // Instantiate global variables to bind to menu
const int buttonPin = A0;             // 4 button switch circuit input connected to analog pin 0
const int led13Pin = 13;              // the number of the LED output pin
int stepCount = 0;                    // number of steps the motor has taken
int HeightZ = 0;                      //ABS Height Variable = mm
int ActualHeightZ = 0;
int NewHeightZ;
int MoveREL;                          //Rel Move Variable = mm
int Height2;
boolean buttonBlock = 0;
boolean buttonAct = 0;                // flag 1
boolean stopMenu = 0;                 // flag 2
byte buttonPressed = 0;               // which button was pressed
byte lastButtonPressed = 0;           // prev button pressed
int buttonValue = 0;                  // read value from analog port for the 4 navigation pushbuttons
long menuOffTime = 0;                 //used for timer

extern byte MW_navbtn;                //needed to run the software key navigation in Menwiz


void setup()
{
Serial.begin(9600);          // Output to serial writing
  digitalWrite((A0), HIGH);        // enable the 20k internal pullup for UNO based board for analog port A0

  //****** Motor Speed & Accel ******
   stepper.setMaxSpeed(200);
//  stepper.setSpeed(110);
     stepper.setAcceleration(50);
     
  //********** Menu and LCD *********
  char b[84];
  _menu *r,*s1,*s2,*s3;

  // initialize the menu object (16x2 LCD)
  menu.begin(&lcd,16,2);           //initialize the menwiz menu object passing the lcd object and the colums and rows params
  menu.addUsrNav(navMenu,4);
  MW_navbtn=4;                     // force 4 or 6 buttons mode for menu navigation -> MW_navbtn=4; or MW_navbtn=6;

  //****** create the menu tree *****
  r=menu.addMenu(MW_ROOT,NULL,F("MAIN MENU"));          // create a root menu at first (required)

  //****** SAW ******
  s1=menu.addMenu(MW_SUBMENU,r,F("SAW"));               // add a submenu node 2 to the root menu (control the heigh of my Saw)
   s2=menu.addMenu(MW_SUBMENU,s1,F("Saw Height"));      // (Move AT a certain mm height)
    s3=menu.addMenu(MW_VAR,s2,F("Absolute Height"));    // add a terminal node in the menu tree (that is "variable")
     s3->addVar(MW_AUTO_INT,&HeightZ,0,100,1);          // int type, fd binded variable, rage 0-100, step 1
    s3=menu.addMenu(MW_VAR,s2,F("Saw Height"));         // Call the Action ABS_Height to move the Stepper in ABS mode
     s3->addVar(MW_ACTION,ABS_Height);                  // Fire the Ation Above
   s2=menu.addMenu(MW_SUBMENU,s1,F("Saw Move"));        // add a terminal node in the menu tree (that is "variable")
    s3=menu.addMenu(MW_VAR,s2,F("Relative Move"));      // (Move OF a certain mm)
     s3->addVar(MW_AUTO_INT,&MoveREL,-100,100,1);       // int type, fd binded variable, rage -100 +100, step 1
    s3=menu.addMenu(MW_VAR,s2,F("MoveSAW"));            // Call the Action moveSAW to move the Stepper in REL mode
     s3->addVar(MW_ACTION,MoveSAW);                     // Fire the Ation Above
   s2=menu.addMenu(MW_VAR,s1,F("Zero"));                //add a terminal node in the menu tree (that is "variable"); (should set the zero)
   s2=menu.addMenu(MW_VAR,s1,F("Setup"));               //add a terminal node in the menu tree (that is "variable");  (set the parameters)

  //******* Planner *******
   s1=menu.addMenu(MW_SUBMENU,r,F("PLANNER"));
  //******* Shaper *******   
   s1=menu.addMenu(MW_SUBMENU,r,F("SHAPER"));

   
void loop()
{
  // NAVIGATION MANAGEMENT & DRAWING ON LCD. NOT BLOCKING has to be the first in the void loop
  menu.draw();
  ReadButtons();
    stepper.run();

}
void ABS_Height()                   // Absolute Height Function
{
  NewHeightZ = (HeightZ - ActualHeightZ);
  stepper.moveTo (NewHeightZ* 200);  // move Height1 mm's
   Serial.print ("Move mm ");
     Serial.print (NewHeightZ);
   Serial.print ("Height mm ");
    Serial.print (HeightZ);
  ActualHeightZ = HeightZ;
}


void MoveSAW()                      // This is the Relative Movement of the SAW. WORKING ! :-)
{
  stepper.moveTo (MoveREL * 200);    // move the SAW X mm's
   Serial.print ("Move mm ");
    Serial.print (MoveREL);
   HeightZ = (HeightZ+MoveREL);
    ActualHeightZ = HeightZ;
    MoveREL = 0;
   Serial.print ("Height mm ");
    Serial.print (HeightZ);
}

void ReadButtons()

// ++++ Control 4 buttons ++++
{
  lastButtonPressed = buttonPressed;
  buttonValue = analogRead(buttonPin); //analog value to simulate the pushed buttons


   if(buttonValue >= 850)
    {
     buttonPressed = 0;
     noButtonPressed();               // ? calling an extra fucntion
    }
   else  if(buttonValue >= 480 & buttonValue <= 550)
    {
     buttonPressed = 4;
     buttonAct = 1;                         // set the menu flag1
    }
   else if(buttonValue >= 280 & buttonValue <=380)
    {   
     buttonPressed = 3;
     buttonAct = 1;                         // set the menu flag1
    }
   else if(buttonValue >= 0 & buttonValue <=50)
    {   
     buttonPressed = 2;
     buttonAct = 1;                         // set the menu flag1
    }
   else if(buttonValue >= 100 & buttonValue <=200)
    {   
     buttonPressed = 1;
     buttonAct = 1;                         // set the menu flag1
    }
}

int noButtonPressed()
{
  return MW_BTNULL;
}

int navMenu()                              // called from menu.draw
{

  long menublockTime = millis();

  if (buttonAct == 1 && buttonPressed != 0 && stopMenu == 0)  // we have a state were we process a menu navigation step once and block it for 2 secs
   {
    digitalWrite(led13Pin,HIGH);                              // set timer led ON
    menuOffTime = menublockTime  + 400;                       //start the timer. You can change this blocking time but do not make it lower aa 200 msecs
    stopMenu = 1;

    switch (buttonPressed)
    {
    case 1: // Up
      return MW_BTU;
      break;
    case 2: // Confirm
      return MW_BTC;
      break;
    case 3: // Down
      return MW_BTD;
      break;   
    case 4: // Escape
      return MW_BTE;
      break;
    }
   }

  if (menuOffTime != 0  &&  menublockTime  > menuOffTime)     //  Reset of the timer so a new menu action can be processed
   {
    buttonAct = 0; // resets the flag 1
    buttonPressed = 0;
    menuOffTime = 0;  // resets timer to zero
    stopMenu = 0;
    digitalWrite(led13Pin,LOW);  // set timer led OFF
   }
}


This is the Calculation "core":

Code: [Select]
void ABS_Height()                   // Absolute Height Function
{
  NewHeightZ = (HeightZ - ActualHeightZ);
  stepper.moveTo (NewHeightZ* 200);  // move Height1 mm's
   Serial.print ("Move mm ");
     Serial.print (NewHeightZ);
   Serial.print ("Height mm ");
    Serial.print (HeightZ);
  ActualHeightZ = HeightZ;
}


void MoveSAW()                      // This is the Relative Movement of the SAW. WORKING ! :-)
{
  stepper.moveTo (MoveREL * 200);    // move the SAW X mm's
   Serial.print ("Move mm ");
    Serial.print (MoveREL);
   HeightZ = (HeightZ+MoveREL);
    ActualHeightZ = HeightZ;
    MoveREL = 0;
   Serial.print ("Height mm ");
    Serial.print (HeightZ);
}


The serial Monitor display always the correct calculation. The MoveSAW funtion called to execute +1 mm = 1 turn (200 step) perfecly works, but then if I make -1 mm = -1 turn (200 step backwards) the motors turns 400 steps backwards (-2 turns) but the serial monitor display move 1mm (heigh 0 mm) and that is correct. The motor understood "go to -1 mm so it moves 2 turns backwards (from +1 to -1)
Another example: execute +1 mm (1 turn) ok,move 200 steps ! then execute another +1 mm (1 turn) ko, no move !
now some example just with numbers:
reset arduino
+1mm = +1 turn; +2mm= +1 turn; +4mm=+2 turn; +5mm=+1 turn; +10mm=5 turns; -10mm=-20 turns
+1=1 +2=1 +4=2 +5=1 +10=5 (the display correctly print 22mm ) then +1=-9 turns (display +23)
Any Hint ? I'm going crazy !

Silverdog63

Is such a strange thing !
I simplified the function and did another test:
Code: [Select]
void MoveSAW()                      // This is the Relative Movement of the SAW
{
  stepper.moveTo (MoveREL * 200);    // move the SAW X mm's
    MoveREL = 0;                               //reset the counter to 0
}


and I have exactly the same results:
+1mm = +1 turn; +2mm= +1 turn; +4mm=+2 turn; +5mm=+1 turn; +10mm=5 turns;
but now it should be a very simple function ...

Silverdog63

:)
OK! I think ... maybe I got the answer by myself.
The command "stepper.moveTo" of the accelstepper library is not what I have to use ...
"stepper.move" (without To) is the correct one.
thanks

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy