[RESOLU] Commande video projecteur PJlink

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)

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

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 ?

Effectivement, j'essaye la connexion par navigateur demain.

Tu ne vois pas de coquille dans mon programme qui pourrait gêner la connexion?

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.

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.

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

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.

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 ?

Oui, je ne parviens toujours pas à me connecter

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

Merci beaucoup pour ton aide, après tant de mal, ça fait super plaisir

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