Jump to content

DCS-BIOS Libreria 0.2.1 arduino help


Adrian_gc

Recommended Posts

hi my frindes. I come back again.loool

how to add a another code for running a stepper motor in this code............ i try to build two or three main flight instrument.

 

#define DCSBIOS_IRQ_SERIAL

 

#include <AccelStepper.h>

#include "DcsBios.h"

#include <LiquidCrystal.h>

#include <Servo.h>

#include <math.h>

float b,d,f;

float c;

int e,a;

LiquidCrystal lcd(2,3,4,5,6,7);

void onAlt10000ftCntChange(unsigned int newValue) {

 

a=((newValue+353.53)/6603.6);

lcd.setCursor(0, 1);

lcd.print(a);

a=a*10000;

lcd.setCursor(0,1);

lcd.print(a);

 

}

DcsBios::IntegerBuffer alt10000ftCntBuffer(0x1080, 0xffff, 0, onAlt10000ftCntChange);

 

void onAlt1000ftCntChange(unsigned int newValue) {

 

b=((newValue+353.53)/6603.6);

 

 

if(9>b>8){

b=floor(b);

}

 

lcd.setCursor(6,1);

lcd.print(b);

b=b*1000;

//lcd.setCursor(6,1);

//lcd.print(b);

 

 

lcd.setCursor(0,0);

lcd.print("ALT");

}

DcsBios::IntegerBuffer alt1000ftCntBuffer(0x1082, 0xffff, 0, onAlt1000ftCntChange);

 

void onAlt100ftCntChange(unsigned int newValue) {

//lcd.setCursor(0, 1);

c=((newValue+353.53)/6603.6);

lcd.setCursor(11,1);

lcd.print©;

 

c=c*100;

e=a+b+c;

lcd.setCursor(3,0);

e=floor(e);

lcd.print(e);

 

}

DcsBios::IntegerBuffer alt100ftCntBuffer(0x1084, 0xffff, 0, onAlt100ftCntChange);

 

void onAlt100ftChange(unsigned int newValue) {

lcd.setCursor(12, 1);

d=((newValue+353.53)/6603.6);

 

//lcd.print(d);

 

}

DcsBios::IntegerBuffer alt100ftBuffer(0x107e, 0xffff, 0, onAlt100ftChange);

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 =

{

1585, // maxSteps

2000, // maxSpeed

1750 // acceleration

};

 

 

// define AccelStepper instance

AccelStepper stepper(AccelStepper::DRIVER, 8, 9);

// 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();

}

 

thx to all

Link to comment
Share on other sites

  • Recently Browsing   0 members

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