1. Do not share user accounts! Any account that is shared by another person will be blocked and closed. This means: we will close not only the account that is shared, but also the main account of the user who uses another person's account. We have the ability to detect account sharing, so please do not try to cheat the system. This action will take place on 04/18/2023. Read all forum rules.
    Dismiss Notice
  2. For downloading SimTools plugins you need a Download Package. Get it with virtual coins that you receive for forum activity or Buy Download Package - We have a zero Spam tolerance so read our forum rules first.

    Buy Now a Download Plan!
  3. Do not try to cheat our system and do not post an unnecessary amount of useless posts only to earn credits here. We have a zero spam tolerance policy and this will cause a ban of your user account. Otherwise we wish you a pleasant stay here! Read the forum rules
  4. We have a few rules which you need to read and accept before posting anything here! Following these rules will keep the forum clean and your stay pleasant. Do not follow these rules can lead to permanent exclusion from this website: Read the forum rules.
    Are you a company? Read our company rules

Resolved Motor reverse problem 2DOF

Discussion in 'SimTools DIY Version' started by yacinos, May 10, 2017.

  1. yacinos

    yacinos 2DOF PROJET Gold Contributor

    Joined:
    May 3, 2017
    Messages:
    12
    Location:
    france
    Balance:
    - 135Coins
    Ratings:
    +2 / 0 / -0
    My Motion Simulator:
    2DOF, 3DOF, DC motor, AC motor, Arduino, 4DOF, 6DOF
    i need help with my 2DOF projet all work fine in motion but
    when i reverse motor in the setting simtools no reverse motion in motor please help me

    hardware : Arduino UNO + 2 Hbridge + MOTOR DC
    arduino code : racing_mat2DOF
    interface setting : in attachement
    axis setting :in attachement


    projet simulator picture : in attachement

    Attached Files:

  2. noorbeast

    noorbeast VR Tassie Devil Staff Member Moderator Race Director

    Joined:
    Jul 13, 2014
    Messages:
    20,557
    Occupation:
    Innovative tech specialist for NGOs
    Location:
    St Helens, Tasmania, Australia
    Balance:
    145,160Coins
    Ratings:
    +10,780 / 52 / -2
    My Motion Simulator:
    3DOF, DC motor, JRK
    Do you mean checking the Dir orange on one axis for roll has no effect?
  3. yacinos

    yacinos 2DOF PROJET Gold Contributor

    Joined:
    May 3, 2017
    Messages:
    12
    Location:
    france
    Balance:
    - 135Coins
    Ratings:
    +2 / 0 / -0
    My Motion Simulator:
    2DOF, 3DOF, DC motor, AC motor, Arduino, 4DOF, 6DOF
    Yes , without inverse that work ( 2 motor turn in the same direction )
    when i check reversing no reverse motion ( 2 motor dont work in inverse direction but work in one direction )
    Last edited: May 11, 2017
  4. noorbeast

    noorbeast VR Tassie Devil Staff Member Moderator Race Director

    Joined:
    Jul 13, 2014
    Messages:
    20,557
    Occupation:
    Innovative tech specialist for NGOs
    Location:
    St Helens, Tasmania, Australia
    Balance:
    145,160Coins
    Ratings:
    +10,780 / 52 / -2
    My Motion Simulator:
    3DOF, DC motor, JRK
    I think you need to check your Arduino and its settings.
  5. yacinos

    yacinos 2DOF PROJET Gold Contributor

    Joined:
    May 3, 2017
    Messages:
    12
    Location:
    france
    Balance:
    - 135Coins
    Ratings:
    +2 / 0 / -0
    My Motion Simulator:
    2DOF, 3DOF, DC motor, AC motor, Arduino, 4DOF, 6DOF
    you mean programme code of arduino ?
  6. yacinos

    yacinos 2DOF PROJET Gold Contributor

    Joined:
    May 3, 2017
    Messages:
    12
    Location:
    france
    Balance:
    - 135Coins
    Ratings:
    +2 / 0 / -0
    My Motion Simulator:
    2DOF, 3DOF, DC motor, AC motor, Arduino, 4DOF, 6DOF
    thank you for note this : when i check reversing no reverse motion ( 2 motor dont work in inverse direction but work in one direction )
  7. noorbeast

    noorbeast VR Tassie Devil Staff Member Moderator Race Director

    Joined:
    Jul 13, 2014
    Messages:
    20,557
    Occupation:
    Innovative tech specialist for NGOs
    Location:
    St Helens, Tasmania, Australia
    Balance:
    145,160Coins
    Ratings:
    +10,780 / 52 / -2
    My Motion Simulator:
    3DOF, DC motor, JRK
    Yes, and hardware.
  8. yacinos

    yacinos 2DOF PROJET Gold Contributor

    Joined:
    May 3, 2017
    Messages:
    12
    Location:
    france
    Balance:
    - 135Coins
    Ratings:
    +2 / 0 / -0
    My Motion Simulator:
    2DOF, 3DOF, DC motor, AC motor, Arduino, 4DOF, 6DOF
    This is Arduino CODE and Attachement picture hardware in use Please Help Me :

    /*
    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 RacingMat in english http://www.xsimulator.net/2dof-wiper-motor-playseat/ in french : http://www.gamoover.net/Forums/index.php?topic=27617
    Updated 30 April 2014 by RacingMat (bug for value below 16 corrected)
    */

    #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=300;
    const int potMaxi=700;

    ////////////////////////////////////////////////////////////////////////////////
    #define motLeft 0
    #define motRight 1
    #define potL A0
    #define potR A1

    ////////////////////////////////////////////////////////////////////////////////
    // 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]=='L'){
    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]=='R'){
    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=33; // 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=180;
    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(potR));
    Serial.print(";");
    Serial.println(analogRead(potL));
    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) || (x[2]=='R') || (x[2]=='L')) //only a LSB and Carrier Return or 'L' or 'R' in case of value below 16 (ie one CHAR and not 2)
    {
    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;
    }

    Attached Files:

    Last edited: May 11, 2017
  9. noorbeast

    noorbeast VR Tassie Devil Staff Member Moderator Race Director

    Joined:
    Jul 13, 2014
    Messages:
    20,557
    Occupation:
    Innovative tech specialist for NGOs
    Location:
    St Helens, Tasmania, Australia
    Balance:
    145,160Coins
    Ratings:
    +10,780 / 52 / -2
    My Motion Simulator:
    3DOF, DC motor, JRK
    I think you need to detail the hardware being used with links to it, for boards and motors.

    Also validate the setup steps with the code.
  10. yacinos

    yacinos 2DOF PROJET Gold Contributor

    Joined:
    May 3, 2017
    Messages:
    12
    Location:
    france
    Balance:
    - 135Coins
    Ratings:
    +2 / 0 / -0
    My Motion Simulator:
    2DOF, 3DOF, DC motor, AC motor, Arduino, 4DOF, 6DOF
    so,i work with a arduino uno generique (clone low cost),2 motor dc 6v, 2 potentiometre 10k ,and 2 h bridge L298N low cost too : ), i used them for my first test only.......what do you think about my ardwear??it's compatible??
    thank you for your help
  11. noorbeast

    noorbeast VR Tassie Devil Staff Member Moderator Race Director

    Joined:
    Jul 13, 2014
    Messages:
    20,557
    Occupation:
    Innovative tech specialist for NGOs
    Location:
    St Helens, Tasmania, Australia
    Balance:
    145,160Coins
    Ratings:
    +10,780 / 52 / -2
    My Motion Simulator:
    3DOF, DC motor, JRK
    I am guessing the 6V motors and L298N are likely pretty limited in terms of their capacity.

    I am not sure if the L298N is supported, perhaps @RacingMat or others could advise.
  12. yobuddy

    yobuddy Well-Known Member Staff Member Moderator SimAxe Beta Tester SimTools Developer Gold Contributor

    Joined:
    Feb 9, 2007
    Messages:
    5,166
    Occupation:
    Computer Technician
    Location:
    Portland, Oregon - USA
    Balance:
    48,215Coins
    Ratings:
    +5,038 / 16 / -0
    @yacinos
    Remember you can always look at the virtual output window to check that the output look correct.
    May help some buddy.
    yobuddy
    • Like Like x 1
  13. yacinos

    yacinos 2DOF PROJET Gold Contributor

    Joined:
    May 3, 2017
    Messages:
    12
    Location:
    france
    Balance:
    - 135Coins
    Ratings:
    +2 / 0 / -0
    My Motion Simulator:
    2DOF, 3DOF, DC motor, AC motor, Arduino, 4DOF, 6DOF
    in the virtual work fine but in the motor no reverse
  14. yacinos

    yacinos 2DOF PROJET Gold Contributor

    Joined:
    May 3, 2017
    Messages:
    12
    Location:
    france
    Balance:
    - 135Coins
    Ratings:
    +2 / 0 / -0
    My Motion Simulator:
    2DOF, 3DOF, DC motor, AC motor, Arduino, 4DOF, 6DOF
    thank you for your help !!! :)
  15. yobuddy

    yobuddy Well-Known Member Staff Member Moderator SimAxe Beta Tester SimTools Developer Gold Contributor

    Joined:
    Feb 9, 2007
    Messages:
    5,166
    Occupation:
    Computer Technician
    Location:
    Portland, Oregon - USA
    Balance:
    48,215Coins
    Ratings:
    +5,038 / 16 / -0
    you get it working @yacinos?
    I see it says this right in the top of the sketch.
    #define RV 2 //beware it's depending on your hardware wiring
    #define FW 1 //beware it's depending on your hardware wiring

    I'm guessing it stands for forward and reverse?
    Maybe has something to do with it?
    yobuddy
  16. yacinos

    yacinos 2DOF PROJET Gold Contributor

    Joined:
    May 3, 2017
    Messages:
    12
    Location:
    france
    Balance:
    - 135Coins
    Ratings:
    +2 / 0 / -0
    My Motion Simulator:
    2DOF, 3DOF, DC motor, AC motor, Arduino, 4DOF, 6DOF
    hey @yobuddy ,
    i found the problem i just check my hardware wiring and i found the solution :

    My hardware was not in right wiring , now it work fine

    thank for your reponse and thank you for all @noorbeast and @yobuddy
    • Like Like x 2