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:
- Pyton Interface: http://www.xpluginsdk.org/python_interface_downloads.htm
- Ambiente de execução Python: https://www.python.org/downloads/
- Biblioteca PySerial: http://pyserial.sourceforge.net/
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:
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 …
En contacto.
Salud.
ps. Su correo electrónico se ha tomado de la observación para evitar spam.
amigo no te entendi, y no me llego ningun correo… Si me puedes ayudar por favor?
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
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
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
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.
oi Comando! boa noite! conseguiu elaborar um tutorial detalhado do processo que se refere acima?
Olá André, um tutorial “muito” detalhado, não. Mas se tiver dificuldades em seguir as etapas do processo acima, basta falar.
Abcs
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
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.
Grande cmte Marlon! Sim, lembro do seu projeto. Espero trocarmos informações e ver esse seu simulador ainda mais realista.
Abcs
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
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
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
Olá Augusto, acredito que sim. O precisa é saber como é a interface de dados desse simulador de corrida.
Abcs
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.
Sim, posso ajudar. Principalmente com o X-Plane.
Enviei um email pra vc.
Abcs
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
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