Page 1 sur 1

Cliffs of dover

Publié : mar. sept. 08, 2015 7:45 pm
par MikiBzh
Salut 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... :)

Re: Cliffs of dover

Publié : mar. sept. 08, 2015 7:51 pm
par Cat
Pas mal comme début ! Il va falloir que je m'y mette aussi...

Re: Cliffs of dover

Publié : mer. sept. 09, 2015 12:23 am
par Myoda
Salut, Chapeau l'artiste ! :yes:
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

Re: Cliffs of dover

Publié : mer. sept. 09, 2015 7:20 am
par Cat
Tu utilises deux engrenages et tu as plus de 180° de course....

Re: Cliffs of dover

Publié : mer. sept. 09, 2015 12:09 pm
par MikiBzh
Salut,

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

Publié : mer. sept. 09, 2015 12:34 pm
par Cat
Tu 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

Re: Cliffs of dover

Publié : mer. sept. 09, 2015 1:52 pm
par Myoda
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 ?
Non effectivement c'est mort avec les 360. J'ai eut la surprise après en avoir commandé 5 !
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 o_O Strictement inutile pour nous ! :yes:

Re: Cliffs of dover

Publié : mer. sept. 09, 2015 6:54 pm
par MikiBzh
Ok, 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

Re: Cliffs of dover

Publié : mer. sept. 09, 2015 7:55 pm
par pilour6
yo 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

Re: Cliffs of dover

Publié : mer. sept. 09, 2015 8:28 pm
par MikiBzh

Re: Cliffs of dover

Publié : jeu. sept. 10, 2015 3:21 pm
par dimebug
c'est marrant, pour les témoins, le data export est + rapide que l'affichage du simu :)

Re: Cliffs of dover

Publié : ven. sept. 11, 2015 10:23 pm
par MikiBzh
Pour 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.

Re: Cliffs of dover

Publié : lun. sept. 14, 2015 3:16 pm
par MikiBzh
Nouvelle 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]

Re: Cliffs of dover

Publié : lun. sept. 14, 2015 8:26 pm
par Pastoя
Gé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 ?

Re: Cliffs of dover

Publié : lun. sept. 14, 2015 8:38 pm
par MikiBzh
Ca 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.

Re: Cliffs of dover

Publié : lun. sept. 14, 2015 8:50 pm
par Pastoя
Pourquoi le serait-il uniquement en solo ?

Aurais tu un lien pour DeviceLink ?
Merci.

Re: Cliffs of dover

Publié : mar. sept. 15, 2015 7:42 am
par Cat
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 ?
Quel est ton probleme ?

Re: Cliffs of dover

Publié : mar. sept. 15, 2015 7:48 pm
par MikiBzh
C'est juste que ce n'est pas très propre :

Image.

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

Publié : mar. sept. 15, 2015 8:04 pm
par Cat
Disons que plus il y a de dents, plus c'est précis.
Mais elles sont beaucoup plus petites

Re: Cliffs of dover

Publié : sam. sept. 26, 2015 4:08 pm
par Pastoя
Salut,

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. :crying:

Pastor

Re: Cliffs of dover

Publié : sam. sept. 26, 2015 4:16 pm
par MikiBzh
Voilà M'sieur (tout ça en WiP à ma sauce, SAV non garanti :) ) :

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); }
Et le C# :

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; } } } }

Re: Cliffs of dover

Publié : sam. sept. 26, 2015 4:27 pm
par Pastoя
Merci :notworthy !!