communication script lua --> Arduino Mega

Tout sur les cartes et la programmation des modules ARDUINO

Re: communication script lua --> Arduino Mega

Messagede mirageiii2009 » Sam 21 Jan 2017 14:48

A320 hérétique a écrit:@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



Bonjour Michel,
J'ai testé le clignot1.lua :

Au lancement, le message "Connected to COM xx" apparait une fois et disparait.
La carte Mega ne réagit pas (2 voyants ambres éteints, 1 voyant vert allumé).

Voici le message du FSUIPC4.log
61308 *** LUA Error: P:\Lockheed Martin\Prepar3D v3\Modules\clignot1.lua:45: attempt to call global 'wait' (a nil value)


Après modification du clignot1.lua wait(1) en commentaire
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


Le message "Connected to COM xx" se maintient, les 3 voyants de la MEGA sont allumés en continu (2 ambres et 1 vert) mais la carte de réagit pas.
Aucun message d'erreur dans le FSUIPC4.log.
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 » Sam 21 Jan 2017 16:59

Bonjour,

tu as bien réagi, et désormais je comprends mieux :

1) il semble donc que la fonction wait ne soit pas supportée (l'erreur lua), ou n'existe pas, pas grave, en supprimant l'instruction tu demandes à ce que lua ouvre et ferme sans arrêt le relai, ce qui provoque l'allumage presque permanent des 2 led oranges (signaux de transmission).

et 2) après ce qu'a expliqué Jacques, l'erreur lua initiale provenait vraisemblablement du fait que la fonction sendtorelay aurait du être déclarée en amont.

Il faut quand même qu'on s'assure que la chaine de commande fonctionne, mais je ne sais pas s'il faut envoyer un 0 ou un 1, donc tu vas faire 2 essais simples :

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


-- Test 0 sur 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,",")



end



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


-- Test 1 sur 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=1
com.write(Dev,Board)
com.write(Dev,43)
com.write(Dev,",")
com.write(Dev,RelValue)
com.write(Dev,",")



end


l'un des 2 scripts doit coller le relais 43.

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 4070 Ti Super sous W10 64), 3 vdp Optoma GT1080E, client A320 FMGS (2600k sous W10 64).
Avatar de l’utilisateur
A320 hérétique
 
Messages: 3356
Inscription: 2/09/12
Localisation: Pornic

Re: communication script lua --> Arduino Mega

Messagede A320 hérétique » Sam 21 Jan 2017 17:03

Jacques, il n'y a pas de wait (ou pause, ou équivalent ...) dans LUA ?
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 4070 Ti Super sous W10 64), 3 vdp Optoma GT1080E, client A320 FMGS (2600k sous W10 64).
Avatar de l’utilisateur
A320 hérétique
 
Messages: 3356
Inscription: 2/09/12
Localisation: Pornic

Re: communication script lua --> Arduino Mega

Messagede JacquesZ » Sam 21 Jan 2017 18:31

Pas dans Lua à ma connaissance, qui est un langage "générique" et donc indépendant d'une plateforme.
Par contre je pense qu'il existe un truc comme ça dans Fsuipc, c'est d'après ce que je viens de trouver dans la la doc de FSUIPC http://www.cityviewed.co.uk/images/uploads/directory/fsuip/FSUIPC_Lua_Library.pdf:
ipc.sleep(msec) avec msec une durée en millisecondes

Ceci dit, je n'ai jamais programmé de scripts pour FSUIPC, je ne garantis rien concernant les librairies spécifiques!
D'après ce que j'ai compris, ipc.sleep() bloque tous les processus FSUIPC en cours d'exécution, donc méfiance...

Remplacer le
wait(1)
par
ipc.sleep(1000)
devrait faire le taf.

Perso j'enverrai dans le script Lua FSUIPC une chaîne de caractère avec un retour chariot '\n' à la fin, plutôt qu'une virgule, pour être sûr que la commande est bien envoyée ligne par ligne.

On teste ensuite dans le script Arduino la ligne 'RX,0\n' jusqu'au \n pour être sûr d'avoir tout traité via un Serial.readln, et on remet le buffer à zéro pour plus de sécurité. Il semble qu'il faut forcer (cast) la conversion de Byte en caractère dans le Serial.read() de cette manière:
 
char inChar = (char)Serial.read();

Un peu comme dans cet exemple de script Arduino trouvé sur leur site, et il me semble également que Link2FS procède de cette manière.

Code: Tout sélectionner
/*
  Serial Event example

 When new serial data arrives, this sketch adds it to a String.
 When a newline is received, the loop prints the string and
 clears it.

 A good test for this is to try it with a GPS receiver
 that sends out NMEA 0183 sentences.

 Created 9 May 2011
 by Tom Igoe

 This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/SerialEvent

 */

String inputString = "";         // a string to hold incoming data
boolean stringComplete = false;  // whether the string is complete

void setup() {
  // initialize serial:
  Serial.begin(9600);
  // reserve 200 bytes for the inputString:
  inputString.reserve(200);
}

void loop() {
  // print the string when a newline arrives:
  if (stringComplete) {
    Serial.println(inputString);
    // clear the string:
    inputString = "";
    stringComplete = false;
  }
}

/*
  SerialEvent occurs whenever a new data comes in the
 hardware serial RX.  This routine is run between each
 time loop() runs, so using delay inside loop can delay
 response.  Multiple bytes of data may be available.
 */
void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline, set a flag
    // so the main loop can do something about it:
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}



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 JacquesZ » Sam 21 Jan 2017 19:31

mirageiii2009 a écrit:
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!

J'ai appris aussi un truc, la balise YouTube existe dans PHPBB!
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 » Sam 21 Jan 2017 20:09

Jacques,

je vois que tu es plutôt réticent par rapport à la lib Serial ! Pour ma part, je l'utilise fréquemment, je ne pense pas que le petit et simple sketch de notre ami puisse la mettre en défaut (même s'il est vrai qu'elle n'est guère optimisée).

Pour le débug, dans mon idée :
1) on vérifie que le sendtorelay du script lua actionne bien 1 relais, c'est l'objet du dernier test que j'ai proposé : ainsi, on est sur que le montage est ok, et que le skecth arduino l'est aussi ; si pb, on remplace le relais par la diode pin 13, de façon à savoir si pb est coté montage hard ou coté arduino
2) après, on peut éventuellement faire un second test avec plusieurs relais, pour s'assurer que le sketch ne s'emmêle pas les pinceaux avec plusieurs séquences, mais ça, c'est juste pour toi ! car je n'ai pas trop de doute à ce niveau.
3) et puis nouveau script lua pour vérifier que les ipc.readSD fonctionnent correctement, sinon il faudra peut-être creuser coté FSUIPC
Après ça, on devrait y voir clair

Avec le truc sous la main, je ne pense pas que ça prendrait plus d'1/4h ...

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 4070 Ti Super sous W10 64), 3 vdp Optoma GT1080E, client A320 FMGS (2600k sous W10 64).
Avatar de l’utilisateur
A320 hérétique
 
Messages: 3356
Inscription: 2/09/12
Localisation: Pornic

Re: communication script lua --> Arduino Mega

Messagede JacquesZ » Sam 21 Jan 2017 22:07

Non non MIchel, rassures-toi je n'ai aucun à priori contre quoi que ce soit!
Ta procédure me semble bonne, et je suis d'accord avec ta démarche, à savoir tester pour un relais et voir ensuite.
Et ça a l'air de marcher, puisque les relais collent avec ta première routine de test.

La routine Arduino trouvée sur le site est équivalente à ce qui est en place, elle semble juste en plus "caster" (*) le résultat de serial.read() , de byte vers char. Ainsi on est sûr de récupérer un caractère, car je ne sais pas vraiment ce que com.write() en Lua envoie précisément à l'Arduino.

Je pense qu'on est pas loin...

Jacques

*(je crois qu'on dit comme ça pour le changement forcé de type de variable)
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 » Dim 22 Jan 2017 11:03

Hello Jacques,

Cette affaire de com.write m'intrigue aussi, donc j'ai cherché, c'est Pete qui nous fournit la réponse :
Com.write(handle,"a") envoie la chaine "a", soit 2 bytes, 0x61 et 0x00
Pour n'envoyer que le a, il faut préciser la longueur Com.write(handle,"a",1)

Coté Arduino, je ne connais hélas aucun manuel de refernce sérieux (je veux dire précis et détaillé), donc difficile de dire si pour lui, dans une comparaison == "a", il compare au simple byte 0x61 ou s'il lui faut aussi un terminator 0x00

Donc je retiens bien volontier ta préco, mais faut-il transformer le résultat du read en simple char, ou au contraire forcer le rajout d'un terminator ?! ecroulerire
bon, je rigole, plutôt la première solution, ... ou laisser faire la nature mdraffiche

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 4070 Ti Super sous W10 64), 3 vdp Optoma GT1080E, client A320 FMGS (2600k sous W10 64).
Avatar de l’utilisateur
A320 hérétique
 
Messages: 3356
Inscription: 2/09/12
Localisation: Pornic

Re: communication script lua --> Arduino Mega

Messagede JacquesZ » Dim 22 Jan 2017 11:31

Bon, pour en être sûr et connaître ce qu'envoie "réellement" FSUIPC, il faudrait un testeur logiciel de Port COM qui surveille le port USB.
On ne peut pas utiliser serial.print() sur l'Arduino pour savoir ce qui est vraiment reçu, puisque le Port série est déjà utilisé.

Utiliser Com.write(dev1,'R',1) ne devrait pas faire de mal et on est sûr d'envoyer un seul caractère

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 » Lun 23 Jan 2017 08:32

A320 hérétique a écrit:Bonjour,

tu as bien réagi, et désormais je comprends mieux :

1) il semble donc que la fonction wait ne soit pas supportée (l'erreur lua), ou n'existe pas, pas grave, en supprimant l'instruction tu demandes à ce que lua ouvre et ferme sans arrêt le relai, ce qui provoque l'allumage presque permanent des 2 led oranges (signaux de transmission).

et 2) après ce qu'a expliqué Jacques, l'erreur lua initiale provenait vraisemblablement du fait que la fonction sendtorelay aurait du être déclarée en amont.

Il faut quand même qu'on s'assure que la chaine de commande fonctionne, mais je ne sais pas s'il faut envoyer un 0 ou un 1, donc tu vas faire 2 essais simples :

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


-- Test 0 sur 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,",")



end



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


-- Test 1 sur 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=1
com.write(Dev,Board)
com.write(Dev,43)
com.write(Dev,",")
com.write(Dev,RelValue)
com.write(Dev,",")



end


l'un des 2 scripts doit coller le relais 43.

Michel

Bonjour Michel,

Merci pour tes scripts que j'ai testé dimanche soir.
Au lancement, la communication s'établie avec la carte MEGA (Connected to COM xx) mais les relais se désalimentent dans les 2 cas et la Mega semble ne plus répondre.Ses 2 voyants ambres restent allumés en permanence.
Je pense que les scripts sont bons mais que le problème vient de la communication entre la Mega et le PC.

Pourtant, la COM 19 est stable. (elle ne se déconnecte pas) USBDview montre un fonctionnement normal de la Mega en COM19.
Une option reste de tester un autre port COM.
Avatar de l’utilisateur
mirageiii2009
 
Messages: 181
Inscription: 26/04/09
Localisation: le + souvent dans mon ERJ-145...

PrécédenteSuivante

Retourner vers Interface & logiciel ARDUINO





Qui est en ligne

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