Gamoover

Vous êtes nostalgiques des jeux vidéos de votre enfance ? Vous désirez acquérir, ou construire une borne d'arcade ? Vous trouverez ici les réponses a vos questions et une communauté de joueurs passionnés.

[WIP] Home Dynamic Racing Cab (HDRC)

Démarré par lipide512, Lundi 02 Juillet 2012, 13:47:12 PM

RacingMat

hello !

Pour l'avancement, oui, mes moteurs obéissent aux cartes électroniques !
vidéo test moteurs et potentiomètres

J'ai commencé un post pour présenter tout ça :-)
Playseat Dynamique 2DOF

Mais me voilà maintenant face à Xsim : il faut envoyer ce qu'attend l'Arduino ...
:'(
Pourrais-tu m'aider pour savoir quels sont les paramètres de Xsim qui correspondent ?

merci
Mat

francois95470

"trop de compétence tue l'incompétence"

Recherche: borne crazy taxi ou jumbo safari.

captaincav

je pourrai savoir ou tu as trouvé le programme  pour le arduino ou si c'est toi qui la fait ?

lipide512

C'est mon beau frère qui l'a écrit pour l'occasion.

RacingMat

#84
@captaincav :
Si tu veux programmer, tu peux repartir des données de base avec le code de la MotoMonster :
Created 24 May 2011 by Jim Lindblom  SparkFun Electronics
https://www.sparkfun.com/products/10182
-> "Example Code"

pour info, je bosse sur une version incluant en particulier
2 potentiomètres de réglage :
  - amplitude de la course des moteurs (variation angulaire du playseat : effet pépère ou montagne russe)
  - et coefficient de PID (réaction souple ou hard).
la mesure de l'intensité
et ... je complète avec beaucoup de commentaires pour un maximum de lisibilité.

MAIS le top, c'est le programme publié par Lipide512  ^-^ parce qu'il fonctionne !!

captaincav

beau travail sinon j'ai un programme pour faire un barre graph avec un arduino et des modules tm 1648 et 1640 je cherche le liens mais pour iracing uniquement


RacingMat

#87
Salut Lipide512 !

pourrais-tu m'indiquer quelle intensité tu as pu mesurer pour les moteurs en fonctionnement (avec M. Powermax dessus  :( ) ?

parce que j'aimerai mettre un fusible de bagnole adapté sur chacun des moteurs.

PS : j'ai récupéré un très zoli arrêt d'urgence mais c'est pas pareil !! C'est en complément et ça fait plus techno  ;)

lipide512

Je pourrai pas te répondre là - perso j'ai protégé en sortie d'alimentation dédiée avec un 30A sur support.
Je checkais les cables souvent afin de m'assurer qu'ils ne chauffent pas trop. Jusque là je n'ai pas eu de pb, si tout est bien calibré lorsque ça bloque mécaniquement, l'arduino a déjà coupé l'alimentation.

Pour info, dans le code actuel, le arduino a une marge de 16% pour des "pics" de mouvements hors champs. Passé cette sécurité, il coupe sans essayer de rattraper.

lipide512

Voici une révision du code du arduino pour xsim
corrections diverses par Mat racing, merci à lui de faire vivre le projet !  ^-

Citation/*

Opensource code for xsimulator by Jean David SEDRUE

Version betatest27 - 24042012



*/

#define BRAKEVCC 0

#define RV  2 //according to cable at 24/11/2011

#define FW  1 //according to cable at 24/11/2011

#define STOP 0

#define BRAKEGND 3

#define CS_THRESHOLD 253 //not use :(

////////////////////////////////////////////////////////////////////////////////

#define pwmMin 128;

#define pwmMax 250;

#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;

/* init position value*/

int DataValueL=125; //middle position

int DataValueR=125; //middle position



////////////////////////////////////////////////////////////////////////////////

// INITIALIZATION

////////////////////////////////////////////////////////////////////////////////

void setup()

{

  /* serial initialization */

  Serial.begin(115200);

  /* motor initialization */

  pinMode(statpin, OUTPUT);

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

  }

//  testpulse;

}

////////////////////////////////////////////////////////////////////////////////

///////////////////////////////// Main Loop ////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////

void loop()

{



int sensorL,sensorR;



  serialData();

  sensorR = analogRead(potR)/4;

  sensorL = analogRead(potL)/4; // echelle 0-1000

/*  Serial.print(sensorL);

  Serial.print(" ; ");

  Serial.println(sensorR);

  motorGo(motRight, FW, 255);

  delay(100);

  motorOff(motRight);

  delay(1000);

*/

  motorMotion(motRight,sensorR,DataValueR);

  motorMotion(motLeft,sensorL,DataValueL);



}

////////////////////////////////////////////////////////////////////////////////

// Procedure: wait for complete trame

////////////////////////////////////////////////////////////////////////////////

void serialData()

{

  byte Data[3]={

    '0','0','0'    };

  // il faut limiter le temps pour garder le controle des moteurs

  if (Serial.available()>2){ //wait two packets

    //test if order  R or L data type

    Data[0]=Serial.read();

    if (Data[0]=='R'){ // ordre connu ?, si non, je verrai au prochain tour !

      Data[1]=Serial.read();

      Data[2]=Serial.read();

      DataValueR=NormalizeData(Data);

    }

    if (Data[0]=='L'){ // ordre connu ?, si non, je verrai au prochain tour !

      Data[1]=Serial.read();

      Data[2]=Serial.read();

      DataValueL=NormalizeData(Data);



    }

  }

  if (Serial.available()>16) Serial.flush();

}

////////////////////////////////////////////////////////

void motorMotion(int numMot,int actualPos,int targetPos)

////////////////////////////////////////////////////////

{



  int Tol=4;

  int difference;

  int pwm;

  int securityLow=20;

  int securityHigh=200;

  int brakeDistance=16;

  boolean move=true;



  // encadrements des valeurs

  if (targetPos<securityLow+brakeDistance)   targetPos=(securityLow+brakeDistance);    //software limits, but consideration speed brake.

  if (targetPos>securityHigh-brakeDistance)  targetPos=(securityHigh-brakeDistance); //software limits, but consideration speed brake.

  // calculate speed about distance

  difference=abs(targetPos-actualPos);



  if (difference<=Tol) pwm=0;  // too near to move

  if (difference>Tol) pwm=168;

  if (difference>50) pwm=200;

  if (difference>75) pwm=225;

  if (difference>100) pwm=255;

  // pwm=255;  //test !

  // pay attention for security for Right motor!!

  if (actualPos>securityHigh || actualPos<securityLow) move=false; //mechanicals limits

  // too near to move

  if (difference<= Tol) move=false; // too near to move   

  // en avant   (haut)

  if (actualPos<targetPos && move) {

    motorGo(numMot, FW, pwm);

    }

  // en arriere (bas)

  if (actualPos>targetPos && move) motorGo(numMot, RV, pwm);

  // ne pas bouger !

  if (move==false) motorOff(numMot);// STOP

}

////////////////////////////////////////////////////////////////////////////////

void motorOff(int motor){

  ////////////////////////////////////////////////////////////////////////////////

  digitalWrite(inApin[motor], LOW);

  digitalWrite(inBpin[motor], LOW);

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



    }

  }

}

////////////////////////////////////////////////////////////////////////////////

// testPot

////////////////////////////////////////////////////////////////////////////////

void testPot(){

  Serial.print("PotR : ");

  Serial.print(analogRead(potR));

  Serial.print(" ; PotL : ");

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

    }

  }

  result=(x[1]*16+x[2]);

  return result;

}

wallytattoo

Citation de: Iro le Lundi 02 Juillet 2012, 13:51:58 PM
watcha !!
Si tu nous ponds  un tuto ou un wip qui permet de se lancer facilement , tu vas me faire perdre des heures de ma vies en construction :D

La suite !!  :-)=

Bonjour grand poste, Ce que je voulais, c'est de voir si je peux aider avec une partie de x-sim, je pourrais accrocher à ce profil de code en cours d'exécution arduno.
car pas beaucoup loentiendo que doux et je voulais voir, plutôt que ce qui est configuré.
Merci beaucoup et j'espère que votre réponse.

V1kt0R52

#91
Je crois qu'il y a une coquille dans le code ;)

Citation
////////////////////////////////////////////////////////////////////////////////

// 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 x0 to x9

      x=x-48;

    }                    

    if (  x>64 && x<71 ){//for xA to xF

      x=x-65;             

    }

  }

  result=(x[1]*16+x[2]);

  return result;

}
Parce qu'ensemble, on est plus fort !!!
mais des fois, t'as peur...

RacingMat

youhou ! tu as raison V1kt0R52  ^-

le 55 n'est pas bon !... (et les commentaires non plus)
j'avais pas remarqué : merci !
c'est Jean-David qui sera content  :-X

V1kt0R52

De rien  ;)

Faire relire le code par quelqu'un d'autre évite de s'arracher les cheveux pendant longtemps.
C'est surement pour ça que les projets à l'IUT étaient à 2 ou 3, on perd moins de temps à chercher  ;D

N'est-ce pas Toinos ?!  :D
Parce qu'ensemble, on est plus fort !!!
mais des fois, t'as peur...

mimso

Salut et merci pour ce wip

Je suis surpris de voir que des moteurs d'essuis glace de voiture sont suffisamment puissance pour faire bouger l'ensemble.
Peux tu confirmer stp a l'occaz

Si c le cas, le cout de l'instalation en serait considerablement reduit, et ca serait une super bonne news :-)

Merci d'avance

RacingMat

Attention tous les moteurs d'essuie-glace ne conviennent pas !
certains sont vraiment insuffisants
-> j'ai testé les MEG de Golf 3 = 0

Les smolka sont (étaient) une exception de robustesse et de coût. Le stock se termine et ils ont augmenté à 100€ pièce. Et ils n'avaient pas besoin d'une opération de suppression de la masse (indispensable pour ne pas crâmer le pont en H Motomonster)

Si tu cherches de l'occas, recherche des MEG de monospace, de camions...