In Processing den COM Port auswählen und Werte vom Arduino einlesen.

Wenn Werte vom Arduino abgerufen werden sollen muß zuerst der richtige COM Port ausgewählt werden und dann kann sich Processing damit verbinden. Für die Abfrage der Werte wird eine kurze Anfrage gesendet und der Arduino gibt den entsprechenden String zurück. Dieser wird in Processing eingelesen und dargestellt.

Hier werden als Beispiel 3 mögliche Strings ausgegeben:
1. Anfrage: n Antwort: Name des Geräts
2. Anfrage: s Antwort: Software Version
3. Anfrage: v Antwort: USB Spannung

Die USB Spannung wird ermittelt wie hier beschrieben. Dazu ist nur eine Brücke vom 3,3V Pin zum A0 Eingang notwendig.

Hier das Arduino Programm

// Arduino USB-Spannung an Processing ausgeben
//
// Matthias Busse 21.3.2017 Version 1.0
 
char wert; // Daten von der seriellen Schnittstelle
float vcc;
 
void setup() {
  Serial.begin(38400); // Baudrate
}
 
void loop() {
  vcc = 3.30 / analogRead(0) * 1023;
  while (Serial.available()) {       // Wenn serielle Daten kommen, dann lesen
    wert = Serial.read();            // Daten in wert speichern
    if (wert== 'n') {                // n: Name ausgeben
      Serial.println("USB Spannung messen");
    }
    if (wert== 's') {                // s: Software Version ausgeben
      Serial.println("Version 1.0");
    }
    if (wert== 'v') {                // v: Spannung ausgeben
      Serial.print(vcc);
      Serial.println(" V");
    }
  }
}

In Processing wird dann folgendes gemacht
Eine COM Port Auswahl mit einfachen Pfeiltasten. Dann kann man sich mit dem COM Port verbinden, die Verbindung wieder trennen oder die Liste der COM Ports neu einlesen. Der aktuelle Status wird im Feld darunter ausgegeben. Dazu wird eine einfache Button Klasse verwendet.

Dann werden die 3 Anfragen nacheinander an den Arduino gesendet und die Antworten im rechten Fenster ausgegeben.

Hier das Processing 3.3 Programm

// COM Schnittstellen Auswahl in der Processing Software und anfragen der USB Spannung vom Arduino.
//
// Die COM Port Listen Auswahl stammt von hier:
// https://startingelectronics.org/software/processing/serial-port-select/
// hoch / runter: wählt den COM Port aus
// verbinden / trennen: belegt den Port und gibt ihn wieder frei
// neu lesen: liest die COM Port Liste neu ein
//
// Immer erst trennen und dann das Programm schliessen oder neu übersetzten
// Wenn sich die COM Ports nicht mehr verbinden lassen weil man zu viel rungespielt hat ;-)
// 1. Processing schliessen und neu starten
// 2. Rechner neu starten
//
// Hardware: Arduino mit einer Drahtbrücke von 3,3V zu A0
//
// Matthias Busse 21.3.2017 Version 1.0                

import processing.serial.*;
Serial serial_port = null;        // die serielle Schnittstelle

Button btn_serial_hoch; // 5 Buttons definieren
Button btn_serial_runter;
Button btn_serial_verbinden;
Button btn_serial_trennen;
Button btn_serial_lesen;
String serial_list; // Liste der seriellen Ports
String wert; // Rückgabewerte
int serial_list_index = 0; // aktuell gewählter Port 
int num_serial_ports = 0; // Anzahl der Ports
int test=0; // Statuszeilen Ausgabe 1-Ja 0-Nein

void setup() {
  size (608, 135); // Fenstergröße
  btn_serial_hoch = new Button("^", 140, 10, 40, 20); // Buttons erstellen
  btn_serial_runter = new Button("v", 140, 50, 40, 20);
  btn_serial_verbinden = new Button("verbinden", 190, 10, 100, 25);
  btn_serial_trennen = new Button("tennen", 190, 45, 100, 25);
  btn_serial_lesen = new Button("neu lesen", 190, 80, 100, 25);
  serial_list = Serial.list()[serial_list_index]; // Liste der COM Ports
  if(test==1) {
    println(Serial.list());
    println(Serial.list().length);
  }
  num_serial_ports = Serial.list().length; // Anzahl der Ports
  surface.setTitle("USB Spannung vom Arduino auslesen.");
}

void mousePressed() {
  if (btn_serial_hoch.MouseIsOver()) { // hoch Button
    if (serial_list_index > 0) {
      serial_list_index--; // Liste nach oben bewegen
      serial_list = Serial.list()[serial_list_index];
    }
  }
  if (btn_serial_runter.MouseIsOver()) { // runter Button
    if (serial_list_index < (num_serial_ports - 1)) {
      serial_list_index++; // Liste nach unten
      serial_list = Serial.list()[serial_list_index];
    }
  }
  if (btn_serial_verbinden.MouseIsOver()) { // verbinden Button
    if (serial_port == null) {
      serial_port = new Serial(this, Serial.list()[serial_list_index], 38400); // verbinden mit dem gewählten Port
    }
  }
  if (btn_serial_trennen.MouseIsOver()) { // Trennen Button
    if (serial_port != null) {
      serial_port.stop(); // Port trennen
      serial_port = null;
    }
  }
  if (btn_serial_lesen.MouseIsOver()) { // lesen Button
    serial_list = Serial.list()[serial_list_index]; // Liste neu ein lesen
    num_serial_ports = Serial.list().length;
  }
}

void draw() {
  fill(255); // weißer Hintergrund
  rect(2,2,300,130); // weißes COM Hintergrund Feld
  rect(305,2,300,130); // weißes Ausgabefeld
  btn_serial_hoch.Draw(); // Buttons zeichen
  btn_serial_runter.Draw();
  btn_serial_verbinden.Draw();
  btn_serial_trennen.Draw();
  btn_serial_lesen.Draw();
  DrawTextBox("COM waehlen", serial_list, 10, 10, 120, 60); // Testbox zeichen
  DrawStatusBox();
}

void DrawStatusBox() { // den aktuellen Status ausgeben
  fill(255); // Box weiß
  rect(10, 100, 120, 20);
  fill(0); // Text schwarz
  textSize(14);
  text("Status:", 15, 80, 110, 20);
  if(serial_port == null) {
    text("getrennt", 15, 100, 110, 20);
  } 
  else {
    text(serial_list, 15, 100, 110, 20); // Schnittstelle eintragen
    DrawOutputBox(); // Ausgaben anfragen
  }
}

void DrawOutputBox() {
// Daten vom Arduino anfragen und ausgeben 
  delay(100); // warten bis die Verbindung hergestellt ist
  if(serial_port != null) {
    if(test==1) println("Port vorhanden");
    fill(0);
    text("Ausgaben vom Arduino", 312,10,200,20);
    text("Name", 312,40,70,20);
    text("Software", 312,70,70,20);
    text("Spannung", 312,100,70,20);
    serial_port.write('n'); // Namen anfragen
    DrawResultBox(390,40);
    serial_port.write('s'); // Software Version anfragen
    DrawResultBox(390,70);
    serial_port.write('v'); // Spannung anfragen
    DrawResultBox(390,100);
    delay(500); // warten bis zu nächsten Anfrage
  }
}

void DrawResultBox(int x0, int y0) {
  delay(100); // nach der Anfrage etwas warten bis die Antwort vorliegt
  if(test==1) println(serial_port.available());
  while ( serial_port.available() > 0) {
    wert = serial_port.readStringUntil('\n'); // Antwort einlesen
    if(test==1) println(wert);
    fill(255); // Feld weiß zeichen
    rect(x0, y0, 205, 20);
    fill(0); // Text schwarz ausgeben
    text(wert, x0+5, y0, 195, 20);
  }
}

void DrawTextBox(String title, String str, int x, int y, int w, int h) {
// Die Com Port Listen Box mit Überschrift und Inhalt ausgeben
  fill(255); // weiß
  rect(x, y, w, h);
  fill(0); // schwarz
  textAlign(LEFT);
  textSize(14);
  text(title, x + 10, y + 10, w - 20, 20);
  fill(255,0,0); // rot
  textSize(12);  
  text(str, x + 10, y + 40, w - 20, h - 10);
  fill(255); // schwarz
}

class Button { // Button class definieren
  String label;
  float x;    // oben links x
  float y;    // oben links y
  float w;    // Breite
  float h;    // Höhe
  Button(String labelB, float xpos, float ypos, float widthB, float heightB) { // constructor
    label = labelB;
    x = xpos;
    y = ypos;
    w = widthB;
    h = heightB;
  }
  void Draw() { // Button zeichen
    fill(218);
    stroke(141);
    rect(x, y, w, h, 10);
    textAlign(CENTER, CENTER);
    fill(0);
    text(label, x + (w / 2), y + (h / 2));
  }
  boolean MouseIsOver() { // Rückgabe true wenn Maus über dem Button ist
    if (mouseX > x && mouseX < (x + w) && mouseY > y && mouseY < (y + h)) {
      return true;
    }
    return false;
  }
}

Das Ausgabe Fenster von Processing unter Windows sieht dann so aus.

Damit kann fortlaufend die USB Spannung vom Arduino überwacht werden.

Das sollte nicht nur unter Windows 32 / 64 Bit laufen, sondern auch unter MAC, Linux und neuerdings sogar auf den Pi.

Verwendet wurde:
Arduino SW 1.8.0
Processing 3.3
Arduino Uno
Drahtbrücke
Windows Rechner

von Matthias Busse

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.