communication script lua --> Arduino Mega

Tout sur les cartes et la programmation des modules ARDUINO

Re: communication script lua --> Arduino Mega

Messagede JacquesZ » Jeu 19 Jan 2017 23:09

Ah oui, tu as raison Michel, Serial.ParseInt() saute effectivement automatiquement les caractères non numériques, j'ai appris quelquechose! Pas besoin de rajouter de serial.read() dans ce cas.

Je vais te laisser continuer de débogguer le code de notre ami, tu es bien plus calé que moi!

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: communication script lua --> Arduino Mega

Messagede mirageiii2009 » Ven 20 Jan 2017 00:03

Bonsoir,
Merci pour vos réponses intéressantes qui me dépassent un peu, vues mes faibles connaissances..

Voici les fichiers lua (adhemar.lua), .ino et le message de plantage sur le FSUIPC4.log :

=======================================================================================================
=======================================================================================================
=======================================================================================================
=======================================================================================================


--------------- LUA Script Program for FSX/Arduino communication ---------------
---------------------------- Switch and relays ---------------------------------
-----------------------------16 Janvier 2017 -----------------------------------
------------------ File Name : ADHEMAR.lua ----------------------------
------------------ Information :CARTE ADHEMAR - COM 19-----------


speed = 115200 --Communication setting at 115200 baud
handshake = 0
serial_wait = 100

dev1 = com.open("COM19", speed, handshake)--RelayBoard N°1

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

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

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


----Readings from simulator

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)

-- 1ERE CARTE (ADHEMAR SYSTEM)

Close = 0

---- Relay 38 #1

SendToRelay(dev1,"R", "38", Close )-- call function and set relay

---- Relay 39 #2

SendToRelay(dev1,"R", "39", Close )-- call function and set relay

---- Relay 40 #3

SendToRelay(dev1,"R", "40", Close )-- call function and set relay

---- Relay 41 #4

SendToRelay(dev1,"R", "41", Close )-- call function and set relay

---- Relay 42 #5

SendToRelay(dev1,"R", "42", Close )-- call function and set relay

---- 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

SendToRelay(dev1,"R", "43" , LoAdhemLight )-- call function and set relay

---- 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

SendToRelay(dev1,"R", "44" , MidAdhemLight )-- call function and set relay

---- 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

SendToRelay(dev1,"R", "45" , HiAdhemLight )-- call function and set relay

-- 2EME CARTE (LOI SOL-VOL)


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

if GroundFlight == 0 and GearCtl == 16383 then Solenoid = 1 else Solenoid = 0 end

SendToRelay(dev1,"R", "46" , Solenoid )-- call function and set relay

---- Relay 47

SendToRelay(dev1,"R", "47", Close )-- call function and set relay

---- Relay 48

SendToRelay(dev1,"R", "48", Close )-- call function and set relay


---- Relay 49

SendToRelay(dev1,"R", "49", Close )-- call function and set relay


---- Relay 50

SendToRelay(dev1,"R", "50", Close )-- call function and set relay

---- Relay 51

SendToRelay(dev1,"R", "51", Close )-- call function and set relay

---- Relay 52

SendToRelay(dev1,"R", "52", Close )-- call function and set relay

---- Relay 53

SendToRelay(dev1,"R", "53", Close )-- call function and set relay



-------------- FUNCTIONS ----------------

function SendToRelay (Dev,Board,RelNber,RelValue) -- declare Send to relay function
com.write(Dev,Board)--marker for relay board --> name of 1st board is "R" (other boards will be identified as : S...T...U... etc)
com.write(Dev,RelNber)--marker for relay number --> will be 1 for relay1
com.write(Dev,",")--separator --> Data separator
com.write(Dev,RelValue)--write value 0 if Switch is Off or battery voltage <20 vdc
com.write(Dev,",")--separator --> Data separator
end

=======================================================================================================
=======================================================================================================
FICHIER .ino
==============================================================================================================================================================================================================


//-------- Controlling x relays receiving data from a LUA script thru serial ----------//
//--------- JP jan 2017 ------------------------------------------------------------//


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 11 relays
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(115200);//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-38)],LogicOFF);// Turns Relay --> Off
}
if(State == 1)//On
{
digitalWrite(RelayPin[(RelayNber-38)],LogicON); // Turns Relays -->On
}
}
/////////

=======================================================================================================
=======================================================================================================
Message FSUIPC4.log
=======================================================================================================
=======================================================================================================


44125 *** LUA Error: P:\Lockheed Martin\Prepar3D v3\Modules\ADHEMAR.lua:92: attempt to call global 'SendToRelay' (a nil value)
Avatar de l’utilisateur
mirageiii2009
 
Messages: 181
Inscription: 26/04/09
Localisation: le + souvent dans mon ERJ-145...

Re: communication script lua --> Arduino Mega

Messagede A320 hérétique » Ven 20 Jan 2017 02:00

@Jacques : ne t'en vas pas, Jacques, je connais un peu Arduino, mais suis sec sur LUA !

@mirage :
J'essaie de deviner ...
Il me semble que le message d'erreur fait référence à la ligne 92, qui pourrait bien être celle qui contient le premier SendToRelay ; l'un des paramètres ne conviendrait pas, hors ils sont tous explicites sauf dev1, qui provient de l'appel com.open, en début de code ; j'imagine donc qu'il pourrait y avoir pb dès la tentative d'ouvrir le port COM19
Je vois que LUA tente une com à 115200 bds, dans ton post précédent tu montrais que Arduino ouvrait une com à 9600 bds ???

Vérifies cela

Jacques, un avis ?

Michel
http://www.myA320sim.com
Simu mixte P3D/FS2020, serveur P3Dv4/A320 FMGS (7700k et GTX 1070 sous W10 64), client P3Dv4/FS2020 (i9-12900K et RTX 3080 Ti sous W10 64), 3 vdp Optoma GT1080E, client A320 FMGS (2600k sous W10 64).
Avatar de l’utilisateur
A320 hérétique
 
Messages: 3355
Inscription: 2/09/12
Localisation: Pornic

Re: communication script lua --> Arduino Mega

Messagede mirageiii2009 » Ven 20 Jan 2017 08:13

A320 hérétique a écrit:@Jacques : ne t'en vas pas, Jacques, je connais un peu Arduino, mais suis sec sur LUA !

@mirage :
J'essaie de deviner ...
Il me semble que le message d'erreur fait référence à la ligne 92, qui pourrait bien être celle qui contient le premier SendToRelay ; l'un des paramètres ne conviendrait pas, hors ils sont tous explicites sauf dev1, qui provient de l'appel com.open, en début de code ; j'imagine donc qu'il pourrait y avoir pb dès la tentative d'ouvrir le port COM19
Je vois que LUA tente une com à 115200 bds, dans ton post précédent tu montrais que Arduino ouvrait une com à 9600 bds ???

Vérifies cela

Jacques, un avis ?

Michel



Bonjour Michel,

Oui, j'ai testé un peu tout ce que je pouvais dont la vitesse. Ca n'a rien changé et j'ai donc laissé ces paramètres.
Je ne sais pas quel est le standard en fait, ou si je dois repasser à 9600 bauds.
Avatar de l’utilisateur
mirageiii2009
 
Messages: 181
Inscription: 26/04/09
Localisation: le + souvent dans mon ERJ-145...

Re: communication script lua --> Arduino Mega

Messagede A320 hérétique » Ven 20 Jan 2017 10:50

Bonjour,
Quand tu lances ton script, tu dois avoir, sur l'écran fsx, une fenêtre lua avec l'un des 2 messages suivants :
Error in opening ...
Connected to com19

Lequel lis-tu ?
Michel

ps : il me vient un doute : ton Arduino est bien sur le COM19 ? si tu ne sais pas, vas dans le gestionnaire de périphérique, déplies la ligne Ports(COM et LPT), tu dois voire une ligne Arduino avec le nom du port correspondant ; si différent, rectifie dans le script LUA
dev1 = com.open("COM19", speed, handshake)--RelayBoard N°1
http://www.myA320sim.com
Simu mixte P3D/FS2020, serveur P3Dv4/A320 FMGS (7700k et GTX 1070 sous W10 64), client P3Dv4/FS2020 (i9-12900K et RTX 3080 Ti sous W10 64), 3 vdp Optoma GT1080E, client A320 FMGS (2600k sous W10 64).
Avatar de l’utilisateur
A320 hérétique
 
Messages: 3355
Inscription: 2/09/12
Localisation: Pornic

Re: communication script lua --> Arduino Mega

Messagede JacquesZ » Ven 20 Jan 2017 13:26

mirageiii2009 a écrit:
A320 hérétique a écrit:@Jacques : ne t'en vas pas, Jacques, je connais un peu Arduino, mais suis sec sur LUA !

@mirage :
J'essaie de deviner ...
Il me semble que le message d'erreur fait référence à la ligne 92, qui pourrait bien être celle qui contient le premier SendToRelay ; l'un des paramètres ne conviendrait pas, hors ils sont tous explicites sauf dev1, qui provient de l'appel com.open, en début de code ; j'imagine donc qu'il pourrait y avoir pb dès la tentative d'ouvrir le port COM19
Je vois que LUA tente une com à 115200 bds, dans ton post précédent tu montrais que Arduino ouvrait une com à 9600 bds ???

Vérifies cela

Jacques, un avis ?

Michel



Bonjour Michel,

Oui, j'ai testé un peu tout ce que je pouvais dont la vitesse. Ca n'a rien changé et j'ai donc laissé ces paramètres.
Je ne sais pas quel est le standard en fait, ou si je dois repasser à 9600 bauds.


Pour ce genre de truc (envoyer une info de fermeture de relais) une vitesse de 115200 bauds n'a aucun intérêt, si ce n'est saturer le Port série. De plus le processeur de l'Arduino n'est pas un foudre de guerre quand même, et le buffer a une taille limitée en octets

L'erreur Fsuipc semble indiquer qu'il ne trouve pas la fonction SendToRelay
La déclaration de la fonction ne devrait-elle pas être faite avant son appel dans le code?
Il suffit de couper/coller la section FUNCTION du script avant le premier appel à SendToRelay
Je ne pratique pas Lua pour Fsuipc, mais ça peut peut-être venir de là.

Sinon il y a une autre piste:
D'après le code Lua, FSUIPC envoie une séquence RX,1, avec une virgule de fermeture en fin
Donc deux commandes successives seront par exemple:
RX,0,RY,1,
Cette virgule de fin de séquence ne semble pas décodée dans le script Arduino qui boucle sur trois caractères seulement, aussi je me demande si la deuxième commande n'est pas mal décodée tout simplement, c'est la virgule et pas le deuxième R qui est pris en compte par la commande serial.read() qui ne lit qu'un caractère à la fois, contrairement à serial.ParseInt() qui lit tous les caractères jusqu'à ce qu'il trouve un entier(merci Michel!).

Jacques

Édit: la deuxième piste n'est pas la bonne, car le code Arduino arrive à boucler avec des serial.read() tant qu'il n'a pas trouvé le caractère R, donc la virgule intermédiaire n'est pas un soucis.
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: communication script lua --> Arduino Mega

Messagede A320 hérétique » Ven 20 Jan 2017 13:58

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"

ce serait intéressant de mettre dans le script un ordre d'écriture à l'écran du handle récupéré lors de la tentative d'ouvrir la com, comme ça on serait déjà sur que la com est ouverte ou pas ... tu sais faire ça ?

Michel

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.
http://www.myA320sim.com
Simu mixte P3D/FS2020, serveur P3Dv4/A320 FMGS (7700k et GTX 1070 sous W10 64), client P3Dv4/FS2020 (i9-12900K et RTX 3080 Ti sous W10 64), 3 vdp Optoma GT1080E, client A320 FMGS (2600k sous W10 64).
Avatar de l’utilisateur
A320 hérétique
 
Messages: 3355
Inscription: 2/09/12
Localisation: Pornic

Re: communication script lua --> Arduino Mega

Messagede fab » Ven 20 Jan 2017 14:17

Vous avez vu aussi que la syntaxe du paramètre passé derrière le R est noté R1, R2 alors que dans le LUA on passe R38, ...,R52, ...

Elle lorsque l'on envoie :
Code: Tout sélectionner
 SendToRelay(dev1,"R", "38", Close )-- call function and set relay


Soustraire 39 ça fait -1 gratgrat
Code: Tout sélectionner
 if(State == 0)//off { digitalWrite(RelayPin[(RelayNber-39)],LogicOFF);// Turns Relay --> Off }


-1 n'est pas un indice de tableau valide yeuxhaut
Avatar de l’utilisateur
fab
 
Messages: 4414
Inscription: 26/12/12
Localisation: Roubaix

Re: communication script lua --> Arduino Mega

Messagede fab » Ven 20 Jan 2017 14:31

Je viens de voir que tu publies des scripts différents entre les premiers et les derniers, on va pas s'en sortir si tu publies un code et que tu indiques que c'est pas celui que tu utilises ( comme avec le COM18 et le COM19)

Publie les 2 codes dans un même message et utilise les balises "code" (bouton en haut de la fenêtre de réponse)
Avatar de l’utilisateur
fab
 
Messages: 4414
Inscription: 26/12/12
Localisation: Roubaix

Re: communication script lua --> Arduino Mega

Messagede A320 hérétique » Ven 20 Jan 2017 15:06

J'ai un peu de mal, le code bouge ?
Michel

Ah, non, c'était 39 la premiere fois, et 38 la seconde, bien vu, Fab !
http://www.myA320sim.com
Simu mixte P3D/FS2020, serveur P3Dv4/A320 FMGS (7700k et GTX 1070 sous W10 64), client P3Dv4/FS2020 (i9-12900K et RTX 3080 Ti sous W10 64), 3 vdp Optoma GT1080E, client A320 FMGS (2600k sous W10 64).
Avatar de l’utilisateur
A320 hérétique
 
Messages: 3355
Inscription: 2/09/12
Localisation: Pornic

PrécédenteSuivante

Retourner vers Interface & logiciel ARDUINO





Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités