Page 13 sur 22

Re: Interfacer Arduino et P3D

MessagePosté: Jeu 27 Juin 2019 22:42
de JacquesZ
Il faut remplacer dans ton code le hw_dial_add() par celui que je t’ai indiqué, en rajoutant les paramètres:

Code: Tout sélectionner
———————————-
— paramètres encodeurs
———————————-
type="TYPE_2_DETENT_PER_PULSE"
acceleration=20
debounce=4
———————————-

(Reste du code)



course_dialchange = hw_dial_add("ARDUINO_MEGA2560_G_D38", "ARDUINO_MEGA2560_G_D39", type,acceleration,debounce,course_dialchange_callback)


Si ça ne marche pas essaies de remplacer :
type="TYPE_2_DETENT_PER_PULSE" par
"TYPE_1_DETENT_PER_PULSE" ou "TYPE_4_DETENT_PER_PULSE".
L’acceleration est une affaire de goût. Commences par 20 et descends ou montes la valeur en fonction de ce que tu préfères.
Le temps d’anti-rebond (debounce) par défaut est de 4ms, peut être augmente légèrement si les encodeurs sont de mauvaise qualité

Jacques

Re: Interfacer Arduino et P3D

MessagePosté: Jeu 27 Juin 2019 22:43
de JacquesZ
Bon tu as été plus rapide que moi sur ce coup-ci ecroulerire

Ceci dit, une valeur de 1 pour l’accelération et de 10msec pour l’antirebond me parait peut être à affiner, je dirais plutôt 10 et 4

Jacques

Re: Interfacer Arduino et P3D

MessagePosté: Ven 28 Juin 2019 09:05
de JacquesZ
hadrien a écrit:Tout d'abord, félicitations Jacques !!!

Merci!
hadrien a écrit:Concernant mes afficheurs digitaux, problème réglé. J'avais simplement câblé sur la mauvaise série de broches du max7219. Il y a en effet 5 petits "trous" sur les côtés pour faire les connexions. Je pensais que c'était les mêmes. J'avais testé sur celui de gauche et branché au final sur celui de droite. Mon erreur était là. J'ai inversé, et tout fonctionne nickel.
Hadrien

Pour le MAX7219, les circuits tout prêts peuvent être chaînés entre eux en SPI pour économiser des broches sur l’Arduino. Les 5 broches de gauche doivent sûrement servir à ça.

Le côté à brancher sur l’Arduino est celui où une des broches est marquée DIN (Digital Input)
De l’autre côté du circuit, la broche DOUT(Digital Output) sert au chaînage, elle doit être raccordée à la broche DIN du circuit suivant.

Avec AM, le nombre maximum de circuits qui peuvent être chaînés est de 8 si ma mémoire est bonne, il y a ensuite un paramètre dans la fonction d’affichage pour indiquer quel circuit on adresse (1-8 ou 0-7, ne me souviens plus).

Jacques

Re: Interfacer Arduino et P3D

MessagePosté: Mar 2 Juil 2019 22:57
de hadrien
Bonsoir à tous,

Je poste ce message car je sèche un peu sur la programmation de mes servo moteurs pour ma flaps gauge. Voici mon code actuel, je vous explique ensuite mon soucis.

Code: Tout sélectionner
L_flaps_gauge = hw_output_pwm_add("ARDUINO_MEGA2560_H_D6", 50, 0.075)

function L_flaps_callback (Val)
   
   hw_output_pwm_duty_cycle(L_flaps_gauge, 0.05+(Val*0.05/40))

end

fsx_variable_subscribe("PMDG 737NGX:MAIN_TEFlapsNeedle:1", "NUMBER", L_flaps_callback)


Mon soucis est que la progression sur la jauge n'est pas continue. En effet, à chaque enclenchement de crans de volets, P3D renvoie dans AM des valeurs de 0.0 à 1.0 (pour le volet 1), de 1.0 à 2.0 (pour le volet 2), de 2.0 à 5.0 (pour le volet 5), etc... Toutefois, sur la jauge, l'écart entre les indicateurs des flaps est égal. Ce qui signifie qu'un duty cycle constant comme dans ce code ne permet pas que la jauge tombe "sur les indicateurs" des flaps.

J'ai donc testé le code suivant :

Code: Tout sélectionner
function R_flaps_callback (Val)

   print(Val)
   
   if Val == 0.0   then
   hw_output_pwm_duty_cycle(R_flaps_gauge, 0.0000)
   end
   
   if Val == 1.0   then
   hw_output_pwm_duty_cycle(R_flaps_gauge, 0.00015)
   end
end

R_flaps_gauge = hw_output_pwm_add("ARDUINO_MEGA2560_H_D5", 50, 0.075)

fsx_variable_subscribe("PMDG 737NGX:MAIN_TEFlapsNeedle:2", "NUMBER", R_flaps_callback)


Alors, l'indicateur de flaps se déplace bien avec ce code, mais ça a l'air très aléatoire. En effet, un dutycycle imposé de 0.0002 va moins loin qu'un dutycycle de 0.00015. De plus, le premier if qui a pour but de ramener le pointeur à 0 en cas de valeur de flaps de 0.0 ne fonctionne pas non plus.

Je suis donc un peu à court d'idées. Certains d'entre vous ont-ils déjà programmé des jauges "non linéaires" comme celle des volets ?

Merci pour vos éclaircissements,

Hadrien

Re: Interfacer Arduino et P3D

MessagePosté: Mer 3 Juil 2019 08:17
de fab
C'est en effet un petit casse tête murrouge
Et il te faudra quelques lignes de code peurefrayé

Il te faudra relever la valeur que prend le servo à chaque repère, puis les faire correspondre aux valeurs linéaires

Regarde par ici pour d'inspirer du code SIOC utilisé : https://www.opencockpits.com/uploads/manual_gauge_flaps_eng.pdf

ou de cette vidéo pour la programmation des jauges non linéraire :


Fabien

Re: Interfacer Arduino et P3D

MessagePosté: Mer 3 Juil 2019 09:14
de hadrien
Bonjour Fab,

Merci pour ton aide. Mais je comprends pas tout. Du coup, je vais simplifier mon code et simplement demander à mon indicateur de faire des "sauts de puces" à chaque niveau de flaps, plutôt que d'avoir une progression continue. C'était déjà mon idée hier. Mais après réflexion et surtout lecture du post de Jacques en anglais sur le forum de Air Manager, j'ai trouvé mon problème. En fait, le duty cycle que j'indiquais n'était pas correct. Pour tourner dans le sens horloger, mon duty cylcle doit impérativement se trouver entre 0.075 qui est le point médian, et 0.115 qui est le développement maximum. J'ai donc commencé à reprogrammer en partant d'un dutycycle de 0.075 pour les flaps up et de 0.082 pour le flap 1, et ça marche nickel. Il n'y a plus qu'à comme on dit...

Et encore merci à Jacques qui, sans le savoir, aura encore réglé mon problème ;-)

Hadrien

Re: Interfacer Arduino et P3D

MessagePosté: Mer 3 Juil 2019 11:17
de fab
Pas de problème, c'est toi le patron ! sourirebis

Re: Interfacer Arduino et P3D

MessagePosté: Mer 3 Juil 2019 11:56
de hadrien
Je regarderai sans doute à ça à l'avenir, d'autant plus que je pense que j'ai fait le gros du travail de repérage des intervalles avec mon système. Je posterai mon code final pour que vous en ayez un aperçu.

Hadrien

Re: Interfacer Arduino et P3D

MessagePosté: Mer 3 Juil 2019 13:43
de JacquesZ
Merci Hadrien, mais pour te dire, je ne me rappelais même plus de ce Post! lunettesnoires

Pour ton indicateur de flaps, le premier problème que je vois est qu'un servo type G90 (au fait tu n'as pas précisé de quel servo il s'agissait) ne tourne que sur un secteur de +/-90° soit 170/180°. Or ton indicateur de flaps semble plutôt être dans les 270° voire plus.
Il te faudra donc un rapport d'engrenages de 3/2 si je ne me trompe pas (18 dents/12 dents par exemple) pour démultiplier la rotation de ton aiguille sur 270 degrés. Il faut faire une cage d'engrenage, tu peux t'inspirer du travail de notre ami ici http://aircockpit.com/viewtopic.php?f=149&t=6362&start=10

Une fois ce "petit" problème mécanique réglé, reste la programmation pour obtenir un déplacement de l'aiguille au bon endroit.
J'ai regardé, l'indicateur est (à peu près) linéaire soit un déplacement tous les 30° par cran de volets.
Image

Image
Le servo va d'une position complètement à gauche (Duty Cycle de 0.05) à complètement à droite (Duty cycle: 0.1) soit un écart de 0.05 sur toute l'étendue du déplacement

Donc je te conseille tout d'abord d'envoyer l'aiguille du servo complètement à gauche (Duty Cycle 0.05), puis de rajouter x/9 de 0.05 à cette valeur minimale pour passer d'un cran à l'autre (x étant le cran de volets en valeur 0-8).

Il faudra pour cela convertir les positions de volets FSX données en degrés vers des "crans" linéaires de 0 à 8 avec des tests en cascade if...elseif...

je n'ai pas de servo ni d'Arduino sous la main pour essayer, mais ca devrait fonctionner.

Jacques

Re: Interfacer Arduino et P3D

MessagePosté: Mer 3 Juil 2019 14:53
de hadrien
Bonjour Jacques,

Je viens seulement de voir ton message. J'avais en attendant pondu un code qui fonctionnait en sauts de puce, le voici :

Code: Tout sélectionner
function R_flaps_callback (Val)
   
   if Val == 0.0   then
   hw_output_pwm_duty_cycle(R_flaps_gauge, 0.067)
   end
   
   if Val == 1.0   then
   hw_output_pwm_duty_cycle(R_flaps_gauge, 0.074)
   end
   
   if Val == 2.0   then
   hw_output_pwm_duty_cycle(R_flaps_gauge, 0.081)
   end
   
   if Val == 5.0   then
   hw_output_pwm_duty_cycle(R_flaps_gauge, 0.089)
   end
   
   if Val == 10.0   then
   hw_output_pwm_duty_cycle(R_flaps_gauge, 0.097)
   end
   
   if Val == 15.0   then
   hw_output_pwm_duty_cycle(R_flaps_gauge, 0.104)
   end
   
   if Val == 25.0   then
   hw_output_pwm_duty_cycle(R_flaps_gauge, 0.111)
   end
   
   if Val == 30.0   then
   hw_output_pwm_duty_cycle(R_flaps_gauge, 0.117)
   end
   
   if Val == 40.0   then
   hw_output_pwm_duty_cycle(R_flaps_gauge, 0.125)
   end
end

R_flaps_gauge = hw_output_pwm_add("ARDUINO_MEGA2560_H_D5", 50, 0.075)
fsx_variable_subscribe("PMDG 737NGX:MAIN_TEFlapsNeedle:2", "NUMBER", R_flaps_callback)


Concernant la jauge de flaps, c'est une jauge que j'ai commandée toute faite et montée sur cette page : https://www.cockpitsimparts.co.uk/gauges/214-b737-flaps-gauge-dual-needle.html

Hadrien