Ohne USB-Verbindung kein laufendes Programm

Hallo Forum,

ich sende einen Sollwert per Java Programm an den Arduino (Uno).
Das funktioniert alles einwandfrei.
Beende ich jedoch das Programm, welches den Wert sendet so unterbicht mein Arduinoprogramm ebenfalls.
Was kann ich dagegen tun, bzw. an was liegt das?

Grüße

Das liegt vermutlich an deinem Quellcode, der Mikrocontroller wird auf eingehende Daten warten. Zeig den Code, dann erklären wir, wie es besser gemacht wird. :wink: Oder wir verweifeln bei der Fehlersuche einfach mit... :smiley:

Nicht erschrecken, es ist momentan ein wenig unordentlich, da ich gerade viel am ausprobieren bin

int pin1 = 2;
int pin2 = 3;
int pin7 = 7;
int pin8 = 8;
int AnsteuerungM1 = 9;
long counter;
boolean goingUp = false;
boolean goingDown = false;



//PID Variablen

long w = 0;
double e = 0;
double x = 0;
double esum = 0;
double Kp,Ki,Ta;
double yPID = 0;
double AnstM = 0;

//Lesen-Schreiben-Variablen
byte incomingByte = 0;
String incomingString = "";
boolean Abfrage = false;


void setup()
{
  counter = 0;
  //Serial prints for debugging and testing
  Serial.begin(115200);

  /* Setup encoder pins as inputs */
  pinMode(pin1, INPUT); // Pin 2
  pinMode(pin2, INPUT); // Pin 4
  pinMode(pin7, OUTPUT);
  pinMode(pin8, OUTPUT); 
  pinMode(AnsteuerungM1,OUTPUT);
  // encoder pin on interrupt 0 (pin 2)
  attachInterrupt(0, decoder, FALLING);
  
  
  
}
int i = 0;
void loop()
{
  //using while statement to stay in the loop for continuous
  //interrupts
  //Serial read
  
   if(Serial.available() > 0 && i<5) 
  {
    
    // read the incoming byte:
    incomingByte = Serial.read(); 
    incomingString = incomingString + incomingByte;
    Abfrage = true;
    Serial.println(incomingString);
    i++;

  }
  
 if(Abfrage)
 {
   w = StringTOInt(incomingString);
   Serial.print("w: ");
   Serial.println(w);
   Serial.print("x: ");
   Serial.println(x);
   Abfrage  = false;
 }
   //incomingString = "";
  // Serial.print("w ");
   //Serial.println(w);
   
  
  //Serial.print("w ");
  //Serial.println(w);
  
  //PID Regler
  Kp = 60; //30 --> 60
  Ki = 0.1;//0.005 --> 0.1
  Ta = 0.01;//0.01
 
 
  x = counter;
  e = w - x;
  
   e=e/1000;
   if(e>=0)
  {
    digitalWrite(pin7,HIGH);
    digitalWrite(pin8,LOW);
  }
  
  if(e<=0)
  {
     digitalWrite(pin7,LOW);
    digitalWrite(pin8,HIGH);
  }
  
  if(e==0)
  {
    digitalWrite(pin7,LOW);
    digitalWrite(pin8,LOW);
  }
    
  if(e<=0)
  {
    e = -e;
  }
  
  if(yPID<=254)  esum = esum + e;    //gegen Wind - up - Effekt, der I Anteil wird eingefroren
 
  if(esum < -1000000) {esum = -1000000;}
  if(esum > 1000000) {esum = 1000000;}
  yPID = Kp*e + Ki*Ta*esum;
  if(yPID < 60) {yPID = 0;}
  if(yPID > 255) {yPID = 255;}
  
  
  //Ansteuerung Motor
  
    
  //Motor läuft nicht mehr an wenn AnstM < 60 wird!
  analogWrite(AnsteuerungM1,yPID);
  
   //Serielle Übertragung
  if(counter%100==0)
  {
    //Serial.println(counter);
    //Serial.print("yPID ");
    //Serial.println(yPID);
    //Serial.print("esum: ");
    //Serial.println(esum); 
    Serial.print("e3: ");
    Serial.println(e*1000); 
    Serial.println("");
  }
}

void decoder()

{
  counter --;
  counter += 2*digitalRead(pin2);
}

long StringTOInt(String incomingString) //long da sonst nur Zahlen bis 32768 möglich!
{
  return incomingString.toInt(); //.toInt wandelt String in Integer Zahl
}

Resetiert sich der Arduino bei beenden des Programms?
Grüße Uwe

Nein, resetten tut er sich nicht.
Der Ausgang wird einfach nicht mehr angesteuert.

Grüße

Hallo FTE11
Spielen wir mal ein bißchen “was bin ich”.

  • Gehe ich recht in der Annahme, daß an Pin 2 und 3 Arduino ein inkrementeller Encoder angeschlossen ist?
  • An Pin 9 ein PWM Ausgang für die Motorgeschwindigkeit
  • An Pin 7 und 8 ein Signal für die Drehrichtung bzw für Stop.

Probleme die ich in einem Code gefunden habe die aber nicht das Verhalten erklähren.

if(Serial.available() > 0 && i<5) 
  {    
    // read the incoming byte:
    incomingByte = Serial.read(); 
    incomingString = incomingString + incomingByte;
    Abfrage = true;
    Serial.println(incomingString);
    i++;
  }

Du änderst nirgens i; also überträgst Du nur 5 Byte.
Ansonsten verstehe ich auch nicht den Grund des beschriebenen Fehlers.

Der Ausgang wird einfach nicht mehr angesteuert.

Welcher Ausgang?

Wie ist die Spannungsversorgung des Arduinos?

Grüße Uwe

uwefed:
Hallo FTE11
Spielen wir mal ein bißchen “was bin ich”.

  • Gehe ich recht in der Annahme, daß an Pin 2 und 3 Arduino ein inkrementeller Encoder angeschlossen ist?
  • An Pin 9 ein PWM Ausgang für die Motorgeschwindigkeit
  • An Pin 7 und 8 ein Signal für die Drehrichtung bzw für Stop.

Drei mal ja!

uwefed:
Probleme die ich in einem Code gefunden habe die aber nicht das Verhalten erklähren.

if(Serial.available() > 0 && i<5) 

{    
   // read the incoming byte:
   incomingByte = Serial.read();
   incomingString = incomingString + incomingByte;
   Abfrage = true;
   Serial.println(incomingString);
   i++;
 }



Du änderst nirgens i; also überträgst Du nur 5 Byte.
Ansonsten verstehe ich auch nicht den Grund des beschriebenen Fehlers.

i wird doch in der letzten Zeile erhöht oder?

Welcher Ausgang?
Wie ist die Spannungsversorgung des Arduinos?

Pin 9 also das PWM Signal
Bezüglich der Spannungsversorgung hänge ich momentan an USB.

Grüße

FTE11:
i wird doch in der letzten Zeile erhöht oder?

Ja, das habe ich gesehen; aber i wird nie wieder auf null gesetzt. Darum wird nur einmal ein Wert von der Seriellen Schnittstelle gelesen.

FTE11:
... Bezüglich der Spannungsversorgung hänge ich momentan an USB. ..

Heißt Dein Problem nicht "Ohne USB-Verbindung kein laufendes Programm"?
wenn Du USB abziehst, woher soll Arduino die Spannungsversorgung bekommen?

Grüße Uwe

Hallo Uwe,

ich ziehe nicht das USB Kabel, sondern ich beende mein Java-Programm überwelches ich werte Sende und Empfange.

mit dem i hast du natürlich recht, dass werde ich mir gleich anschauen.

Grüße

Verliert er das Programm auch wenn Du ihn resetierst? (mit Resettaste) Wenn JA ist er nicht zu gebrauchen da für Debuging Du die serielle Schnittstelle brauchst und beim öffenen des Terminals Arduino resettiert wird.
Grüße Uwe

Hey Uwe,

nein wenn ich resette verliert er das Programm nicht!

Nur für mein Versändnis. Wenn ich die Serielle Kommunikation starte/beende werden dann alle variablen auf ihren ursprungswert zurück gesetzt?

Grüße

uwefed:
Verliert er das Programm auch wenn Du ihn resetierst? (mit Resettaste) Wenn JA ist er nicht zu gebrauchen da für Debuging Du die serielle Schnittstelle brauchst und beim öffenen des Terminals Arduino resettiert wird.
Grüße Uwe

Hab da was verwechselt;
Wenn Du das Javaprogramm zu machst resetiert sich der Arduino?
Grüße Uwe

FTE11:

Nur für mein Versändnis. Wenn ich die Serielle Kommunikation starte/beende werden dann alle variablen auf ihren ursprungswert zurück gesetzt?

Die serielle Komunikation hat keinen Einfluß auf die Abarbeitung des Programms. Aber über die serielle Schnittstelle kann der Arduino resetiert werden. (DTR-Signal)
Bei einem Reset werden die Variablen wieder auf die Startwerte in setup() gesetzt weil das Programm neu abgearbeitet wird.

Viele Grüße Uwe

Hey Uwe,

ja das Java programm resitiert den Arduino.
Habe es nun aber über das Java Programm gelöst, die Verbindung bleibt offen und ich kann über verschiedene Threads lesen und Empfangen.

Ich denke das ist für mich erst einmal eine gute Lösung.

Danke für deine Hilfe

Grüße

Gratuliere!!

Also war das Problem, daß beim beenden des Programms auf dem PC der Arduino resetiert wurde und bis nicht über die serielle Schnittstelle Daten übertragen wurden, die Ausgänge nicht angesteuert wurden.
Eine Lösung die ich sehe ist einem Standartstartwert zu bestimmen und mi dem zu starten und dann über die serielle Schnittstelle diesen nach Notwendigkeit zu ändern.

Viele Grüße Uwe