Jump to content

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


FSFIan

Recommended Posts

Danke, dachte schon oh ist das einfach... jetzt habe ich mir einen Bug im Code eingebaut::mad:

 

#include <Servo.h>

#define DCSBIOS_IRQ_SERIAL
#include "DcsBios.h"

DcsBios::Switch2Pos r800EmerRcvr("R800_EMER_RCVR", 5);
DcsBios::Switch2Pos r800Adf("R800_ADF", 4);
DcsBios::Switch2Pos abrisPower("ABRIS_POWER", 11);
DcsBios::Switch2Pos hsiDhDtaManualAuto("HSI_DH_DTA_MANUAL_AUTO", 9);
DcsBios::Switch2Pos laserMode("LASER_MODE", 8);
DcsBios::Switch2Pos opPitotPortHeat("OP_PITOT_PORT_HEAT", 7);
DcsBios::Switch2Pos opPitotRamHeat("OP_PITOT_RAM_HEAT", 6);
DcsBios::Switch2Pos scRotorRpmBtn("SC_ROTOR_RPM_BTN", 3);
DcsBios::ServoOutput apuTemp(0x191c, 2, 540, 2550);
DcsBios::LED raltSafeAltLamp(0x184c, 0x1000, 12);
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_RM", 4, 8);

#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.

LedControl lc=LedControl(22,26,24,2); //DIN,CLK,LOAD,# OF IC's

//mit MAX7219SegmentId.ino die jeweiligen Digits-Nummern anzeigen lassen
//und dann unten in lc.setChar() einsetzen
// IDs von MAX7219Segment:
//7 6 5 4 3 2 1 0

void onUv26DisplayChange(char* newValue) {
   /* set digit 4 to first character (newValue[0]) */
   lc.setChar(0, 7, newValue[0], false);

   /* set digit 3 to second character */
   lc.setChar(0, 6, newValue[1], false);

   /* set digit 2 to third character */
   lc.setChar(0, 5, newValue[2], false);
}
DcsBios::StringBuffer<3> uv26DisplayBuffer(0x1812, onUv26DisplayChange);

void onWeaponsDisplayCannonRemainChange(char* newValue) {
   /* set digit 4 to next first character MAX7219 2 (newValue[0]) */
   lc.setChar(1, 3, newValue[0], false);

   /* set digit 3 to second character */
   lc.setChar(1, 2, newValue[1], false);
}
DcsBios::StringBuffer<2> weaponsDisplayCannonRemainBuffer(0x188c, onWeaponsDisplayCannonRemainChange);

void onWeaponsDisplayWeaponRemainChange(char* newValue) {
   /* set digit 2 to third character MAX7219 2 (newValue[0]) */
   lc.setChar(1, 7, newValue[0], false);

   /* set digit 0 to last character */
   lc.setChar(1, 6, newValue[1], false);
}
DcsBios::StringBuffer<2> weaponsDisplayWeaponRemainBuffer(0x188a, onWeaponsDisplayWeaponRemainChange);

void onWeaponsDisplayStoreTypeChange(char* newValue) {
   /* set digit 4 to first character (newValue[0]) */
   lc.setChar(0, 3, newValue[0], false);

   /* set digit 3 to second character */
   lc.setChar(0, 2, newValue[1], false);
}
DcsBios::StringBuffer<2> weaponsDisplayStoreTypeBuffer(0x1888, onWeaponsDisplayStoreTypeChange);


void setup() {
 lc.shutdown(0,false);
 /* Set the brightness to a medium values */
 lc.setIntensity(0,8);
 /* and clear the display */
 lc.clearDisplay(0);
 /* Set the MAX7219 2 */
 lc.shutdown(1,false);
 /* Set the brightness to a medium values MAX7219 2 */
 lc.setIntensity(1,8);
 /* and clear the display MAX7219 2 */
 lc.clearDisplay(1);
 
 DcsBios::setup();
}

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

 

Denke das Problem liegt hier an dem Abschnitt:

 

void setup() {
 lc.shutdown(0,false);
 /* Set the brightness to a medium values */
 lc.setIntensity(0,8);
 /* and clear the display */
 lc.clearDisplay(0);
 /* Set the MAX7219 2 */
 lc.shutdown(1,false);
 /* Set the brightness to a medium values MAX7219 2 */
 lc.setIntensity(1,8);
 /* and clear the display MAX7219 2 */
 lc.clearDisplay(1);
 
 DcsBios::setup();
}

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

 

Ist echt zum Haare raufen, wenn man noch welche hätte und sich mit der Thematik NULL auskennt.... :(


Edited by Oldcooltronix

[sIGPIC][/sIGPIC]

 

my DCS World - Ka50 Pit Project: :pilotfly:

http://www.ka50.de

Link to comment
Share on other sites

Danke, dachte schon oh ist das einfach... jetzt habe ich mir einen Bug im Code eingebaut::mad:

 

Welchen denn?

 

Ohne Problembeschreibung (Was hast du gemacht? also Code und Schaltung; Was ist passiert?; Was hast du stattdessen erwartet?) kann ich nicht einmal raten, wo das Problem liegt.

Link to comment
Share on other sites

Ich habe wie du beschrieben hast versucht das zweite MAX7219 anzusprechen:

 

lc.setDigit(0, 7, 9, false); // Ziffer 7 auf dem ersten MAX7219 auf '9' setzen
lc.setChar(1, 4, '3', false); // Ziffer 4 auf dem zweiten MAX7219 auf '3' setzen

 

hier der aktuelle Code:

 

#include <Servo.h>

#define DCSBIOS_IRQ_SERIAL
#include "DcsBios.h"

DcsBios::Switch2Pos r800EmerRcvr("R800_EMER_RCVR", 5);
DcsBios::Switch2Pos r800Adf("R800_ADF", 4);
DcsBios::Switch2Pos abrisPower("ABRIS_POWER", 11);
DcsBios::Switch2Pos hsiDhDtaManualAuto("HSI_DH_DTA_MANUAL_AUTO", 9);
DcsBios::Switch2Pos laserMode("LASER_MODE", 8);
DcsBios::Switch2Pos opPitotPortHeat("OP_PITOT_PORT_HEAT", 7);
DcsBios::Switch2Pos opPitotRamHeat("OP_PITOT_RAM_HEAT", 6);
DcsBios::Switch2Pos scRotorRpmBtn("SC_ROTOR_RPM_BTN", 3);
DcsBios::ServoOutput apuTemp(0x191c, 2, 540, 2550);
DcsBios::LED raltSafeAltLamp(0x184c, 0x1000, 12);
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_RM", 4, 8);

#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.

LedControl lc=LedControl(22,26,24,2); //DIN,CLK,LOAD,# OF IC's

//mit MAX7219SegmentId.ino die jeweiligen Digits-Nummern anzeigen lassen
//und dann unten in lc.setChar() einsetzen
// IDs von MAX7219Segment:
//7 6 5 4 3 2 1 0

void onUv26DisplayChange(char* newValue) {
   /* set digit 4 to first character (newValue[0]) */
   lc.setChar(0, 7, newValue[0], false);

   /* set digit 3 to second character */
   lc.setChar(0, 6, newValue[1], false);

   /* set digit 2 to third character */
   lc.setChar(0, 5, newValue[2], false);
}
DcsBios::StringBuffer<3> uv26DisplayBuffer(0x1812, onUv26DisplayChange);

void onWeaponsDisplayCannonRemainChange(char* newValue) {
   /* set digit 4 to next first character MAX7219 2 (newValue[0]) */
   lc.setChar(1, 3, newValue[0], false);

   /* set digit 3 to second character */
   lc.setChar(1, 2, newValue[1], false);
}
DcsBios::StringBuffer<2> weaponsDisplayCannonRemainBuffer(0x188c, onWeaponsDisplayCannonRemainChange);

void onWeaponsDisplayWeaponRemainChange(char* newValue) {
   /* set digit 2 to third character MAX7219 2 (newValue[0]) */
   lc.setChar(1, 7, newValue[0], false);

   /* set digit 0 to last character */
   lc.setChar(1, 6, newValue[1], false);
}
DcsBios::StringBuffer<2> weaponsDisplayWeaponRemainBuffer(0x188a, onWeaponsDisplayWeaponRemainChange);

void onWeaponsDisplayStoreTypeChange(char* newValue) {
   /* set digit 4 to first character (newValue[0]) */
   lc.setChar(0, 3, newValue[0], false);

   /* set digit 3 to second character */
   lc.setChar(0, 2, newValue[1], false);
}
DcsBios::StringBuffer<2> weaponsDisplayStoreTypeBuffer(0x1888, onWeaponsDisplayStoreTypeChange);


void setup() {
 lc.shutdown(0,false);
 /* Set the brightness to a medium values */
 lc.setIntensity(0,8);
 /* and clear the display */
 lc.clearDisplay(0);
 /* Set the MAX7219 2 */
 lc.shutdown(1,false);
 /* Set the brightness to a medium values MAX7219 2 */
 lc.setIntensity(1,8);
 /* and clear the display MAX7219 2 */
 lc.clearDisplay(1);
 
 DcsBios::setup();
}

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

 

Beim Test ist mir aufgefallen das die 7 Segmente nichts anzeigen. Deshalb habe ich den Code für shutdown, brightness, clear the display dupliziert und aus der "0" eine "1" gemacht:

void setup() {
 lc.shutdown(0,false);
 /* Set the brightness to a medium values */
 lc.setIntensity(0,8);
 /* and clear the display */
 lc.clearDisplay(0);
 /* Set the MAX7219 2 */
 lc.shutdown(1,false);
 /* Set the brightness to a medium values MAX7219 2 */
 lc.setIntensity(1,8);
 /* and clear the display MAX7219 2 */
 lc.clearDisplay(1);
 
 DcsBios::setup();
}

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

 

Jetzt habe ich folgendes Problem:

 

Am Anfang sehe ich auf dem 7 Segmenten meine Anzeige auf dem auf den 1. MAX7219 und 2. MAX7219 Modul für:

-UV26 (1. MAX7219)

-Store (1. MAX7219)

-Remain (2. MAX7219)

-RNDS (2. MAX7219)

 

Sobald ich aber eine Rakete oder die Gun abfeuere und sich die Zahlen auf den 7 Segmenten ändern, dass die Anzeigen auf den 1. MAX7219 und 2. MAX7219 teilweise ausfallen, oder komische Hieroglyphen anzeigen...


Edited by Oldcooltronix

[sIGPIC][/sIGPIC]

 

my DCS World - Ka50 Pit Project: :pilotfly:

http://www.ka50.de

Link to comment
Share on other sites

Am Anfang sehe ich auf dem 7 Segmenten meine Anzeige auf dem auf den 1. MAX7219 und 2. MAX7219 Modul für:

-UV26 (1. MAX7219)

-Store (1. MAX7219)

-Remain (2. MAX7219)

-RNDS (2. MAX7219)

 

Sobald ich aber eine Rakete oder die Gun abfeuere und sich die Zahlen auf den 7 Segmenten ändern, dass die Anzeigen auf den 1. MAX7219 und 2. MAX7219 teilweise ausfallen, oder komische Hieroglyphen anzeigen...

 

Passiert immer das gleiche oder ist das Verhalten jedesmal anders? Treten die Fehler bei jeder einzelnen Änderung auf oder nur machmal?

 

Das Ganze klingt erstmal nach einem Problem mit der Verkabelung (dann sollte es aber auch am Anfang auftreten, wenn man den Arduino nur oft genug neu startet). Was für Kabel benutzt du, um deinen Arduino Mega mit den MAX7219-Chips zu verbinden? Hast du an den MAX7219 auch den 100 nf-Kondensator zwischen VCC und GND eingebaut? Steckbrett oder Platine?

Link to comment
Share on other sites

Guten Morgen zusammen,

 

ich hoffe ich bin hier im richtigen Thread,

ansonsten entschuldige ich mich schonmal vorab.

 

Ich spiele seit kurzen mit dem Gedanken, mir auch ein Simpit zu bauen.

Natürlich habe ich schon so einige Threads im Home Cockpit Forum durch gelesen.

Ist schon genial was einer so aus dem ärmel schütteln kann :thumbup:

 

Ich wollte mal mit dem Fuel Panel anfangen und schon kommen die Fragen.

 

Es wird offensichtlich ein Arduino Board bevorzugt, wenn ich es richtig verstanden habe, da diese besser mit DCS-Bios funktionieren?

Was spricht denn gegen die ganzen anderen Boards wie z.B Bordnar, GP-Wiz usw.

 

Welches Arduino soll man nehmen, Nano, Uno oder Mega?

Kann man z.B auch hingehen und sagen ein Mega für die linke Konsole, ein Mega für die mittlere Konsole, ein Mega für die rechte Konsole und dann jedes Panel ein Ardiuno für sich, welches dann mit dem jeweiligen Mega verbunden wird?

Habe da was mit RS-485 Bus gelesen.

 

Dann gibt es ja hier eine schöne Auflistung, welche Schalter und Poties usw an den original Panels verbaut wurden.

Einige von den Schaltern kann man noch bestellen, wieder andere sind schwerer zu finden, aber im allgemeinen sind die Preise für die original Teile, doch sehr hoch.

 

Für den Anfang soll es also dann doch erstmal mit vergleichbaren gemacht werden.

 

Die Toggleswitche sind 800K4 bzw MS24523-23.

Als Ersatz habe ich mir die APEM 636H/2 ausgesucht.

Muss es aber ein Ein / Ein Schalter sein oder würde auch ein Ein / Aus gehen um dies mit DCS-Bios zu simulieren?

 

Der Line Check Knopf soll ein APEM 1213 werden.

Würde dieser funktionieren?

 

Für die Fill Disable Push / Pull wollte ich dann KFZ Zugschalter nehmen

z.B https://www.conrad.de/de/zugschalter-12-v-10-a-1-x-ausein-hp-autozubehoer-zugschalter-1-st-1464850.html

Oder kennt jemand da eine bessere Alternative.

 

Das einzige was ich noch gefunden habe, ist der Poti fürs RCVR LT.

Was kann man dafür nehmen?

 

 

 

Danke und Gruß

Sven

Link to comment
Share on other sites

Ian;2990586']Passiert immer das gleiche oder ist das Verhalten jedesmal anders? Treten die Fehler bei jeder einzelnen Änderung auf oder nur machmal?

 

Das Ganze klingt erstmal nach einem Problem mit der Verkabelung (dann sollte es aber auch am Anfang auftreten, wenn man den Arduino nur oft genug neu startet). Was für Kabel benutzt du, um deinen Arduino Mega mit den MAX7219-Chips zu verbinden? Hast du an den MAX7219 auch den 100 nf-Kondensator zwischen VCC und GND eingebaut? Steckbrett oder Platine?

 

Hm... ich teste das heute noch mal...

 

ich nutze ganz normale Kabel zum stecken... und nein einen Kondensator habe ich nicht verbaut... habe die Module einfach hintereinander gesteckt, siehe Foto

 

2-MAX7219.jpg

 

Ich habe das erste Modul (MAX7219-Chip) am Arduino Mega verbunden und dann das zweite Modul (MAX7219-Chip) am ersten Modul (MAX7219-Chip), wie auf dem Bild zusehen.

[sIGPIC][/sIGPIC]

 

my DCS World - Ka50 Pit Project: :pilotfly:

http://www.ka50.de

Link to comment
Share on other sites

so... bin ein Schritt weiter, habe den Code noch mal von vorne neu geschrieben und die Reihenfolge geändert:

 

-UV26 (2. MAX7219)

-Store (1. MAX7219)

-Remain (1. MAX7219)

-RNDS (1. MAX7219)

 

Dabei ist mir aufgefallen, dass die Hieroglyphen nicht mit dem MAX7219 Modulen zu tun haben, sondern an dieser Funktion liegt:

 

oid onWeaponsDisplayStoreTypeChange(char* newValue) {
   /* set digit 4 to first character (newValue[0]) */
   lc.setChar(0, 7, newValue[0], false);

   /* set digit 3 to second character */
   lc.setChar(0, 6, newValue[1], false);
}
DcsBios::StringBuffer<2> weaponsDisplayStoreTypeBuffer(0x1888, onWeaponsDisplayStoreTypeChange);

 

Irgendwie schein das nicht richtig exportiert zu werden, oder das MAX7219 kann die Buchstaben nicht richtig darstellen... :cry:

 

Da Du ja auch ein MAX7219 hast kann Du das ggf. mal bei dir testen?! :thumbup:

[sIGPIC][/sIGPIC]

 

my DCS World - Ka50 Pit Project: :pilotfly:

http://www.ka50.de

Link to comment
Share on other sites

Da Du ja auch ein MAX7219 hast kann Du das ggf. mal bei dir testen?! :thumbup:

 

Ich hab mir das mal mit der interaktiven control reference angesehen. Die Werte, die da aus DCS-BIOS herausfallen, sind entweder " " (zwei Leerzeichen, bei leerem Display), "AT" wenn das Display "NC" anzeigt oder "RT" wenn das Display "HP" anzeigt. Warum, das weiß nur ED. Hat vielleicht was damit zu tun, dass das eigentlich kyrillische Zeichen sein sollen.

 

Die LedControl-Library kann mit 'R' oder 'T' nichts anfangen. Du musst die beiden Fälle also extra abfragen:

 

void onWeaponsDisplayStoreTypeChange(char* newValue) {
   if (!strcmp(newValue, "AT")) {
       // zeige "NC" an
   } else if (!strcmp(newValue, "RT")) {
       // zeige "HP" an
   } else {
       /* set digit 4 to first character (newValue[0]) */
       lc.setChar(0, 7, newValue[0], false);

       /* set digit 3 to second character */
       lc.setChar(0, 6, newValue[1], false);
   }
}
DcsBios::StringBuffer<2> weaponsDisplayStoreTypeBuffer(0x1888, onWeaponsDisplayStoreTypeChange);

 

"HP" sollte mit setChar() darstellbar sein, das C auch. Mit "N" kann die LedControl-Library nichts anfangen, da musst du wahrscheinlich setRow() aufrufen und eine Zahl übergeben, die geau die richtigen Segmente anschaltet, damit sich das N ergibt.

Link to comment
Share on other sites

Es wird offensichtlich ein Arduino Board bevorzugt, wenn ich es richtig verstanden habe, da diese besser mit DCS-Bios funktionieren?

Was spricht denn gegen die ganzen anderen Boards wie z.B Bordnar, GP-Wiz usw.

 

Welches Arduino soll man nehmen, Nano, Uno oder Mega?

 

Joystick Controller wie Leo Bodnar, GP-Wiz 40 sind ein anderer Ansatz. Die stellen ein paar digitale Eingänge für Schalter und Taster bereit sowie ein paar analoge Eingänge für Achsen und melden sich dann am Computer als ganz normaler USB-Joystick, so dass du angeschlossene Knöpfe ganz normal in den DCS-Optionen den Funktionen im virtuellen Cockpit zuweisen kannst. An manche dieser Boards kannst du auch Rotary Encoder (Inkrementaldrehgeber) anschließen, die lösen dann einen Button aus, wenn sie nach links gedreht werden und einen anderen, wenn sie nach rechts gedreht werden.

 

Vorteil: funktioniert mit jedem Spiel und mit jedem Modul in DCS.

Nachteil: keine Ausgabe (LEDs, Servos, Schrittmotoren, Displays),

 

 

Der andere Ansatz ist, eine eigene Software zu schreiben, die vollen Zugriff auf das virtuelle Cockpit hat und irgendwie mit der selbstgebauten oder gekauften Hardware redet. DCS: World stellt dafür eine Schnittstelle bereit (Stichwort Export.lua).

 

Dieser Ansatz hat den Vorteil, dass man auch Daten vom PC zur eigenen Hardware senden kann. Der Nachteil ist im Allgemeinen, dass dieser Ansatz nur mit DCS: World funktioniert und die Software für jedes neue Flugzeugmodul angepasst werden muss.

 

Mir sind vier Projekte bekannt, die den Export.lua-Ansatz mit dem Ziel verfolgen, eigene Hardware anzusteuern:

  • Helios kann nicht nur virtuelle Touchscreen-Panels anzeigen, sondern auch über sein EOS-Protokoll mit eigener Hardware reden. Es unterstützt wohl auch Phidgets USB Interfaces.
  • PSCockpits kann wohl auch DCS: World
  • Die Simpit-Software von SDA kann mit dem Arcaze USB Interface reden, welches für Leute designt wurden, die Arcade-Maschinen emulieren wollen. Soweit ich weiß, unterstützt die Software sehr viele Flugzeugmodule in DCS: World und das Arcaze-Interface kann Schalter, Taster, Rotary Encoder, LEDs und 7-Segment-Anzeigen ansteuern.
  • DCS-BIOS redet über ein eigenes Protokoll mit Hardware, die an einem (über USB emulierten) seriellen Port hängt. Die DCS-BIOS Arduino Library macht es relativ einfach, solche Hardware auf Basis der Arduino-Mikrocontrollerboards selbst zu bauen.

 

Ich weiß jetzt über die anderen Systeme nicht genug, um da einen fairen Vergleich zu machen.

 

Der größte Nachteil an DCS-BIOS ist, dass es im Moment nur vier Flugzeugmodule (A-10C, Ka-50, UH-1H und Mig-21) unterstützt. Das soll sich in Zukunft ändern, kann aber noch viele Monate dauern, weil ich schwer vorhersagen kann, wieviel Zeit ich in das Projekt stecken kann.

 

Bei DCS-BIOS musst du die Software für das Arduino-Board selber schreiben. Für Taster, Kippschalter, Rotary Encoder und LEDs geht das einfach per Copy&Paste ohne Programmiererfahrung. Für Displays, Servos und Schrittmotoren muss man schon ein bisschen Programmieren lernen. Das ist aufwändiger als bei manch anderem System, macht einen aber auch unabhängig von irgendeinem bestimmten System. Wenn du z.B. in deinem CMSP Displays verbauen willst, die genau so wie das Original aussehen, dann kannst du das mit genug Programmierkenntnissen, DCS-BIOS und einem Arduino-Board machen. (Ähnliches gilt für Helios und EOS.)

 

Kann man z.B auch hingehen und sagen ein Mega für die linke Konsole, ein Mega für die mittlere Konsole, ein Mega für die rechte Konsole und dann jedes Panel ein Ardiuno für sich, welches dann mit dem jeweiligen Mega verbunden wird?

Habe da was mit RS-485 Bus gelesen.

 

Die Idee ist, dass man nur einen (oder ggf. zwei bis drei) Arduinos an den PC anschließt und der Rest der Boards über einen RS-485-Bus untereinander kommuniziert. Damit braucht man für ein komplettes Cockpit keine 20 bis 40 USB-Anschlüsse.

Die RS-485-Unterstützung ist zwar schon in DCS-BIOS drin, aber noch nicht dokumentiert, weil wir da noch ein paar Sachen testen müssen. Solange du aber einen I/O-Pin pro Arduino frei lässt, um später das TX_ENABLE-Signal zu steuern, ist es relativ unkompliziert, ein Board von USB auf RS-485-Bus umzustellen.

 

Muss es aber ein Ein / Ein Schalter sein oder würde auch ein Ein / Aus gehen um dies mit DCS-Bios zu simulieren?

 

DCS-BIOS sollte mit jedem erhältlichen Typ von Taster oder Kippschalter funktionieren, ein einfacher EIN-AUS-Schalter (SPST) tut es also auch.

 

 

Wenn du noch Fragen hast, beantworte ich die gerne so gut ich kann. Es wäre hilfreich, wenn du mal kurz beschreibst, welches Vorwissen in Programmierung und Elektronik ggf. schon vorhanden ist.

 

Wenn du DCS-BIOS einfach mal ausprobieren willst, würde ich dir den Arduino Nano (klein und günstig, du solltest aber schon einen Lötkolben besitzen um die Pin-Header dranzulöten) oder einen Arduino Mega 2560 (mehr I/O-Pins, du kannst auch mit Arduino Shields rumspielen) empfehlen. Den Uno kannst du auch verwenden, aber der Nano bietet genau das gleiche (außer dass du keine Shields draufstecken kannst) bei deutlich geringerem Preis ud kleinerem Formfaktor (leichter hinter dem Panel zu verstecken). Außerdem lässt sich der Nano einfach auf ein Steckbrett stecken, wie z.B. in diesem Bild.

 

Den Mega bekommst du für ca. 12 Euro ($6.00 aus China ohne USB-Kabel), der Nano kostet ca. 4,40 bei eBay (Artikelstandort: Deutschland) oder $2.15 aus China bei AliExpress.


Edited by [FSF]Ian
Link to comment
Share on other sites

Guten Morgen Ian,

 

danke für deine Antwort.

 

Ich habe mir gestern mal einen Mega 2560 bestellt.

 

Mein Vorwissen bzgl programmieren liegt mittlerweile 11 Jahre zurück da haben wir C# gelernt, dass Buch dazu ist allerdings noch vorhanden.

Ich müsste sicherlich wieder "reinkommen"

 

Die ein oder andere Schaltung habe ich auch gelötet bzw gesteckt, ist aber seit Ende meiner Ausbildung nicht mehr großartig angewendet worden.

Technisches Verständnis ist allerdings vorhanden Schaltpläne, technische Zeichnung usw kann ich allerdings lesen.

 

 

Wollte erstmal schauen ob der Bau eines Homepits ein Hobby ist, welches mich reizen würde.

Deswegen erstmal die ganzen Standardfragen, damit ich nicht unnötig viel "Lehrgeld" ausgeben muss.

 

Danke und Gruß

Sven


Edited by Alburg
Link to comment
Share on other sites

Ian;2992514']Ich hab mir das mal mit der interaktiven control reference angesehen. Die Werte, die da aus DCS-BIOS herausfallen, sind entweder " " (zwei Leerzeichen, bei leerem Display), "AT" wenn das Display "NC" anzeigt oder "RT" wenn das Display "HP" anzeigt. Warum, das weiß nur ED. Hat vielleicht was damit zu tun, dass das eigentlich kyrillische Zeichen sein sollen.

 

Die LedControl-Library kann mit 'R' oder 'T' nichts anfangen. Du musst die beiden Fälle also extra abfragen:

 

void onWeaponsDisplayStoreTypeChange(char* newValue) {
   if (!strcmp(newValue, "AT")) {
       // zeige "NC" an
   } else if (!strcmp(newValue, "RT")) {
       // zeige "HP" an
   } else {
       /* set digit 4 to first character (newValue[0]) */
       lc.setChar(0, 7, newValue[0], false);

       /* set digit 3 to second character */
       lc.setChar(0, 6, newValue[1], false);
   }
}
DcsBios::StringBuffer<2> weaponsDisplayStoreTypeBuffer(0x1888, onWeaponsDisplayStoreTypeChange);

 

"HP" sollte mit setChar() darstellbar sein, das C auch. Mit "N" kann die LedControl-Library nichts anfangen, da musst du wahrscheinlich setRow() aufrufen und eine Zahl übergeben, die geau die richtigen Segmente anschaltet, damit sich das N ergibt.

 

Hi Ian,

habe den Code mal ausprobiert, da wir gar nichts angezeigt. Also ist das Thema mit der Anzeige von Buchstaben wohl kompliziert... :cry:

 

Vor allem haben wir ja nicht nur "NC" und "HT" sondern noch "A6" bei Bomben und "NN" bei den UPK-23-250 Behältern... :(

[sIGPIC][/sIGPIC]

 

my DCS World - Ka50 Pit Project: :pilotfly:

http://www.ka50.de

Link to comment
Share on other sites

habe den Code mal ausprobiert, da wir gar nichts angezeigt. Also ist das Thema mit der Anzeige von Buchstaben wohl kompliziert... :cry:

 

Vor allem haben wir ja nicht nur "NC" und "HT" sondern noch "A6" bei Bomben und "NN" bei den UPK-23-250 Behältern... :(

 

Du musst an den Stellen, wo die Kommentare stehen, auch noch den richtigen Code einfügen...

Ich hab leider nicht die Zeit, das alles selber aufzubauen und zu testen, zumal ich mich dann auch erstmal wieder in die Bedienung eines Ka-50 einarbeiten müsste.

 

Für jeden Wert, der nicht richtig angezeigt wird, musst du folgendes tun:

  • herausfinden, wie du den (ohne DCS-BIOS) auf dem Display anzeigst
  • herausfinden, welcher Wert aus DCS-BIOS rausfällt, wenn das angezeigt wird (
    )
  • ein zusätzliches if-statement einfügen, um den Fall zu behandeln

 

Das ist der Teil von DCS-BIOS, bei dem du selbst programmieren musst. Es gibt zu viele mögliche Displaytypen, so dass ich die nicht alle selbst implementieren und testen kann.

 

Bau mal folgendes in einen Test-Sketch ein:

lc.setRow(0, 0, B01111110);

Das müsste ein 'A' ausgeben. Jede 1 oder 0 kontrolliert dabei ein Segment. Damit kannst du beliebige Kombinationen von Segmenten setzen. Es ist nicht schwierig, du musst nur verstehen, wie die Hardware, die du benutzt, funktioniert. Ressourcen dazu gibt es eine Menge -- das Datasheet des MAX7219, Wikipedia, den Quellcode der LedControl-Library...

Link to comment
Share on other sites

So mein Mega 2560 ist heute schon eingetroffen.

Habe also vorhin schon mal etwas herum gespielt, da ich wie der Zufall es wollte noch genau ein Widerstand, eine LED, ein Taster und ein DPDT center off übrig hatte, habe ich mal etwas herumgespielt.

 

Ist es eigentlich möglich die Position des jeweiligen Schalters vorher abzufragen?

Ich habe z.B den CICU Switch aufs DPDT gesetzt, wenn ich meinen Schalter auf OFF habe und DCS mit einer Trainingsmission starte (FLieger an und Systeme an), dann muss mein Schalter einmal "gecycled" werden, damit es in DCS erkannt wird.

 

Beim Hotas Warthog werden die Schalterpositionen ja auch erkannt.

 

Dann habe ich mir mal den RCVR LT vom Fuel Control Panel angeschaut.

 

DcsBios::Potentiometer alcpRcvrLts("ALCP_RCVR_LTS", PIN);

 

Original scheint es ein Poti mit Schaltfunktion zu sein.

Ich habe aber im der Control Reference nichts weiter für den RCVR LT gefunden.

Heißt dies, dass die "Schaltunktion" in DCS nicht wiedergespiegelt wird?

 

Danke und Gruß Sven

Link to comment
Share on other sites

Ist es eigentlich möglich die Position des jeweiligen Schalters vorher abzufragen?

Ich habe z.B den CICU Switch aufs DPDT gesetzt, wenn ich meinen Schalter auf OFF habe und DCS mit einer Trainingsmission starte (FLieger an und Systeme an), dann muss mein Schalter einmal "gecycled" werden, damit es in DCS erkannt wird.

 

Das ist Absicht. Wenn physikalischer Schalter und Simulation nicht im gleichen Zustand sind, hast du zwei Möglichkeiten: (1) passe die Simulation an den Schalter an oder (2) passe den Schalter an die Simulation an.

 

(1) hat den Vorteil, dass du als Mensch nichts tun musst. Allerdings würde es in der von dir beschriebenen Situation erstmal ungefragt den Bordcomputer ausschalten und könnte je nach dem, um welchen Schalter es sich genau handelt, dazu führen, dass z.B. das Navigationssystem das Alignment verliert. Deshalb habe ich bei DCS-BIOS auf (2) gesetzt, so dass niemals ein Schalter in der Simulation ohne menschliches Zutun bewegt wird.

 

Im Prinzip könnte man den Arduino so programmieren, dass er den Zustand des Schalters in der Simulation überwacht und bei Bedarf angleicht, das würde aber etwas sinnlos Ressourcen fressen. Da die Anfrage nach diesem Feature mehrmals kam, habe ich vor, in DCS-BIOS 2.0 im Protokoll ein "gratuitous"-Flag vorzusehen, das anzeigt, dass ein Befehl nicht durch das physikalische Umschalten eines Schalters ausgelöst wurde. Befehle mit diesem Flag würden dann standardmäßig ignoriert, und man könnte das in der Software auf dem PC für jeden Schalter einzeln einstellen. Dann fehlt noch ein Event-Mechanismus, der bei einem Flugzeugwechsel die Hardware dazu auffordert, doch mal den kompletten Zustand zu schicken (normalerweise melden sich die Arduinos nur, wenn sich was geändert hat).

 

Original scheint es ein Poti mit Schaltfunktion zu sein.

Ich habe aber im der Control Reference nichts weiter für den RCVR LT gefunden.

Heißt dies, dass die "Schaltunktion" in DCS nicht wiedergespiegelt wird?

 

Sieht so aus. Soweit ich weiß gibt es auch im virtuellen Cockpit keine Funktion, um den Schalter zu bedienen. Du könntest natürlich den Arduino so programmieren, dass das physikalische Poti nicht zwischen 0% und 100% sondern z.B. zwischen 10% und 100% regelt und der Regler im virtuellen Cockpit erst bei Abschalten des Schalters auf 0% gedreht wird.

Link to comment
Share on other sites

  • 3 weeks later...

Hi Ian,

 

so habe das jetzt mit dem Weapon Panel hin bekommen... :thumbup:

 

http://ka50.de/wp-content/uploads/2017/01/Weapon_Panel_NC.jpg

 

http://ka50.de/wp-content/uploads/2017/01/Weapon_Panel_HP.jpg

 

Habe noch eine Frage zum Export DCS-BIOS / Ka50. Ist es wohl möglich in den Control Reference for v0.5.0 noch einen Export der Frequenzen Radio R800 und R828 zu integrieren?!

 

Ich würde mir gerne von den beiden Radios die Frequenzen über die 7 Segment Anzeigen

anzeigen lassen... :music_whistling:

 

Habe gesehen das dieses für die A10C möglich ist.

 

Vielen Dank und VG

Tronix

[sIGPIC][/sIGPIC]

 

my DCS World - Ka50 Pit Project: :pilotfly:

http://www.ka50.de

Link to comment
Share on other sites

So, jetzt bin ich wohl auch mal über dieses Wunderwerk der Bastelkunst gestolpert. Funktioniert bei mir ( A10C ) bisher auch wunderbar.

 

Bis jetzt habe ich mir die FuelPumps und das ElectricalPowerPanel ausgelagert. Das funktioniert auch wirklich alles wunderbar.

 

Jetzt zu meinem Problem:

 

Beim Auslagern des SAS_Panel der A10C ist mir aufgefallen, dass diese in der Dokumentation als PUSH-Buttons angegeben sind. Es handelt sich jedoch eigentlich um Switch2Pos-Schalter. Und egal wie ich es drehe und wende, ich bekomme die 4 Kippschalter und den T/O-Trim-Button nicht ausgelagert. Die LED-Anzeige für die Kontroll-Leuchte (während des Drückens vom T/O-Trim-Button) funktioniert einwandfrei (dann aber im Cockpit selbst gedrückt und nicht über den ausgelagerten PUSH-Button)

 

Mache ich da jetzt irgendwas falsch, oder ist das ein kleiner Fehler der sich eingeschlichen hat?

 

Gruß

 

DeadEye

Link to comment
Share on other sites

Seit DCS-BIOS 0.5.0 sollten die auch als Switch2Pos funktionieren. Warum das in der Control Reference nicht drinsteht, muss ich mir nochmal ansehen, wenn ich wieder an meinem Desktop-Computer sitze.

 

Versuch mal folgendes:

DcsBios::Switch2Pos saspYawSasL("SASP_YAW_SAS_L", PIN);

 

Das besondere an diesen Schaltern ist, dass die magnetisch in Position gehalten werden, d.h. der Bordcomputer kann die bei Bedarf wieder abschalten. In der A-10C gibt es sowas beim SAS-Panel, beim EAC Ein/Aus-Schalter, dem Anti-Skid-Switch und dem Schalter für die Anticollision Lights.

 

@Oldcooltronix: Wenn du die Control Reference auf "Advanced" schaltest, dann sollten da auch Teile der Frequenzselektoren als Strings auftauchen.

Link to comment
Share on other sites

Hi Ian,

 

super danke für den Hinweis. Habe das mal Probiert, es funktioniert auch sehr gut.

 

Beim R828 habe ich ein kleines Problem... Das R828 steht im DCS auf Kanal "1" aber auf

7 Segment Anzeige wird die Zahl "0" angezeigt... bei Kanal "2" dann die "1" usw.

 

Anbei der Code:

 

/* set R828 Frequenz 2.MAX7219 */
void onR828ChannelChange(unsigned int newValue) {
       lc.setChar( 1, 0, newValue, true );
}
DcsBios::IntegerBuffer r828ChannelBuffer(0x194a, 0x003c, 2, onR828ChannelChange);

 

wie kann ich denn der Anzeige sagen, dass sie bei "1" anfangen soll?! :helpsmilie:

 

Danke und viele Grüße

Tronix

[sIGPIC][/sIGPIC]

 

my DCS World - Ka50 Pit Project: :pilotfly:

http://www.ka50.de

Link to comment
Share on other sites

wie kann ich denn der Anzeige sagen, dass sie bei "1" anfangen soll?! :helpsmilie:

 

Du programmierst in C++, rechne dir die Werte einfach aus:

 

/* set R828 Frequenz 2.MAX7219 */
void onR828ChannelChange(unsigned int newValue) {
   unsigned int value = newValue+1;
   lc.setChar(1, 0, value < 0 ? ' ' : '1', false);
   lc.setDigit(1, 1, value%10, false);
}
DcsBios::IntegerBuffer r828ChannelBuffer(0x194a, 0x003c, 2, onR828ChannelChange);

 

Die erste Stelle ist '1' bei Kanal 10 und sonst ein Leerzeichen, die zweite Stelle ist der Rest, der bei Division durch 10 übrig bleibt.

Link to comment
Share on other sites

ähhhh.... :blink:

 

jetzt funktioniert das mit dem Kanal "1" = "1" aber das zweite Digit zeigt immer eine "1" an.

 

Sollte das nicht so funktionieren, dass von Kanal "1-9" nur das erste Digit die Zahl anzeigt und nur bei "10" dann das zweite Digit eine "0" anzeigt?! :cry:

 

bin gerade total verwirrt... :drunk:

[sIGPIC][/sIGPIC]

 

my DCS World - Ka50 Pit Project: :pilotfly:

http://www.ka50.de

Link to comment
Share on other sites

aber das zweite Digit zeigt immer eine "1" an.

 

Das liegt an der Modulo-Operation:

Ian;3015584']value%10

Das gibt dir den Rest der ganzzahligen Division. Und kleiner 10 ist der Rest immer gleich value.

Beispiel 1 (ganzzahlig) geteilt durch 10 in einfachen Worten: die 10 geht null Mal in die 1 rein. Es bleibt ein Rest von 1.

 

Wie Ian schon sagte bist du in C++ unterwegs. Rechne dir einfach selbst aus, was du da brauchst!

Im Prinzip musst du nur Zahlen kleiner 10 von der Modulo-Operation bzw. wenn value kleiner als 10 ist, dann das zweite Digit nicht anzeigen lassen (oder ausmachen... oder was auch immer... ich hab keine Ahnung von der Hardware und der Schnittstelle dahinter ;) ).

- Deutsche Tutorials und DCS Gameplay: youtube.com/Rakuzard | raku.yt/discord -
Link to comment
Share on other sites

Zwei kleine Fehler sind da noch drin (ich hatte den Code nicht getestet, sondern auf Verdacht am Laptop geschrieben):

 

zum Einen ist bei dir wohl Ziffer 1 links, Ziffer 0 rechts davon, also müssen die Positionen getauscht werden. Zum anderen meinte ich value < 10 statt value < 0.

 

Das hier sollte funktionieren:

/* set R828 Frequenz 2.MAX7219 */
void onR828ChannelChange(unsigned int newValue) {
   unsigned int value = newValue+1;
   lc.setChar(1, 1, value < 10 ? ' ' : '1', false);
   lc.setDigit(1, 0, value%10, false);
}
DcsBios::IntegerBuffer r828ChannelBuffer(0x194a, 0x003c, 2, onR828ChannelChange);

 

Hab das wieder nicht auf Arduinos getestet, aber die Ausgabe des folgenden kleinen Testprogramms sieht vielversprechend aus:

[b]$ cat test.cc[/b]
#include <iostream>
using namespace std;
int main() {

       for (unsigned short value = 1; value < 11; value++) {
               cout << value << ":\t";
               cout << (value < 10 ? ' ' : '1');
               cout << ( (char)('0'+ (value%10) ));
               cout << endl;
       }
       cout << endl;
       return 0;
}

[b]$ g++ test.cc && ./a.out[/b]
1:       1
2:       2
3:       3
4:       4
5:       5
6:       6
7:       7
8:       8
9:       9
10:     10

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

[sIGPIC][/sIGPIC]

 

my DCS World - Ka50 Pit Project: :pilotfly:

http://www.ka50.de

Link to comment
Share on other sites

  • Recently Browsing   0 members

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