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