DCS World - École de Simulation de Combat Aérien
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Aller en bas
Hugo
Hugo
Qualification N0
Qualification N0 obtenue dans le cursus tronc commun (T-45C) de l'ESCA
100 Heures de Vol
Seuil de 100 Heures de Vol atteint au sein de l'ESCA
Pilote de la 8e Escadre de Chasse Virtuelle
A publié suffisament de messages sur le forum pour accéder au contenu réservé aux membres de l'école et de la 8e Escadre
Élève UH-1H
Vide
Localisation : Jallans
Messages : 221

Programmation arduino Empty Programmation arduino

Lun 8 Aoû - 15:38
Bonjour,
j'ai reçu des encodeurs rotatifs KY-040.

Je n'arrive pas à les faire fonctionner. J'ai beau regarder les explications je sèche.

Je suis certain que :
-DCS-bios interagit avec DCS car lorsque je change la fréquence ADF, cela est retranscrit dans DCS Bios.

L'encodeur a 5 broches.
GND que je connecte  sur GND
+      que je connecte sur 5V
SW    pur l'instant pas connecté, c'est la fonction bouton
DT (bande A) connecté broche 5
CLK (bande B) connecté broche 6

Le code entré dans Arduino est le suivant:

Code:
/*
  Tell DCS-BIOS to use a serial connection and use interrupt-driven
  communication. The main program will be interrupted to prioritize
  processing incoming data.
  
  This should work on any Arduino that has an ATMega328 controller
  (Uno, Pro Mini, many others).
 */
#define DCSBIOS_IRQ_SERIAL

#include "DcsBios.h"
#include "RotaryEncoder.h"

/* paste code snippets from the reference documentation here */
DcsBios::RotaryEncoder adfTune("ADF_TUNE", "-3200", "+3200", 5, 6);

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

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


J'ai également essayé sur des pins analogiques mais sans succès.

Si l'un d'entre vous a la solution, ce sera mon héro du jour. Very Happy

buffalo aime ce message

Hugo
Hugo
Qualification N0
Qualification N0 obtenue dans le cursus tronc commun (T-45C) de l'ESCA
100 Heures de Vol
Seuil de 100 Heures de Vol atteint au sein de l'ESCA
Pilote de la 8e Escadre de Chasse Virtuelle
A publié suffisament de messages sur le forum pour accéder au contenu réservé aux membres de l'école et de la 8e Escadre
Élève UH-1H
Vide
Localisation : Jallans
Messages : 221

Programmation arduino Empty Re: Programmation arduino

Lun 8 Aoû - 19:47
Bon, et bien après avoir passé plusieurs heures à trifouiller, je pense qu'en fait ma carte ne communique pas avec dcs bios.

Programmation arduino Hub10
COM3 ne passe jamais au vers. 

Sinon, dans mon fichier script, j'ai inséré
Programmation arduino Dcs_co10
Auriez vous une idée pur connecter tout ça???
Merci

buffalo aime ce message

Hugo
Hugo
Qualification N0
Qualification N0 obtenue dans le cursus tronc commun (T-45C) de l'ESCA
100 Heures de Vol
Seuil de 100 Heures de Vol atteint au sein de l'ESCA
Pilote de la 8e Escadre de Chasse Virtuelle
A publié suffisament de messages sur le forum pour accéder au contenu réservé aux membres de l'école et de la 8e Escadre
Élève UH-1H
Vide
Localisation : Jallans
Messages : 221

Programmation arduino Empty Re: Programmation arduino

Mar 9 Aoû - 14:43
Bon et bien ça fonctionne !!!  Very Happy Very Happy Very Happy

Pour ceux qui vont bientôt faire leur boite à boutons, voici ce dont je me suis rendu compte pour que cela fonctionne.

1°/ connecter son Arduino AVANT d'ouvrir DCS Bios
1bis°/ouvrir DCS WORLD - une mission au choix et entrer dans l'hélico.
2°/ AVANT de téléverser le code sur la carte Arduino (à partir de l'appli Arduino) , il faut déconnecter la carte dans l'appli DCS Bios.
3°/ une fois le transfert terminé, reconnecter la carte dans DCS Bios.
4°/ Allez sur DCS world et recharger l'hélicoptère (Rybackerie).

Il ne me reste plus qu'à attendre le reste des switch, et de trouver un support.

Je reste dispo pour ceux qui auraient des difficultés. 

En tout cas pour le réglage de l'ADF c'est super cool. Fini la molette de la souris pendant 3 heures. En 3 rotations complètes, parcours de la bande.

Salut les costauds et vive les caïmans


Dernière édition par Hugo le Mar 9 Aoû - 16:59, édité 1 fois

buffalo aime ce message

FullGas
FullGas
Administrateur Technique
Association ESCA
Administrateur Technique Association ESCA
Qualification N1 - UH-1H
Qualification N1 obtenue dans le cursus UH-1H Huey de l'ESCA
Qualification N2 - UH-1H
Qualification N2 obtenue dans le cursus UH-1H Huey de l'ESCA
Qualification N3 - UH-1H
Qualification N3 obtenue dans le cursus UH-1H Huey de l'ESCA
100 Heures de Vol
Seuil de 100 Heures de Vol atteint au sein de l'ESCA
Pilote de la 8e Escadre de Chasse Virtuelle
A publié suffisament de messages sur le forum pour accéder au contenu réservé aux membres de l'école et de la 8e Escadre
500 Heures de Vol
Seuil de 500 Heures de Vol atteint au sein de l'ESCA
Instructeur UH-1H
Vide
Localisation : Maule - 78
Messages : 404

Programmation arduino Empty Re: Programmation arduino

Mar 9 Aoû - 15:08
Salut Hugo, interressant ton montage.

Je suis en congés, donc pas possible de communiquer pour l'instant. Mais si tu veux, à mon retour je pourrai t'expliquer comment je me suis bricolé une boite à boutons un peu differente de la tienne.

En fait, je n'utilise pas dcs bios, mais simplement une boite qui est reconnue comme un périphérique usb standard. Du coup, je peux simplement la mapper comme un joystick avec n'importe quel appreil de dcs.

Si ça t'interresse, je pourrai faire une petite présentation ici, et partager des précisions sur le projet que j'ai réalisé.

A+  jocolor

Killight, Sushimi, Hugo et buffalo aiment ce message

Hugo
Hugo
Qualification N0
Qualification N0 obtenue dans le cursus tronc commun (T-45C) de l'ESCA
100 Heures de Vol
Seuil de 100 Heures de Vol atteint au sein de l'ESCA
Pilote de la 8e Escadre de Chasse Virtuelle
A publié suffisament de messages sur le forum pour accéder au contenu réservé aux membres de l'école et de la 8e Escadre
Élève UH-1H
Vide
Localisation : Jallans
Messages : 221

Programmation arduino Empty Re: Programmation arduino

Mar 9 Aoû - 15:39
Salut @Fullgas,

Yes j'ai vu qu'il y avait un autre système plus simple que DCS mais comme j'avais déjà une Arduino, je suis parti là-dessus. 

Si ton système fonctionne avec une carte Arduino, je suis aussi partant et je pense que d'autres seront aussi intéressés et choisir comment faire leur boxe.

Bonnes vacances à toi.

buffalo aime ce message

Hugo
Hugo
Qualification N0
Qualification N0 obtenue dans le cursus tronc commun (T-45C) de l'ESCA
100 Heures de Vol
Seuil de 100 Heures de Vol atteint au sein de l'ESCA
Pilote de la 8e Escadre de Chasse Virtuelle
A publié suffisament de messages sur le forum pour accéder au contenu réservé aux membres de l'école et de la 8e Escadre
Élève UH-1H
Vide
Localisation : Jallans
Messages : 221

Programmation arduino Empty Re: Programmation arduino

Jeu 11 Aoû - 16:01
Le projet avance bien,
Petit point d'étape.
Bien évidemment c'est une maquette avant la réalisation finale, histoire de voir  l'ergonomie.
Je suis content car j'ai même réussi à configurer l'afficheur Lcd_I2C.

Seul petit problème,
La conversion de l'ADF et je n'arrive pas à trouver le cap dans dcs bios.
Si quelqu'un a une idée ce serait génial.

Pour l'ergonomie j'ai d'abord fait un schéma des fonctions que je souhaitais puis réalisation.


Programmation arduino Img_2010
Programmation arduino Img_2011

buffalo aime ce message

Hugo
Hugo
Qualification N0
Qualification N0 obtenue dans le cursus tronc commun (T-45C) de l'ESCA
100 Heures de Vol
Seuil de 100 Heures de Vol atteint au sein de l'ESCA
Pilote de la 8e Escadre de Chasse Virtuelle
A publié suffisament de messages sur le forum pour accéder au contenu réservé aux membres de l'école et de la 8e Escadre
Élève UH-1H
Vide
Localisation : Jallans
Messages : 221

Programmation arduino Empty Re: Programmation arduino

Dim 14 Aoû - 19:43
Programmation arduino Img_2012

buffalo aime ce message

Hugo
Hugo
Qualification N0
Qualification N0 obtenue dans le cursus tronc commun (T-45C) de l'ESCA
100 Heures de Vol
Seuil de 100 Heures de Vol atteint au sein de l'ESCA
Pilote de la 8e Escadre de Chasse Virtuelle
A publié suffisament de messages sur le forum pour accéder au contenu réservé aux membres de l'école et de la 8e Escadre
Élève UH-1H
Vide
Localisation : Jallans
Messages : 221

Programmation arduino Empty Re: Programmation arduino

Sam 20 Aoû - 17:30
Bon et bien là c'est beaucoup plus propre, 
j'ai pris une boite de dérivation chez brico dépôt.
C'est la maquette 2 qui m'a encore permis de voir quelque petits trucs.
Pas certain de garder les LED.
Dans la version finale, l'affichage sera blanc sur fond noir.
Programmation arduino Img_2013

Killight, latrufe, wanegen, Eltarius, Tango, Sushimi, Arcools et aiment ce message

Eltarius
Eltarius
Pilote de la 8e Escadre de Chasse Virtuelle
A publié suffisament de messages sur le forum pour accéder au contenu réservé aux membres de l'école et de la 8e Escadre
Vide
Vide
Localisation : Ardèche: Meysse
Messages : 18

Programmation arduino Empty Re: Programmation arduino

Lun 5 Sep - 13:02
@hugo pour ton afficheur LCD I2C, tu récupères une data brut via DCS BIOS et tu laffiches tel quel ou tu récupéres plusieurs data que tu affiches où tu veux sur l'afficheur?
Je t'avoue que je vais probablement en mettre un aussi d'afficheur du coup si tu pouvais partager une partie du code correspondant ça m'aiderai à mieux y comprendre aussi Wink

Hugo aime ce message

Hugo
Hugo
Qualification N0
Qualification N0 obtenue dans le cursus tronc commun (T-45C) de l'ESCA
100 Heures de Vol
Seuil de 100 Heures de Vol atteint au sein de l'ESCA
Pilote de la 8e Escadre de Chasse Virtuelle
A publié suffisament de messages sur le forum pour accéder au contenu réservé aux membres de l'école et de la 8e Escadre
Élève UH-1H
Vide
Localisation : Jallans
Messages : 221

Programmation arduino Empty Re: Programmation arduino

Lun 5 Sep - 23:20
voici le code.
J'ai laissé uniquement la partie écran LCD.

Normalement tu devrais t'en sortir.

Code:
/*PANEL By HUGO
 * Avec Arduino MEGA 2560
 * je laisse les PIN 20/21 disponibles pour utiliser un liquidcrystal I2C (ultérieurement)
Du coup, tu dois brancher +5V et masse. Les 2 autres broches sur 20/21
Quand tu déclare le liquidcrystal, ça incrémente en automatique les PINs.
*/

//Bibliotheques utilisées
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define DCSBIOS_IRQ_SERIAL
#include "DcsBios.h"

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


//liquidcrystal_I2C
LiquidCrystal_I2C lcd(0x27,16,2);
//frequence ADF
void onAdfFreqChange(unsigned int newValue) {
    /* your code here */

    lcd.setCursor(0,1);
    lcd.print("ADF:");
    lcd.setCursor(4,1);
    lcd.print("     ");
    lcd.setCursor(4,1);
    lcd.print(newValue);
}
DcsBios::IntegerBuffer adfFreqBuffer(0x1426, 0xffff, 0, onAdfFreqChange);

//fréquznce FM
  
void onVhffmFreq1Change(char* newValue) {
    /* your code here */
    lcd.setCursor(0,0);
    lcd.print("FM :");
    lcd.setCursor(4,0);
    lcd.print(newValue);
}
DcsBios::StringBuffer<1> vhffmFreq1Buffer(0x14ec, onVhffmFreq1Change);

//cap
void onSbyCompassHdgChange(unsigned int newValue) {
    /* your code here */
    lcd.setCursor(9,1);
    lcd.print("CAP:");
    lcd.setCursor(13,1);
    lcd.print("   ");
    lcd.setCursor(13,1);
    lcd.print(newValue);
}
DcsBios::IntegerBuffer sbyCompassHdgBuffer(0x153a, 0xffff, 0, onSbyCompassHdgChange);
void onVhffmFreq2Change(unsigned int newValue) {
    /* your code here */
    lcd.setCursor(5,0);
    lcd.print(newValue);
}
DcsBios::IntegerBuffer vhffmFreq2Buffer(0x14e8, 0x0f00, 8, onVhffmFreq2Change);

//altitude

void onAltMslFtChange(unsigned int newValue) {
    /* your code here */
    lcd.setCursor(7,0);
    lcd.print("ALT:");
    lcd.setCursor(11,0);
    lcd.print("     ");
    lcd.setCursor(11,0);
    lcd.print(newValue);
}
DcsBios::IntegerBuffer altMslFtBuffer(0x0434, 0xffff, 0, onAltMslFtChange);
void setup() {
lcd.init();
lcd.backlight();
lcd.clear();
    DcsBios::setup();
    
}

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

Pour chaque item, il y a une ligne "        ", c'est un moyen facile de réinitialiser l'affichage de l'item avant d'afficher la nouvelle valeur.

il faudra bien que tu compte le nombre d'espaces par valeur.
Attention la première position de la ligne est zéro, la seconde 1, la troisième 2....

Y a plus qu'à.
GO l'ami

Killight, Eltarius et Tango aiment ce message

Hugo
Hugo
Qualification N0
Qualification N0 obtenue dans le cursus tronc commun (T-45C) de l'ESCA
100 Heures de Vol
Seuil de 100 Heures de Vol atteint au sein de l'ESCA
Pilote de la 8e Escadre de Chasse Virtuelle
A publié suffisament de messages sur le forum pour accéder au contenu réservé aux membres de l'école et de la 8e Escadre
Élève UH-1H
Vide
Localisation : Jallans
Messages : 221

Programmation arduino Empty Re: Programmation arduino

Mer 26 Oct - 19:28
YOUPIIIIIIIIIIIIIIIIIIIIIIII

J'ai enfin réussi à coder l'ADF.
Pour info DCS BIOS donne une valeur brute qu'il faut convertir pour obtenir l'ADF "vraie". Il faut utiliser la fonction MAP().
De plus, comme les graduations ne sont pas toutes identiques, il a fallu également en tenir compte.
Et pour finir, il fallait également prendre en compte la position du sélecteur de bande.

Une grande inspiration de la chaine You tube de Angel Sim, mais à la mode Hugo. En effet, il effectue un calcul où l'écart avec l'affichage et beaucoup plus grand qu'en utilisant la fonction map(). 

Maintenant, j'ai un afficheur LCD qui donne parfaitement l'ADF, valeur à 2 points près.

Je vous partage le code de tout mon panel.

Ma prochaine mission et d'arriver à récupérer et convertir le CAP...

Code:
/*PANEL By HUGO
 * Avec Arduino MEGA 2560
 * je laisse les PIN 20/21 disponibles pour utiliser un liquidcrystal I2C (ultérieurement)
-module ADF
-module FM
-module ARMEMENT
-module FLARE
-module LIGHT
-module MASTER ARM
*/

//Bibliotheques utilisées
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define DCSBIOS_IRQ_SERIAL
#include "DcsBios.h"
//Variables
unsigned int band, signal, rawFreq, freq;

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

//module ADF
DcsBios::RotaryEncoder adfMode("ADF_MODE", "DEC", "INC", 2, 3);
DcsBios::RotaryEncoder adfTune ("ADF_TUNE", "-3200", "+3200", 4, 5);
DcsBios::Switch3Pos adfBand("ADF_BAND", 6, 7);
DcsBios::Switch2Pos intNavSw("INT_NAV_SW", Cool;//bouton volume ADF à insérer PIN_8

//module FM uniquement les 2 premiers rotacteurs
DcsBios::RotaryEncoder vhffmFreq1("VHFFM_FREQ1", "DEC", "INC", 11, 12);
DcsBios::RotaryEncoder vhffmFreq2("VHFFM_FREQ2", "DEC", "INC", 9, 10);
DcsBios::Switch2Pos intRcvr1Sw("INT_RCVR1_SW", 13);//bouton volume FM à insérer PIN_13
DcsBios::RotaryEncoder vhffmMode("VHFFM_MODE", "DEC", "INC", 14, 15);

//module ARMEMENT
DcsBios::Switch3Pos rocketSel("ROCKET_SEL", 16, 17);
DcsBios::Switch3Pos masterArmSw("MASTER_ARM_SW", 18, 19);
DcsBios::RotaryEncoder rocketPair("ROCKET_PAIR", "DEC", "INC", 23, 24);
//DcsBios::LED armedInd(0x1416, 0x0010, 25);

//module contre-mesure
//DcsBios::LED cmArmSw(0x151e, 0x0010, 27);
DcsBios::Switch2Pos cmFlareBtn("CM_FLARE_BTN", 28);
////bouton DISP CONT à insérer PIN_29

//module LIGHT
DcsBios::Switch3Pos ldgLtCtrl("LDG_LT_CTRL", 30, 31); //commande phare d'atterrissage
DcsBios::Switch2Pos ldgLightSw("LDG_LIGHT_SW", 32);
DcsBios::Switch3Pos searchLightSw("SEARCH_LIGHT_SW", 35, 34); // phare de recherche
DcsBios::Switch3Pos navLtsSw("NAV_LTS_SW", 36, 37);//Feux de navigation
DcsBios::Switch2Pos anticollLtsSw("ANTICOLL_LTS_SW", 38); //Anticoll
DcsBios::Switch3Pos domeLightSw("DOME_LIGHT_SW", 40, 41);//Plafonnier

//module MASTER ARM
//DcsBios::LED masterCautionInd(0x1416, 0x0100, 44);
DcsBios::Switch3Pos clpResetTestSw("CLP_RESET_TEST_SW", 46, 47);//test reset MA

//liquidcrystal_I2C
LiquidCrystal_I2C lcd(0x27,16,2);
//modification de la bande
void onAdfBandChange(unsigned int newValue) {
  band = newValue;
  calculateFreq();
}
DcsBios::IntegerBuffer adfBandBuffer(0x14fc, 0x00c0, 6, onAdfBandChange);
//frequence ADF
void onAdfFreqChange(unsigned int newValue) {
  rawFreq= newValue;
  calculateFreq();
}
DcsBios::IntegerBuffer adfFreqBuffer(0x1426, 0xffff, 0, onAdfFreqChange);

//Calcul de la fréquence, c'est ici que tout se passe pour convertir l'ADF
void calculateFreq() {
  switch(band){
    case 0:{ //190-450
      if (rawFreq < 5759){
        freq = map(rawFreq,0,5759,190, 200);
      }
      if (rawFreq >5758){
        freq = map(rawFreq,5759,65477,200, 400);
      }
      lcd.setCursor(0,1);
    lcd.print("ADF:");
    lcd.setCursor(4,1);
    lcd.print("    ");
    lcd.setCursor(4,1);
    lcd.print(freq);
      break;}
      case 1:{ //400-850
        if (rawFreq < 5759){
        freq = map(rawFreq,0,5759,400, 420);
      }
      if (5760<rawFreq < 12799){
        freq = map(rawFreq,5760,12799,420, 450);
      }if (rawFreq > 12800){
        freq = map(rawFreq,12800,65477,450, 850);
      }
     
      lcd.setCursor(0,1);
    lcd.print("ADF:");
    lcd.setCursor(4,1);
    lcd.print("    ");
    lcd.setCursor(4,1);
    lcd.print(freq);
      break;}
      case 2:{ //850-1800
        if (rawFreq < 5759){
          freq = map(rawFreq,0,5759,850, 900);
        }
        if (rawFreq> 5758){
      freq = map(rawFreq,5759,65477,900, 1800);
        }
      lcd.setCursor(0,1);
    lcd.print("ADF:");
    lcd.setCursor(4,1);
    lcd.print("    ");
    lcd.setCursor(4,1);
    lcd.print(freq);
      break;}
    }
 
}
//fréquznce FM
 
void onVhffmFreq1Change(char* newValue) {
    /* your code here */
    lcd.setCursor(0,0);
    lcd.print("FM :");
    lcd.setCursor(4,0);
    lcd.print(newValue);
}
DcsBios::StringBuffer<1> vhffmFreq1Buffer(0x14ec, onVhffmFreq1Change);

//cap
void onSbyCompassHdgChange(unsigned int newValue) {
    /* your code here */
  /* lcd.setCursor(9,1);
    lcd.print("CAP:");
    lcd.setCursor(13,1);
    lcd.print("  ");
    lcd.setCursor(13,1);
    lcd.print(newValue);*/
}
DcsBios::IntegerBuffer sbyCompassHdgBuffer(0x153a, 0xffff, 0, onSbyCompassHdgChange);
void onVhffmFreq2Change(unsigned int newValue) {
    /* your code here */
    lcd.setCursor(5,0);
    lcd.print(newValue);
}
DcsBios::IntegerBuffer vhffmFreq2Buffer(0x14e8, 0x0f00, 8, onVhffmFreq2Change);

//altitude

void onAltMslFtChange(unsigned int newValue) {
    /* your code here */
    lcd.setCursor(7,0);
    lcd.print("ALT:");
    lcd.setCursor(11,0);
    lcd.print("    ");
    lcd.setCursor(11,0);
    lcd.print(newValue);
}
DcsBios::IntegerBuffer altMslFtBuffer(0x0434, 0xffff, 0, onAltMslFtChange);
void setup() {
lcd.init();
lcd.backlight();
lcd.clear();
    DcsBios::setup();
   
}

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

Killight, FullGas, Tango, Sisyphe et Floki aiment ce message

Hugo
Hugo
Qualification N0
Qualification N0 obtenue dans le cursus tronc commun (T-45C) de l'ESCA
100 Heures de Vol
Seuil de 100 Heures de Vol atteint au sein de l'ESCA
Pilote de la 8e Escadre de Chasse Virtuelle
A publié suffisament de messages sur le forum pour accéder au contenu réservé aux membres de l'école et de la 8e Escadre
Élève UH-1H
Vide
Localisation : Jallans
Messages : 221

Programmation arduino Empty Re: Programmation arduino

Jeu 27 Oct - 13:56
CAP opérationnel. 

Du coup, pour 3€ j'affiche la FM, l'Adf, le Cap et l'altitude.
Fini  les crashs contre le relief en changeant les fréquences.

Killight aime ce message

Revenir en haut
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum