Software Captacion Datos (multi-Simuladores) + Arduino
Moderador: XRStaff
Re: Software Captacion Datos (multi-Simuladores) + Arduino
Hola chicos.
Por fin encontré lo que queria.
Después de analizar Simhub(por sugerencia de Vojvoda), SimDash de Symprojects, X-sim (por sujerencia de Psarias, de 900grados.es) no me convencia nada. Todo andaba enfocado a arduino, no se explica de donde salen las cosas, que se envia por el puerto serie (hay que ir buceando en los códigos de arduino), y con la premisa de hacer todo en código abierto, encontré en un foro la referencia a un trabajo de ArduinoRacingDash
El código en cuestión es
https://github.com/WarriorOfAvalon/ArduinoRacingDash
Lo primero que pensé era en usar la iRacingSdkWrapper.dll en mi entorno de programación en QT y tras pasar unas horas buscando y no tenerlo claro no me ha quedado mas remedio que aceptar usar C#.
Hay un pdf que explica bien el funcionamiento de la dll, e incluso he llegado a encontrar una versión en python que tampoco domino.
Me he instalado el Visual Studio 2017, pero me petaban los programas descargados, asi que he instalado el Visual Studio 2013 y voila, ya tengo un código en C# que saca los datos del juego y los puede enviar a mi pantalla.
La primera curiosidad que he visto es que el código espera una placa arduino, como la mia no es, menos mal que he visto el fuente y lo cambiaré para que use lo que yo quiera.
for (int i = 0; i < cbo.Items.Count; i++)
{
if (cbo.Items.ToString().Contains("Arduino"))
{
String port = Regex.Match(cbo.Items.ToString(), @"\(([^)]*)\)").Groups[1].Value;
console("Found Arduino On Port: " + port);
startMethod(port);
for (int j = 0; j < SerialPort.GetPortNames().Length; j++)
{
if (SerialPort.GetPortNames()[j].Equals(port))
startPort = j;
}
break;
}
}
Por otro lado tengo control total sobre que se envía a mi placa y en que posiciones.
public byte[] compile(Boolean spdUnit, int intensity){
int iSpeed = spdUnit ? Convert.ToInt16(Speed * 2.23693629) : Convert.ToInt16(Speed * (2.23693629 * 1.609344));
int iShift = Convert.ToInt16(Math.Round((Shift * 100 * 16) / 100));
serialdata[0] = 255;
serialdata[1] = Convert.ToByte((DeltaNeg << 7) | (intensity << 4) | 0);
serialdata[2] = Convert.ToByte(Gear + 1);
serialdata[3] = Convert.ToByte((iSpeed >> & 0x00FF);
serialdata[4] = Convert.ToByte(iSpeed & 0x00FF);
serialdata[5] = Convert.ToByte((RPM >> & 0x00FF);
serialdata[6] = Convert.ToByte(RPM & 0x00FF);
serialdata[7] = Convert.ToByte((Fuel >> & 0x00FF);
serialdata[8] = Convert.ToByte(Fuel & 0x00FF);
serialdata[9] = Convert.ToByte(iShift);
serialdata[10] = Engine;
serialdata[11] = Convert.ToByte(Lap);
serialdata[12] = 0;
serialdata[13] = Convert.ToByte((Delta >> & 0x00FF);
serialdata[14] = Convert.ToByte(Delta & 0x00FF);
serialdata[15] = Convert.ToByte(Mins);
return serialdata;
Espero tenerlo listo este fin de semana para el Iracing el leer los datos y mandarlos a mi pantalla.
Para los botones y rotarys he pensado en un software que los mapee como un jostick y asignarlos dentro del juego, pero eso es la segunda parte.
En cuanto tenga imágenes lo pongo, y si alguien se anima crearé un repositorio en Github (nunca lo he usado, supongo se podrá) para que pueda colaborar, y sino cuando lo termine lo colgaré de todos modos con todos los fuentes y referencias a los trabajos de donde he partido.
Por fin encontré lo que queria.
Después de analizar Simhub(por sugerencia de Vojvoda), SimDash de Symprojects, X-sim (por sujerencia de Psarias, de 900grados.es) no me convencia nada. Todo andaba enfocado a arduino, no se explica de donde salen las cosas, que se envia por el puerto serie (hay que ir buceando en los códigos de arduino), y con la premisa de hacer todo en código abierto, encontré en un foro la referencia a un trabajo de ArduinoRacingDash
El código en cuestión es
https://github.com/WarriorOfAvalon/ArduinoRacingDash
Lo primero que pensé era en usar la iRacingSdkWrapper.dll en mi entorno de programación en QT y tras pasar unas horas buscando y no tenerlo claro no me ha quedado mas remedio que aceptar usar C#.
Hay un pdf que explica bien el funcionamiento de la dll, e incluso he llegado a encontrar una versión en python que tampoco domino.
Me he instalado el Visual Studio 2017, pero me petaban los programas descargados, asi que he instalado el Visual Studio 2013 y voila, ya tengo un código en C# que saca los datos del juego y los puede enviar a mi pantalla.
La primera curiosidad que he visto es que el código espera una placa arduino, como la mia no es, menos mal que he visto el fuente y lo cambiaré para que use lo que yo quiera.
for (int i = 0; i < cbo.Items.Count; i++)
{
if (cbo.Items.ToString().Contains("Arduino"))
{
String port = Regex.Match(cbo.Items.ToString(), @"\(([^)]*)\)").Groups[1].Value;
console("Found Arduino On Port: " + port);
startMethod(port);
for (int j = 0; j < SerialPort.GetPortNames().Length; j++)
{
if (SerialPort.GetPortNames()[j].Equals(port))
startPort = j;
}
break;
}
}
Por otro lado tengo control total sobre que se envía a mi placa y en que posiciones.
public byte[] compile(Boolean spdUnit, int intensity){
int iSpeed = spdUnit ? Convert.ToInt16(Speed * 2.23693629) : Convert.ToInt16(Speed * (2.23693629 * 1.609344));
int iShift = Convert.ToInt16(Math.Round((Shift * 100 * 16) / 100));
serialdata[0] = 255;
serialdata[1] = Convert.ToByte((DeltaNeg << 7) | (intensity << 4) | 0);
serialdata[2] = Convert.ToByte(Gear + 1);
serialdata[3] = Convert.ToByte((iSpeed >> & 0x00FF);
serialdata[4] = Convert.ToByte(iSpeed & 0x00FF);
serialdata[5] = Convert.ToByte((RPM >> & 0x00FF);
serialdata[6] = Convert.ToByte(RPM & 0x00FF);
serialdata[7] = Convert.ToByte((Fuel >> & 0x00FF);
serialdata[8] = Convert.ToByte(Fuel & 0x00FF);
serialdata[9] = Convert.ToByte(iShift);
serialdata[10] = Engine;
serialdata[11] = Convert.ToByte(Lap);
serialdata[12] = 0;
serialdata[13] = Convert.ToByte((Delta >> & 0x00FF);
serialdata[14] = Convert.ToByte(Delta & 0x00FF);
serialdata[15] = Convert.ToByte(Mins);
return serialdata;
Espero tenerlo listo este fin de semana para el Iracing el leer los datos y mandarlos a mi pantalla.
Para los botones y rotarys he pensado en un software que los mapee como un jostick y asignarlos dentro del juego, pero eso es la segunda parte.
En cuanto tenga imágenes lo pongo, y si alguien se anima crearé un repositorio en Github (nunca lo he usado, supongo se podrá) para que pueda colaborar, y sino cuando lo termine lo colgaré de todos modos con todos los fuentes y referencias a los trabajos de donde he partido.
-
- Primeras curvas
- Mensajes: 131
- Registrado: 09 Jun 2012 14:36
- Volante: Thrustmaster TS-PC Racer
- Ubicación: Cádiz
- Contactar:
Re: Software Captacion Datos (multi-Simuladores) + Arduino
Hola.jaht escribió: ↑14 Abr 2017 20:40 Bueno, ya me he leido todo el hilo.
Me he bajado el InPut 0.0.7 y los plugins de rfactor.
Ahora programaré un puerto serie en mi placa y a leer datos. Por lo que he podido entender el input manda datos sin parar por el puerto serie en formato ascii, separando con letras cada dato.
Lo que no he visto es el enviarle los botones de mi placa al juego.
He encontrado como hacer una dll de rfactor con rfInternalsPluginsV3.
El programa InPutDataFisic veo que está hecho en Visual C. No me llevo muy bien con Visual C. Lo he usado pero he estado muchos años con Borland y ahora trabajo con QT. Mi intención era hacer un programa como el se Sito en QT.
También he visto que Vojvoda propone relanzar este hilo de nuevo.
Mi idea es llegar a algo como esto
Gastando lo menos posible y publicar todo para que cualquiera pueda llegar a hacerlo.
Saludos
Es c# no C. Por otro lado no uso los botones de la placa ni recojo sus pulsos, que seria fácil hacerlo, lo que yo uso son los botones del volante para interactuar con arduino.
De lo poco que me falta ( o mucho ) , es incluir IRACING .
Tengo el proyecto algo parado por el foro, peto me pongo en mis ratos libres... que no son muchos ahora.
Saludos
Código: Seleccionar todo
if(!borracho)
{
MessageBox.Show("Disfruta conduciendo, no podemos conducir por ti");
}
else
{
MessageBox.Show("Hoy toca bus");
}
Re: Software Captacion Datos (multi-Simuladores) + Arduino
Hola Sito
Gracias por contestar.
Ya se que C# no es C, ni siquiera C++. He trabajado mucho en C, y para objetos o clases Delphi. C# es la apuesta de Microsoft frente al Java de Sun.
Lo de que los botones es facil hacerlo, no lo sé. He pensado en que cuando quite el volante y ponga el mio, parte de los botones los cablearé a la placa del G27. Pero los rotarys los leeré con mi micro y los enviaré por USB al programa de PC que estoy preparando. Lo que entiendo es que no es sencillo poner esos datos en la memoria. Para sacar datos del Iracing se leen de la memoria con la dll iRacingSdkWrapper.dll. Pero poner datos en la memoria del juego es otra cosa. Supongo que está muy capado para impedir que la gente haga trampas jugando y que la solución es que se vea como un josticg mi placa y asignarle funciones en el juego.
Para el Iracing el proyecto iRacingSLI dentro de ArduinoRacingDash es el que demuestra como usar la dll y las clase de telemetría y información de sesión.
Espero el lunes poder subir un video funcionando el Iracing con mi pantalla.
Saludos
Gracias por contestar.
Ya se que C# no es C, ni siquiera C++. He trabajado mucho en C, y para objetos o clases Delphi. C# es la apuesta de Microsoft frente al Java de Sun.
Lo de que los botones es facil hacerlo, no lo sé. He pensado en que cuando quite el volante y ponga el mio, parte de los botones los cablearé a la placa del G27. Pero los rotarys los leeré con mi micro y los enviaré por USB al programa de PC que estoy preparando. Lo que entiendo es que no es sencillo poner esos datos en la memoria. Para sacar datos del Iracing se leen de la memoria con la dll iRacingSdkWrapper.dll. Pero poner datos en la memoria del juego es otra cosa. Supongo que está muy capado para impedir que la gente haga trampas jugando y que la solución es que se vea como un josticg mi placa y asignarle funciones en el juego.
Para el Iracing el proyecto iRacingSLI dentro de ArduinoRacingDash es el que demuestra como usar la dll y las clase de telemetría y información de sesión.
Espero el lunes poder subir un video funcionando el Iracing con mi pantalla.
Saludos
-
- Primeras curvas
- Mensajes: 131
- Registrado: 09 Jun 2012 14:36
- Volante: Thrustmaster TS-PC Racer
- Ubicación: Cádiz
- Contactar:
Re: Software Captacion Datos (multi-Simuladores) + Arduino
Para enviar comando de teclas a un juego usa "sendkeys ".
Swtich (botonRecibido)
{
case "repartoFrenada":
sendKeys.send("Q"); //Q sería la tecla asignada en el juego para el repartí de frenada
Break;
case..... //resto de código
Swtich (botonRecibido)
{
case "repartoFrenada":
sendKeys.send("Q"); //Q sería la tecla asignada en el juego para el repartí de frenada
Break;
case..... //resto de código
Código: Seleccionar todo
if(!borracho)
{
MessageBox.Show("Disfruta conduciendo, no podemos conducir por ti");
}
else
{
MessageBox.Show("Hoy toca bus");
}
Re: Software Captacion Datos (multi-Simuladores) + Arduino
Gracias Sito por el apunte. Lo probaré en cuanto pueda.
De momento, gracias a este fin de semana largo ya he conseguido que me comunicara mi placa con el PC (me dio la lata el sábado que no se veia, al final tema de cloks de la placa), y luego me ha llevado unas cuantas horas añadir a la pantalla una fuente de letra mas grande de las que lleva nativas solo para la puñetera marcha (todo por un número) pero bueno, ya está funcionando con Iracing. Ahora a dar formato a los datos de tiempo. En el video que os pongo se envia la marcha, la vuelta, el fuel (que no se en que unidades está) y la velocidad.
En el vídeo se ven dos USB uno es el de cargar el software a la placa y el otro es el de comunicación de la placa con el PC
Voy a ir preparando también una placa con los botones y rotarys y los led para las revoluciones.
De momento, gracias a este fin de semana largo ya he conseguido que me comunicara mi placa con el PC (me dio la lata el sábado que no se veia, al final tema de cloks de la placa), y luego me ha llevado unas cuantas horas añadir a la pantalla una fuente de letra mas grande de las que lleva nativas solo para la puñetera marcha (todo por un número) pero bueno, ya está funcionando con Iracing. Ahora a dar formato a los datos de tiempo. En el video que os pongo se envia la marcha, la vuelta, el fuel (que no se en que unidades está) y la velocidad.
En el vídeo se ven dos USB uno es el de cargar el software a la placa y el otro es el de comunicación de la placa con el PC
Voy a ir preparando también una placa con los botones y rotarys y los led para las revoluciones.
Re: Software Captacion Datos (multi-Simuladores) + Arduino
Bueno, para los que querais ver como evoluciona mi volante, lo teneis en el hilo
viewtopic.php?f=45&t=12368
viewtopic.php?f=45&t=12368
Re: Software Captacion Datos (multi-Simuladores) + Arduino
(No encuentro el tema apropiado, lo siento. A ver si me podeis echar un cable).
Hola! Tengo un simulador 2dof construido con arduino, moto monsther y x-Sim. Y me funcionaba bien. El tema es que he cambiado a las IBT2 para alimentar cada motor a 24v y ya no va igual. Tengo que cambiar el firmrware a la Arduino? Por otro lado, para usar el Simtools,(ya tengo la licencia) es el mismo cableado y conexionado? Muchas gracias por vuestra ayuda e interes. Un saludo.Héctor.
Hola! Tengo un simulador 2dof construido con arduino, moto monsther y x-Sim. Y me funcionaba bien. El tema es que he cambiado a las IBT2 para alimentar cada motor a 24v y ya no va igual. Tengo que cambiar el firmrware a la Arduino? Por otro lado, para usar el Simtools,(ya tengo la licencia) es el mismo cableado y conexionado? Muchas gracias por vuestra ayuda e interes. Un saludo.Héctor.