Jump to content

Der deutsche DCS-BIOS-Thread: Für Simpit-Bastler und solche, die es werden wollen


FSFIan
 Share

Recommended Posts

  • Replies 266
  • Created
  • Last Reply

Top Posters In This Topic

Das muss zwingend ein Mega sein. Der Uno hat nur einen seriellen Port, der Bus-Master braucht aber mindestens zwei, da der ja sowohl mit dem RS-485-Bus als auch mit dem PC reden muss.

 

Der Mega hat vier serielle Ports (UARTs), so dass der theoretisch bis zu drei RS-485-Busse ansteuern kann. Ich bin mir noch nicht sicher, dass drei in der Praxis auch in allen Situationen zuverlässig funktionieren, aber zwei gleichzeitig sollten kein Problem sein.

Link to comment
Share on other sites

Männer noch mal ne kurze Frage zum Servo.

Ich muss Bauart bedingt bei einem die Drehrichtung ändern.

 

Habe mal beim Code die "minPulseWidth" und "maxPulseWidth" vertauscht, der Servo hat auch die Drehrichtung geändert, nur fährt dieses jetzt in den unteren Anschlag und wird warm.

 

Gibt es da ggf. eine andere Lösung, oder muss ich am Servo löten bzw. mir so ein elektronisches Servo - Umpolt - Teil in meine Leitung einbauen?!

 

Hier mein Beispiel vom geänderten Code:

 

DcsBios::ServoOutput engLEngPress(0x195a, PIN, 2400, 544);

 

Danke und VG

Tronix

 

Seit v0.2.8 der Arduino-Library hat die ServoOutput-Klasse auch einen Konstruktor, dem man eine beliebige Funktion zum Umrechnen von DCS-BIOS-Werten auf Servo-Mikrosekunden mitgeben kann. Das ganze ist leider noch völlig undokumentiert, weil ich noch dabei bin, den gleichen Mechanismus überall einzubauen und die Doku sowieso mal komplett zu überarbeiten.

 

Das ganze lässt sich so benutzen:

 

unsigned int mapServoValue(unsigned int newValue) {
   return map(newValue, 0, 65535, 2400, 544);
}
DcsBios::ServoOutput engLEngPress(0x195a, PIN, 544, 2400, mapServoValue);

 

Wichtig ist, dass die 2400 und 544 nur in mapServoValue() vertauscht werden, die 544 und 2400, die der ServoOutput-Konstruktor übergeben bekommt werden so an die Servo-Library weitergereicht und bestimmen den Bereich, auf den die Werte beschränkt werden (d.h. selbst wenn myServoValue der Meinung wäre, da sollten 2577 Mikrosekunden rauskommen, würde das auf 2400 begrenzt).

 

Wenn man sich für die mapServoValue()-Funktion nicht für jede ServoOuput-Instanz einen Namen ausdenken will, kann man das auch alles als lambda-Funktion schreiben (neues Feature im C++11-Standard), das sieht dann so aus:


DcsBios::ServoOutput engLEngPress(0x195a, PIN, 544, 2400, [](unsigned int newValue) -> unsigned int {
     return map(newValue, 0, 65535, 2400, 544);
});

Link to comment
Share on other sites

Ian;3017259']Das muss zwingend ein Mega sein. Der Uno hat nur einen seriellen Port, der Bus-Master braucht aber mindestens zwei, da der ja sowohl mit dem RS-485-Bus als auch mit dem PC reden muss.

 

Der Mega hat vier serielle Ports (UARTs), so dass der theoretisch bis zu drei RS-485-Busse ansteuern kann. Ich bin mir noch nicht sicher, dass drei in der Praxis auch in allen Situationen zuverlässig funktionieren, aber zwei gleichzeitig sollten kein Problem sein.

 

Dann werde ich wohl doch noch einen MEGA besorgen müssen.

 

Danke für die schnelle Antwort.

 

Gruß

Roni

Link to comment
Share on other sites

Ian;3017278']

 

Das ganze lässt sich so benutzen:

 

unsigned int mapServoValue(unsigned int newValue) {
   return map(newValue, 0, 65535, 2400, 544);
}
DcsBios::ServoOutput engLEngPress(0x195a, PIN, 544, 2400, mapServoValue);

 

Hier bekomme ich folgenden Fehler:

exit status 1
no matching function for call to 'DcsBios::ServoOutput::ServoOutput(int, int, int, int, unsigned int (&)(unsigned int))'

 

 

 

Wenn man sich für die mapServoValue()-Funktion nicht für jede ServoOuput-Instanz einen Namen ausdenken will, kann man das auch alles als lambda-Funktion schreiben (neues Feature im C++11-Standard), das sieht dann so aus:


DcsBios::ServoOutput engLEngPress(0x195a, PIN, 544, 2400, [](unsigned int newValue) -> unsigned int {
     return map(newValue, 0, 65535, 2400, 544);
});

 

Und hier folgenden Fahler:

exit status 1
no matching function for call to 'DcsBios::ServoOutput::ServoOutput(int, int, int, int, __lambda0)'

[sIGPIC][/sIGPIC]

 

my DCS World - Ka50 Pit Project: :pilotfly:

http://www.ka50.de

Link to comment
Share on other sites

Und hier folgenden Fahler:

exit status 1
no matching function for call to 'DcsBios::ServoOutput::ServoOutput(int, int, int, int, __lambda0)'

 

Du musst vor dem #include "DcsBios.h" noch ein #include "Servo.h" setzen, um die Servo-Library mit einzubauen. DCS-BIOS macht das nicht von sich aus, weil die einen der Timer vom Arduino belegt.

 

Ich hab gerade nochmal in der Doku geguckt, da steht das gar nicht drin... ich glaube ich hatte das früher in den Template-Sketches drin und das ist dann bei der Einführung von IRQ_SERIAL rausgeflogen.

 

Ich werd das in Zukunft wahrscheinlich so machen, dass alles was von anderen Libraries abhängt (Servos und demnächst mal auch Stepper) in ganz eigenen Header-Files liegt, dann muss ich nur noch einen Mechanismus in die Referenzdoku einbauen, so dass bei entsprechenden Code Snippets ein Hinweis eingeblendet wird oder so.

Link to comment
Share on other sites

ja, dass hatte ich bereits gemacht, denn die Servo funktionieren ja, nur mit der Drehrichtung - das geht leider nicht... :cry:

 

hier der Code:

#include "Servo.h"

#define DCSBIOS_IRQ_SERIAL
#include "DcsBios.h"

DcsBios::Switch2Pos r800EmerRcvr("R800_EMER_RCVR", 42);
DcsBios::Switch2Pos r800Adf("R800_ADF", 44);
DcsBios::Switch2Pos abrisPower("ABRIS_POWER", 35);
DcsBios::Switch2Pos hsiDhDtaManualAuto("HSI_DH_DTA_MANUAL_AUTO", 37);
DcsBios::Switch2Pos laserMode("LASER_MODE", 36);
DcsBios::Switch2Pos opPitotPortHeat("OP_PITOT_PORT_HEAT", 38);
DcsBios::Switch2Pos opPitotRamHeat("OP_PITOT_RAM_HEAT", 40);
DcsBios::LED raltSafeAltLamp(0x184c, 0x1000, 34);
const byte engSelectorPins[4] = {53, 51, 49, 47};
DcsBios::SwitchMultiPos engSelector("ENG_SELECTOR", engSelectorPins, 4);
const byte opNavLightsPins[5] = {45, 43, 41, 39};
DcsBios::SwitchMultiPos opNavLights("OP_NAV_LIGHTS", opNavLightsPins, 4);
DcsBios::Switch3Pos engStartupMode("ENG_STARTUP_MODE", 50, 52);
DcsBios::Switch2Pos r800AmFm("R800_AM_FM", 48);

DcsBios::ServoOutput apuTemp(0x191c, 2, 540, 2550);
DcsBios::ServoOutput engLEngPress(0x195a, 5, 540, 1115);
DcsBios::ServoOutput engREngPress(0x195c, 4, 540, 1115);
DcsBios::ServoOutput engNominalModePress(0x1958, 3, 444, 810);

#include "LedControl.h"
//Pins sind beliebig auswählbar
//Die erste Zahl (22) gibt den DATA_IN pin an, 
//die zweite     (26) den CLOCK pin 
//und die dritte (24) ist der LOAD/CS pin. 
//Die vierte Zahl(1) ist die Anzahl der hintereinandergeschalteten MAX7219-Chips.

[sIGPIC][/sIGPIC]

 

my DCS World - Ka50 Pit Project: :pilotfly:

http://www.ka50.de

Link to comment
Share on other sites

Hallo zusammen,

 

ich habe folgendes Problem, wenn ich den sketch mit dem Master Caution lade und im spiel den auslöse passiert nichts. Taster und LED sind richtig angeschlossen und zu vor auf Funktion getestet.

Der interactive control reference funktioniert aber komischer weise. Ich habe schon mal so ein Problem gehabt, da war eine Netwerküberwachungssoftware die die Komunikation geblockt hatte. Hab mein Firewall komplett aus geschaltet, troz dem geht nichts außer interactive control reference.

Weiß einer einen guten rat?

 

edit: Der Comport ist richtig eingestellt und der Datenfluss läuft.

mfg


Edited by 33rd_Elvis

Aircrafts: F-16C | TF-51 | M2000C | F/A-18C | AV-8B | Viggen | KA-50 | A-10C | UH-1 | Mi-8 |

Maps: Caucasus | Persian Gulf | NTTR | Normandy | Syria

System: AMD Ryzen 3700X | 32GB Ram | AMD Radeon RX 5700 XT | Win10 64Bit | 1TB 970 EVO M.2 SSD

Equipment: TrackIR 5_Trackclip Pro |TM Warthog HOTAS | Oculus Rift S

Link to comment
Share on other sites

Hallo zusammen,

 

ich habe folgendes Problem, wenn ich den sketch mit dem Master Caution lade und im spiel den auslöse passiert nichts. Taster und LED sind richtig angeschlossen und zu vor auf Funktion getestet.

Der interactive control reference funktioniert aber komischer weise. Ich habe schon mal so ein Problem gehabt, da war eine Netwerküberwachungssoftware die die Komunikation geblockt hatte. Hab mein Firewall komplett aus geschaltet, troz dem geht nichts außer interactive control reference.

Weiß einer einen guten rat?

 

edit: Der Comport ist richtig eingestellt und der Datenfluss läuft.

mfg

 

Versuch mal das Script aus diesem Post, das benutzt TCP statt UDP. Da die interactive control reference geht (die benutzt auch TCP), sollte es damit dann laufen.

Link to comment
Share on other sites

Das hab ich auch schon versucht jedoch ohne erfolg. Auch wenn ich die Firewall und Antivir aus schalte, keine Veränderung. Wie schon gesagt der Datenfluss ist da und die LED am Arduino uno ist am blinken.

Aircrafts: F-16C | TF-51 | M2000C | F/A-18C | AV-8B | Viggen | KA-50 | A-10C | UH-1 | Mi-8 |

Maps: Caucasus | Persian Gulf | NTTR | Normandy | Syria

System: AMD Ryzen 3700X | 32GB Ram | AMD Radeon RX 5700 XT | Win10 64Bit | 1TB 970 EVO M.2 SSD

Equipment: TrackIR 5_Trackclip Pro |TM Warthog HOTAS | Oculus Rift S

Link to comment
Share on other sites

Ian danke für dein Einsatz nochmal. Habe den Fehler gefunden. Die BAUT war nicht auf 250000 im serialport.cmd. Habs umgestellt und es funtzt wieder.

 

MfG

Aircrafts: F-16C | TF-51 | M2000C | F/A-18C | AV-8B | Viggen | KA-50 | A-10C | UH-1 | Mi-8 |

Maps: Caucasus | Persian Gulf | NTTR | Normandy | Syria

System: AMD Ryzen 3700X | 32GB Ram | AMD Radeon RX 5700 XT | Win10 64Bit | 1TB 970 EVO M.2 SSD

Equipment: TrackIR 5_Trackclip Pro |TM Warthog HOTAS | Oculus Rift S

Link to comment
Share on other sites

Ich habe da mal eine Frage bzgl meines Sketch

 

#define DCSBIOS_IRQ_SERIAL

#include "DcsBios.h"

/* paste code snippets from the reference documentation here */

//Fuel Switch Panel
DcsBios::Switch2Pos fscpExtTanksFus("FSCP_EXT_TANKS_FUS", 53);
DcsBios::Switch2Pos fscpExtTanksWing("FSCP_EXT_TANKS_WING", 52);
DcsBios::Switch2Pos fscpTkGate("FSCP_TK_GATE", 50);
DcsBios::Switch2Pos fscpCrossfeed("FSCP_CROSSFEED", 51);
DcsBios::Switch2Pos fscpBoostWingL("FSCP_BOOST_WING_L", 48);
DcsBios::Switch2Pos fscpBoostWingR("FSCP_BOOST_WING_R", 49);
DcsBios::Switch2Pos fscpBoostMainL("FSCP_BOOST_MAIN_L", 46);
DcsBios::Switch2Pos fscpBoostMainR("FSCP_BOOST_MAIN_R", 47);
DcsBios::Switch2Pos fscpAmpl("FSCP_AMPL", 45);
DcsBios::Switch2Pos fscpLineCheck("FSCP_LINE_CHECK", 44);
DcsBios::Switch2Pos fscpFdWingL("FSCP_FD_WING_L", 43);
DcsBios::Switch2Pos fscpFdWingR("FSCP_FD_WING_R", 42);
DcsBios::Switch2Pos fscpFdMainL("FSCP_FD_MAIN_L", 41);
DcsBios::Switch2Pos fscpFdMainR("FSCP_FD_MAIN_R", 40);
DcsBios::Switch2Pos fscpRcvrLever("FSCP_RCVR_LEVER", 39);
DcsBios::Potentiometer alcpRcvrLts("ALCP_RCVR_LTS", A0);

void setup() {
 DcsBios::setup();
}

void loop() {
 DcsBios::loop();
}

 

 

Der Compiler läuft durch.

Es gibt auch keine Zeile die er wirklich beanstandet aber trotzdem bekomme ich folgende Meldung.

 

[color="Red"]F:\Arduino\a10\a10.ino:23:55: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

DcsBios::Potentiometer alcpRcvrLts("ALCP_RCVR_LTS", A0);[/color]

 

Danke und Gruß

 

Sven

Link to comment
Share on other sites

Wird der sketch auch auf den Arduinoboard hoch geladen? Wenn ja dürfte es keine Probleme bei der Funktion geben.


Edited by 33rd_Elvis

Aircrafts: F-16C | TF-51 | M2000C | F/A-18C | AV-8B | Viggen | KA-50 | A-10C | UH-1 | Mi-8 |

Maps: Caucasus | Persian Gulf | NTTR | Normandy | Syria

System: AMD Ryzen 3700X | 32GB Ram | AMD Radeon RX 5700 XT | Win10 64Bit | 1TB 970 EVO M.2 SSD

Equipment: TrackIR 5_Trackclip Pro |TM Warthog HOTAS | Oculus Rift S

Link to comment
Share on other sites

 

[color="Red"]F:\Arduino\a10\a10.ino:23:55: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

DcsBios::Potentiometer alcpRcvrLts("ALCP_RCVR_LTS", A0);[/color]

 

Danke für den Hinweis, da hab ich beim Fix für v0.2.7 wohl ein paar Stellen übersehen. Sollte in der neuen v0.2.9 jetzt repariert sein.

Link to comment
Share on other sites

  • 4 months later...

Hallo Ian,

 

ich hab es jetzt mal geschafft, mich ein wenig mit DCS Bios auseinander zu setzen.

Ich frag mich nur, wie der Sketch für das Rudder und die Bremsen aussehen muß!

Wäre dir sehr dankbar, wenn du mir da Helfen könntest.

 

LG Falki

[sIGPIC][/sIGPIC]I´m not only perfect, I´m German! Let´s drink on it!!!

 

System Spec.:

i7 4771, GTX 770, Samsung SyncMaster S27B370

Hotas Warthog, MFD Cougar und eigenbau Pedale

(Edelstahl mit Hallsensoren), Eigenbau Headtracker über Opentrack, Eigenbau UFC

Link to comment
Share on other sites

Um die primären Steuerachsen kümmert sich DCS-BIOS nicht.

 

Im Prinzip könnte ich das zwar einbauen, dann würde ich aber eine Grundannahme hinter dem Design von DCS-BIOS verletzen.

 

Diese Annahme lautet: Der Pilot hat nur zwei Hände, und eine davon ist immer am HOTAS. Das bedeutet, dass es nie (bzw. äußerst selten) vorkommt, dass zwei Schalter, Potis etc. gleichzeitig Eingaben zum PC senden wollen. Dadurch können wir dann im Prinzip ein komplettes Cockpit über eine einzige serielle Schnittstelle ansteuern, die "nur" 25.000 Bytes pro Sekunde schafft.

 

Wenn man jetzt die Steuerachsen für die Fluglage über DCS-BIOS laufen lassen würde, dann müssten die immer aufeinander warten, was die Latenz erhöhen würde, und das würde natürlich ausgerechnet bei diesen Achsen auch noch am meisten stören.

 

Mit anderen Worten: DCS-BIOS funktioniert gut für Schalter und Regler, die nur ab und zu bewegt werden. Pitch, Roll und Yaw werden von über USB angebundenen Joysticks und Ruderpedalen besser bedient.

 

Wenn du sowas selbst bauen willst, guck dir mal MMJoy an. Damit kann man sich soweit ich weiß Firmware für den Arduino Pro Micro (ca. $5) zusammenklicken, die ein paar Analog- und Digitaleingänge als Joystickachsen und -Buttons anbindet. IIRC können die auch Hall-Sensoren ansteuern, wenn man keine Potentiometer verbauen will.

Link to comment
Share on other sites

ich hab meine Pedale über USB verbunden!

kanst du nicht probehalber die Arduino-Libary un die Achsen erweitern?

Wei gesagt, ich würde es gerne probieren!

[sIGPIC][/sIGPIC]I´m not only perfect, I´m German! Let´s drink on it!!!

 

System Spec.:

i7 4771, GTX 770, Samsung SyncMaster S27B370

Hotas Warthog, MFD Cougar und eigenbau Pedale

(Edelstahl mit Hallsensoren), Eigenbau Headtracker über Opentrack, Eigenbau UFC

Link to comment
Share on other sites

  • 9 months later...

Fehler bei serial monitor Verbindung

 

Hallo [FSF]Ian

 

ich bin Anfänger was DCS BIOS angeht, ich komme an einer Stelle nicht weiter.

Ich habe bereits einen einfachen Sketch aber bei der Verbindung mit dem serial port läuft was schief. Ich habe ein Arduino Mega 2560 auf Port3 . Ich habe einen Sketch aus der arduino library ("Master Caution")hochgeladen, die Anschlüsse stimmen auch. Wenn ich den serial port öffne werde ich nach dem Port gefragt und ich gebe 3 ein.

Bei dem darauf erscheinen Infos im cmd.exe Fenster sind alle Signale auf Off, und ich habe unten die Meldung "Das System kann den angegeben Pfad nicht finden" . Von Youtube Videos weiß ich wie das cmd.exe Fenster richtiger aussehen sollte. Ich kommen hier nicht weiter. Wie kriege ich eine funktionierende Verbindung hin. (Mein Betriebssystem Win7) Screenshot füge ich bei

 

Gruß und Danke Michael

598734498_serialport.jpg.f7dc904681145a42905bc46eb91d28c7.jpg

Link to comment
Share on other sites

ich habe jetzt einfach mal was ausprobiert,

Ich habe die connect serial port.cmd (Batch-Datei ? richtig?) editiert wie in Post #7 beschrieben und dabei meine Portnummer (3) reingesetzt um es über TCP zu versuchen. Ich habe den alten Code durch diesen ersetzt. (die Original Datei aus dem dcs bios Ordner habe so gelassen ich habe die neue cmd in einem anderen Ordner geändert und ausgeführt)

 

 

 

 

REM Specify the number of the COM port your Arduino is connected to:

set COMPORT=3

set /A TTYNUM=%COMPORT%-1

mode COM%COMPORT% BAUD=500000 PARITY=N DATA=8 STOP=1 TO=off DTR=on

socat\socat -v TCP4:127.0.0.1:7778 /dev/ttyS%TTYNUM%

pause

 

 

Das hat auch nicht funktioniert. dafür habe ich jetzt folgende Meldung.

C:/Windows/system32/socat/socat/ -v TCP4:127.0.0.1:7778 /dev/ttyS2

Das System kann den angegebenen Pfad nicht finden....

Nur was heisst das jetzt?. Im DCS-BIOS Ordner ist eine socat .exe dabei die habe ich mal versucht auszuführen. Da öffnet sich nur kurz ein Fenster und verschwindet wieder.

 

Ich brauche hier etwas Hilfe, Danke

704109420_serialportTCP-cmd.jpg.4086e78b3054061618100d2a3d4dc8ba.jpg

Link to comment
Share on other sites

Hallo Michael,

 

liegt die socat.exe unter c:\windows\system32\socat\?

Ich glaube nicht, daher kommt wahrscheinlich die Meldung "Pfad nicht gefunden". Nimm lieber die Batch-Datei die im DCS-Bios Ordner liegt.

Kannst du den Mega über COM 3 mit der Arduino IDE ansprechen?

 

Gruß

Roni

Link to comment
Share on other sites

Hallo Roni86,

nein, die socat.exe liegt nicht vor, da sollte der Fehler vorliegen . Ich habe zunächst die socat.exe aus dem DCS-BIOS Master Packet ausgeführt. Das hat nichtgeholfen, dann habe ich socat von github runtergeladen und habe die dort vorhandene socat.exe ausgeführt. Auch ohne Erfolg. Meine Antivirfunktionen sind dabei alle deaktiviert. Sobald ich die socat.exe ausführe öffnet sich kurz ein Fenster und schließt sich wieder.

Gruß Michael

Link to comment
Share on other sites

Die socat.exe einzeln auszuführen bringt nichts. Da fehlen die Parameter.

Wo hast Du denn die DCS-Bios Dateien entzippt?

Meine liegen im Download-Ordner. Von der Batch-Datei "connect-serial-port.cmd" habe ich eine Verknüpfung auf dem Desktop angelegt, um die bequem zu starten.

Starte einfach mal die beiliegende Batch im entpackten DCS-Bios Ordner.

Link to comment
Share on other sites

 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...