Nec Beamer über rs232 mit dem Arduino steuern

Hey liebe µC Gemeinde,

ich habe eine Beamersteuerung mit dem Arduino Nano gebaut. Vorher lief die Steuerung schon an Casio Beamern und jetzt muss ich sie auf einen Nec P525UL anpassen. Die ON/OFF Funktion funktioniert schon. Meine Frage ist was habe ich bei den Befeheln für Input Umschalten und Mute ON/OFF falsch bzw anders gemacht? Die Befehle funktionieren nicht und ich bin der Meinung, dass ich es genauso gemacht habe wie bei dem ON/OFF Befehlen.
Befehle laut Anleitung:
Beamer AN: [02][00][00][00][00][02]
Beamer AUS: [02][01][00][00][00][03]

HDMI 1: [02][03][00][00][02][01][A1][A9]
VGA: [02][03][00][00][02][01][01][09]

Picture Mute ON: [02][10][00][00][00][12]
Picture Mute OFF: [02][11][00][00][00][13]

/* 
 * Steuerung für NEC P525UL
 * Zur Umsetzung wird ein Arduino Nano verwändet
 * Der Umsetzer für die RS232 Schnittstelle ist ein MAX232ECPE  
 */

#include <Bounce2.h>
 
// Pinbelegung -> Konstante Belegung
int OnOff = 3;                                      //Pin 2 dem OnOff Taster zugewiesen
int Video = 4;                                      //Pin 3 dem Video Input Taster zugewiesen
int RGB = 5;                                        //Pin 4 dem RGB Input Taster zugewiesen
int HDMI = 6;                                       //Pin 5 dem HDMI Input Taster zugewiesen
int Mute = 7;                                       //Pin 6 dem Mute Taster zugewiesen
int LED = 2;                                        //Pin 7 ist für die Satus LED (soll leuchten wenn Taster gedrückt wird)


//welcher Pin entprellt wird wird hier defeniert
Bounce PinOnOff = Bounce();                         
Bounce PinVideo = Bounce();
Bounce PinRGB   = Bounce();
Bounce PinHDMI  = Bounce();
Bounce PinMute  = Bounce();


//Vriabelen für AN und Aus
int OnOffStatus        = 0;                          //Variabele zum abfragen des Taster Status
int OnOffZaehler       = 0;                          //Variabele um zu Zählen ob Taster On oder Off schalten soll
int OnOffletzterStatus = 0;                          //Variabele die den letzten Status des Tasters speichert (On oder Off)



//Variabelen für die Mutefunktion
int MuteStatus        = 0;                           //Variabele zum abfragen des Taster Status
int MuteZaehler       = 0;                           //Variabele um zu Zählen ob Taster Mute oder NO Mute schalten soll
int MuteletzterStatus = 0;                           //Variabele die den letzten Status des Taasters speichert (Bildschirm gemutet oder nicht)


//Array definieren
const byte ON        [] = {0x02, 0x00, 0x00, 0x00, 0x00, 0x02};
const byte OFF       [] = {0x02, 0x01, 0x00, 0x00, 0x00, 0x03};
const byte InputHDMI [] = {0x02, 0x03, 0x00, 0x00, 0x02, 0x01, 0xA1, 0xA9};
const byte InputRGB  [] = {0x02, 0x03, 0x00, 0x00, 0x02, 0x01, 0x01, 0x09};
const byte MuteON    [] = {0x02, 0x10, 0x00, 0x00, 0x00, 0x12};
const byte MuteOFF   [] = {0x02, 0x11, 0x00, 0x00, 0x00, 0x13};

void setup() 
{                                                    // put your setup code here, to run once:

  pinMode(LED,   OUTPUT);                            //LED Pin als Ausgang deklariert
  pinMode(LED_BUILTIN, OUTPUT);                      //interne LED für testzweke aktiviert

  PinOnOff.attach (OnOff, INPUT_PULLUP);             //defenierte Taster werden den entprell Variabelen zugewiesen
  PinOnOff.interval (100);                           //Entprellzeit des Tatsers definiert

  PinVideo.attach (Video, INPUT_PULLUP);             //defenierte Taster werden den entprell Variabelen zugewiesen
  PinVideo.interval (100);                           //Entprellzeit des Tatsers definiert

  PinRGB.attach (RGB, INPUT_PULLUP);                 //defenierte Taster werden den entprell Variabelen zugewiesen
  PinRGB.interval (100);                             //Entprellzeit des Tatsers definiert

  PinHDMI.attach (HDMI, INPUT_PULLUP);               //defenierte Taster werden den entprell Variabelen zugewiesen
  PinHDMI.interval (100);                            //Entprellzeit des Tatsers definiert

  PinMute.attach (Mute, INPUT_PULLUP);               //defenierte Taster werden den entprell Variabelen zugewiesen
  PinMute.interval (100);                            //Entprellzeit des Tatsers definiert
                                       
  Serial.begin(9600);                               //Die Baudrate (Seriele Übertragungsgeschwindigkeit) für den Seriellen Monitor am PC und Initialisierung der Seriellen Schnitstelle
  Serial.println("Verbindungs Test");                //Verbingung zum Seriellen Monitor wird getestet
}

void loop() 
{ 

//Die entprellten Pinne müssen neu geladen werden
  PinOnOff.update();                                 //Damit die Bounce Bibliothek einwandfrei läuft
  PinVideo.update();                                 //müss am Anfang des Programmes (loop)
  PinRGB.update();                                   //alle zu entprellenen Taster  einmal abgerufen werden,
  PinHDMI.update();                                  //damit keine falschen Zustände eingelesen werden
  PinMute.update();

//Festgelegt wo welcher Status abgerufen wird
  OnOffStatus = digitalRead(OnOff);                  //die Variabele wir durch den Zustand des Tasters definiert, dafür wird einfach der passende Taster abgefragt
  MuteStatus = digitalRead(Mute);


//Ablauf Ein- & Ausschalten
  if (PinOnOff.fallingEdge())                        //if Abfrage ob Pin On Off gedrückt wird
    {
      digitalWrite(LED, HIGH);                       //wenn Taster gedrückt -> LED wird angeschaltet
      if (OnOffStatus == OnOffletzterStatus)         //if Abfrage ob der jetzige Zustand des Tasters dem letzten gespeicherten Zustand entspricht
        {
          Serial.write(ON, sizeof(ON));                  //wenn beide Zustände gleich sind wird der Beamer eingeschaltet
          OnOffletzterStatus++;                      //der letzte Taster Status wird mit 1 addiert
        }
       else
        {
          Serial.write(OFF, sizeof(OFF));                  //sind die Zustände nicht gleich wird der Beamer ausgeschaltet
          OnOffletzterStatus--;                      //letzter Taster Status wird mit 1 subtraiert
        }
    }

   if (PinOnOff.risingEdge())                        //if Abfrage ob Pin On Off losgelassen wird
    {
      digitalWrite(LED, LOW);                        //wenn dies der fall ist wird die LED ausgeschaltet
    }


/*Input Video
  if (PinVideo.fallingEdge())                         //if Abfrage ob Video Pin gedrückt wird
    {
      digitalWrite(LED, HIGH);                        //ist das der Fall wir die LED angeschaltet
      Serial.println("(SRC2)");                       //und der Input wechselt zu Video
    }

  if (PinVideo.risingEdge())                          //if Abfrage ob Video Pin losgelassen wird
    {
      digitalWrite(LED, LOW);                         //wenn ja, schaltet sich die LED wieder aus
    }
*/  

//Input RGB
  if (PinRGB.fallingEdge())                           //if Abfrage ob RGB Pin gedrückt wird
    {
      digitalWrite(LED, HIGH);                        //wenn ja, Schaltet sich die led an
      Serial.write(InputRGB, sizeof(InputRGB));                       //und der Beamer wechselt auf Input: RGB
    }

   if (PinRGB.risingEdge())                           //if Abfrage ob RGB losgelassen wird
    {
      digitalWrite(LED, LOW);                         //wenn ja, geht die LED wieder aus
    }


//Input HDMI
  if (PinHDMI.fallingEdge())                          //if Abfrage ob Pin HDMI gedrückt wird  
    {
      digitalWrite(LED, HIGH);                        //wenn ja, schaltet sich die LED an
      Serial.write(InputHDMI, sizeof(InputHDMI));                       //und der Beamer auf Input: HDMI
    }

  if (PinHDMI.risingEdge())                           //if Abfrage ob HDMI Pin losgelassen wird
    {
      digitalWrite(LED, LOW);                         //wenn ja, schaltet sich die LED aus
    }


//Mutefunktion
  if (PinMute.fallingEdge())                        //if Abfrage ob Pin Mute gedrückt wird
    {
      digitalWrite(LED, HIGH);                       //wenn Taster gedrückt -> LED wird angeschaltet
      if (MuteStatus == MuteletzterStatus)         //if Abfrage ob der jetzige Zustand des Tasters dem letzten gespeicherten Zustand entspricht
        {
          Serial.write(MuteON, sizeof(MuteON));                  //wenn beide Zustände gleich sind wird die Mutefunktion aktiviert
          MuteletzterStatus++;                      //der letzte Taster Status wird mit 1 addiert
        }
       else
        {
          Serial.write(MuteOFF, sizeof(MuteOFF));                  //sind die Zustände nicht gleich wird die Mutefunktion deaktiviert
          MuteletzterStatus--;                      //letzter Taster Status wird mit 1 subtraiert
        }
    }

   if (PinMute.risingEdge())                        //if Abfrage ob Pin Mute losgelassen wird
    {
      digitalWrite(LED, LOW);                        //wenn dies der fall ist wird die LED ausgeschaltet
    }
}

LG Jacky

Das Programm scheint zu tun, was es soll. Getestet mit einem Mega2560 als Empfänger:

02 00 00 00 00 02 
02 01 00 00 00 03 
02 03 00 00 02 01 A1 A9 
02 03 00 00 02 01 01 09 
02 10 00 00 00 12 
02 11 00 00 00 13 

Ich habe das Programm kosmetisch überarbeitet:

/* 
 * Steuerung für NEC P525UL
 * Zur Umsetzung wird ein Arduino Nano verwändet
 * Der Umsetzer für die RS232 Schnittstelle ist ein MAX232ECPE  
 */

#include <Bounce2.h>
 
// Pinbelegung -> Konstante Belegung
const byte OnOff = 3;                                      //Pin 2 dem OnOff Taster zugewiesen
const byte Video = 4;                                      //Pin 3 dem Video Input Taster zugewiesen
const byte RGB = 5;                                        //Pin 4 dem RGB Input Taster zugewiesen
const byte HDMI = 6;                                       //Pin 5 dem HDMI Input Taster zugewiesen
const byte Mute = 7;                                       //Pin 6 dem Mute Taster zugewiesen
const byte LED = 2;                                        //Pin 7 ist für die Satus LED (soll leuchten wenn Taster gedrückt wird)


//welcher Pin entprellt wird wird hier defeniert
Bounce PinOnOff = Bounce();                         
Bounce PinVideo = Bounce();
Bounce PinRGB   = Bounce();
Bounce PinHDMI  = Bounce();
Bounce PinMute  = Bounce();


//Vriabelen für AN und Aus
bool OnOffStatus        = 0;                          //Variabele zum abfragen des Taster Status

//Variabelen für die Mutefunktion
bool MuteStatus        = 0;                           //Variabele zum abfragen des Taster Status


//Array definieren
const byte ON        [] = {0x02, 0x00, 0x00, 0x00, 0x00, 0x02};
const byte OFF       [] = {0x02, 0x01, 0x00, 0x00, 0x00, 0x03};
const byte InputHDMI [] = {0x02, 0x03, 0x00, 0x00, 0x02, 0x01, 0xA1, 0xA9};
const byte InputRGB  [] = {0x02, 0x03, 0x00, 0x00, 0x02, 0x01, 0x01, 0x09};
const byte MuteON    [] = {0x02, 0x10, 0x00, 0x00, 0x00, 0x12};
const byte MuteOFF   [] = {0x02, 0x11, 0x00, 0x00, 0x00, 0x13};

void setup() 
{                                                    // put your setup code here, to run once:

  pinMode(LED,   OUTPUT);                            //LED Pin als Ausgang deklariert
  pinMode(LED_BUILTIN, OUTPUT);                      //interne LED für testzweke aktiviert

  PinOnOff.attach (OnOff, INPUT_PULLUP);             //defenierte Taster werden den entprell Variabelen zugewiesen
  PinOnOff.interval (100);                           //Entprellzeit des Tatsers definiert

  PinVideo.attach (Video, INPUT_PULLUP);             //defenierte Taster werden den entprell Variabelen zugewiesen
  PinVideo.interval (100);                           //Entprellzeit des Tatsers definiert

  PinRGB.attach (RGB, INPUT_PULLUP);                 //defenierte Taster werden den entprell Variabelen zugewiesen
  PinRGB.interval (100);                             //Entprellzeit des Tatsers definiert

  PinHDMI.attach (HDMI, INPUT_PULLUP);               //defenierte Taster werden den entprell Variabelen zugewiesen
  PinHDMI.interval (100);                            //Entprellzeit des Tatsers definiert

  PinMute.attach (Mute, INPUT_PULLUP);               //defenierte Taster werden den entprell Variabelen zugewiesen
  PinMute.interval (100);                            //Entprellzeit des Tatsers definiert
                                       
  Serial.begin(9600);                               //Die Baudrate (Seriele Übertragungsgeschwindigkeit) für den Seriellen Monitor am PC und Initialisierung der Seriellen Schnitstelle
  Serial.println("Verbindungs Test");                //Verbingung zum Seriellen Monitor wird getestet
}

void loop() 
{ 

//Die entprellten Pinne müssen neu geladen werden
  PinOnOff.update();                                 //Damit die Bounce Bibliothek einwandfrei läuft
  PinVideo.update();                                 //müss am Anfang des Programmes (loop)
  PinRGB.update();                                   //alle zu entprellenen Taster  einmal abgerufen werden,
  PinHDMI.update();                                  //damit keine falschen Zustände eingelesen werden
  PinMute.update();

//Ablauf Ein- & Ausschalten
  if (PinOnOff.fallingEdge())                        //if Abfrage ob Pin On Off gedrückt wird
    {
      digitalWrite(LED, HIGH);                       //wenn Taster gedrückt -> LED wird angeschaltet
      OnOffStatus = !OnOffStatus;
      if (OnOffStatus)         //if Abfrage ob der jetzige Zustand des Tasters dem letzten gespeicherten Zustand entspricht
        {
          Serial.write(ON, sizeof(ON));                  //wenn beide Zustände gleich sind wird der Beamer eingeschaltet
        }
       else
        {
          Serial.write(OFF, sizeof(OFF));                  //sind die Zustände nicht gleich wird der Beamer ausgeschaltet
        }
    }

   if (PinOnOff.risingEdge())                        //if Abfrage ob Pin On Off losgelassen wird
    {
      digitalWrite(LED, LOW);                        //wenn dies der fall ist wird die LED ausgeschaltet
    }


/*Input Video
  if (PinVideo.fallingEdge())                         //if Abfrage ob Video Pin gedrückt wird
    {
      digitalWrite(LED, HIGH);                        //ist das der Fall wir die LED angeschaltet
      Serial.println("(SRC2)");                       //und der Input wechselt zu Video
    }

  if (PinVideo.risingEdge())                          //if Abfrage ob Video Pin losgelassen wird
    {
      digitalWrite(LED, LOW);                         //wenn ja, schaltet sich die LED wieder aus
    }
*/  

//Input RGB
  if (PinRGB.fallingEdge())                           //if Abfrage ob RGB Pin gedrückt wird
    {
      digitalWrite(LED, HIGH);                        //wenn ja, Schaltet sich die led an
      Serial.write(InputRGB, sizeof(InputRGB));                       //und der Beamer wechselt auf Input: RGB
    }

   if (PinRGB.risingEdge())                           //if Abfrage ob RGB losgelassen wird
    {
      digitalWrite(LED, LOW);                         //wenn ja, geht die LED wieder aus
    }


//Input HDMI
  if (PinHDMI.fallingEdge())                          //if Abfrage ob Pin HDMI gedrückt wird  
    {
      digitalWrite(LED, HIGH);                        //wenn ja, schaltet sich die LED an
      Serial.write(InputHDMI, sizeof(InputHDMI));                       //und der Beamer auf Input: HDMI
    }

  if (PinHDMI.risingEdge())                           //if Abfrage ob HDMI Pin losgelassen wird
    {
      digitalWrite(LED, LOW);                         //wenn ja, schaltet sich die LED aus
    }


//Mutefunktion
  if (PinMute.fallingEdge())                        //if Abfrage ob Pin Mute gedrückt wird
    {
      digitalWrite(LED, HIGH);                       //wenn Taster gedrückt -> LED wird angeschaltet
      MuteStatus=!MuteStatus;
      if (MuteStatus)
        {
          Serial.write(MuteON, sizeof(MuteON));                  //wenn beide Zustände gleich sind wird die Mutefunktion aktiviert
        }
       else
        {
          Serial.write(MuteOFF, sizeof(MuteOFF));                  //sind die Zustände nicht gleich wird die Mutefunktion deaktiviert
        }
    }

   if (PinMute.risingEdge())                        //if Abfrage ob Pin Mute losgelassen wird
    {
      digitalWrite(LED, LOW);                        //wenn dies der fall ist wird die LED ausgeschaltet
    }
}

Allerdings sehe ich 38400 Bit/s (Quelle):

Mh okay, dann muss ich wohl noch mal am Beamer testen.

Die Baudrate ist am Beamer einstellbar und steht auf 9600 bit/s.
Danke für die kosmetische Überarbeitung :grinning: