Interfacer Arduino et P3D

Programmation LUA, Macros FSUIPC, logiciel LINDA
et codage en LUA des gauges Air Manager

Re: Interfacer switch Arduino et P3D

Messagede JacquesZ » Sam 9 Fév 2019 15:03

J'ai regardé du coup la doc d'AM

hw_output_pwm_id = hw_output_pwm_add(hw_id, frequency_hz, initial_duty_cycle)

# Argument Type Description
1 hw_id String The is the reference to the input. You can choose to bind to an existing Hardware ID
2 frequency_hz Number The frequency of the PWM output signal, in Hz.
3 initial_duty_cycle Number The initial PWM duty cycle. Range 0.0 - 1.0, 0.0 being off, and 1.0 on.


D'après ce que j'ai lu (Fab corrigera sûrement):
- la fréquence habituelle d'alimentation d'un servo est de 2ms, soit une fréquence de 500hz (500x2=1000ms), qui est la valeur à mettre en argument 2
- La largeur d'une impulsion standard d'un servo est entre 1 et 2 ms, soit un duty cycle compris entre 50% (0.5x2ms=1ms) et 100%(1.0x2ms=2ms) au maximum.
Il faut vérifier dans les specifications de ton servo, indiques nous de quel modèle s'agit-il STP.

Donc la valeur du duty cycle doit varier entre 0.5 (minimum) et 1.0 (maximum), le reste est une histoire de règle de 3.
les valeurs de duty cycle vont progresser de 0.5/80 à chaque fois=0.0625, en partant de 0.5.

Si je ne me suis pas trompé dans mon raisonnement , ça devrait être un truc comme ça:
Code: Tout sélectionner
airduct_R_engine = hw_output_pwm_add("ARDUINO_MEGA2560_P_D6", 500, 0.75)

function R_engine_air_callback (Val)
print (Val)
hw_output_pwm_duty_cycle(airduct_R_engine, 0.5+(Val*0.5/80))

end

fsx_variable_subscribe("PMDG 737NGX:AIR_DuctPressNeedle:2", "NUMBER", R_engine_air_callback)


A noter que toutes les broches de l'Arduino ne supportent pas le PWM, se rapporter à la table fournie dans le Wiki d'AM ici:
https://siminnovations.com/wiki/index.php?title=Hardware_id_list

Tiens nous au courant (c'est le cas de le dire!) lunettesnoires

Jacques
Ma chaîne YouTube Tutos sur l’A320 par un Pilote de Ligne: https://youtube.com/channel/UCljftuoKBcgeR-WBgYJpuoA
Avatar de l’utilisateur
JacquesZ
 
Messages: 2848
Inscription: 24/11/10

Re: Interfacer switch Arduino et P3D

Messagede JacquesZ » Sam 9 Fév 2019 15:18

J'ai regardé la datasheet du SG90 (quand j'ai un os, je ne lâche pas!), la doc est là:
http://www.ee.ic.ac.uk/pcheung/teaching/DE1_EE/stores/sg90_datasheet.pdf

C'est une fréquence de 20ms (50hz) et un duty cycle variant entre 1.0 et 2.0ms de largeur d'impulsion.
Soit un duty cycle de 5% (0.05x20ms=1ms) au minimum et de 10%(0.1x20ms=2ms) au maximum.
La gamme des valeurs PWM varie donc entre 0.05 et 0.1 soit un Delta de 0.05.

Les valeurs retournées par PMDG variant entre 0 et 80, on progresse de 0.05/80 pas à chaque fois pour faire varier le PWM.

Donc le code modifé est celui-ci:
Code: Tout sélectionner
 airduct_R_engine = hw_output_pwm_add("ARDUINO_MEGA2560_P_D6", 50, 0.075)-- 50Hz et 0.075 pour centrer le moteur

    function R_engine_air_callback (Val)
    print (Val)
    hw_output_pwm_duty_cycle(airduct_R_engine, 0.05+(Val*0.05/80))

    end

    fsx_variable_subscribe("PMDG 737NGX:AIR_DuctPressNeedle:2", "NUMBER", R_engine_air_callback)


Jacques
Ma chaîne YouTube Tutos sur l’A320 par un Pilote de Ligne: https://youtube.com/channel/UCljftuoKBcgeR-WBgYJpuoA
Avatar de l’utilisateur
JacquesZ
 
Messages: 2848
Inscription: 24/11/10

Re: Interfacer switch Arduino et P3D

Messagede hadrien » Sam 9 Fév 2019 19:14

Jacques,

C'est désormais officiel, tu es mon nouveau Dieu vivant ! Ton code marche nickel ! C'est bien un moteur sg90. J'étais parvenu à trouver les caractéristiques du sg90, mais un tout grand merci pour les formules et les conversions !!!

J'adore ce forum, vous avez toujours réponse à tout !!! Je vais pouvoir continuer mon overhead.

Merci et bonne soirée à tous.

Hadrien
hadrien
 
Messages: 95
Inscription: 30/10/18
Localisation: Seilles, Belgique

Re: Interfacer switch Arduino et P3D

Messagede JacquesZ » Sam 9 Fév 2019 21:05

Ben disons que vu que le sujet du servo sous AM m'intéressait aussi, du coup j'ai cherché!
Bien content d'avoir trouvé la solution et que cela aie pu t'aider, surtout que j'avais jamais essayé... lunettesnoires
Mais ça prouve que AM est assez efficace, une fois qu'on a compris le truc.

Du coup je vais publier un post sur le forum d'AM pour partager cette découverte.

Jacques
Ma chaîne YouTube Tutos sur l’A320 par un Pilote de Ligne: https://youtube.com/channel/UCljftuoKBcgeR-WBgYJpuoA
Avatar de l’utilisateur
JacquesZ
 
Messages: 2848
Inscription: 24/11/10

Re: Interfacer switch Arduino et P3D

Messagede JacquesZ » Sam 9 Fév 2019 22:38

Ma chaîne YouTube Tutos sur l’A320 par un Pilote de Ligne: https://youtube.com/channel/UCljftuoKBcgeR-WBgYJpuoA
Avatar de l’utilisateur
JacquesZ
 
Messages: 2848
Inscription: 24/11/10

Re: Interfacer switch Arduino et P3D

Messagede PapaLima » Sam 9 Fév 2019 22:50

20/20affiche Jacques !!

Superbe tutoriel sur l'utilisation des servos avec AirManager !
Avatar de l’utilisateur
PapaLima
 
Messages: 814
Inscription: 14/04/16
Localisation: LFPG

Re: Interfacer switch Arduino et P3D

Messagede JacquesZ » Sam 9 Fév 2019 23:09

Merci!
Maintenant que j'ai compris le truc (enfin je crois), autant en faire profiter le plus grand nombre!

Jacques
Ma chaîne YouTube Tutos sur l’A320 par un Pilote de Ligne: https://youtube.com/channel/UCljftuoKBcgeR-WBgYJpuoA
Avatar de l’utilisateur
JacquesZ
 
Messages: 2848
Inscription: 24/11/10

Re: Interfacer switch Arduino et P3D

Messagede JacquesZ » Dim 10 Fév 2019 00:15

hadrien a écrit:... J'ai lu que pour une arduino, avec le programme arduino, on peut maper une pwm afin d'indiquer les valeurs entre lesquelles on va opérer. Comment fait-on cela sur AirManager ?

Pour répondre complètement répondre à ta question, effectivement la fonction map() d'arduino permet de partir d'une échelle de départ vers une échelle d'arrivée, fonction utile quand on veut convertir un ensemble de valeurs sans se prendre la tête, entres autres de PWM. Mais AM utilise ses propres fonctions pour interfacer une Arduino, et map() n'est pas implémentée.

J'ai checrhé un peu et coup de pot, la doc d'Arduino donne la constitution de la fonction map(), qu'on peut si l'on y tient vraiment, reproduire en lua. in_min,in_max étant les valeurs extrèmes de l'échelle de départ, out_max,out_max les deux valeurs de l'échelle d'arrivée, et x la valeur à convertir d'une échelle à l'autre.
Code: Tout sélectionner
long map(long x, long in_min, long in_max, long out_min, long out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}


Note:
J'ai remarqué que la formule que j'ai proposé (0.05+(Val*0.05/80)) correspond en fait à une version simplifiée de la fonction map()! Yes chouettedoights !

en effet si on prend comme valeurs pour ton cas:
in_min=0
in_max=80
out_min=0.05
out_max=0.1
x= val
et qu'on les met dans la formule utilisée par la fonction map() ci dessus, on obtient
Code: Tout sélectionner
y=(val-0)*(0.1-0.05)/(80-0)+0.05==>y=val*0.05/80+0.05


Note 2:
A noter que dans les cas extrêmes, AM autorise la communication directe avec une Arduino via les fonctions Message Port, qui si l'on programme directement l'Arduino avec l'IDE, permet d'implémenter des fonctions non intégrées dans AM et d'échanger des données dans les deux sens avec l'Arduino.
Mais c'est un tout autre sujet...

Jacques
Ma chaîne YouTube Tutos sur l’A320 par un Pilote de Ligne: https://youtube.com/channel/UCljftuoKBcgeR-WBgYJpuoA
Avatar de l’utilisateur
JacquesZ
 
Messages: 2848
Inscription: 24/11/10

Re: Interfacer switch Arduino et P3D

Messagede hadrien » Dim 10 Fév 2019 10:44

Merci pour ton boulot et pour toutes ces précisions.

Petite info pour ceux qui, comme moi, souhaitent monter programmer des Leds avec AM et Arduino. En réalisant mon overhead, j'ai déjà monté et programmé une petite 50aine de couples de leds, que j'avais ensuite programmés avec la fonction hw_led_add et hw_led_set. Résultat, les leds mettaient du temps à réagir au changement d'état dans le simulateur. Il y avait souvent un délais de réaction allant parfois jusqu'à 10 secondes (voir plus dans certains cas).

Après une recherche sur le forum d'AM, j'ai trouvé un sujet posté par quelqu'un avec le même problème. En fait, si vous n'avez pas besoin de faire varier l'intensité de vos leds, c'est-à-dire, comme moi, seulement avoir besoin d'un état "allumé" et "éteint", vous devez plutôt utiliser la fonction hw_output_add et hw_output_set (le codage pour un digital output). En fait, cette deuxième fonction s'exécute bcp plus rapidement que la première. Je viens de changer tout mon code et "boum", la réaction des leds devient instantanée.

Merci à Jacques de m'avoir envoyé sur le forum d'AM pour un autre problème, sans quoi je ne serais jamais tombé sur cette solution. Sans le savoir, tu m'as encore dépanné d'un soucis ;-)

Hadrien
hadrien
 
Messages: 95
Inscription: 30/10/18
Localisation: Seilles, Belgique

Re: Interfacer switch Arduino et P3D

Messagede JacquesZ » Dim 10 Fév 2019 13:45

Oui pour un Overhead, inutile d’utiliser le PWM pour gérer des LEDs en On/Off.
Le PWM permet de faire varier l’intensité d’une LED (ou de piloter un servo). Avec la fonction digitale hw_output_set(), là on est en mode “tout ou rien” (ON/OFF), forcément c’est plus rapide, ce d’autant que pour pouvoir avoir du PWM sur la quasi totalité des broches de l’Arduino, Air Manager a dû programmer en interne cette fonction, avec des interruptions probablement, ce qui prend du temps quand elles sont nombreuses.

Le PWM n’est disponible en natif sur l’Arduino de mémoire que pour 6 broches seulement, ce sont les broches qui affichent le symbole tilde (~) à côté du numéro de broche, pour les autres c’est implémenté par programmation.

Sur l‘overhead Airbus (j’imagine que pour Boeing c’est la même chose), toutes les LEDs et afficheurs des Korries ont leur luminosité contrôlée par un switch avec deux positions: Dim (la nuit) et Bright(le jour), avec en plus une position temporaire Test qui allume tous les voyants et indicateurs à la fois.

Si on pense à une alimentation des Leds externe à l’Arduino, on peut imaginer une alimentation double avec deux tensions variables une pour pleine intensité, l’autre à basse intensité. Il faudrait commander ces voltages via des transistors je pense, mais Fab saura sûrement expliquer ça mieux.

Jacques
Ma chaîne YouTube Tutos sur l’A320 par un Pilote de Ligne: https://youtube.com/channel/UCljftuoKBcgeR-WBgYJpuoA
Avatar de l’utilisateur
JacquesZ
 
Messages: 2848
Inscription: 24/11/10

PrécédenteSuivante

Retourner vers LUA, Linda, Macros & gauges Air Manager





Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron