Cliffs of dover
Cliffs of dover
#1Salut la communauté,
Une petite vidéo d'un travail que je réalise, plutot une étude de faisabilité pour le moment, avant, de , qui sait me lance.
C'est sous Cliffs of Dover, patché TeamFusion.
La TeamFusion nous a amené un export de données qui fonctionne même en multi.
J'utilise un code C# qui envoi les datas du jeu (gear left, gear right et RPM pour le moment).
En sortie j'ai une Arduino Uno avec LED pour chaque jambe de train et une servo pour le RPM (pas la bonne servo, une 180° pour le moment, mais le principe est là).
Mon code est stable désormais (je débute tout juste...), donc je vais pouvoir l'y mettre à fond.
[BBvideo 800,600][/BBvideo]
Et je m'excuse pour la musique, elle est seulement là pour couvrir les ronflements de mon chien...
Une petite vidéo d'un travail que je réalise, plutot une étude de faisabilité pour le moment, avant, de , qui sait me lance.
C'est sous Cliffs of Dover, patché TeamFusion.
La TeamFusion nous a amené un export de données qui fonctionne même en multi.
J'utilise un code C# qui envoi les datas du jeu (gear left, gear right et RPM pour le moment).
En sortie j'ai une Arduino Uno avec LED pour chaque jambe de train et une servo pour le RPM (pas la bonne servo, une 180° pour le moment, mais le principe est là).
Mon code est stable désormais (je débute tout juste...), donc je vais pouvoir l'y mettre à fond.
[BBvideo 800,600][/BBvideo]
Et je m'excuse pour la musique, elle est seulement là pour couvrir les ronflements de mon chien...
Re: Cliffs of dover
#3Salut, Chapeau l'artiste !
avec quoi as-tu fais ta jauge ? Pour ma part, j'ai utilisé des servomoteurs. Mais je galère à trouver des servomoteurs 270° ou plus de 180° !
Les servo 360° n'ayant pas du tout la même fonction, et la course des 180° n'est pas top pour une jauge.
J'ai abandonné l'idée des moteurs pas à pas (Trop chiant à faire avec un capteur de position)
Voici une petite vidéo de comment je m'y suis pris
avec quoi as-tu fais ta jauge ? Pour ma part, j'ai utilisé des servomoteurs. Mais je galère à trouver des servomoteurs 270° ou plus de 180° !
Les servo 360° n'ayant pas du tout la même fonction, et la course des 180° n'est pas top pour une jauge.
J'ai abandonné l'idée des moteurs pas à pas (Trop chiant à faire avec un capteur de position)
Voici une petite vidéo de comment je m'y suis pris
L'histoire du pit sur Checksix : viewtopic.php?f=286&t=192908
Télécharger mon programme : http://f4toserial.com
La chaîne Youtube : https://www.youtube.com/channel/UChAv6B ... 1J7oDf-W1w
Les photos du cockpit : https://photos.app.goo.gl/BqyyyjkKzo2ZjdoF9
Télécharger mon programme : http://f4toserial.com
La chaîne Youtube : https://www.youtube.com/channel/UChAv6B ... 1J7oDf-W1w
Les photos du cockpit : https://photos.app.goo.gl/BqyyyjkKzo2ZjdoF9
Re: Cliffs of dover
#5Salut,
Mon test est fait avec une servo de 180°.
La question tombe bien, car je pensais me tourner vers des 360°.
Donc c'est mort ?
Le fonctionnement de la 180° est très simple, avec les définitions des points 0 et 180° et valeurs associées du genre : 0, 1600, 180, 3300=> ce qui me donne 0° pour 1600 RPM, 180° pour 3300.
Pas la même sur une 360° ?
Je vais regarder pour les engrenages. Il me semble avoir vu un post qui référence un site d'achat... ou alors je regarde dans les LEGO de mes enfants !
Mon test est fait avec une servo de 180°.
La question tombe bien, car je pensais me tourner vers des 360°.
Donc c'est mort ?
Le fonctionnement de la 180° est très simple, avec les définitions des points 0 et 180° et valeurs associées du genre : 0, 1600, 180, 3300=> ce qui me donne 0° pour 1600 RPM, 180° pour 3300.
Pas la même sur une 360° ?
Je vais regarder pour les engrenages. Il me semble avoir vu un post qui référence un site d'achat... ou alors je regarde dans les LEGO de mes enfants !
Re: Cliffs of dover
#6Tu mets un engrenage avec 15 dents d'un côté, 30 de l'autre et tu double ainsi ton angle.
Ou bien 20 et 10. Le tout est d'avoir un rapport de 2
Ou bien 20 et 10. Le tout est d'avoir un rapport de 2
Re: Cliffs of dover
#7Non effectivement c'est mort avec les 360. J'ai eut la surprise après en avoir commandé 5 !Mon test est fait avec une servo de 180°.
La question tombe bien, car je pensais me tourner vers des 360°.
Donc c'est mort ?
En réalité ils ne fonctionnent pas du tout pareil ! les servo 360 sont considérés comme des "enrouleurs" ou servo à rotation continue. Leur principe est radicalement différent. ! Tu ne communique pas un angle, mais une vitesse de rotation. 90° indique une vitesse nulle. Entre 0 et 90° le servo tourne dans le sens inverse des aiguilles, entre 90 et 180 dans l'autre sens.
https://www.arduino.cc/en/Reference/ServoWrite
On a continuous rotation servo, this will set the speed of the servo (with 0 being full-speed in one direction, 180 being full speed in the other, and a value near 90 being no movement)
On pourrait se dire que c'est faisable avec, mais en pratique c'est tres difficile d'ajuster une vitesse à un angle, car tu auras toujours un décalage. Tu ne maitrise jamais le Delta entre l'angle et la conversion de la vitesse de rotation.
Bref, inutilisable !
Je me tourne vers les 270°, qui sont tres bien pour ca, mais très cher. Le seul modèle que j'ai couté est hors de prix (24€) ! normal il supporte juqu'a 15Kg de charge Strictement inutile pour nous !
L'histoire du pit sur Checksix : viewtopic.php?f=286&t=192908
Télécharger mon programme : http://f4toserial.com
La chaîne Youtube : https://www.youtube.com/channel/UChAv6B ... 1J7oDf-W1w
Les photos du cockpit : https://photos.app.goo.gl/BqyyyjkKzo2ZjdoF9
Télécharger mon programme : http://f4toserial.com
La chaîne Youtube : https://www.youtube.com/channel/UChAv6B ... 1J7oDf-W1w
Les photos du cockpit : https://photos.app.goo.gl/BqyyyjkKzo2ZjdoF9
Re: Cliffs of dover
#8Ok, merci à tous les deux pour vos infos.
J'ai pas répondu à ta question Myoda : c'est effectivement une servo, une Arduino du kit que j'ai acheté
http://www.gotronic.fr/art-servomoteur- ... -21206.htm
J'ai pas répondu à ta question Myoda : c'est effectivement une servo, une Arduino du kit que j'ai acheté
http://www.gotronic.fr/art-servomoteur- ... -21206.htm
Re: Cliffs of dover
#9yo le breton
beau boulot, tu as trouvé où les infos sur l'export de données pour causer avec l'arduino ?
merci d'avance et bonne continuation
beau boulot, tu as trouvé où les infos sur l'export de données pour causer avec l'arduino ?
merci d'avance et bonne continuation
Re: Cliffs of dover
#11c'est marrant, pour les témoins, le data export est + rapide que l'affichage du simu
Dresseur de cochon (sauvage)
Re: Cliffs of dover
#12Pour les témoins de train ?
En fait j'exporte une valeur entière d'un nombre décimal. Donc la différence se fait sur le 0.5 de cette valeur, quand le système arrondi ma valeur.
En fait j'exporte une valeur entière d'un nombre décimal. Donc la différence se fait sur le 0.5 de cette valeur, quand le système arrondi ma valeur.
Re: Cliffs of dover
#13Nouvelle version du RPM.
Issu d'un vrai tachy. J'ai retravaillé le fond pour le faire correspondre à un MK.III et que ça match avec le Hurri.
J'ai une servo (180°), deux engrenages, un de 20 dents, l'autre de 10 (merci Cat Plombe).
Par contre, je ne suis pas statisfait de mon montage de la servo, trop bricolage. Va falloir que je creuse, peut être un truc en résine ?
[BBvideo 800,600][/BBvideo]
Issu d'un vrai tachy. J'ai retravaillé le fond pour le faire correspondre à un MK.III et que ça match avec le Hurri.
J'ai une servo (180°), deux engrenages, un de 20 dents, l'autre de 10 (merci Cat Plombe).
Par contre, je ne suis pas statisfait de mon montage de la servo, trop bricolage. Va falloir que je creuse, peut être un truc en résine ?
[BBvideo 800,600][/BBvideo]
Re: Cliffs of dover
#14Génial, c'est un bon début !
Je viens de recevoir mon Starter Pack Arduino d'où ma question:
Est-il possible de faire de même avec Il2 1946 ? Avec le même code ?
Je viens de recevoir mon Starter Pack Arduino d'où ma question:
Est-il possible de faire de même avec Il2 1946 ? Avec le même code ?
Re: Cliffs of dover
#15Ca doit être possible.
Mais peut-être uniquement en solo ? Je ne maitrise plus trop 1946, mais je crois qu'il y a un anti-cheat lié à l'extraction de données...
Regarde du côté de DeviceLink et d'UDP Speed. quant au code, je pense qu'il devrait être, dans les grandes lignes, identique.
Mais peut-être uniquement en solo ? Je ne maitrise plus trop 1946, mais je crois qu'il y a un anti-cheat lié à l'extraction de données...
Regarde du côté de DeviceLink et d'UDP Speed. quant au code, je pense qu'il devrait être, dans les grandes lignes, identique.
Re: Cliffs of dover
#16Pourquoi le serait-il uniquement en solo ?
Aurais tu un lien pour DeviceLink ?
Merci.
Aurais tu un lien pour DeviceLink ?
Merci.
Re: Cliffs of dover
#17Quel est ton probleme ?MikiBzh a écrit :
Par contre, je ne suis pas statisfait de mon montage de la servo, trop bricolage. Va falloir que je creuse, peut être un truc en résine ?
Re: Cliffs of dover
#18C'est juste que ce n'est pas très propre :
.
Deux système en un, à gauche un premier essai, non concluant, visé sur celui une pate qui me donne quais satisfaction.
Je souhaite avoir quelque chose de démontable.
Autre point, j'ai du faire du sur mesure pour cette servo, dans le réglage des angles par rapport aux données reçues. J'aurais aimé quelque chose de plus générique, mais je pense que les engrenages sont trop grossiers.
.
Deux système en un, à gauche un premier essai, non concluant, visé sur celui une pate qui me donne quais satisfaction.
Je souhaite avoir quelque chose de démontable.
Autre point, j'ai du faire du sur mesure pour cette servo, dans le réglage des angles par rapport aux données reçues. J'aurais aimé quelque chose de plus générique, mais je pense que les engrenages sont trop grossiers.
Re: Cliffs of dover
#19Disons que plus il y a de dents, plus c'est précis.
Mais elles sont beaucoup plus petites
Mais elles sont beaucoup plus petites
Re: Cliffs of dover
#20Salut,
MikiBzh est-ce que tu pourrais partager le code arduino en C que tu as utilisé pour discuter avec Il2 CoD ?
J'aimerai avoir une base pour programmer Arduino à échanger avec IL2, je n'en trouve aucune sur le net.
Pastor
MikiBzh est-ce que tu pourrais partager le code arduino en C que tu as utilisé pour discuter avec Il2 CoD ?
J'aimerai avoir une base pour programmer Arduino à échanger avec IL2, je n'en trouve aucune sur le net.
Pastor
Re: Cliffs of dover
#21Voilà M'sieur (tout ça en WiP à ma sauce, SAV non garanti ) :
L'Arduino :
Et le C# :
L'Arduino :
Code : Tout sélectionner
// programme de commande Arduino via C# et DeviceLink
// pour Cliffs of Dover
// Thank you TeamFusion for DeviceLink
// by no.501_Miki
// output definition
// change numbers if you want to change any affectation of Pin
const int pinGearLeftDown = 3;
const int pinGearLeftUp = 2 ;
const int pinGearRightDown = 5;
const int pinGearRightUp = 4 ;
#include <Servo.h>
Servo rpmServo;
int dataRpm;
int dataRpmConstrain;
int rpmServoAngle;
void setup()
{
Serial.begin(9600);
// pinMode definition
pinMode(pinGearLeftDown, OUTPUT);
pinMode(pinGearLeftUp, OUTPUT);
pinMode(pinGearRightDown, OUTPUT);
pinMode(pinGearRightUp, OUTPUT);
rpmServo.attach(6);
int dataGearLeft;
int dataGearRight;
}
void loop()
{
int dataGearLeft;
int dataGearRight;
if (Serial.find("GL"))
{
dataGearLeft = Serial.parseInt(); // Gear Left parses numeric characters
}
if (Serial.find("GR"))
{
dataGearRight = Serial.parseInt(); // Gear Right parses numeric characters
}
if (Serial.find("RPM"))
{
dataRpm = Serial.parseInt(); // Rpm parses numeric characters
}
//Serial.print dataGearLeft;
//Serial.print dataGearRight;
// GEAR /////////////////////////////////////////////////
// Left gear state (2=gear leg down)(1=gear leg up)//
if (dataGearLeft == 11)
{
digitalWrite (pinGearLeftDown, LOW);
digitalWrite (pinGearLeftUp, HIGH);
}
else if (dataGearLeft == 1)
{
digitalWrite (pinGearLeftDown, HIGH);
digitalWrite (pinGearLeftUp, LOW);
}
else
{
digitalWrite (pinGearLeftUp, HIGH);
digitalWrite (pinGearLeftDown, HIGH);
}
// Right gear state (2=gear leg down)(1=gear leg up)//
if (dataGearRight == 11)
{
digitalWrite (pinGearRightDown, LOW);
digitalWrite (pinGearRightUp, HIGH);
}
else if (dataGearRight == 1)
{
digitalWrite (pinGearRightDown, HIGH);
digitalWrite (pinGearRightUp, LOW);
}
else
{
digitalWrite (pinGearRightUp, HIGH);
digitalWrite (pinGearRightDown, HIGH);
}
// RPM /////////////////////////////////////////////////
dataRpmConstrain = constrain(dataRpm, 1600, 3200);
int rpmServoAngle = map(dataRpmConstrain, 3200, 1600, 0, 122);
rpmServo.write(rpmServoAngle);
}
Code : Tout sélectionner
using System;
using System.Timers;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.IO.MemoryMappedFiles;
using System.IO.Ports;
using System.Threading;
namespace DeviceLinkServer
{
class Program
{
public class Timer1
{
static SerialPort serialPort1;
static bool _continue;
public static void Main()
{
// Serial port setup
serialPort1 = new SerialPort();
serialPort1.PortName = "COM7";
serialPort1.BaudRate = 9600;
serialPort1.WriteTimeout = 250;
serialPort1.Parity = Parity.None;
serialPort1.StopBits = StopBits.One;
serialPort1.DataBits = 8;
serialPort1.Handshake = Handshake.XOnXOff;
serialPort1.Open();
_continue = true;
while (_continue)
{
GameCommunications Comm = new GameCommunications();
// GEAR LEFT /////////////////////////////////////////////////////////////////
double leftGear = Comm.GetParameter(GameCommunications.ParameterTypes.A_Undercarriage, 0) * 10 + 1;
int intLeftGear = Convert.ToInt32(leftGear);
// GEAR RIGHT /////////////////////////////////////////////////////////////////
double rightGear = Comm.GetParameter(GameCommunications.ParameterTypes.A_Undercarriage, 1) *10 + 1;
int intRightGear = Convert.ToInt32(rightGear);
// RPM ////////////////////////////////////////////////////////////////////////
double rpm = Comm.GetParameter(GameCommunications.ParameterTypes.I_EngineRPM, 0);
//short shortRpm;
int intRpm = Convert.ToInt32(rpm);
// intRpm = 2800 // remove // and set value to test
;
// SEND DATAS TO SERIAL //////////////////////////////////////////////////////
Console.WriteLine(String.Format("GL{0},GR{1},RPM{2}", intLeftGear, intRightGear, intRpm));
serialPort1.WriteLine(String.Format("GL{0},GR{1},RPM{2}", intLeftGear, intRightGear, intRpm));
//////////////////////////////////////////////////////////////////////////////
Thread.Sleep(250);
_continue = true;
}
}
}
}
public class GameCommunications
{
private MemoryMappedFile m_MemoryMappedFile;
private MemoryMappedViewAccessor m_MemoryMappedViewAccessor;
public enum ParameterTypes
{
Nil,
M_Random,
M_Shake,
M_CabinDamage,
M_CabinState,
M_NamedDamage,
M_SystemWear,
M_Health,
C_Steering,
C_Brake,
C_Throttle,
C_Trigger,
C_Pitch,
C_Mix,
C_WaterRadiator,
C_OilRadiator,
C_RadiatorAutomation,
C_PitchAutomation,
C_Compressor,
C_Afterburner,
C_BoostEnabler,
C_SlowRunningCutOut,
C_Magneto,
C_Feather,
C_CarbHeater,
C_HatchDoor,
C_HatchJettison,
C_Timer,
C_Timer1,
C_Aileron,
C_Elevator,
C_Rudder,
C_AileronTrim,
C_ElevatorTrim,
C_RudderTrim,
C_TailwheelLock,
C_LandingFlap,
C_LeadingEdgeSlats,
C_Undercarriage,
C_UndercarriageEmergency,
C_BombBayDoor,
C_Airbrake,
C_FuelTankSelector,
C_TelepirometroElettrico,
C_AltimeterPinion,
C_AnemometroPinion,
C_BombSight,
C_Sight,
C_Bombenabwurfgerat,
C_KraftstoffSelector,
C_LiquidGauge0,
C_LiquidGauge1,
C_PriLights,
C_SecLights,
C_SightLights,
C_PitotHeater,
C_Handpumpe,
C_RadTXRX,
C_RadPriNav,
C_RadSecNav,
C_Kurssteuerung,
A_Steering,
A_Brake,
A_Aileron,
A_Elevator,
A_Rudder,
A_AileronTrim,
A_ElevatorTrim,
A_RudderTrim,
A_Undercarriage,
A_UndercarriageShock,
A_UndercarriageWheel,
A_HatchDoor,
A_BombBayDoor,
A_ImpellerAngle,
A_ImpellerAngularVelocity,
A_ImpellerUnfold,
A_LandingFlap,
A_Airbrake,
A_EngineAirRadiator,
A_EngineWaterRadiator,
A_EngineOilRadiator,
A_LeadingEdgeSlat,
Z_Coordinates,
Z_Orientation,
Z_Overload,
Z_AltitudeAGL,
Z_AltitudeMSL,
Z_VelocityIAS,
Z_VelocityTAS,
Z_VelocityMach,
Z_AmbientAirTemperature,
S_ElectricVoltage,
S_ElectricIncandescingRatio,
S_ElectricAmperage,
S_ElectricPrimaryPitLight,
S_ElectricSecondaryPitLight,
S_ElectricSightLight,
S_FuelReserve,
S_HatchDoor,
S_UndercarriageValve,
S_PneumoContainerPressure,
S_PneumoLinePressure,
S_HydroPressure,
S_HydroReserve,
S_Sturzanlage,
S_GunOperation,
S_GunReserve,
S_GunClipReserve,
S_BombReserve,
S_Fenster,
S_PitotHeater,
S_Bombenabwurfgerat,
S_Turret,
M_Reserved000,
M_Reserved001,
M_Reserved002,
M_Reserved003,
M_Reserved004,
M_Reserved005,
M_Reserved006,
M_Reserved007,
M_Reserved008,
M_Reserved009,
M_Reserved00A,
M_Reserved00B,
M_Reserved00C,
M_Reserved00D,
M_Reserved00E,
M_Reserved00F,
M_Reserved010,
M_Reserved011,
M_Reserved012,
M_Reserved013,
M_Reserved014,
M_Reserved015,
M_Reserved016,
M_Reserved017,
M_Reserved018,
M_Reserved019,
M_Reserved01A,
M_Reserved01B,
M_Reserved01C,
M_Reserved01D,
M_Reserved01E,
M_Reserved01F,
I_Timer,
I_AmbientTemp,
I_EngineRPM,
I_EngineManPress,
I_EngineBoostPress,
I_EngineWatPress,
I_EngineOilPress,
I_EngineFuelPress,
I_EngineWatTemp,
I_EngineRadTemp,
I_EngineOilTemp,
I_EngineOilRadiatorTemp,
I_EngineTemperature,
I_EngineCarbTemp,
I_Pitch,
I_VelocityIAS,
I_Altitude,
I_Variometer,
I_Slip,
I_MagneticCompass,
I_RepeaterCompass,
I_Peilzeiger,
I_FuelReserve,
I_LiquidReserve,
I_Voltamperemeter,
I_Voltmeter,
I_Amperemeter,
I_HydroPressure,
I_HydroEmPressure,
I_Turn,
I_AH,
I_DirectionIndicator,
I_SlavedCompass,
I_Suction,
I_AFN,
I_ADF,
I_RDF,
I_RMI,
I_FLRC,
I_Kurssteuerung,
I_BombSight
}
public GameCommunications()
{
m_MemoryMappedFile = null;
m_MemoryMappedViewAccessor = null;
}
private void OpenMMF()
{
try
{
m_MemoryMappedFile = MemoryMappedFile.OpenExisting("CLODDeviceLink", MemoryMappedFileRights.Read);
m_MemoryMappedViewAccessor = m_MemoryMappedFile.CreateViewAccessor(0, 10000 * sizeof(double), MemoryMappedFileAccess.Read);
}
catch (Exception e)
{
return;
}
}
public double GetParameter(ParameterTypes ParameterType, int SubType)
{
if (m_MemoryMappedFile == null)
OpenMMF();
try
{
return m_MemoryMappedViewAccessor.ReadDouble((((int)ParameterType * 10) + SubType) * sizeof(double));
}
catch (Exception e)
{
return -99999.99999;
}
}
}
}