Plataforma de movimento: Utilizando Arduino com X-Plane


plataforma_movimento

Experiência para desenvolvimento de uma plataforma de movimento para simulador de voo. É utilizado o X-Plane 10, e através de um script em python, é criada uma comunicação serial com o arduino. Que por sua vez, controla dois servo motores fazendo o movimento da plataforma. Para que o script funcione, é necessário instalar o plugin Python Interface.

Downloads:

Esquema para ligar os servomotores:
Obs: Utilizar dois servo motores consome muita corrente. É importante utilizar uma fonte de energia externa além do cabo USB.

Segue código para ser carregado no arduino:

[sourcecode language=”cpp” wraplines=”false” collapse=”true”]
#include <Servo.h>

Servo servoPitch; // Cria servo object para controlar um servo
Servo servoRoll; // Cria servo object para controlar um servo

// Inicializa variaveis
int posPitch = 0;
int posRoll = 0;
int inByte;

String pitch, pitchold, roll, rollold;

void setup()
{
servoPitch.attach(8); // Define o pino 8 para controlar o servo
servoRoll.attach(9); // Define o pino 8 para controlar o servo

// Inicializa a comunicacao serial
Serial.begin(115200);
Serial.flush();
}

void loop() {
// le o ultimo dado no buffer:
if (Serial.available() > 0) {
inByte = Serial.read();

if (inByte == ‘P’){ // Identificador do Pitch
delay (11); // atraso necessario para evitar erro de leitura
pitch = "";
pitch += char(Serial.read());// sinal
pitch += char(Serial.read());
pitch += char(Serial.read());
pitch += char(Serial.read());
pitch += char(Serial.read()); // ponto
pitch += char(Serial.read()); // decimal
if (pitch != pitchold){ // verifica se a leitura nova eh diferente da anterior

posPitch = ((pitch[2]-48)*10+(pitch[3]-48));
if (pitch[0] == ‘-‘){
posPitch = (posPitch * -1);
}
posPitch = posPitch + 90;
servoPitch.write(posPitch);
delay(11);

pitchold = pitch; // Atualiza a leitua anterior.
}
}

if (inByte == ‘R’){ // Identificador do Roll
delay (11);
roll = "";
roll += char(Serial.read()); // sinal
roll += char(Serial.read());
roll += char(Serial.read());
roll += char(Serial.read());
roll += char(Serial.read()); // ponto
roll += char(Serial.read()); // decimal
if (roll != rollold){

// Converte string para numero
posRoll = ((roll[2]-48)*10+(roll[3]-48));
if (roll[0] == ‘-‘){
posRoll = (posRoll * -1);
}
// 90 eh a posicao centrol do servo
posRoll = posRoll + 90;
servoRoll.write(posRoll);
// Aguarda o servo atualizar posicao
delay(11);

rollold = roll;
}
}

}
}
[/sourcecode]

A qui o código do script python. O arquivo deve ser adicionado em …\X-Plane 10\Resources\plugins\PythonScripts\

É importante modificador a porta COM de acordo com a porta onde o arduino está instalado.

[sourcecode language=”python” wraplines=”false” collapse=”true”]
# -*- coding: cp1252 -*-
"""
PY_motion
Transmite via comunicacao serial, informacoes
de Pitch e Roll
2015 – leonardoviana.com.br/hangar-ok
"""

# Importa bblioteca serial
import serial

# Bibliotecas do Python Interface
from XPLMDefs import *
from XPLMDataAccess import *
from XPLMProcessing import *

class PythonInterface:
"""
XPluginStart
Inicializa o plugin
"""
def XPluginStart(self):
"""O sistema de plugins necessita destas informacoes para uma descricao correta"""
self.Name = "PyMotion"
self.Sig = "JOZ.Python.PyMotion"
self.Desc = "Envia informacoes do Pitch e Roll via Serial"

# >>>>>>>>>> IMPORTANTE: Modifique a porta e velocidade de acordo com o Arduino
self.ser = serial.Serial(‘COM9’, 115200, timeout = 12)

# Inicializa os Datarefs
self.DataRefPitch = XPLMFindDataRef("sim/flightmodel/position/theta")
self.DataRefRoll = XPLMFindDataRef("sim/flightmodel/position/phi")
self.atual_seq = ”
self.serial_seq = ”

# Nosso Callback ‘funcao principal’ baseado em tempo
self.FlightLoopCB = self.FlightLoopCallback
XPLMRegisterFlightLoopCallback(self, self.FlightLoopCB, 1.0, 0)
return self.Name, self.Sig, self.Desc
"""
XPluginStop
Necessario. Utilizado para finalizar as rotinas iniciadas
"""

def XPluginStop(self):
XPLMUnregisterFlightLoopCallback(self, self.FlightLoopCB, 0)
self.ser.close()
pass
def XPluginEnable(self):
return 1
def XPluginDisable(self):
pass
def XPluginReceiveMessage(self, inFromWho, inMessage, inParam):
pass

#Funcao pincipal:
def FlightLoopCallback(self, elapsedMe, elapsedSim, counter, refcon):

# Informação Pitch Roll

self.infPitch = ‘000’
self.infPitch = self.infPitch + ‘%.1f’ %abs(XPLMGetDataf(self.DataRefPitch))
self.infPitch = self.infPitch[-5:]
if XPLMGetDataf(self.DataRefPitch) < 0:
self.infPitch = ‘P-‘ + self.infPitch
else:
self.infPitch = ‘P+’ + self.infPitch

self.infRoll = ‘000’
self.infRoll = self.infRoll + ‘%.1f’ %abs(XPLMGetDataf(self.DataRefRoll))
self.infRoll = self.infRoll[-5:]
if XPLMGetDataf(self.DataRefRoll) < 0:
self.infRoll = ‘R-‘ + self.infRoll
else:
self.infRoll = ‘R+’ + self.infRoll

self.atual_seq = (self.infPitch+self.infRoll)

# Comparamos a string, caso seja diferente da enviada via serial, enviamos novamente
if (self.serial_seq != self.atual_seq):
self.serial_seq = self.atual_seq
self.ser.write(self.serial_seq)

# A funcao devera ser chamada novamente em 0.5 sec
return 0.05
[/sourcecode]

Vídeo com a demonstração:

 

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

20 pensamentos em “Plataforma de movimento: Utilizando Arduino com X-Plane

  • Alberto Hernandez

    Hola buenas Tardes amigo, te escribo desde Colombia…. estoy trabajando en un proyecto y necesito manipular el cabeceo y alabeo del avión del xplane por medio de un joystick (en este caso el nunchuck del nintendo wii) que a su vez va conectado a las entradas del Arduino, pero no consigo hacer la comunicación del arduino por puerto serial al xplane, del cabeceo y alabeo. estaba pensando en hacer un pluggin por python pero no se como hacerlo, ya que mis conocimientos en python son nulos. Espero tu respuesta gracias este es mi correo …

  • Walter

    ola amigo baixei os programas mas não consigo fazer funncionar porde me passar as cordenadas de como instalar tudo e como funcionar estes programas como mover os motores com o movimento do jogo pode ser usado em qualquer jogo de avião, pode me dar um tutorial explicativo de como fazer o bicho fumfar, obrigado

    • Joz Autor do post

      Olá Walter, nos próprios links acima explicam como instalar cada programa. Para que o código funcione corretamente é necessário ter o X-Plane 10. Mas com algumas modificações no código é possível utilizar outro simulador de voo.
      Com o lançamento da versão 10.35 do X-Plane, esse código será simplificado não precisando mais do PythonInterface. Pretendo fazer um tutorial assim que possível.

      Abraços

      • Walter

        obrigado, mas sou meio leigo nesta parte poderia me detalhar os passos procedimentos de instalação e os programas usados não entende muito bem. x 10 plane na verdade é o jogo

        • Joz Autor do post

          Tudo bem Walter, acompanhe o site e assim que possível preparo um vídeo tutorial detalhando o processo.
          Enquanto isso, aconselho pesquisar vídeos no youtube para se familiarizar com o Arduino. Tem muita coisa boa.
          Abraços.

          • Joz Autor do post

            Olá André, um tutorial “muito” detalhado, não. Mas se tiver dificuldades em seguir as etapas do processo acima, basta falar.

            Abcs

  • Samy

    Ola Joz, estou desenvolvendo uma motion platform biplace em FS, mas pretendo migrar pro Xplanes em breve. Gostaria de criar um canal direto contigo para troca de experiências principalmente no frame serial. Poderia me envial um email? Grato

  • Marlon henrique Ribeiro dos Santos

    Grande Joz blz. Cara te conheço daqui de Ilhéus do Aeroclube. Eu sou aquele carinha que tem um simulador de voo Airbus. Estou agora fazendo novo projeto com plataforma móvel comprei 2 atuadores linear na China placa Arduino e tudo em breve vou postar uns vídeos lá no meu canal. To esperando umas peças chegarem em breve entro em contato com vc pra tirar umas duvidas sobre essa ligação do Arduino no simulador. Abraços.

  • n

    Boa tarde Joz

    Meu nome é Nicola e eu montei uma plataforma motion com 2 motoredutores de 24v na parte frontal; eu estava usando para games de carros de corrida(automobilista DA REIZA STUDIOS) e o software motion X-sim, co o arduino uno + 2 pontes h ibt 2

    Agora eu quero usar esta mesma plataforma para simulador de voo com o x-plane 10 ou o x-plane 11 e acredito que para usar uma destas 2 versões do x-plane seja mais pratico usar o seu código

    vc acha que dá para usar seu código na minha plataforma e o plugin Python Interface?

    sds
    Nicola

    • Joz Autor do post

      Olá Nicola,
      Não conheço o motion X-sim, mas como você pode notar, meus códigos são extremamente simples e portanto será fácil fazer qualquer modificação. A princípio não vejo problemas em utilizar sua plataforma. Espero que os códigos sejam úteis, qualquer dúvida é só falar.

      Abcs

  • Augusto

    Boa Tarde Joz, gostaria de saber se eu poderia usar esta interface xplane, num simulador de corrida ???
    Para receber as informações de aceleração e movimento do volante no arduino ???
    Grato e aguardo retorno…
    Augusto
    São Paulo

  • Hernandes Rueda

    Olá Joz,

    Estou construindo um yoke colum 737, mas não gosto de usar molas para retornar ao centro dos comandos.
    Estou querendo colocar servo motores para substituir as molas. Penso em utilizar arduino, servo motor e potenciômetro para indicar a posição do manche-yoke, mas não sei como pegar os dados do x-plane ou fsx!
    Você saberia me dizer como?

    Obrigado.

  • Hernandes Rueda

    Olá Joz!

    Consigo modificar este código para o elevator e aileron, fazer tipo um force feedback? Quais linhas eu precisaria modificar? Não sei muito de programação, então me falando ao menos as linhas que deverão ser modificadas já ajudaria bastante. Qualquer coisa, eu te mando o código para você ”lapida-lo”

    Valeu Joz

    • admin Autor do post

      Blz Hernandes, estou atualizando o código para funcionar direto com o x-plane sem precisar do plugin em python. Enviarei um email e então você fala sobre sobre suas dúvidas.

      Abcs