matcad
February 17, 2020, 3:23pm
1
Bonjour à tous,
Je souhaiterais réaliser une télécommande pour piloter le shutter interne d'un vidéoprojecteur (cache mécanique occultant l’image).
Je me suis bien inspiré de cette discussion pour rédiger un premier programme qui ne gère que l'envoie et non le retour d'information
https://forum.arduino.cc/index.php?topic=130847.0
Cependant, je ne parviens pas à établir la connexion avec le VP, je reste bloqué en "connexion failled". Pourtant j'ai tester le VP avec un logiciel dédier, et il prend bien la commande.
Voici mon programme, auriez vous une idée des causes de ce dysfonctionnement?
Merci à vous
commande_1_vp_test.ino (2.4 KB)
matcad
February 17, 2020, 4:13pm
2
//Shield Ethernet
#include <Ethernet.h>
#include <SPI.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,10,1);
IPAddress ipvp(192,168,10,199);
EthernetClient vpClient;
//Interface utilisateur
#define bouton 2
#define ledOuvert 3
#define ledFerme 4
#define ledErreur 5
byte commande = 1;
bool link = false;
void setup()
{
Ethernet.begin(mac, ip);
Serial.begin(19200);
pinMode(bouton, INPUT_PULLUP);
pinMode(ledOuvert, OUTPUT);
pinMode(ledFerme, OUTPUT);
pinMode(ledErreur, OUTPUT);
digitalWrite(ledOuvert,LOW);
digitalWrite(ledFerme,LOW);
digitalWrite(ledErreur,LOW);
delay(1000);
}
void loop()
{
if (digitalRead (bouton) == LOW)
{
if (commande == 0 || commande == 1)
{
connexion();
ouverture ();
}
}
if (digitalRead (bouton) == HIGH)
{
if (commande == 0 || commande == 2)
{
connexion();
fermeture ();
}
}
}
void connexion()
{
byte a = 0;
int ret = 0;
while ( ! vpClient.connected() && a <= 10 )
{
vpClient.connect(ipvp, 4352);
Serial.println("connecting...");
ret = vpClient.connect(ipvp, 4352);
a++;
}
if ( (ret == 0) || !vpClient.connected() )
{
Serial.println("connection failed");
digitalWrite (ledErreur, HIGH);
link = false;
commande = 0;
}
else
{
digitalWrite (ledErreur, LOW);
Serial.println("connected");
link = true;
}
}
void ouverture()
{
if (link == true )
{
for (byte b = 0; b <= 5; b++)
{
Serial.println();
Serial.print(vpClient);
Serial.println(" Ouverture");
vpClient.print("%1AVMT 30\r");
digitalWrite (ledOuvert,HIGH);
digitalWrite (ledFerme,LOW);
}
vpClient.stop();
commande = 2;
}
}
void fermeture()
{
if (connexion == true )
{
for (byte c = 0; c <= 5; c++)
{
Serial.println();
Serial.print(vpClient);
Serial.println(" Fermeture");
vpClient.print("%1AVMT 31\r");
digitalWrite (ledOuvert,LOW);
digitalWrite (ledFerme,HIGH);
}
vpClient.stop();
commande = 1 ;
}
}
4.5 Mute instruction AVMT
Où as-tu vu qu'il s'agissait d'une commande pour ouvrir fermer / un shutter ?
Je lis :
"%AVMT 30\r" : video and audio mute ON instruction
"%AVMT 31\r" : video and audio mute OFF instruction
Mais là n'est pas l'origine de ton problème de connexion.
Il faudrait être sûr de ton adresse IP et du port.
matcad
February 17, 2020, 6:29pm
4
Bonjour,
Merci d'avoir pris le temps de répondre
L'action vidéo mute est bien réalisée par un shutter
Vidéo mute OFF = shutter ouvert et Vidéo mute ON = shutter fermé.
J'ai en ma possession un ordi faisan tourner un logiciel qui exécute ces mêmes commandes, et ça marche, ce qui me fait dire au passage que je suis donc sur la bonne IP et le bon port.
Ici, l'IP de mon VP est 192,168,10,199 et le port pour le PJlink est 4352
Si tu ne parviens pas à te connecter sur 192.168.10.199:4352 c'est grave.
As-tu essayé d'entrer l'URL dans un navigateur ?
matcad
February 17, 2020, 7:28pm
6
Effectivement, j'essaye la connexion par navigateur demain.
Tu ne vois pas de coquille dans mon programme qui pourrait gêner la connexion?
matcad
February 18, 2020, 10:58am
7
J'accède bien au VP par mon naviguateur.
J'ai également essayer de connecter l’Arduino en direct à mon PC, et j'échoue également, il n'y a pas de connexion. J'ai même éditer un programme pour m'assurer qu'il ne s'agit pas d'une erreur de port, mais cela ne marche pas.
Ma carte Ethernet est une non officielle W5100
Voici le programme de teste de connexion au PC
#include <Ethernet.h>
#include <SPI.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 10, 17 };
byte server[] = { 192, 168, 10, 10 };
int voie = 0;
EthernetClient client;
void setup()
{
Ethernet.begin(mac, ip);
Serial.begin(9600);
delay(1000);
}
void loop()
{
client.connect(server, voie);
if ( client.connected())
{
Serial.println("connected");
Serial.println(voie);
delay( 2000);
}
if (!client.connected())
{
Serial.println("connection failed");
}
voie++;
Une bonne habitude : commence déjà par ceci :
Ethernet.begin(mac, ip);
if (Ethernet.hardwareStatus() == EthernetNoHardware) {
Serial.println(F("Ethernet shield was not found. Sorry, can't run without hardware. :("));
while (true) {
delay(1); // do nothing, no point running without Ethernet hardware
}
}
if (Ethernet.linkStatus() == LinkOFF) {
Serial.println(F("Ethernet cable is not connected."));
}
J'ai également essayer de connecter l'Arduino en direct à mon PC, et j'échoue également, il n'y a pas de connexion.
Tu veux dire par là que tu relies le W5100 au PC directement, sans passer par un switch ?
Après que le PC ait obtenu une adresse IP DHCP ou fixe ?
Je ne sais pas si le W5100 est automatique ... Tu as utilisé un câble croisé ?
Je ne sais pas ce que tu utilises comme OS mais cela m'étonnerait que l'adresse IP du PC soit conservée si tu débranches le câble Ethernet du PC pour le rebrancher sur le W5100, à moins de lui donner une nouvelle adresse manuellement.
matcad
February 18, 2020, 11:33am
9
Le VP est en IP fixe et le PC également.
J'ai relier le PC en direct à l’Arduino avec un câble droit. Le problème peut venir de là?
Possible. Passe plutôt par un switch.
Ajoute de toutes façons le code du post #7 .
Cela permet de lever les doutes : SPI mal branché, et câble.
matcad
February 18, 2020, 11:40am
11
Je précise que je fait mes test pare feu baissé, carte wifi désactivée.
Le retour de ton programme est "ethernet shield was not found"
j'essaye avec un switch tout à l'heure
matcad
February 18, 2020, 12:56pm
12
Cela m'as permis de détecter un faux contact entre les deux cartes (arduino et shield ethernet).
Lorsque je résout le problème, je n'aie plus "ethernet shield was nos found". Mais lorsque je Serial.println(Ethernet.linkStatus()); j'obtiens 0
Je ne parviens toujours pas à me connecter à mon ordinateur, même en passant par un switch. Mon ordinateur est bien scencé se trouver sur le port 80 ?
Le retour de ton programme est "ethernet shield was not found"
Cela m'as permis de détecter un faux contact entre les deux cartes (arduino et shield ethernet).
Exact.
Ethernet.linkStatus() = 0 : OK
Ethernet.linkStatus() = LinkOFF = 2 : câble débranché
Je ne parviens toujours pas à me connecter à mon ordinateur, même en passant par un switch. Mon ordinateur est bien scencé se trouver sur le port 80 ?
S'il n'y a pas au minimum un serveur (Apache par exemple) à l'écoute sur le port 80, non.
Il semblerait que maintenant il devrait être possible de se connecter sur le PJlink port 4352.
matcad
February 19, 2020, 9:13am
14
Ce qui est étrange c'est que la carte me retourne Ethernet.linkStatus() = 0, même quand aucun câble n'est branché
Pourtant la led link sur le shield est bien éteinte et elle s'allume quand je branche le câble
Je n'avais jamais remarqué.
As-tu fait un nouvel essai avec PJlink ?
matcad
February 19, 2020, 10:47am
16
Oui, je ne parviens toujours pas à me connecter
matcad
February 19, 2020, 10:55am
17
Erratum, J'ai réussi à envoyer la commande, le shutter s'ouvre et se ferme
Il n'y avait pas de raison ...
Trop cool 8)
Prochaine étape : faire la même chose avec un ESP8266, donc WIFI
matcad
February 19, 2020, 11:21am
19
Merci beaucoup pour ton aide, après tant de mal, ça fait super plaisir
matcad
February 19, 2020, 11:57am
20
Au faite, ça marche sans passer par un switch, en direct avec le VP, C'est fonctionnel.
Si ça peut aider d'autre gens, voici mon programme
//Shield Ethernet
#include <Ethernet.h>
#include <SPI.h>
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0xDF, 0xAB };
byte ip[] = { 192, 168, 10, 17 };
byte ipvp[] = { 192, 168, 10, 199 };
EthernetClient vpClient;
//Interface utilisateur
#define bouton 2
#define ledOuvert 3
#define ledFerme 4
#define ledErreur 5
byte commande = 0;
bool link = false;
void setup()
{
Ethernet.begin(mac, ip);
Serial.begin(19200);
pinMode(bouton, INPUT_PULLUP);
pinMode(ledOuvert, OUTPUT);
pinMode(ledFerme, OUTPUT);
pinMode(ledErreur, OUTPUT);
digitalWrite(ledOuvert,LOW);
digitalWrite(ledFerme,LOW);
digitalWrite(ledErreur,LOW);
delay(500);
}
void loop()
{
if (digitalRead (bouton) == HIGH)
{
if (commande == 0 || commande == 1)
{
connexion();
ouverture ();
}
}
if (digitalRead (bouton) == LOW)
{
if (commande == 0 || commande == 2)
{
connexion();
fermeture ();
}
}
if (link == true )
{
vpClient.stop();
}
}
void connexion()
{
byte a = 0;
int ret = 0;
while ( ! vpClient.connected() && a <= 10 )
{
Serial.println("connecting...");
ret = vpClient.connect(ipvp,4352);
a++;
}
if ( (ret == 0) || !vpClient.connected() )
{
Serial.println("connection failed");
digitalWrite (ledErreur, HIGH);
link = false;
commande = 0;
}
else
{
digitalWrite (ledErreur, LOW);
Serial.println("connected");
link = true;
}
}
void ouverture()
{
if (link == true )
{
for (byte b = 0; b <= 5; b++)
{
Serial.println();
Serial.print(vpClient);
Serial.println(" Ouverture");
vpClient.print("%1AVMT 30\r");
digitalWrite (ledOuvert,HIGH);
digitalWrite (ledFerme,LOW);
}
commande = 2;
}
}
void fermeture()
{
if (link == true )
{
for (byte c = 0; c <= 5; c++)
{
Serial.println();
Serial.print(vpClient);
Serial.println(" Fermeture");
vpClient.print("%1AVMT 31\r");
digitalWrite (ledOuvert,LOW);
digitalWrite (ledFerme,HIGH);
}
commande = 1 ;
}
}
Je cherche à présent à interroger le VP sur son état et à interpréter le retour d'info (ouvert ou fermé)