LabVIEWForum.de - Labview und Arduino Mega via USB

LabVIEWForum.de

Normale Version: Labview und Arduino Mega via USB
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen.

Kürzlich begann ich damit, mich in Labview einzuarbeiten. Für ein Projekt steht mir ein Arduino Mega zur Verfügung. Ich werde nun versuchen mein grundsätzliches Vorhaben präzise zu beschreiben um auf die später folgende Beschreibung meines Problems eingehen zu können.

Projektbeschreibung:
Ziel ist es zunächst auf einfachem Level eine Ansteuerung für elektrische Schaltglieder zu realisieren. Die Idee ist demnach die, dass über ein GUI ein Betriebsmodus für den "Testaufbau" ausgewählt wird, dies an den Arduino kommuniziert wird und er daraufhin die entsprechenden I/O´s setzt. Desweiteren soll für den Anfang über zwei analoge Eingänge permanent gemessen werden (kurzzeitige Unterbrechungen wegen Umschaltung der Betriebsmodi sind zulässig).
Die Kommunikation soll für den ersten Versuch über die USB Verbindung laufen. Anschließend geht die Weiterentwicklung in Richtung Ethernet, was aber aktuell nicht relevant ist.

Die bisherige Umsetzung:
Für den Arduino schrieb ich die Software zum setzen der digitalen Ports und zum einlesen der analogen Werte sowie die entsprechende Kommunikation. In der Arduino IDE habe ich das Programm getestet. Es erwartet über dei serielle Schnittstelle Zahlenwerte von 1-4 (Format String). Jeder dieser Zahlenwerte löst dann einen im Programm definierten Betriebszustand aus, sprich die digitalen Ausgänge werden gesetzt. Mit dem seriellen Monitor der IDE funktioniert dies absolut tadellos und 100% zuverlässig. Ich bekomme permanent meine anaologen Werte geliefert und kann sämtliche Betriebsmodi schalten.
Anmerkung: Der Code für den Arduino enthält Definitionen für digitale Eingänge. Diese können ignoriert werden. Ich hatte sie in der Vergangenheit für Tests verwendet.

Nun ging ich hin und wollte die bisher manuelle Eingabe durch ein Labview VI ergänzen bzw. ersetzen. Das VI dazu schien zunächst nicht weiter kompliziert, doch komme ich nun zu meinem Problem.

Problembeschreibung:
Die analogen Werte werden gelesen und umgerechnet. Bis hierhin ist alles OK. Die Vorgabe, also das Schreiben von Labview zum Arduino, scheint aber nicht sauber zu funktionieren. Der Arduino reagiert auf die Vorgaben sehr langsam (etliche Sekunden) und beginnt dann die programmierten Betriebsmodi zu toggeln. Ich habe dafür keine Erklärung und hoffe nun hier Unterstützung finden zu können.

Code:
Arduino Code:
void setup()
{
  Serial.begin(9600);      
}

//Hier endet das Setup.
void loop()
{
  int state_reg=5;      //1=PFC aktiv, 2=DCDC Charge aktiv, 3=DCDC Discharge aktiv, 4=IDLE, 5=Initialisierung
  int pfc_operating_mode=18;
  int dcdc_ch_mode=19;
  int dcdc_dch_mode=20;
  int idle_mode=21;
  int mode;

  int shunt_1=1;          //Anschluss des Shunt 1 - PFC  Laden und Entladen
  int shunt_2=2;          //Anschluss des Shunt 2 - DCDC Laden und Entladen
  //Ausgangsschaltglieder: Nummer des digitalen Ports für MEGA:
  int pfc=49;
  int dc_load=45;
  int dc_source=47;
  int lessy=43;  
  int counter=0;
  int shunt1_value;
  int shunt2_value;
  pinMode(pfc_operating_mode, INPUT);
  pinMode(dcdc_ch_mode,       INPUT);
  pinMode(dcdc_dch_mode,      INPUT);
  pinMode(idle_mode,          INPUT);

  //Konfiguration der Pins für direkte Ansteuerung der Komponenten
  pinMode(pfc,       OUTPUT);
  pinMode(dc_load,   OUTPUT);
  pinMode(dc_source, OUTPUT);
  pinMode(lessy,     OUTPUT);
  do
  {
    shunt1_value=analogRead(shunt_1)+1000;    //Werte werden mit 1000 addiert um definiert immer 9Bytes an Daten zu senden
    shunt2_value=analogRead(shunt_2)+1000;
    Serial.print(shunt1_value,DEC);
    Serial.print("/");
    Serial.print(shunt2_value,DEC);
    counter++;
    delay(10);

    mode=Serial.read();
    //  Serial.println(mode);
    delay(10);
    switch (mode)
    {
    case '1':
      if (state_reg!=1) {
        Serial.println("PFC Operating initiiert");
        Serial.println("Schaltglieder werden gesetzt. Bitte warten!");
        digitalWrite(dc_load,LOW);
        digitalWrite(dc_source,LOW);
        digitalWrite(pfc,HIGH);
        delay(500);
        digitalWrite(lessy,HIGH);  
        delay(500);  
        Serial.println("Schaltglieder erfolgreich gesetzt");
        state_reg=1;
        Serial.println(state_reg);
        break;
      }
      case ('2'):
      if (state_reg!=2) {
        Serial.println("DCDC LADE-Modus initiiert");
        Serial.println("Schaltglieder werden gesetzt. Bitte warten!");
        digitalWrite(pfc,LOW);
        digitalWrite(dc_source,LOW);
        digitalWrite(lessy,HIGH);
        delay(500);
        digitalWrite(dc_load,HIGH);
        delay(500);
        Serial.println("Schaltglieder erfolgreich gesetzt");
        Serial.println();
        state_reg=2;
        break;
      }
      case ('3'):
      if (state_reg!=3){
        Serial.println("DCDC ENTLADE-Modus initiiert");
        Serial.println("Schaltglieder werden gesetzt. Bitte warten!");
        digitalWrite(pfc,LOW);
        digitalWrite(dc_load,LOW);
        digitalWrite(dc_source,HIGH);
        delay(500);
        digitalWrite(lessy,HIGH);
        delay(500);
        Serial.println("Schaltglieder erfolgreich gesetzt");
        Serial.println();
        state_reg=3;
        break;
      }
      case ('4'):
      if (state_reg!=4){
        Serial.println("IDLE Mode initiiert");
        Serial.println("Schaltglieder werden gesetzt. Bitte warten!");
        digitalWrite(pfc,LOW);
        digitalWrite(lessy,LOW);
        digitalWrite(dc_load,LOW);
        digitalWrite(dc_source,LOW);
        delay(500);
        Serial.println("Schaltglieder erfolgreich gesetzt");
        Serial.println();
        state_reg=4;
        break;
      }
    }
  }
  while(state_reg!=0);
}
So....
Nach reichlich experimentieren, einem geballten Haufen Frustration und einem Quäntchen Glücksgefühl, bedingt durch ein kleines Erfolgserlebnis bin ich einen Schritt weiter und stehe vor einem neuen Problem.

Zunächst aber ein paar Dinge zu meinem vorigen Post. Wenn man sich das VI angesehen hat, dann stellt man fest, dass ich die "serielle" Schnittstelle als Parallelport nutzen wollte Tongue Ist mir selbst erst im Laufe des Tages klar geworden und war natürlich nicht beabsichtigt. Dies habe ich nun korrigiert. Nun arbeite ich die Lese- und Schreibzyklen tatsächlich sequenziell ab.

Der Arduino reagiert die ersten paar Sekunden brav auf meine Eingaben, bis dann RX und TX LED´s aus unerklärlichem Grund dauerhaft aufleuchten. Wenn das passiert, akzeptiert der Controller scheinbar keine Eingaben mehr und gibt auch nichts mehr zurück - er hat sich also aufgehangen.
Ich frage mich natürlich warum.

Meinen Arduino code habe ich geringfügig angepasst. Die Änderungen betreffen nur die Erfassung der seriellen Werte und den Aufruf des entsprechenden Programmteils:
Code:
do
  {

     shunt1_value=analogRead(shunt_1)+1000;    //Werte werden mit 1000 addiert um definiert immer 9Bytes an Daten zu senden
     delay(10);
     shunt2_value=analogRead(shunt_2)+1000;
     delay(10);
     Serial.print(shunt1_value,DEC);
     Serial.print("/");
     Serial.print(shunt2_value,DEC);
    
//  counter++;
     delay(10);

    mode=Serial.read();


    if ((mode=='1') && (state_reg!=1)){
      Serial.println("PFC Operating initiiert");
      Serial.println("Schaltglieder werden gesetzt. Bitte warten!");
      digitalWrite(dc_load,LOW);
      digitalWrite(dc_source,LOW);
      digitalWrite(pfc,HIGH);
      delay(500);
      digitalWrite(lessy,HIGH);  
      delay(500);  
      Serial.println("Schaltglieder erfolgreich gesetzt");
      state_reg=1;
    }
    if ((mode=='2') && (state_reg!=2)){
      Serial.println("DCDC LADE-Modus initiiert");
      Serial.println("Schaltglieder werden gesetzt. Bitte warten!");
      digitalWrite(pfc,LOW);
      digitalWrite(dc_source,LOW);
      digitalWrite(lessy,HIGH);
      delay(500);
      digitalWrite(dc_load,HIGH);
      delay(500);
      Serial.println("Schaltglieder erfolgreich gesetzt");
      Serial.println();
      state_reg=2;      
    }
    if ((Serial.read()=='3') && (state_reg!=3)){        
      Serial.println("DCDC ENTLADE-Modus initiiert");
      Serial.println("Schaltglieder werden gesetzt. Bitte warten!");
      digitalWrite(pfc,LOW);
      digitalWrite(dc_load,LOW);
      digitalWrite(dc_source,HIGH);
      delay(500);
      digitalWrite(lessy,HIGH);
      delay(500);
      Serial.println("Schaltglieder erfolgreich gesetzt");
      Serial.println();
      state_reg=3;  
    }
    if ((Serial.read()=='4') && (state_reg!=4)){
      Serial.println("IDLE Mode initiiert");
      Serial.println("Schaltglieder werden gesetzt. Bitte warten!");
      digitalWrite(pfc,LOW);
      digitalWrite(lessy,LOW);
      digitalWrite(dc_load,LOW);
      digitalWrite(dc_source,LOW);
      delay(500);
      Serial.println("Schaltglieder erfolgreich gesetzt");
      Serial.println();
      state_reg=4;      
    }
  }

  while(state_reg!=0);

Hat jemand eine Idee was da schief läuft, bzw. wo ich nach einem Fehler suchen sollte?
Problem gelöst.

Habe den Receive Buffer nicht leer geräumt. Nachdem ich ein Flush Buffer eingebaut habe funktioniert das VI problemlos.

Topic kann geschlossen werden.
Referenz-URLs