quinta-feira, 4 de janeiro de 2018

Ano Novo, projeto antigo!!!

Após 18 meses afastados, por problemas alheios, chegamos em 2018 com força total. Senta no carona, aperta o cinto e vamos juntos acelerar fundo e "concluir" esse projeto. 


Simulador sendo montado novamente, novas ideias, equipamentos prontos para serem montados e conectados e muita, mas muita determinação até a realização desse sonho. 

quinta-feira, 14 de julho de 2016

SimuCUBE: Projeto Força Bruta


É com muita satisfação que recebemos o nosso kit SimuCUBE, projeto desenvolvido pela Granite Devices, conforme publicamos anteriormente aqui.


 Placa SimuCUBE e IONI PRO HC
 


Nude do kit, para montagem (DIY) - fonte, case, placas, fan, cabos e parafusos
Logo mais voltaremos com a montagem... aguardem!!!



domingo, 10 de julho de 2016

We´re alive!!!!

Novidades na garagem F5im!


Segue o vídeo dos primeiros testes (bem sucedido) da eletrônica F5im!


Agradecimento especial ao Alexandre Kostik, pela paciência e atendimento técnico!!!

Essa semana será promissora para a garagem F5im!

Um abraço e até mais!!!

quarta-feira, 6 de julho de 2016

Does it moves?

Voltamos com mais uma atualização na parte eletrônica, e vamos substituir os potenciômetros de 100k multivoltas importado por um par de potenciômetros 10k nacional e com 1 volta.

Não identifiquei o que pode ter queimado a fonte no primeiro ter, mas acredito que tenha sido adorna coisa relacionada aos potenciômetros (ou não)...

Potenciômetros comprados, ligações refeitas, código compilado e a dúvida que ficará até a próxima semana... does it moves????

 Ligações refeitas e potenciômetros substituídos


VNH3SP30 ainda sem dissipadores

Se tudo der certo, teremos o primeiro vídeo do canal na próxima semana!

Um abraço, fiquem ligados...

terça-feira, 5 de julho de 2016

Take your SEAT!!!!

Depois de 2 meses afastados do projeto, voltamos! E voltamos com estilo! O banco do F5im ficou pronto, e ficou lindo!!!

Ao todo, foram necessários exatos 3 meses para a conclusão dessa etapa, conforme nosso primeiro post do assunto Chassis vs Banco.

A inspiração do desenho do banco foi baseado no conjunto da Mercedes A45 AMG, que eu achei muito bonito. Sem mais delongas...


Apoio da cabeça, dos ombros e lombar moldados na espuma. 

Suporte da perna projetado. 

Costuras em vermelho, combinando com os detalhes do banco.

Semana que vem teremos atualizações na parte eletrônica!!! Não percam!!!

sexta-feira, 29 de abril de 2016

F5im Alpha 0.1

Estamos evoluindo no desenvolvimento dos códigos para o display e para a plataforma do full motion. Essa semana, tive como meta, (re)produzir e aprimorar os códigos para o Arduino.

Comecemos pela parte boa!

Usei, como ponto de partida para o display do F5im, o projeto do FergoTech. O Fernando, utilizou nesse projeto apenas 1 display com controlador TM1638. No F5im, utilizaremos 2 displays com o mesmo controlador TM1638. Assim, podemos acessar o dobro de informações de maneira simultânea e também nos deixa com um button box integrado de 16 botões, o que não é nada mal!!!

Primeiros testes com 2 displays TM1638 integrados:




Agora, vou precisar de mais estudo para poder integrar os display e separar as informações para cada um!!!

Agora vamos para a parte dolorosa!

Na plataforma full motion, os testes preliminares foram um sucesso!!!! Até ligarmos as 2 fontes de 24V nos controladores. Algum curto, ainda não identificado, acabou queimando a fonte e talvez o controlador. Ainda não consegui testa-lo...

A fonte queimada é a da direita, porém, não consegui identificar qual componente foi afetado.


Próxima semana estarei afastado das atividades, tanto do blog, quanto do F5im.

Até breve pessoal!

quarta-feira, 20 de abril de 2016

O Código F-5im

Essa semana começamos com os testes no arduino and, so far, so good!!! No final do post deixo o código para aqueles que queiram se aventurar!!!


Na próxima semana, farei os testes com os moteres bosch acoplados ao sistema e ainda começaremos a pensar no layout para prender todas as fontes e placas dentro da caixa de Pandora. Acrílico? Suporte Metálico? Ideias e sugestões são bem vindos! Mais detalhes em Caixa de Pandora.

Abraços e até lá...

Code: Select all
/* 
 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.x-sim.de/forum/posting.php?mode=edit&f=37&t=943&p=8481  in french : http://www.gamoover.net/Forums/index.php?topic=27617
 Updated 30 April 2014 by RacingMat (bug for value below 16 corrected)
 Updated 20 April 2016 by Guto Antunes for F-5im Motorsport Simulations http://f5im.blogspot.com.br 
*/

#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 A0
#define potR A1

////////////////////////////////////////////////////////////////////////////////
//  DECLARATIONS
////////////////////////////////////////////////////////////////////////////////
/*  VNH3SP30 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[i], OUTPUT);
    pinMode(inBpin[i], OUTPUT);
    pinMode(pwmpin[i], OUTPUT);
  }
  // Initialize braked for motor
  for (int i=0; i<2; i++)
  {
    digitalWrite(inApin[i], LOW);
    digitalWrite(inBpin[i], 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=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(potL));
  Serial.print(";");
  Serial.println(analogRead(potR));
  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[i]>47 && x[i]<58 ){//for x0 to x9
      x[i]=x[i]-48;
    }                     
      if (x[i]>64 && x[i]<71 ){//for xA to xF
      x[i]=(x[i]-65)+10;     
    }
  }
  // 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;
}