Page 3 sur 5

Re: communication script lua --> Arduino Mega

MessagePosté: Ven 20 Jan 2017 15:13
de fab
Je n'ai pas rêver :
http://www.aircockpit.com/viewtopic.php?f=146&t=5711#p69221 il y a :
Code: Tout sélectionner
/////// function for relay board
void RelayBoard (int RelayNber,int State)
{
if(State == 0)//off
{
digitalWrite(RelayPin[(RelayNber-39)],LogicOFF);// Turns Relay --> Off
}
if(State == 1)//On
{
digitalWrite(RelayPin[(RelayNber-39)],LogicON); // Turns Relays -->On
}
}
/////////


puis ici : http://www.aircockpit.com/viewtopic.php?f=146&t=5711&start=10#p69239 il y a :
Code: Tout sélectionner
/////// function for relay board
void RelayBoard (int RelayNber,int State)
{
if(State == 0)//off
{
digitalWrite(RelayPin[(RelayNber-38)],LogicOFF);// Turns Relay --> Off
}
if(State == 1)//On
{
digitalWrite(RelayPin[(RelayNber-38)],LogicON); // Turns Relays -->On
}
}
/////////



Je suis perdu aussi furieuxfumée

Je crois que je mélange les 2 codes ecroulerire

Si tu pouvais publier les 2 codes que tu essaies dans une même réponses ... avec le bouton "code"pour chacun des extraits ce serait mieux !

Re: communication script lua --> Arduino Mega

MessagePosté: Ven 20 Jan 2017 17:00
de JacquesZ
A320 hérétique a écrit:Salut Jacques,

comment ça marche coté compil avec LUA ? il y a un rapport de compil ? car, en effet, dans d'autres langages ,il faut déclarer la fonction avant de s'en servir, sinon erreur de compil ... en tous les cas, ça m'a l'air d'être un gros morceau, ce LUA ?!

Coté Arduino, je ne te suis pas dans ton hypothèse concernant la virgule entre 2 séquences, elle ne gène pas, elle sera juste ignorée par le test if Marker "= R"

ps : ne perdons pas de vue que le script et le sketch sont réputés fonctionner, c'est pour ça que j'incline vers une erreur de paramétrage plutôt qu'un pb de code ; j'attends la vérif du port COM.

Lua pour autant que je sache n'est pas un langage compilé, mais interprété puis compilé à la volée(just in time). Donc pas de message lié à la compilation, juste le message avec la Ligne où s'est produite l'erreur
Il y a peut être une trace dans les logs de Fsuipc, à voir.

Sur Lua pour Air Manager, une fonction doit être déclarée AVANT son utilisation, de ce fait même (compilation à la volée).
Avec un vrai langage compilé il n'y a pas ce soucis car le compilateur lit l'intégralité du code en deux ou 3 passes généralement avant de produire le code exécutable en assembleur ou en pseudo code (pseudo compilé) pour certains langages Microsoft.

Pour le côté Arduino, je suis d'accord avec toi, d'ailleurs j'ai édité ensuite mon message pour dire que cette piste n'était pas la bonne puisque il y avait bouclage sur un serial.read() tant que la lettre R n'était pas trouvée.
Ce qui me gênait c'est que le signal de fin de Ligne n'est pas \0 comme d'habitude, mais une virgule!
Comme je n'ai pas sous la main mon PC pour tester, depuis l'iPhone c'est pas évident;-)

@Fab, bien vu, je n'ai pas non plus compris pourquoi ce micmac avec les numéros de relais qui passent de 38 à 53 vers 1 à 16, c'est semble t'il pour un numéro de carte.
Je suggère qu'on crée un script de test simplifié avec un seul relais pour voir si ça fonctionne avec un seul relais en ouverture/fermeture

JP tu semble t'être inspiré d'un script trouvé sur un phaurome, tu peux nous envoyer le lien, ça permettrait d'avancer?

Jacques

Re: communication script lua --> Arduino Mega

MessagePosté: Ven 20 Jan 2017 19:46
de mirageiii2009
Bonsoir,

Oui j'ai tout à apprendre y compris sur les balises en haut des message :)

Je travaille parallèlement avec un ami sur les 2 fichiers pour essayer de trouver une solution. Quelques progrès ont été faits mais ça n'est pas concluant. Excusez-moi pour les variations de fichiers.

Voici les fichier .ino et .lua à jour :

Code: Tout sélectionner
//-------- Controlling  x relays receiving data from a LUA script thru serial  ----------//
//--------- JP jan 2016 ------------------------------------------------------------//


int RelayNber,State;
int Dx ;// delay if needed
int RelayPin []= {53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38}
;//
int Relnber =16; //How many relays on this board ,here 16 relays - not all used
int LogicON   = LOW;
int LogicOFF  = HIGH;
int RelayState ;
char n,Marker;

////Note : Format of data if console to be used -->  R1,1 (relay1 On)    R1,0 (relay1 Off)   R2,1 (relay2 On) R2,0 (relay2 Off)///

void setup()
{
  Serial.begin(9600);//COM speed(baud rate)
  for(n=0;n<Relnber;n++ )
  {
    pinMode(RelayPin [n], OUTPUT);
  }
}

void loop()
{//loop
  Dx=0;//delay is set to zero millisec
  if(Serial.available()>0)
  {//sa
    Marker = Serial.read();//read  Marker  for category
    if( Marker == 'R' )
    {
      RelayNber = Serial.parseInt();//get relay nber
      State = Serial.parseInt(); // get numeric character BEFORE the comma
      RelayBoard (RelayNber,State);// call function
    }
  }//sa

} //loop

/////// function for relay board
void RelayBoard (int RelayNber,int State)
{
  if(State == 0)//off
  {
    digitalWrite(RelayPin[(RelayNber-43)],LogicOFF);// Turns Relay  --> Off
  }
  if(State == 1)//On
  {
    digitalWrite(RelayPin[(RelayNber-43)],LogicON); // Turns Relays  -->On
  }
}
/////////



et lua :

Code: Tout sélectionner
--------------- LUA Script Program for FSX/Arduino communication ---------------
---------------------------- Switch and relays ---------------------------------
-----------------------------16 Janvier 2017 -----------------------------------                               
------------------ File Name : ADHEjp2.lua ----------------------------
------------------ Information :CARTE ADHEMAR - COM 19-----------
 
 
speed = 9600    --Communication setting at 9600 baud
handshake = 0
serial_wait = 100

dev1 = com.open("COM19", speed, handshake)--RelayBoard N°1   <-----Change COM nber if needed

--dev1 = com.open("CNCA1", speed, handshake)--RelayBoard N°1   <-----Change COM nber if needed
--dev2 = com.open("CNCA0", speed, handshake)--SwitchBoard    <-----Change COM nber if needed

if dev1 == 0  then
   ipc.display("Error in opening device(s) port(s)")
   ipc.sleep(5000)
   ipc.exit()
end

 ipc.display("Connected to COM xx ")--Display message
 ipc.setdisplay(5,50,280,400) --Size of display window (initx,inity,width,length)



while 1 do

----Readings from P3D

Batteryvoltage     =ipc.readDBL(0x2834)-- 64 bit
MasterBattSwitch   =ipc.readSD (0x281C)-- 32 bit
GeneratorSwitch    =ipc.readSD (0x3B78)-- 32 bit
EngineOilpressure  =ipc.readUW (0x08BA)-- 16 bit
BpCarPressure   =ipc.readSD (0x08F8)-- 32 bit
AutoC   =ipc.readSD (0x07BC)-- 32 bit
Hyd1   =ipc.readSD (0x08D8)-- 32 bit
KiasRaw   =ipc.readSD (0x02BC)-- 32 bit
AirBrakes   =ipc.readSD (0x0BD4)-- 32 bit
RpmRaw   =ipc.readUW (0x0898)-- 16 bit
GenAlternBusVolt   =ipc.readDBL(0x2880)-- 64 bit
GroundFlight       =ipc.readUW(0x0366)-- 16 bit

GearCtl            =ipc.readSD(0x0BE8)-- 32 bit
LhGear             =ipc.readSD(0x0BF4)-- 32 bit
RhGear             =ipc.readSD(0x0BF0)-- 32 bit
NoseGear           =ipc.readSD(0x0BEC)-- 32 bit

RhExtRaw   =ipc.readSD (0x1254)-- 32 bit
CenTankARaw   =ipc.readSD (0x0B74)-- 32 bit
CenTankBRaw   =ipc.readSD (0x1244)-- 32 bit
CenTankCRaw   =ipc.readSD (0x124C)-- 32 bit
LhExtRaw   =ipc.readSD (0x125C)-- 32 bit
LhTankRaw   =ipc.readSD (0x0B7C)-- 32 bit
RhTankRaw   =ipc.readSD (0x0B94)-- 32 bit
TasRaw       =ipc.readUW (0x11D0)-- 16 bit
ThrotPos   =ipc.readUW (0x088C)-- 16 bit -- Throtlle position
TrueAirSpeedRaw    =ipc.readSD (0x02B8)-- 32 bit -- TAS
TotalAirTemp       =ipc.readSW (0x11D0)-- 16 bit -- TAT
OutsideAirTempRaw  =ipc.readSW (0x0E8C)-- 16 bit -- OAT
FuelTotQtyLbs      =ipc.readSD (0x126C)-- 32 bit
MachFsxRaw         =ipc.readUW (0x11C6)-- 16 bit -- Mach number FSX
EngineFailureFire  =ipc.readSD (0x3AE0)-- 32 bit -- When Engine Falure - FIRE light comes ON


--Convert-

Rpmpercent = math.floor(((RpmRaw * 100) / 16384)+ .5)
Kias = math.floor(( KiasRaw /128)+ .5)
Tas = math.floor ((TasRaw /128) + .5)
Hyd1 = Hyd1/4 --appears to be 4*psi said Peter Dowson !! so divided by 4 to get real psi
RhExt       =  math.floor((RhExtRaw*100       /( 128 * 65536))+.5) --Get % ->0% = empty
CenTankA    =  math.floor((CenTankARaw*100    /( 128 * 65536))+.5) --Get % ->0% = empty
 
CenTankB =  math.floor((CenTankBRaw*100    /( 128 * 65536))+.5)
 
CenTankC    =  math.floor((CenTankCRaw*100    /( 128 * 65536))+.5)
 
LhExt       =  math.floor((LhExtRaw*100       /( 128 * 65536))+.5)
 
LhTank      =  math.floor((LhTankRaw*100      /( 128 * 65536))+.5)
 
RhTank      =  math.floor((RhTankRaw*100
 /( 128 * 65536))+.5)
TatCelsius  =  math.floor((TotalAirTemp -32) * (5/9) / 142.8)
TatFsx      =  math.floor( (TatCelsius * 256)+0.5)
TrueAirSpeed = math.floor ((TrueAirSpeedRaw / 128) +.5)
OutsideAirTemp = math.floor ((OutsideAirTempRaw / 256) +.5)
SpeedOfSound =((math.sqrt (OutsideAirTemp + 273))* 39)
FuelTotQtyLiter =  math.floor((FuelTotQtyLbs /1.77 )+.5)
MachFsxAjusted = ((math.floor ((MachFsxRaw / 20480)*100)+ .5)/100)


--------------- Relayssection---------------

---- Relay 43---ADHEMAR - LO SPEED #6

   if GearCtl == 16383 and Kias <= 195 then LoAdhemLight = 1 end
   if GearCtl == 16383 and Kias > 195 then LoAdhemLight = 0 end
 
   if GearCtl == 0 and Kias <= 184 then LoAdhemLight = 1 end
   if GearCtl == 0 and Kias > 184 then LoAdhemLight = 0 end   

Dev=dev1 Board="R" RelValue=LoAdhemLight
com.write(Dev,Board)
com.write(Dev,43)
com.write(Dev,",")
com.write(Dev,RelValue)
com.write(Dev,",")


---- Relay 44---ADHEMAR - MID SPEED #7

   if GroundFlight == 1 then MidAdhemLight = 0 end
   
   if GearCtl == 16383 and Kias >= 168 and Kias <= 250 then MidAdhemLight = 1 end
   if GearCtl == 16383 and Kias > 250 then MidAdhemLight = 0 end
   if GearCtl == 16383 and Kias < 168 then MidAdhemLight = 0 end
   
   if GearCtl == 0 and Kias >= 158 and Kias <= 230 then MidAdhemLight = 1 end
   if GearCtl == 0 and Kias > 230 then MidAdhemLight = 0 end
   if GearCtl == 0 and Kias < 158 then MidAdhemLight = 0 end

Dev=dev1 Board="R" RelValue=MidAdhemLight
com.write(Dev,Board)
com.write(Dev,44)
com.write(Dev,",")
com.write(Dev,RelValue)
com.write(Dev,",")

---- Relay 45---ADHEMAR - HI SPEED #8

   if GroundFlight == 1 then HiAdhemLight = 0 end
   
   if GearCtl == 16383 and Kias >= 222 and Kias <= 275 then HiAdhemLight = 1 end
   if GearCtl == 16383 and Kias > 275 then HiAdhemLight = 0 end
   if GearCtl == 16383 and Kias < 222 then HiAdhemLight = 0 end
   
   if GearCtl == 0 and Kias >= 205 and Kias <= 245 then HiAdhemLight = 1 end
   if GearCtl == 0 and Kias > 245 then HiAdhemLight = 0 end
   if GearCtl == 0 and Kias < 205 then HiAdhemLight = 0 end

Dev=dev1 Board="R" RelValue=HiAdhemLight
com.write(Dev,Board)
com.write(Dev,45)
com.write(Dev,",")
com.write(Dev,RelValue)
com.write(Dev,",")

---- Relay 46---LOI SOL/VOL

      if GroundFlight == 0 and GearCtl == 16383 then Solenoid = 1 else Solenoid = 0 end
Dev=dev1 Board="R" RelValue=Solenoid
com.write(Dev,Board)
com.write(Dev,46)
com.write(Dev,",")
com.write(Dev,RelValue)
com.write(Dev,",")


end


Voici la vidéo du lancement du fichier ADHEjp2.lua sous P3D. La vidéo est parlante.



(L'intégration ne fonctionne pas mais copie coller fonctionne)

@JacquesZ : J'ai un ami simmer (Pseudo Yveca qui postait ici) qui me donne un sérieux coup de main pour les scripts. Il consulte encore ce forum et pourra apporter plus de précisions que moi! Certains changements sur le lua sont dûs à Yveca (Jacques) car il teste les fichiers de son côté.

Re: communication script lua --> Arduino Mega

MessagePosté: Ven 20 Jan 2017 20:13
de fab
Impec !

Il y a un truc qui me perturbe :
Code: Tout sélectionner
RelayPin[(RelayNber-43)]


RelayPin[] est un tableau de 16 éléments qui contiennent les numéros de pin (de 53 à 38)
RelayPin[0]=53
RelayPin[1]=52
RelayPin[2]=51
---
RelayPin[15]=38


Donc RelayNber-43 doit fournir un résultat de 0 à 15

Re: communication script lua --> Arduino Mega

MessagePosté: Ven 20 Jan 2017 20:14
de A320 hérétique
@Jacques : merçi ! si donc interprété, y a-t-il un mode ligne de commande, ça permettrait de se faire très vite une idée ?

@Mirage :
Bon point, la com est bien établie.
Pour reprendre la suggestion de Jacques, essaies ce script, il devrait faire clignoter le relai 43 ttes les secondes ; si OK, le pb se situerait au niveau de la com avec P3D, on verra après.

Michel
ps : je ne connais pas LUA, donc peut-être une erreur très grossière, mais je ne pense pas ... c'est de la recopie


Code: Tout sélectionner
--------------- LUA Script Program for FSX/Arduino communication ---------------
---------------------------- Switch and relays ---------------------------------


-- Test clignotement relay 43 --
 
 
speed = 9600    --Communication setting at 9600 baud
handshake = 0
serial_wait = 100

dev1 = com.open("COM19", speed, handshake)--RelayBoard N°1   <-----Change COM nber if needed

--dev1 = com.open("CNCA1", speed, handshake)--RelayBoard N°1   <-----Change COM nber if needed
--dev2 = com.open("CNCA0", speed, handshake)--SwitchBoard    <-----Change COM nber if needed

if dev1 == 0  then
   ipc.display("Error in opening device(s) port(s)")
   ipc.sleep(5000)
   ipc.exit()
end

 ipc.display("Connected to COM xx ")--Display message
 ipc.setdisplay(5,50,280,400) --Size of display window (initx,inity,width,length)



while 1 do




--------------- Relayssection---------------

---- Relay 43---ADHEMAR -
 

Dev=dev1 Board="R" RelValue=0
com.write(Dev,Board)
com.write(Dev,43)
com.write(Dev,",")
com.write(Dev,RelValue)
com.write(Dev,",")

wait(1)

Dev=dev1 Board="R" RelValue=1
com.write(Dev,Board)
com.write(Dev,43)
com.write(Dev,",")
com.write(Dev,RelValue)
com.write(Dev,",")

wait(1)

end

Re: communication script lua --> Arduino Mega

MessagePosté: Ven 20 Jan 2017 20:44
de JacquesZ
Lua n'est pas un langage interprété en principe.
Je pense que la version de Lua installée sur FSUIPC est un compilateur "Just in Time", probablement crée à la base en C. Il ne compile pas à l'avance mais en temps réel au moment de l'exécution.

C'est un pseudo-interpréteur, au lancement il lit chaque ligne de code à l'avancement et la compile dans la foulée pour accélérer l'exécution. Pour une boucle par exemple, le code sera quelques msec plus lent à la première passe le temps de l'analyse et de sa transformation, mais comme le code compilé est ensuite stocké en mémoire, c'est lui qui sera exécuté.
Il n'y a pas de possibilité de modifier en temps réel des variables via une ligne de commande sauf s'il ya une console de débogage.
Ce genre de langage est très rapide, bien plus qu'un interpréteur simple qui retraduit à chaque itération l'ensemble du code.

Je ne suis pas pour autant spécialiste du sujet, et ne pourrait pas t'en dire beaucoup plus, si ce n'est que pour la version FSUIPC il n'y a pas de possibilité de ligne de commande pour envoyer des commandes, pour autant que je sache.

On peut demander à FSUIPC d'afficher la console de debug via l'onglet Logging de FSUIPC en cochant "Send to Console Window"

Jacques

Re: communication script lua --> Arduino Mega

MessagePosté: Sam 21 Jan 2017 10:48
de JacquesZ
@JP:
Pour le lien YouTube, la balise [Youtube] n'existe pas dans cette version de PhpBB (le logiciel de gestion/affichage du forum).

Par contre les balises [url][\url] accessibles via le bouton "URL" au dessus permettent de transformer une adresse quelconque (y compris YouTube) en lien cliquable. Tu sélectionnes le lien au complet et tu cliques sur URL, le lien sera encadré par les balises [url] et [\\url] et ça donne ça:

https://youtu.be/SqZhFECr8pk


Jacques

Re: communication script lua --> Arduino Mega

MessagePosté: Sam 21 Jan 2017 11:37
de A320 hérétique
Merci Jacques pour ces précisions, il faudra que j'approfondisse ça quand j'aurai un moment ; pas eu besoin jusqu'à présent, pour mon simu, A320 Fmgs et Sioc ont suffi ...
Michel

Re: communication script lua --> Arduino Mega

MessagePosté: Sam 21 Jan 2017 12:40
de fab
@JP et jacques ...

La balise Youtube fonctionne il faut enlever le "S" de "https"
"https://youtu.be/SqZhFECr8pk"
devient
"http://youtu.be/SqZhFECr8pk"

ce qui donne



Fabien

Re: communication script lua --> Arduino Mega

MessagePosté: Sam 21 Jan 2017 14:23
de mirageiii2009
fab a écrit:@JP et jacques ...

La balise Youtube fonctionne il faut enlever le "S" de "https"
"https://youtu.be/SqZhFECr8pk"
devient
"http://youtu.be/SqZhFECr8pk"

ce qui donne



Fabien

Merci Jacques et Fab! C'est corrigé sur mon message et appris pour le futur!