Cockpit de Movimento com Arduino - Parte 1


Gosto muito de jogos simuladores de corrida. Um tempo atrás meu cunhado comentou comigo sobre esses cockpits que movimentam em curvas e também sobre velocímetros reais que acompanham o jogo, mas até então não fazia ideia de como eles funcionavam. A pouco tempo ele me enviou um vídeo sobre um e decidi estudar um pouco, descobri que boa parte dos jogos possui APIs que entregam dados dos jogo, então falei com ele que se ele interessasse em fazer a mecânica eu faria a eletrônica e programação.

Nossa ideia é fazer algo o mais simples possível, então concluímos que usar Arduino para a eletrônica e apenas dois atuadores são suficientes. Não decidimos ainda que tipo de atuadores usar, mas provavelmente serão motores de passo, neste pequeno protótipo usei servos de aeromodelos.

O jogo que estou fazendo o teste é o Project CARS e a programação foi feita em C++, já que a API é em C++. É necessário adicionar uma biblioteca no código disponível no forum do pCars, depois é feito um mapeamento de memoria do jogo e declara-se os objetos da biblioteca que trabalha com structs. Com os dados em variáveis é hora de trabalhar com eles, eu fiquei sem saber o que usar para simular as "rolagens" do carro, já que o jogo não fornece a força G, então descidi fazer a rolagem lateral usando os dados de velocidade angular do eixo y. Por enquanto apenas isso que está pronto, para rolagem frontal (na frenagem), devo usar dados de velocidade em conjunto com a posição do freio. A velocidade angular varia do negativo ao positivo, para um lado é negativo e para o outro positivo, quando é negativo removo o sinal, multiplico por um numero, já que os números são muito baixos e queria trabalhar com três dígitos no Arduino, então definido o multiplicador para o numero máximo não passar de 999 e adiciono na frente do numero a letra r (right), para o outro lado multiplico e adiciono 'l'. Usando uma biblioteca para enviar dados para a sua serial de forma fácil, envio os dados para o Arduino. No Arduino apenas verifico se está chegando 'r', se sim envio os dados para um servo, se não envio para o outro.

Os códigos estão disponíveis em meu Github.

Abaixo segue um vídeo do funcionamento.




Agora vou trabalhar melhor o codigo, onde quando um servo subir o outro desce um pouco e fazer a rolagem frontal (frenagem).

Comentários

  1. Respostas
    1. Olá, estão parados por falta de tempo. Mas assim que puder retornarei.

      Excluir
  2. amigo seu projeto e muito bom to montando um cockpit para um simulador de trucks o ETS 2 mais to tendo dificuldades em programar sabe de alguém que ja fez um para essa finalidade?

    ResponderExcluir
    Respostas
    1. Olá João! Para esse simulador não conheço. Dê uma olhada no forum xsimulator, talvez você ache alguma coisa lá.
      https://www.xsimulator.net/community/

      Excluir
  3. o meu projeto e com um arduino uno r3 u uma ponte h L298 para 2 motores

    ResponderExcluir
  4. Parabéns amigo! Você sabe dizer onde consigo os mesmos dados no game Dirty4?

    ResponderExcluir
    Respostas
    1. Ola Wagner, o Dirt não mexi em nenhum, mas tem com certeza. Da uma olhada nos foruns do jogo.

      Excluir
    2. Muito obrigado pela atenção, tenho percorrido alguns e nada, continuo na busca, quero melhorar meu cockpit, incrementando movimento. Mas na verdade, a princípio queria mesmo apenas uma certa vibração de acordo com o terreno, impactos, etc...Aproveitando, me diga, pelo que entendi, terei que elaborar um programa para cada jogo, ou ao menos uma configuração para cada, pois os dados pelo visto devem vir cada um de uma forma. Obrigado!

      Excluir
    3. Parece que ele usa UDP para comunicação, tem um exemplo do Dirt2 no link e normalmente não muda de uma versão de jogo para outra mais nova. Dê uma olhada no exemplo que pode te ajudar, UDP eu nunca mexi.
      https://www.xsimulator.net/community/threads/how-to-write-a-game-plugin-for-simtools-2-0-api-documentation.9107/

      Excluir
  5. Saude para voce. Qual programa voce usou para obter o codigo? IDA?

    ResponderExcluir

Postar um comentário