Page 1 sur 5

communication script lua --> Arduino Mega

MessagePosté: Mer 18 Jan 2017 16:11
de mirageiii2009
Bonjour,

Je tente de commander une carte relais branchée sur une carte Arduino MEGA à partir d'un script lua situé dans le répertoire /modules de P3D et déclaré dans FSUIPC (Registered).

Quand je lance le lua, les relais cyclent bien mais restent alimentés en permanence et la carte Mega ne semble plus concernée par les instructions du fichier lua.

J'ai l'intuition qu'il s'agit d'un problème de communication entre le lua et la carte...
Voici le début du script qui est supposé connecter la carte Mega :

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

dev1 = com.open("COM19", speed, handshake)


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

Toute suggestion ou aide est la bienvenue!

Merci!
JP

Re: communication script lua --> Arduino Mega

MessagePosté: Mer 18 Jan 2017 18:29
de A320 hérétique
Bonjour,

il faudrait à minima que tu montres le skecth arduino qui va avec ...

Michel

Re: communication script lua --> Arduino Mega

MessagePosté: Jeu 19 Jan 2017 06:37
de mirageiii2009
Bonjour Michel,

Voici le sketch Arduino téléversé sur une Mega en Com 19 :



//-------- 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}
;//pos 0 =>11 pos 1=>10 This means --> Relay1 on Pin 11 ,Relay2 on Pin 10
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( 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-39)],LogicOFF);// Turns Relay --> Off
}
if(State == 1)//On
{
digitalWrite(RelayPin[(RelayNber-39)],LogicON); // Turns Relays -->On
}
}
/////////

Re: communication script lua --> Arduino Mega

MessagePosté: Jeu 19 Jan 2017 08:16
de fab
Première chose : dans le LUA, le numéro de port est le bon ? (COM18)

Tu écris : Voici le sketch Arduino téléversé sur une Mega en Com 19 gratgrat

Remplace COM18 par COM19 cligneoeil

Re: communication script lua --> Arduino Mega

MessagePosté: Jeu 19 Jan 2017 08:18
de JacquesZ
D'après le script Arduino, les relais sont activés quand la carte reçoit la chaîne ´RXY' avec X le numéro du relais, et Y l'état on/off (0/1)

Le script Arduino semble correct, même s'il a l'air de tourner très (trop) vite, et peut peut-être rater des infos.
Essaies aussi d'augmenter le délai dans la boucle loop(), car il y à la référence à une variable Dx=0 qui n'est pas utilisée dans le code de la fonction loop(), il ne manquerait pas une boucle for par hasard?

Il faut voir si le script Lua envoie bien RX1, puis RX0 pour ouvrir les relais

Jacques

Re: communication script lua --> Arduino Mega

MessagePosté: Jeu 19 Jan 2017 10:30
de mirageiii2009
fab a écrit:Première chose : dans le LUA, le numéro de port est le bon ? (COM18)

Tu écris : Voici le sketch Arduino téléversé sur une Mega en Com 19 gratgrat

Remplace COM18 par COM19 cligneoeil

Bonjour Fab,

C'est une erreur de copie sur le forum. C'est bien sur le COM 19. rigolus

Re: communication script lua --> Arduino Mega

MessagePosté: Jeu 19 Jan 2017 10:31
de mirageiii2009
JacquesZ a écrit:D'après le script Arduino, les relais sont activés quand la carte reçoit la chaîne ´RXY' avec X le numéro du relais, et Y l'état on/off (0/1)

Le script Arduino semble correct, même s'il a l'air de tourner très (trop) vite, et peut peut-être rater des infos.
Essaies aussi d'augmenter le délai dans la boucle loop(), car il y à la référence à une variable Dx=0 qui n'est pas utilisée dans le code de la fonction loop(), il ne manquerait pas une boucle for par hasard?

Il faut voir si le script Lua envoie bien RX1, puis RX0 pour ouvrir les relais

Jacques

Bonjour Jacques,

Merci pour ta réponse. Je fais des tests et je reviens! C'est un peu le flou artistique pour moi..

Re: communication script lua --> Arduino Mega

MessagePosté: Jeu 19 Jan 2017 10:43
de A320 hérétique
Bonjour,

En effet, d'accord avec Jacques
La comm est bien établie, puisque quand tu lances le script lua les relais collent ; ça veut également dire qu'arduino recoit bien une séquence à base de Rx,1 (x = n° relais).
Il faudrait vérifier que tu envoies bien les ordres d'ouverture Rx,0

Par ailleurs, com à 9600 bds ça n'est pas rapide, rajoutes avant le premier serial.parseint une ligne delay(Dx); et remplaces Dx=0 par Dx=1. , de façon à laisser le temps aux char d'arriver

Michel

Re: communication script lua --> Arduino Mega

MessagePosté: Jeu 19 Jan 2017 17:33
de JacquesZ
Tu peux copier également le script lua pour fsuipc s'il te plaît?

Ce serait pour connaître la véritable séquence de caractères envoyée, car le script arduino attend et décode "en l'état" une chaîne du type: "RX0" ou "RX1" soit 3 caractères.
Or il me semble que ce qui lui est envoyé par FSUIPC est plutôt du genre "RX,0" , c'est à dire avec une virgule entre les deux, donc un caractère de plus.
Si c'est le cas, l'arduino décode mal le message, il prend la virgule pour l'état du relais.
Le deuxième parse.int() du code Arduino, au lieu de lire l'état du relais lit le caractère virgule(,), et donc la variable State n'est jamais égale à 0 mais à Char(","), soit une valeur correspondant au code ASCII du caractère ",", et donc le relais ne s'ouvre jamais puisque le test State==0 n'est jamais vrai...

Je rajouterai dans le code Arduino une Ligne du genre
car=serial.read()
entre les deux lignes existantes
RelayNber=parse.int()
et
State=parse.int()
pour "sauter" le caractère "," et forcer l'avance dans le buffer des caractères, chaque appel à parse.int() ou serial.read() lisant un caractère du buffer série après l'autre.

Jacques

Re: communication script lua --> Arduino Mega

MessagePosté: Jeu 19 Jan 2017 18:22
de A320 hérétique
Jacques,

je ne pense pas que le pb soit là, car le parseint "saute" les char non numériques (c'est son intérêt par rapport au simple read), dont la virgule ;
Il faudrait voir ce qui arrive sur la carte, pas simple car j'imagine que la liaison usb est déjà prise ! une façon pas trop compliquée serait de rajouter un afficheur lcd 2x16, je fais souvent ça (c'est même à demeure sur ma plateforme de test) ; ou alors, utiliser la led pin 13 pour afficher un éventuel timeout.

Michel