Jump to content

[DCS-BIOS] Stepper setup - Arduino compiler error


Hansolo

Recommended Posts

Alright another noob question from my side. I have come to the point where I am about to implement steppers into the setup. I have copied the code used by Warhog and Ian (I think) but I get a compiler error.

 

This is the code:

 

#define DCSBIOS_IRQ_SERIAL

#include <AccelStepper.h>
#include "DcsBios.h"

struct StepperConfig {
 unsigned int maxSteps;
 unsigned int acceleration;
 unsigned int maxSpeed;
};


class Vid29Stepper : public DcsBios::Int16Buffer {
 private:
   AccelStepper& stepper;
   StepperConfig& stepperConfig;
   unsigned int (*map_function)(unsigned int);
   unsigned char initState;
 public:
   Vid29Stepper(unsigned int address, AccelStepper& stepper, StepperConfig& stepperConfig, unsigned int (*map_function)(unsigned int))
   : Int16Buffer(address), stepper(stepper), stepperConfig(stepperConfig), map_function(map_function), initState(0) {
   }

   virtual void loop() {
     if (initState == 0) { // not initialized yet
       stepper.setMaxSpeed(stepperConfig.maxSpeed);
       stepper.setAcceleration(stepperConfig.acceleration);
       stepper.moveTo(-((long)stepperConfig.maxSteps));
       initState = 1;
     }
     if (initState == 1) { // zeroing
       stepper.run();
       if (stepper.currentPosition() <= -((long)stepperConfig.maxSteps)) {
         stepper.setCurrentPosition(0);
         initState = 2;
         stepper.moveTo(stepperConfig.maxSteps/2);
       }
     }
     if (initState == 2) { // running normally
       if (hasUpdatedData()) {
         unsigned int newPosition = map_function(getData());
         newPosition = constrain(newPosition, 0, stepperConfig.maxSteps);
         stepper.moveTo(newPosition);
       }
       stepper.run();
     }
   }
};

/* modify below this line */

/* define stepper parameters
  multiple Vid29Stepper instances can share the same StepperConfig object */
struct StepperConfig stepperConfig = {
 120,  // maxSteps
 1200, // maxSpeed
 10000 // acceleration
 };


// define AccelStepper instance
[b]AccelStepper stepper(AccelStepper::DRIVER, 11, 10);[/b]
// define Vid29Stepper class that uses the AccelStepper instance defined in the line above
//           +-- arbitrary name
//           |   +-- Address of stepper data (from control reference)
//           |   |       +-- name of AccelStepper instance
//           v   v       v        v-- StepperConfig struct instance
Vid29Stepper vvi(0x10a0, stepper, stepperConfig, [](unsigned int newValue) -> unsigned int {
 /* this function needs to map newValue to the correct number of steps */
 return map(newValue, 0, 65535, 0, stepperConfig.maxSteps);
}); 


void setup() {
 DcsBios::setup();
}

void loop() {
 DcsBios::loop();
}

 

This is the compiler error:

Flaps_position_test:70: error: 'DRIVER' is not a member of 'AccelStepper'

AccelStepper stepper(AccelStepper::DRIVER, 11, 10);

                     ^

Using library AccelStepper-master in folder: C:\Users\____\Documents\Arduino\libraries\AccelStepper-master (legacy)
Using library dcs-bios-arduino-library-0.2.11 at version 0.2.10 in folder: C:\Users\____\Documents\Arduino\libraries\dcs-bios-arduino-library-0.2.11 
exit status 1
'DRIVER' is not a member of 'AccelStepper'

 

My guess is that the AccelStepper.h version I am using is not the correct one? Does anyone know where to find the correct one?

 

 

 

Cheers

Hans


Edited by Hansolo
Pasted the wrong code
Link to comment
Share on other sites

Check out this site http://www.airspayce.com/mikem/arduino/AccelStepper/index.html

 

I'm using an older version - 1.23 2016/08/09 and it works fine with the below code -

 

#define DCSBIOS_IRQ_SERIAL

#include <AccelStepper.h>
#include "DcsBios.h"

struct StepperConfig {
 unsigned int maxSteps;
 unsigned int acceleration;
 unsigned int maxSpeed;
};


class Vid29Stepper : public DcsBios::Int16Buffer {
 private:
   AccelStepper& stepper;
   StepperConfig& stepperConfig;
   unsigned int (*map_function)(unsigned int);
   unsigned char initState;
 public:
   Vid29Stepper(unsigned int address, AccelStepper& stepper, StepperConfig& stepperConfig, unsigned int (*map_function)(unsigned int))
   : Int16Buffer(address), stepper(stepper), stepperConfig(stepperConfig), map_function(map_function), initState(0) {
   }

   virtual void loop() {
     if (initState == 0) { // not initialized yet
       stepper.setMaxSpeed(stepperConfig.maxSpeed);
       stepper.setAcceleration(stepperConfig.acceleration);
       stepper.moveTo(-((long)stepperConfig.maxSteps));
       initState = 1;
     }
     if (initState == 1) { // zeroing
       stepper.run();
       if (stepper.currentPosition() <= -((long)stepperConfig.maxSteps)) {
         stepper.setCurrentPosition(0);
         initState = 2;
         stepper.moveTo(stepperConfig.maxSteps/2);
       }
     }
     if (initState == 2) { // running normally
       if (hasUpdatedData()) {
         unsigned int newPosition = map_function(getData());
         newPosition = constrain(newPosition, 0, stepperConfig.maxSteps);
         stepper.moveTo(newPosition);
       }
       stepper.run();
     }
   }
};

/* modify below this line */

/* define stepper parameters
  multiple Vid29Stepper instances can share the same StepperConfig object */
struct StepperConfig stepperConfig = {
 475,  // maxSteps
 100, // maxSpeed
 100 // acceleration
 };


// define AccelStepper instance
AccelStepper stepper;
// define Vid29Stepper class that uses the AccelStepper instance defined in the line above
//           +-- arbitrary name
//           |   +-- Address of stepper data (from control reference)
//           |   |       +-- name of AccelStepper instance
//           v   v       v        v-- StepperConfig struct instance
Vid29Stepper apu(0x10be, stepper, stepperConfig, [](unsigned int newValue) -> unsigned int {
 /* this function needs to map newValue to the correct number of steps */
 return map(newValue, 0, 65535, 0, stepperConfig.maxSteps);
}); 


void setup() {
 DcsBios::setup();
}

void loop() {
 DcsBios::loop();
}

Link to comment
Share on other sites

Thanks WhoMadeWho. Much appreciated. I just noticed that I pasted the wrong code :doh: I pasted your code which compiles.

Its the other that won't complite and as far as I can see the only difference between yours and the one Ian/Warhog is that yours says this

AccelStepper stepper

 

Whereas Ian/warhog code says this

AccelStepper stepper(AccelStepper::DRIVER, 11, 10);

 

I will try the link you provided later tonight. Many thanks for the assistance

 

 

Cheers

Hans


Edited by Hansolo
Additional info
Link to comment
Share on other sites

  • 2 months later...

Can please somebody share wiring diagram for this code or in general for connection of stepper to arduino :helpsmilie:..

I am not able to find any eshop with vid29 (only producer site http://www.vid.wellgain.com/index.aspx) any advice how to obtain it, or can I use x27 instead with same arduino code http://www.jukenswisstech.com/products/x27/. There are planty of them on aliexpress....


Edited by draken152

[sIGPIC][/sIGPIC]

Building FW190D pit ,,To Dora with love" http://forums.eagle.ru/showthread.php?t=132743

Link to comment
Share on other sites

The x27 motors are exactly the same as the VID series in all respects.

 

I would investigate using the Easy Driver board with these motors. Much better control over stepping rates depending on what you are using them for. Do a search on the Easy Driver board and you will get lots of good info.

Regards

John W

aka WarHog.

 

My Cockpit Build Pictures...



John Wall

 

My Arduino Sketches ... https://drive.google.com/drive/folders/1-Dc0Wd9C5l3uY-cPj1iQD3iAEHY6EuHg?usp=sharing

 

 

WIN 10 Pro, i8-8700k @ 5.0ghz, ASUS Maximus x Code, 16GB Corsair Dominator Platinum Ram,



AIO Water Cooler, M.2 512GB NVMe,

500gb SSD, EVGA GTX 1080 ti (11gb), Sony 65” 4K Display

VPC MongoosT-50, TM Warthog Throttle, TRK IR 5.0, Slaw Viper Pedals

Link to comment
Share on other sites

  • 1 month later...

Sorry

I took the sketch created by Warhog and Ian but arduino continues to make me mistake you can tell me where I am wrong?

#define DCSBIOS_IRQ_SERIAL

#include <AccelStepper.h>
#include "DcsBios.h"

struct StepperConfig {
 unsigned int maxSteps;
 unsigned int acceleration;
 unsigned int maxSpeed;
};


class Vid60Stepper : public DcsBios::Int16Buffer {
 private:
   AccelStepper& stepper;
   StepperConfig& stepperConfig;
   inline bool zeroDetected() { return digitalRead(irDetectorPin) == 1; }
   unsigned int (*map_function)(unsigned int);
   unsigned char initState;
   long currentStepperPosition;
   long lastAccelStepperPosition;
   unsigned char irDetectorPin;
   long zeroOffset;
   bool movingForward;
   bool lastZeroDetectState;

   long normalizeStepperPosition(long pos) {
     if (pos < 0) return pos + stepperConfig.maxSteps;
     if (pos >= stepperConfig.maxSteps) return pos - stepperConfig.maxSteps;
     return pos;
   }

   void updateCurrentStepperPosition() {
     // adjust currentStepperPosition to include the distance our stepper motor
     // was moved since we last updated it
     long movementSinceLastUpdate = stepper.currentPosition() - lastAccelStepperPosition;
     currentStepperPosition = normalizeStepperPosition(currentStepperPosition + movementSinceLastUpdate);
     lastAccelStepperPosition = stepper.currentPosition();
   }
 public:
   Vid60Stepper(unsigned int address, 
   AccelStepper& stepper, 
   StepperConfig& stepperConfig, 
   unsigned char irDetectorPin, 
   long zeroOffset, unsigned int (*map_function)(unsigned int)): Int16Buffer(address), 
   stepper(stepper), 
   stepperConfig(stepperConfig), 
   irDetectorPin(irDetectorPin), 
   zeroOffset(zeroOffset), 
   map_function(map_function), 
   initState(0), 
   currentStepperPosition(0), 
   lastAccelStepperPosition(0) 
   {
   }

   virtual void loop() {
     if (initState == 0) { // not initialized yet
       pinMode(irDetectorPin, INPUT);
       stepper.setMaxSpeed(stepperConfig.maxSpeed);
       stepper.setSpeed(1000);
       
       initState = 1;
     }
     if (initState == 1) {
       // move off zero if already there so we always get movement on reset
       // (to verify that the stepper is working)
       if (zeroDetected()) {
         stepper.runSpeed();
       } else {
           initState = 2;
       }
     }
     if (initState == 2) { // zeroing
       if (!zeroDetected()) {
         stepper.runSpeed();
       } else {
           stepper.setAcceleration(stepperConfig.acceleration);
           stepper.runToNewPosition(stepper.currentPosition() + zeroOffset);
           // tell the AccelStepper library that we are at position zero
           stepper.setCurrentPosition(0);
           lastAccelStepperPosition = 0;
           // set stepper acceleration in steps per second per second
           // (default is zero)
           stepper.setAcceleration(stepperConfig.acceleration);
           
           lastZeroDetectState = true;
           initState = 3;
       }
     }
     if (initState == 3) { // running normally
       
       // recalibrate when passing through zero position
       bool currentZeroDetectState = zeroDetected();
       if (!lastZeroDetectState && currentZeroDetectState && movingForward) {
         // we have moved from left to right into the 'zero detect window'
         // and are now at position 0
         lastAccelStepperPosition = stepper.currentPosition();
         currentStepperPosition = normalizeStepperPosition(zeroOffset);
       } else if (lastZeroDetectState && !currentZeroDetectState && !movingForward) {
         // we have moved from right to left out of the 'zero detect window'
         // and are now at position (maxSteps-1)
         lastAccelStepperPosition = stepper.currentPosition();
         currentStepperPosition = normalizeStepperPosition(stepperConfig.maxSteps + zeroOffset);
       }
       lastZeroDetectState = currentZeroDetectState;
       
       
       if (hasUpdatedData()) {
           // convert data from DCS to a target position expressed as a number of steps
           long targetPosition = (long)map_function(getData());

           updateCurrentStepperPosition();
           
           long delta = targetPosition - currentStepperPosition;
           
           // if we would move more than 180 degree counterclockwise, move clockwise instead
           if (delta < -((long)(stepperConfig.maxSteps/2))) delta += stepperConfig.maxSteps;
           // if we would move more than 180 degree clockwise, move counterclockwise instead
           if (delta > (stepperConfig.maxSteps/2)) delta -= (long)stepperConfig.maxSteps;

           movingForward = (delta >= 0);
           
           // tell AccelStepper to move relative to the current position
           stepper.move(delta);
           
       }
       stepper.run();
     }
   }
};

/* modify below this line */

/* define stepper parameters
  multiple Vid60Stepper instances can share the same StepperConfig object */
struct StepperConfig stepperConfig = 
 {
 400,  // maxSteps
 2200, // maxSpeed
 1000 // acceleration
 };


// define AccelStepper instance
AccelStepper stepper(AccelStepper::DRIVER, 9, 8);
// define Vid60Stepper class that uses the AccelStepper instance defined in the line above
//           v-- arbitrary name
Vid60Stepper alt100ftPointer(0x107e,          // address of stepper data
                            stepper,         // name of AccelStepper instance
                            stepperConfig,   // StepperConfig struct instance
                            11,              // IR Detector Pin (must be HIGH in zero position)
                            0,               // zero offset
                            [](unsigned int newValue) -> unsigned int {
 /* this function needs to map newValue to the correct number of steps */
 return map(newValue, 0, 65535, 0, stepperConfig.maxSteps-1);
                                                          });


void setup() {
 DcsBios::setup();
 pinMode(13, OUTPUT);
}

void loop() {
 PORTB |= (1<<5);
 PORTB &= ~(1<<5);
 DcsBios::loop();
}

 

 

 

error:

Altimeter.ino.ino:154:68: error: type '__lambda0' with no linkage used to declare function 'unsigned int __lambda0::operator()(unsigned int) const' with linkage [-fpermissive]

type '__lambda0' with no linkage used to declare function 'unsigned int __lambda0::operator()(unsigned int) const' with linkage [-fpermissive]


Edited by albateo
Link to comment
Share on other sites

before the load was working well using the adrian script

//Script by Adrian_gc
//https://forums.eagle.ru/showthread.php?t=145193

Code:
// include AccelStepper library
#include <AccelStepper.h>

// include DcsBios library
#include <DcsBios.h>
#include <Servo.h>

// DcsBios-related declarations
DcsBios:rotocolParser parser;

#define STEPS_PER_REVOLUTION 240
#define ZERO_OFFSET 0

AccelStepper stepper; // Defaults to AccelStepper::FULL4WIRE (4 pins) on 2, 3, 4, 5
int currentStepperPosition = 0; // current stepper position (in steps, from 0 to STEPS_PER_REVOLUTION-1)
signed long lastAccelStepperPosition;

void setup()
{ 
Serial.begin(250000);

pinMode (12,INPUT); // LOW when in zero position, HIGH otherwise


// set up stepper motor for zeroing
stepper.setMaxSpeed(1000);
stepper.setSpeed(500);
// run clockwise until we detect the zero position
while (digitalRead (12)==1) {
stepper.runSpeed(); 
}

// add zero offset
stepper.runToNewPosition(stepper.currentPosition() + ZERO_OFFSET);

// tell the AccelStepper library that we are at position zero
stepper.setCurrentPosition(0);
lastAccelStepperPosition = 0;
// set stepper acceleration in steps per second per second
// (default is zero)
stepper.setAcceleration(1000);

}

void loop()
{
// handle DcsBios communication
while (Serial.available()) {
parser.processChar(Serial.read());
}
DcsBios:ollingInput::pollInputs();

// move stepper motor
stepper.run();
}

void onDcsBiosWrite(unsigned int address, unsigned int value) {
if (address == 0x107e) {
digitalWrite (13,1);
unsigned int alt100ftValue = (value & 0xffff) >> 0;

// convert data from DCS to a target position expressed as a number of steps
int targetPosition = map(alt100ftValue, 0, 65535, 0, STEPS_PER_REVOLUTION-1);

// adjust currentStepperPosition to include the distance our stepper motor
// was moved since we last updated it
int movementSinceLastUpdate = stepper.currentPosition() - lastAccelStepperPosition;
currentStepperPosition += movementSinceLastUpdate;
lastAccelStepperPosition = stepper.currentPosition();

if (currentStepperPosition < 0) currentStepperPosition += STEPS_PER_REVOLUTION;
if (currentStepperPosition > STEPS_PER_REVOLUTION) currentStepperPosition -= STEPS_PER_REVOLUTION;

int delta = targetPosition - currentStepperPosition;

// if we would move more than 180 degree counterclockwise, move clockwise instead
if (delta < -(STEPS_PER_REVOLUTION/2)) delta += STEPS_PER_REVOLUTION;
// if we would move more than 180 degree clockwise, move counterclockwise instead
if (delta > (STEPS_PER_REVOLUTION/2)) delta -= STEPS_PER_REVOLUTION;

// tell AccelStepper to move relative to the current position
stepper.move(delta);
}
}

I bought 10 NEMA engines that worked fine with that type of script

now I have to throw them into the rubbish ??


Edited by albateo
Link to comment
Share on other sites

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...