Page 21 sur 22

Re: Interfacer Arduino et P3D

MessagePosté: Mer 11 Sep 2019 17:54
de JacquesZ
Tu as bien mis à jour le plugin AM et tout ce qui va avec? Je veux dire le firmware de l’arduino?
https://siminnovations.com/wiki/index.php?title=Arduino#Installer

Jacques

Re: Interfacer Arduino et P3D

MessagePosté: Mer 11 Sep 2019 18:15
de hadrien
J'ai mis à jour le plugin, qui en fait l'était déjà et j'ai réinstallé chaque arduino avec l'intaller.exe fourni sur le wiki de siminnovation. Il y a autre chose à faire ?

Merci pour la formule. Toutefois, mes aiguilles ne tombent pas juste, comme si la progression des servo n'était pas linéaire car quand je rentre manuellement la valeur 0 dans la console AM, l'aiguille va sur 0. Quand je rentre 80, elle va sur le 80. Mais quand je rentre 20 par exemple, elle n'avance que jusque sur le 10... Etrange...

Hadrien

Re: Interfacer Arduino et P3D

MessagePosté: Mer 11 Sep 2019 18:28
de fab
et quand tu rentres 40, l'aiguille va à mi-course ou pas ?

Re: Interfacer Arduino et P3D

MessagePosté: Ven 13 Sep 2019 09:47
de hadrien
Bonjour Fab,

Lorsque je rentre 40, l'aiguille tombe presque juste (elle doit pointer sur +- 38 sur ma jauge au lieu de 40), mais c'est bcp plus proche qu'un 20 qui s'arrête entre 10 et 15 sur la jauge... Tu as une idée de ce que ça peut être ?

Je viens également de tester la formule avec mes servo pour mes jauges de flaps. Je ne parviens pas à avoir une course régulière du moteur. Quand j'enclenche un niveau de flaps, l'aiguille bouge progressivement vers le stade suivant de la jauge mais de manière irrégulière. En fait, elle fait souvent d'abord un grand bond en avant puis finit sa course lentement jusqu'à s'arrêter à la bonne position. Voici le code utilisé pour les flaps :

Code: Tout sélectionner
function R_flaps_callback (Val)
   
   if Val == 0.0   then
   hw_output_pwm_duty_cycle(R_flaps_gauge, 0.01)
   end
   
   if Val > 0.0 and Val <= 1.0   then
   hw_output_pwm_duty_cycle(R_flaps_gauge, (((0.016-0.01)/1)*Val)+0.01)
   -- Flaps 1 = dutycycle 0.016
   end
   
   if Val > 1.0 and Val <= 2.0   then
   hw_output_pwm_duty_cycle(R_flaps_gauge, (((0.0192-0.016)/2)*Val)+0.016)
   -- Flaps 2 = dutycycle 0.0192
   end
   
   if Val > 2.0 and Val <= 5.0   then
   hw_output_pwm_duty_cycle(R_flaps_gauge, (((0.0232-0.0192)/5)*Val)+0.0192)
   -- Flaps 5 = dutycycle 0.0232
   end
   
   if Val > 5.0 and Val <= 10.0   then
   hw_output_pwm_duty_cycle(R_flaps_gauge, (((0.027-0.0232)/10)*Val)+0.0232)
   -- Flaps 10 = dutycycle 0.027
   end
   
   if Val > 10.0 and Val <= 15.0   then
   hw_output_pwm_duty_cycle(R_flaps_gauge, (((0.0313-0.027)/15)*Val)+0.027)
   -- Flaps 15 = dutycycle 0.0313
   end
   
   if Val > 15.0 and Val <= 25.0   then
   hw_output_pwm_duty_cycle(R_flaps_gauge, (((0.0345-0.0313)/25)*Val)+0.0313)
   -- Flaps 25 = dutycycle 0.0345
   end
   
   if Val > 25.0 and Val <= 30.0   then
   hw_output_pwm_duty_cycle(R_flaps_gauge, (((0.038-0.0345)/30)*Val)+0.0345)
   -- Flaps 30 = dutycycle 0.038
   end
   
   if Val > 30.0 and Val <= 40.0   then
   hw_output_pwm_duty_cycle(R_flaps_gauge, (((0.0415-0.038)/40)*Val)+0.038)
   -- Flaps 40 = dutycycle 0.0415
   end
end

R_flaps_gauge = hw_output_pwm_add("Flaps_R", 50, 0.01) -- Arduino mega I D5
fsx_variable_subscribe("PMDG 737NGX:MAIN_TEFlapsNeedle:2", "NUMBER", R_flaps_callback)


Hadrien

Re: Interfacer Arduino et P3D

MessagePosté: Ven 13 Sep 2019 11:01
de fab
Je n'ai pas analysé ton code, mais il faudrait voir si ce n'est pas la communication avec AM et l'arduino qui pose problème, essais un servo avec un arduino seul avec un bout de code test pour servo en t'inspirant de code sur internet comme ici :
https://projetsdiy.fr/piloter-servomoteur-arduino/

ou celui-ci

Code: Tout sélectionner
#define SERVO_PWM 9
#define SERVO_PERIOD (20000)

int pwm = 1500;

void setup() {
  Serial.begin(115200);
  pinMode(SERVO_PWM, OUTPUT);
}

void loop() {
  if (Serial.available()) {
    pwm = Serial.parseInt();
  }
  digitalWrite(SERVO_PWM, HIGH);
  delayMicroseconds(pwm);
  digitalWrite(SERVO_PWM, LOW);
  delayMicroseconds(SERVO_PERIOD - pwm);
}

Re: Interfacer Arduino et P3D

MessagePosté: Ven 13 Sep 2019 11:15
de hadrien
OK Fab merci pour le conseil. Je verrai ça quand j'aurais du temps car je ne connais rien au langage arduino d'origine (j'ai directement attaqué avec AM comme intermédiaire entre mes cartes et P3D) et n'étant pas informaticien, ça va me demander pas mal de temps et d'énergie, ce qu'on a peu avec un petit bout de 2 ans...

Hadrien

Re: Interfacer Arduino et P3D

MessagePosté: Ven 13 Sep 2019 13:08
de tabar57
Eh oui Hadrien, le problème c'est le temps et c'est vrai que notre passion est terriblement chronophage.
Si je peux me permettre un conseil de Papi, privilégie ton bout de chou ton simu ne grandira jamais aussi vite que lui

Bernard

Re: Interfacer Arduino et P3D

MessagePosté: Ven 20 Sep 2019 10:35
de hadrien
Bonjour à tous,

J'ai une nouvelle question, de programmation sur AM cette fois. Je vous explique mon soucis. Lorsque j'ai commandé mon kit EFIS, le fournisseur m'a fourni des boutons poussoirs avec, sauf que ce sont des momentané et non des maintenus (ce sont les petit carré gris, bouton noir et 4 pattes mais bipôles). Je voudrais donc savoir s'il y a une entourloupe logicielle pour en faire des maintenus, car la rangée de poussoirs en bas de l'EFIS fonctionne comme cela. Par exemple, une pression sur "TERR" active la vue du relief, et une nouvelle pression la déactive. Or, dans mon montage, pour garder la fonction "TERR" active, je suis obligé de maintenir le bouton appuyé. Y aurait-il une solution logicielle qui consisterait à dir à AM que quand le bouton renvoi 1, il regarde la position précédente et lance l'inverse. Ainsi, s'il reçoit 1 et que le "TERR" est inactif, alors il l'active. Et si jamais il reçoit 1 du bouton et que "TERR" est actif,alors il le désactive.

J'ai déjà un peu réfléchi à ça mais je parviens pas à demander à AM de lire le statut d'un event. J'arrive à demander à AM d'écrire une nouvelle valeur pour un event mais pas en lire une.

Merci pour votre aide,

Hadrien

Re: Interfacer Arduino et P3D

MessagePosté: Ven 20 Sep 2019 11:30
de tabar57
Bonjour Hadrien,

AM ne lit pas le statut d'un event, il faut comprendre que c'est un event qui déclenche quelque chose (une fonction ) et cette fonction peut faire ce qu'on veut, lire , écrire, faire un calcul, ouvrir ou fermer un fichier etc.
Donc dans ton cas , un event va guetter l'appui sur le bouton et lancer une fonction qui basculera une variable d'un état On à un état Off à chaque appui.
Je ne me rappelle plus si tu utilise aussi Sioc ?

Voilà ....

Bernard

Re: Interfacer Arduino et P3D

MessagePosté: Ven 20 Sep 2019 12:13
de JacquesZ
hadrien a écrit:Bonjour à tous,

J'ai une nouvelle question, de programmation sur AM cette fois. Je vous explique mon soucis. Lorsque j'ai commandé mon kit EFIS, le fournisseur m'a fourni des boutons poussoirs avec, sauf que ce sont des momentané et non des maintenus (ce sont les petit carré gris, bouton noir et 4 pattes mais bipôles). Je voudrais donc savoir s'il y a une entourloupe logicielle pour en faire des maintenus, car la rangée de poussoirs en bas de l'EFIS fonctionne comme cela. Par exemple, une pression sur "TERR" active la vue du relief, et une nouvelle pression la déactive. Or, dans mon montage, pour garder la fonction "TERR" active, je suis obligé de maintenir le bouton appuyé. Y aurait-il une solution logicielle qui consisterait à dir à AM que quand le bouton renvoi 1, il regarde la position précédente et lance l'inverse. Ainsi, s'il reçoit 1 et que le "TERR" est inactif, alors il l'active. Et si jamais il reçoit 1 du bouton et que "TERR" est actif,alors il le désactive.

J'ai déjà un peu réfléchi à ça mais je parviens pas à demander à AM de lire le statut d'un event. J'arrive à demander à AM d'écrire une nouvelle valeur pour un event mais pas en lire une.

Merci pour votre aide,

Hadrien

Ben à priori, il te suffit de créer des variables booléennes à toi qui vont conserver le statut de chaque bouton. Exemple:

Code: Tout sélectionner
terr_switch_active=false

Pour le statut initial, il te faut consulter le dataref(et pas l’event) correspondant et le mettre a false ou true en fonction de l’etat du simu.

Ensuite lorsque tu capte un event button pressed(), dans ta routine de traitement tu utilisera les propriétés des booléens.
L’avantage d’un booléen c’est que c’est très facile à inverser avec la fonction not: not(true)=false et not (false)=true!
Code: Tout sélectionner
terr_switch_active=not terr_switch_active


Et voilà la variable est automatiquement inversée et ensuite tu gères en fonction de son nouvel état

Code: Tout sélectionner
if terr_switch_active==true then
...
else
..
end


J’espere que c’est clair

Jacques