Author Topic: Steuerung höhenverstellbarer Ikea-Tisch  (Read 23530 times)

afx2000

  • Newbie
  • *
  • Posts: 20
  • Karma: +0/-0
    • Meine Webseite
Steuerung höhenverstellbarer Ikea-Tisch
« on: September 04, 2013, 05:33:10 PM »
Hallo zusammen

Bin gerade an meinem ersten "grossen" Arduino Projekt: Die Steuerung eines höhenverstellbaren Ikea-Tisches.

Der Tisch steht in meinem Büro und funzt bereits 100%. Unter der Tischkante sind 2 Knöpfe Up und Down.

Jetzt will ich auf meiner Windows-Kiste ein GUI mit diesen Knöpfen (Schritt 1) und dann mal noch per Ultraschall-Sensor einen Positionsspeicher (Schritt 2).

Habe Python installiert. Kann darüber bereits ne Test-LED am Arduino on-off schalten.
Nun suche ich ne passende GUI. Habe null Ahnung davon.
Folgendes schon versucht:
  • GTK mit Glance (oder so), blieb dort an gefühlten 1000 Abhängigkeiten stecken
  • Web-Interface (dafür bräuchte ich aber noch ein Ethernet-Shield oder ä. Muss nicht sein.
  • wxPython, wollte ich jetzt testen, aber das funzt anscheinend nur mit Python 2.6 und 2.7, ich habe aber 3.3 installiert (und zwar 32bit, nachdem die 64bit mit serialPy nicht wollte)
  • Lohnt sich Qt? Das war doch Nokia, und das ist ja jetzt MS... :o

Die Installations/Deinstallations Versuche hängen mir momentan zum Halse raus...  da kriesch Plagg! >:(

Kennt jemand was einfacheres? Ich brauch ja wirklich nicht viel...

Gruss
Mario

dinoi

  • freakyfriday
  • Sr. Member
  • *
  • Posts: 441
  • Karma: +7/-0
    • Dinoi
Re: Steuerung höhenverstellbarer Ikea-Tisch
« Reply #1 on: September 04, 2013, 08:18:17 PM »
Hallo Mario,

das würde ich mit Processing machen ( http://processing.org ).

In der Arduino IDE gibt es unter Kommunikation das Beispiel Dimmer.

http://arduino.cc/en/Tutorial/Dimmer

Das sendet genau wie Du willst Daten vom Processing (Maus Position) an den Arduino.
Processing ist schnell gelernt und braucht auch keine Installation.

Viel Erfolg
Gruss Dinoi

arduinopraxis

  • freakyfriday
  • Hero Member
  • *
  • Posts: 553
  • Karma: +11/-0
  • Arduino Praxiseinstieg (4.Auflage)
    • Arduino Praxiseinstieg, 4. Auflage
Re: Steuerung höhenverstellbarer Ikea-Tisch
« Reply #2 on: September 04, 2013, 08:36:37 PM »
Hallo Mario,

auch ich empfehle dir Processing.
Eine weitere, mögliche Variante wäre das Erstellen eines Windows-Formulares mittels Visual Studio, programmiert in Visual Basic oder C#.

Vorteile von Processing hat Dinoi bereits erwähnt.

Gruss
Thomas

afx2000

  • Newbie
  • *
  • Posts: 20
  • Karma: +0/-0
    • Meine Webseite
Re: Steuerung höhenverstellbarer Ikea-Tisch
« Reply #3 on: September 05, 2013, 01:03:51 PM »
Hey Super, vielen Dank!

Habe gestern auch mal mit Processing was versucht, aber anscheinend zu schnell aufgegeben.
Das ist wirklich ne super Sache!  :D

Gruss
Mario

arduinopraxis

  • freakyfriday
  • Hero Member
  • *
  • Posts: 553
  • Karma: +11/-0
  • Arduino Praxiseinstieg (4.Auflage)
    • Arduino Praxiseinstieg, 4. Auflage
Re: Steuerung höhenverstellbarer Ikea-Tisch
« Reply #4 on: September 05, 2013, 04:04:45 PM »
Quote
Jetzt will ich auf meiner Windows-Kiste ein GUI mit diesen Knöpfen (Schritt 1) und dann mal noch per Ultraschall-Sensor einen Positionsspeicher (Schritt 2).


Mario,
wieso muss diese GUI auf deinem Rechner laufen?

Ich würde ein separates Display, bespielsweise ein Arduino mit Touchscreen (http://shop.boxtec.ch/tft-lcd-touch-shield-p-40559.html),  verwenden. So siehst du auch die Position wenn dein Rechner ausgeschaltet ist  ;)
Vermutlich kannst du das Display direkt auf dem Arduino-Board betreiben welches auch die Motoren ansteuert.

Gruss
Thomas


afx2000

  • Newbie
  • *
  • Posts: 20
  • Karma: +0/-0
    • Meine Webseite
Re: Steuerung höhenverstellbarer Ikea-Tisch
« Reply #5 on: September 06, 2013, 02:19:59 PM »
Hoi Thomas

Ich wollte eben genau weg von einem 2. Ort wo ich das steuern kann/muss. Im Büro läuft der PC sowieso immer wenn ich da bin, also weshalb nicht rasch Fenster wechseln und Tischhöhe ändern. So kann ich fauler Sack meine Finger auf Keyboard/Mouse lassen und muss nicht woanders hin greifen ;)

Die Höhe muss ich gar nicht sehen, ich möchte einfach einmal Position "Stehen" und einmal Position "Sitzen" speichern und fertig.

Es läuft jetzt übrigens perfekt, ich habe ein Windows-Exe mit 2 Buttons (up/down).
Bei Gelegenheit bastle ich noch den Ultraschall-Sensor ein (und ein Kalibrier-Programm, und ein Arduino-Port-Selektor).

Wusste gar nicht wie mächtig und einfach Processing mit all den Libraries ist...

Gruss
Mario




afx2000

  • Newbie
  • *
  • Posts: 20
  • Karma: +0/-0
    • Meine Webseite
Re: Steuerung höhenverstellbarer Ikea-Tisch
« Reply #6 on: September 27, 2013, 12:23:18 PM »
Ok, der Ultraschallsensor ist eingebaut und ich kann die Distanz in cm auf meinem Processing-GUI anzeigen.
Aber nach 1-2s stürzt mir das Teil ab.

Code: [Select]
java.lang.NullPointerException
at processing.mode.java.runner.Runner.findException(Runner.java:947)
at processing.mode.java.runner.Runner.reportException(Runner.java:892)
at processing.mode.java.runner.Runner.exceptionEvent(Runner.java:818)
at processing.mode.java.runner.Runner$2.run(Runner.java:707)

Ich weiss jetzt echt nicht wo suchen...

Arduino-Code:
Code: [Select]
int TableDown = 7;    // Arduino Pin to move the table down, Relais 1
int TableUp = 6;    // Arduino Pin to move the table up, Relais 2
int trigPin = 12;  // Arduino Pin to trigger ultrasonic sensor
int echoPin = 11;  // Arduino Pin to receive ultrasonic values

void setup()

  pinMode(TableDown, OUTPUT);
  pinMode(TableUp, OUTPUT);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
 
  // initialize the serial communication:
  Serial.begin(9600); 
}

void loop() {
 
  long duration, distance;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
 
  //delayMicroseconds(100);
  Serial.println(distance);   
  //delayMicroseconds(100);
 
 
  byte buttonPressed;
 
  // check if data has been sent from the computer: 
  if (Serial.available()) {
    // read the most recent byte (which will be from 0 to 255):
    buttonPressed = Serial.read();
   
    // 1 = Button Down
    if(buttonPressed == 1){
      digitalWrite(TableDown,HIGH);// NO1 and COM1 Connected;
    }
   
    // 2 = Button Up
    if(buttonPressed == 2){
      digitalWrite(TableUp,HIGH);// NO2 and COM2 Connected;
    }   
   
    // Stop all Buttons
    if(buttonPressed == 0){
      digitalWrite(TableDown,LOW);// NO1 and COM1 Disconnected;
      digitalWrite(TableUp,LOW);// NO2 and COM2 Disconnected;
    }
  }
}

Processing Code (ohne GUI):
Code: [Select]
// Need G4P library
import g4p_controls.*;
import processing.serial.*;
Serial port;

public void setup(){
  size(480, 320, JAVA2D);
  createGUI();
  customGUI();
  // Place your setup code here
 
}

public void draw(){
  background(230);
 
}

// Use this method to add additional statements
// to customise the GUI controls
public void customGUI(){
 
  port = new Serial(this, "COM4", 9600);
  buttonDown.fireAllEvents(true);
  buttonUp.fireAllEvents(true);

}

void serialEvent(Serial port) // Is called everytime there is new data to read
{
  if (port.available() > 0)
  {
    String completeString = port.readStringUntil(10); // Read the Serial port until there is a linefeed/carriage return

    if (completeString != null) // If there is valid data insode the String
    {
      trim(completeString); // Remove whitespace characters at the beginning and end of the string
      distanceVal.setText(completeString);     
    }
  }
 
}

Kann mir höchstens vorstellen, dass das dauernde write und read auf dem serialport Probleme macht, habe schon Diverses versucht, ohne Erfolg. Delays, Exceptions, irgendwas mit threadsave iterations...

Hat jemand ne Idee?

Gruss
Mario

dinoi

  • freakyfriday
  • Sr. Member
  • *
  • Posts: 441
  • Karma: +7/-0
    • Dinoi
Re: Steuerung höhenverstellbarer Ikea-Tisch
« Reply #7 on: September 27, 2013, 01:31:03 PM »
Hallo Mario,

ja das könnte gut am Serial Port liegen. Bringt er Dir nicht die Meldung an welcher Coding Zeile er das Problem hat? In dem Processing Code liest Du ja die Höhe aus das sieht man im Code, das scheint ok zu sein. Aber irgendwo schreibst Du ja auch den "Button" Status wieder über den Serial Port zurück zum Arduino, wo machst Du das und wie?

Gruss Dinoi

pylon

  • freakyfriday
  • Full Member
  • *
  • Posts: 158
  • Karma: +16/-0
Re: Steuerung höhenverstellbarer Ikea-Tisch
« Reply #8 on: September 28, 2013, 12:01:50 PM »
Am Arduino liegt's wahrscheinlich nicht (der stürzt ja auch nicht ab), aber Deinen GUI-Code habe ich mehr in Verdacht. Du hast aber nicht den ganzen Processing-Code gespostet, sondern nur einen sehr kleinen Ausschnitt, zudem noch jenen, der allem Anschein nach unbeteiligt ist.
Poste den ganzen Code und teile uns bitte auch gleich den Link zur verwendeten Bibliothek(en) mit, denn auch die kann den Fehler enthalten.

afx2000

  • Newbie
  • *
  • Posts: 20
  • Karma: +0/-0
    • Meine Webseite
Re: Steuerung höhenverstellbarer Ikea-Tisch
« Reply #9 on: September 30, 2013, 08:16:12 AM »
Dieser Processing-Code fehlte noch:

Code: [Select]
/* =========================================================
 * ====                   WARNING                        ===
 * =========================================================
 * The code in this tab has been generated from the GUI form
 * designer and care should be taken when editing this file.
 * Only add/edit code inside the event handlers i.e. only
 * use lines between the matching comment tags. e.g.

 void myBtnEvents(GButton button) { //_CODE_:button1:12356:
     // It is safe to enter your event code here 
 } //_CODE_:button1:12356:
 
 * Do not rename this tab!
 * =========================================================
 */

public void buttonDown_click(GButton source, GEvent event) { //_CODE_:buttonDown:404459:
  println("buttonDown - PRESSED");
  port.write(1);
 
  if(event == GEvent.RELEASED || event != GEvent.PRESSED) { //workaround for g4p 2.0b7)
    println("buttonDown - RELEASED");
    port.write(0);
  }
} //_CODE_:buttonDown:404459:

public void buttonUp_click(GButton source, GEvent event) { //_CODE_:buttonUp:582100:
  println("buttonUp - PRESSED");
  port.write(2);
 
  if(event == GEvent.RELEASED || event != GEvent.PRESSED) { //workaround for g4p 2.0b7)
    println("buttonUp - RELEASED");
    port.write(0);
  }
} //_CODE_:buttonUp:582100:

public void distanceVal_change1(GTextField source, GEvent event) { //_CODE_:distanceVal:930876:
  println("distanceVal - GTextField event occured " + System.currentTimeMillis()%10000000 );
} //_CODE_:distanceVal:930876:



// Create all the GUI controls.
// autogenerated do not edit
public void createGUI(){
  G4P.messagesEnabled(false);
  G4P.setGlobalColorScheme(GCScheme.GREEN_SCHEME);
  G4P.setCursor(ARROW);
  if(frame != null)
    frame.setTitle("Ikea Table Controller");
  buttonDown = new GButton(this, 320, 150, 80, 30);
  buttonDown.setText("Runter");
  buttonDown.setTextBold();
  buttonDown.addEventHandler(this, "buttonDown_click");
  buttonUp = new GButton(this, 320, 110, 80, 30);
  buttonUp.setText("Rauf");
  buttonUp.setTextBold();
  buttonUp.addEventHandler(this, "buttonUp_click");
  distanceVal = new GTextField(this, 320, 30, 80, 30, G4P.SCROLLBARS_NONE);
  distanceVal.setDefaultText("not ready");
  distanceVal.setOpaque(true);
  distanceVal.addEventHandler(this, "distanceVal_change1");
}

// Variable declarations
// autogenerated do not edit
GButton buttonDown;
GButton buttonUp;
GTextField distanceVal;

Jetzt merke ich gerade, dass es verschiedene Fehler gibt. Ohne, dass ich am Code oder HW was ändere:

NullPointerException (nichts geht mehr, GUI stürzt ab)
Code: [Select]
java.lang.NullPointerException
at processing.mode.java.runner.Runner.findException(Runner.java:947)
at processing.mode.java.runner.Runner.reportException(Runner.java:892)
at processing.mode.java.runner.Runner.exceptionEvent(Runner.java:818)
at processing.mode.java.runner.Runner$2.run(Runner.java:707)

Dann hatte ich kurz eine ConcurrentModificationException.

Und vorhin stand im Fenstertitel nichts (grauer Balken) aber folgender Fehler in der Konsole:
Code: [Select]
error, disabling serialEvent() for //./COM4
java.lang.reflect.InvocationTargetException
at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at processing.serial.Serial.serialEvent(Unknown Source)
at gnu.io.RXTXPort.sendEvent(RXTXPort.java:732)
at gnu.io.RXTXPort.eventLoop(Native Method)
at gnu.io.RXTXPort$MonitorThread.run(RXTXPort.java:1575)
Caused by: java.lang.NullPointerException
at g4p_controls.StyledString.getLines(Unknown Source)
at g4p_controls.GTextField.setStyledText(Unknown Source)
at g4p_controls.GTextField.setText(Unknown Source)
at IkeaTableController.serialEvent(IkeaTableController.java:57)

Das Programm stürzte aber nicht ab, die beiden Buttons up und down funktionierten noch, aber die Höhenanzeige war gefreezed. Sobald ich das Programm schliesse, erscheint wieder die NullPointerException. Stimmt, wegen dieser Meldung bin ich überhaupt auf das Serial-Problem gekommen...

Libraries (nur Processing):
import g4p_controls.*; // http://www.lagers.org.uk/g4p/download.html
import processing.serial.*; // http://processing.org/reference/libraries/serial/


dinoi

  • freakyfriday
  • Sr. Member
  • *
  • Posts: 441
  • Karma: +7/-0
    • Dinoi
Re: Steuerung höhenverstellbarer Ikea-Tisch
« Reply #10 on: September 30, 2013, 09:27:15 PM »
Hallo Mario, bis jetzt hatte ich nur Anwendungen welche entweder Daten vom Arduino zu Processing senden oder umgekehrt. Ich hatte noch keine bidirektionale Schnittstelle realisiert. Hier ein paar Tipps die Dir evtl. weiterhelfen:

- Der 2. Fehler kommt mit grosser Wahrscheinlichkeit davon, dass der Arduino bereits im loop Daten sendet. Dabei ist mir aufgefallen, dass er dass mit einer relativ hohen Taktrate sendet, es gibt keine Pause, da würde ich Dir empfehlen, mal nur alle 0,5 Sekunden zu senden am besten aber ohne delay. Siehe Arduino Beispiel blinkwithoutdelay. Das Processing muss auf jeden Fall zuerst laufen, und den Port verbunden haben, bevor der Arduino Daten sendet.

- Beim 1. Fehler würde ich mal prüfen ob nicht der Arduino teilweise 0 Werte oder leere Werte überträgt und dadurch das Processing abstürzt? Am besten mal Funktionen deaktivieren, bis der Fehler nicht mehr auftritt und dann wieder einbauen bis der Ort der Absturzes klar ist. In Processing kann man auch Meldungen auf die Konsole ausgeben um so Informationen über Variablen und den Programmablauf zu erhalten. Einfach die Funktion print() verwenden.

Viel Erfolg.
Gruss Dinoi

afx2000

  • Newbie
  • *
  • Posts: 20
  • Karma: +0/-0
    • Meine Webseite
Re: Steuerung höhenverstellbarer Ikea-Tisch
« Reply #11 on: October 01, 2013, 01:25:43 PM »
Hey Dinoi, ich glaube das wars!

Habe das Senden der Distanz vom Arduino zu Processing auf 100ms begrenzt. Ich konnte das blinkwithoutdelay-Example 1:1 übernehmen.
Vorher lief Processing ca. 2 Min im Dauer-Knopfdrück-Test und stürzte erst beim Beenden des Fensters mit einer NullPointerException ab. Konnte ich mit kurzer Laufzeit noch nicht nachvollziehen.

Fürs Erste mal ok so  8)



Code: [Select]
if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;   
    long duration, distance;
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    duration = pulseIn(echoPin, HIGH);
    distance = (duration/2) / 29.1;
   
    //delayMicroseconds(100);
    Serial.println(distance);   
    //delayMicroseconds(100);
  }

Als nächstes muss ich mal die Distanz-Ausgabe genauer anschauen. Selbst bei ruhendem Tisch schwankt die Anzeige im cm-Bereich....

Vorerst mal vielen Dank an Dinoi und pylon!
Mario

dinoi

  • freakyfriday
  • Sr. Member
  • *
  • Posts: 441
  • Karma: +7/-0
    • Dinoi
Re: Steuerung höhenverstellbarer Ikea-Tisch
« Reply #12 on: October 01, 2013, 08:42:06 PM »
Hallo Mario, das freut mich natürlich, dass Du damit weitergekommen  bisten. Bestens.
Gruss Dinoi