PROBLEMA POSTAZIONE DINAMICA ARDUINO 2DOF - Postazioni di guida - Driving cockpits - DrivingItalia.NET simulatori di guida Jump to content

Recommended Posts

Posted

SALVE A TUTTI,HO COLLEGATO ARDUINO AL MOTOR SHIELD HO COLLEGATO I MOTORI E ANCHE I POTENZIOMETRI    E HO INSERITO QUESTO CODICE TROVATO IN UNA GUIDA IN ARDUINO  

 

/*   
     Arduino code for dynamic playseat 2DOF
     Created 24 May 2011 by Jim Lindblom   SparkFun Electronics https://www.sparkfun.com/products/10182 "Example Code"
     Created 24 Apr 2012 by Jean David SEDRUE Version betatest26 - 24042012 http://www.gamoover.net/Forums/index.php?topic=25907
     Updated 20 May 2013 by Mathieu RIVIER in english http://www.xsimulator.net/2dof-wiper-motor-playseat/ in french : http://www.gamoover.net/Forums/index.php?topic=27617
     */
 
    #define BRAKEVCC 0
    #define RV  2 //beware it's depending on your hardware wiring
    #define FW  1 //beware it's depending on your hardware wiring
    #define STOP 0
    #define BRAKEGND 3
 
    ////////////////////////////////////////////////////////////////////////////////
    #define pwmMax 255 // or less, if you want to lower the maximum motor's speed
 
    // defining the range of potentiometer's rotation
    const int potMini=208;
    const int potMaxi=815;
 
    ////////////////////////////////////////////////////////////////////////////////
    #define motLeft 0
    #define motRight 1
    #define potL A5
    #define potR A4
 
    ////////////////////////////////////////////////////////////////////////////////
    //  DECLARATIONS
    ////////////////////////////////////////////////////////////////////////////////
    /*  VNH2SP30 pin definitions*/
    int inApin[2] = {
      7, 4};  // INA: Clockwise input
    int inBpin[2] = {
      8, 9}; // INB: Counter-clockwise input
    int pwmpin[2] = {
      5, 6}; // PWM input
    int cspin[2] = {
      2, 3}; // CS: Current sense ANALOG input
    int enpin[2] = {
      0, 1}; // EN: Status of switches output (Analog pin)
    int statpin = 13;  //not explained by Sparkfun
    /* init position value*/
    int DataValueL=512; //middle position 0-1024
    int DataValueR=512; //middle position 0-1024
 
    ////////////////////////////////////////////////////////////////////////////////
    // INITIALIZATION
    ////////////////////////////////////////////////////////////////////////////////
    void setup()
    {
      // serial initialization
      Serial.begin(115200);
 
      // initialization of Arduino's pins
      pinMode(statpin, OUTPUT); //not explained by Sparkfun
      digitalWrite(statpin, LOW);
 
      for (int i=0; i<2; i++)
      {
        pinMode(inApin, OUTPUT);
        pinMode(inBpin, OUTPUT);
        pinMode(pwmpin, OUTPUT);
      }
      // Initialize braked for motor
      for (int i=0; i<2; i++)
      {
        digitalWrite(inApin, LOW);
        digitalWrite(inBpin, LOW);
      }
    }
    ////////////////////////////////////////////////////////////////////////////////
    ///////////////////////////////// Main Loop ////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////
    void loop()
    {
      int sensorL,sensorR;
 
      readSerialData();   // DataValueR & L contain the last order received (if there is no newer received, the last is kept)
      // the previous order will still be used by the PID regulation MotorMotion Function
 
      sensorR = analogRead(potR);  // range 0-1024
      sensorL = analogRead(potL);  // range 0-1024
 
      motorMotion(motRight,sensorR,DataValueR);
      motorMotion(motLeft,sensorL,DataValueL);
    }
    ////////////////////////////////////////////////////////////////////////////////
    // Procedure: wait for complete trame
    ////////////////////////////////////////////////////////////////////////////////
    void readSerialData()
    {
      byte Data[3]={
        '0','0','0'        };
      // keep this function short, because the loop has to be short to keep the control over the motors
 
      if (Serial.available()>2){
        //parse the buffer : test if the byte is the first of the order "R"
        Data[0]=Serial.read();
        if (Data[0]=='R'){
          Data[1]=Serial.read();
          Data[2]=Serial.read();
          //  call the function that converts the hexa in decimal and that maps the range
          DataValueR=NormalizeData(Data);
        }
        if (Data[0]=='L'){
          Data[1]=Serial.read();
          Data[2]=Serial.read();
          //  call the function that converts the hexa in decimal and maps the range
          DataValueL=NormalizeData(Data);
 
        }
      }
      if (Serial.available()>16) Serial.flush();
    }
    ////////////////////////////////////////////////////////
    void motorMotion(int numMot,int actualPos,int targetPos)
    ////////////////////////////////////////////////////////
    {
      int Tol=20; // no order to move will be sent to the motor if the target is close to the actual position
      // this prevents short jittering moves
      //could be a parameter read from a pot on an analogic pin
      // the highest value, the calmest the simulator would be (less moves)
 
      int gap;
      int pwm;
      int brakingDistance=30;
 
      // security concern : targetPos has to be within the mechanically authorized range
      targetPos=constrain(targetPos,potMini+brakingDistance,potMaxi-brakingDistance);
 
      gap=abs(targetPos-actualPos);
 
      if (gap<= Tol) {
        motorOff(numMot); //too near to move     
      }
      else {
        // PID : calculates speed according to distance
        pwm=195;
        if (gap>50)   pwm=215;
        if (gap>75)   pwm=235;   
        if (gap>100)  pwm=255;
        pwm=map(pwm, 0, 255, 0, pwmMax);  //adjust the value according to pwmMax for mechanical debugging purpose !
 
        // if motor is outside from the range, send motor back to the limit !
        // go forward (up)
        if ((actualPos<potMini) || (actualPos<targetPos)) motorGo(numMot, FW, pwm);
        // go reverse (down)   
        if ((actualPos>potMaxi) || (actualPos>targetPos)) motorGo(numMot, RV, pwm);
 
      }
    }
 
 
 
////////////////////////////////////////////////////////////////////////////////
    void motorOff(int motor){ //Brake Ground : free wheel actually
      ////////////////////////////////////////////////////////////////////////////////
      digitalWrite(inApin[motor], LOW);
      digitalWrite(inBpin[motor], LOW);
      analogWrite(pwmpin[motor], 0);
    }
    ////////////////////////////////////////////////////////////////////////////////
    void motorOffBraked(int motor){ // "brake VCC" : short-circuit inducing electromagnetic brake
      ////////////////////////////////////////////////////////////////////////////////
      digitalWrite(inApin[motor], HIGH);
      digitalWrite(inBpin[motor], HIGH);
      analogWrite(pwmpin[motor], 0);
    }
 
    ////////////////////////////////////////////////////////////////////////////////
    void motorGo(uint8_t motor, uint8_t direct, uint8_t pwm)
    ////////////////////////////////////////////////////////////////////////////////
    {
      if (motor <= 1)
      {
        if (direct <=4)
        {
          // Set inA[motor]
          if (direct <=1)
            digitalWrite(inApin[motor], HIGH);
          else
            digitalWrite(inApin[motor], LOW);
 
          // Set inB[motor]
          if ((direct==0)||(direct==2))
            digitalWrite(inBpin[motor], HIGH);
          else
            digitalWrite(inBpin[motor], LOW);
 
          analogWrite(pwmpin[motor], pwm);
 
        }
      }
    }
 
    ////////////////////////////////////////////////////////////////////////////////
    void motorDrive(uint8_t motor, uint8_t direct, uint8_t pwm)
    ////////////////////////////////////////////////////////////////////////////////
    {
      // more readable function than Jim's (for educational purpose)
      // but 50 octets heavier ->  unused
      if (motor <= 1 && direct <=4)
      {
        switch (direct) {
        case 0: //electromagnetic brake : brake VCC
          digitalWrite(inApin[motor], HIGH);
          digitalWrite(inBpin[motor], HIGH);
          break;
        case 3: //Brake Ground (free wheel)
          digitalWrite(inApin[motor], LOW);
          digitalWrite(inBpin[motor], LOW);
          break;
        case 1: // forward : beware it's depending on your hardware wiring
          digitalWrite(inApin[motor], HIGH);
          digitalWrite(inBpin[motor], LOW);
          break;
        case 2: // Reverse : beware it's depending on your hardware wiring
          digitalWrite(inApin[motor], LOW);
          digitalWrite(inBpin[motor], HIGH);
          break;
        }
        analogWrite(pwmpin[motor], pwm);
      }
    }
    ////////////////////////////////////////////////////////////////////////////////
    // testPot
    ////////////////////////////////////////////////////////////////////////////////
    void testPot(){
 
      Serial.print(analogRead(A4));
      Serial.print(";");
      Serial.println(analogRead(A5));
      delay(250);
 
    }
    ////////////////////////////////////////////////////////////////////////////////
    void testpulse(){
      int pw=120;
      while (true){
 
        motorGo(motLeft, FW, pw);
        delay(250);       
        motorOff(motLeft);
        delay(250);       
        motorGo(motLeft, RV, pw);
        delay(250);       
        motorOff(motLeft);     
 
        delay(500);       
 
        motorGo(motRight, FW, pw);
        delay(250);       
        motorOff(motRight);
        delay(250);       
        motorGo(motRight, RV, pw);
        delay(250);       
        motorOff(motRight);     
        Serial.println("testpulse pwm:80");     
        delay(500);
 
      }
    }
    ////////////////////////////////////////////////////////////////////////////////
    // Function: convert Hex to Dec
    ////////////////////////////////////////////////////////////////////////////////
    int NormalizeData(byte x[3])
    ////////////////////////////////////////////////////////////////////////////////
    {
      int result;
 
      if (x[2]==13)   //only a LSB and Carrier Return
      {
        x[2]=x[1];  //move MSB to LSB
        x[1]='0';     //clear MSB
      }
      for (int i=1; i<3; i++)
      {
        if (x>47 && x<58 ){//for xA to xF
          x=x-48;
        }                       
        if (  x>64 && x<71 ){//for x0 to x9
          x=x-55;               
        }
      }
      // map the range from Xsim (0 <-> 255) to the mechanically authorized range (potMini <-> potMaxi)
      result=map((x[1]*16+x[2]),0,255,potMini,potMaxi);
      return result;
    }
 
IL PROBLEMA è CHE QUANDO ACCENDO I MOTORI GIRANO SENZA SOSTA, QUAL'è IL PROBLEMA?
 
 
 
 
Posted

non tovano la  centratura prova a controllare che siano giusti i collegamenti su arduino oppure cerca su x sim il progetto arduino 360

  • 1 month later...
Posted

io uso una k8055v ma ho il tuo stesso identico problema...chissà che sia lo stesso?

Posted (edited)

io uso una k8055v ma ho il tuo stesso identico problema...chissà che sia lo stesso?

io ho risolto...prima fai partire extractor, da li il gioco, poi alt+tab e apri converter. Start e rimetti il gioco...qualcosa dovrebbe succedere

Edited by billo2404

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.