Touch Display als INPUT verwenden?

hallo liebe Gemeinde, seit ein paar Tagen verfolge ich ein Projekt (2achsige Maschine). daher meine frage kann ich mit einem touchdisplay auf dem ich z.B. 3 Buttons erstelle mit "Referenzfahrt" , "Start", "Stop"; diese maschine so ansteuern und zb auch noch die aktuelle motorposition auslesen lassen? mein gedanke: ich drücke die taste Referenzfahrt und die beiden achsen fahren zu den endschaltern und dann auf die position 1 danach drücke ich "start" und die maschine fährt position 1 bis zb. 5 ab doch wenn ich zwischendurch auf "Stop" drücke so wie ein Not aus bleibt sie stehen. so nun zu meinem Programm ich habe schon alles geshchrieben also die referenzfahrt und endschalter und er fährt auch alle anderen positionen ab. nun wollte ich hald als "Schmankerl" noch die motorposition und eben die buttons hinzufügen. Nun meine Hardware: Arduino mega, Arduino motorshield (2stepper), arduino tft LCD Mega Shield, TFT display 3,2 Zoll.

ich hoffe das waren genug infos. mfg basti

Bitte Links zur Hardware, die nicht von Arduino selbst stammt sowie zu den Bibliotheken, die Du dazu verwendest. Und poste den Code, den Du schon hast.

motor shield

board mega 2560

tft shield+display

code für refernzfahrt:

#include <AFMotor.h>
#include <AccelStepper.h>

AF_Stepper motorx (200,1);
AF_Stepper motory (200,2);

void forwardstepx()
{ motorx.onestep (FORWARD,DOUBLE);}
void backwardstepx()
{motorx.onestep(BACKWARD,DOUBLE);}
void forwardstepy()
{motory.onestep (FORWARD,DOUBLE);}
void backwardstepy()
{motory.onestep (BACKWARD,DOUBLE);}


AccelStepper stepperx(forwardstepx, backwardstepx);
AccelStepper steppery(forwardstepy, backwardstepy);

int EndschalterX = 31;
int EndschalterY = 47;
void setup ()
{

stepperx.setMaxSpeed(999); stepperx.setAcceleration(100);
steppery.setMaxSpeed(999); steppery.setAcceleration(100);


pinMode(EndschalterX, INPUT);
pinMode(EndschalterY, INPUT);

Serial.begin(9600);


}

void loop(){
  while(digitalRead(EndschalterX)==LOW)
  {
    stepperx.setSpeed(720);
    stepperx.runSpeed();
  }
 
 stepperx.setCurrentPosition(0);
 if(digitalRead(EndschalterX)==HIGH)
 {Serial.println("EndschalterX");}
    
   
   while(digitalRead(EndschalterY)==LOW)
  {
    steppery.setSpeed(720);
    steppery.runSpeed();
  }
  steppery.setCurrentPosition(0);
  if(digitalRead(EndschalterY)==HIGH);
  {Serial.println("EndschalterY");}
  
  stepperx.runToNewPosition(500);
  steppery.runToNewPosition(100);
 }

verwendete library:
http://www.airspayce.com/mikem/arduino/AccelStepper/index.html

so das ist alles was ich euch geben kann

Wo ist jetzt das Problem? Das Touch Screen anzusteuern?

Da brauchst du eine entsprechende Lib. z.B. UTFT mit UTFT Buttons: http://www.henningkarlsen.com/electronics/library.php?id=52 http://www.henningkarlsen.com/electronics/library.php?id=62

Und schau dir da erst mal die Beispiele an. Vor allem in UTFT Buttons

Diese library hab ich auch schon gefunden nur ich kapier iwie nicht wie ich wenn ich einen Knopf drück zB das Programm laufen lassen kann?

Steht wie gesagt in dem Beispiel zu UTFT Buttons. Und du brauchst auch noch die UTouch Lib.

Ich mache es so:

UTFT display(TFT01_32, 38,39,40,41);
UTouch touch(6,5,4,3,2);
UTFT_Buttons buttons(&display, &touch);

void loop()
{
   checkButtons();
}

void checkButtons()
{   
  if(touch.dataAvailable() == true)
  {
     int pressedButton = buttons.checkButtons();
     if(pressedButton == -1)
          return;           //nichts gedrückt


    ....
}

pressedButton gibt dir die Nummer des Buttons zurück. Angefangen bei 0 in der Reihenfolge in der sie angelegt wurden. Du kannst dann abfragen ob pressedButton 0, 1 oder 2 ist. Entweder mit if/else oder switch/case

Du kannst auch mal kleiner anfangen und einfach mal Serial.println(pressedButton) machen

Hier ist auch praktisch sich ein oder mehrere enums mit Button-Namen anzulegen. Ich habe z.B. sowas:

enum mainMenuButtons { MAIN_TIMES, MAIN_TEMP, MAIN_CLOCK, MAIN_SYSTEM };

Dann kann ich die Buttons über Namen ansprechen und muss mir nicht merken welche Nummer sie haben. Die Konstanten entsprechen einfach 0 bis n

ok das hört sich sehr vielversprechend an danke schon mal ich werde es später gleich mal testen. noch eine frage welche ausgänge auf dem mega brauch ich denn für das shield? weil ich will ja eig das motor shield draufstecken und das display mit brücken/jumper weiter weg verbinden. daher frage ich mich wie ich das am besten mache?

http://www.komputer.de/wordpress/archives/1002

Das Shield da ist zwar von ElecFreaks, aber die sollte von der Verdrahtung her gleich sein. In der rechten Spalte sind alle Pins die belegt sind. Das sind auf der doppelten Buchsenleiste die meisten (dazu noch GND). Dann 2-7 für das Touch Interface. 50-53 sind für SPI und können auch mit anderen Devices geteilt werden. Und dann glaube ich noch 3.3V, 5V und GND auf der Spannungsversorgungsleiste unten links.

Habe das aber selbst noch nicht abgesetzt betrieben.

Ok vielen Dank. Kann mir villeicht noch jemand sagen welche Pins ich villeicht vernachlässigen kann? MfG

ein kurzer nachtrag:
ich sitz da jetz schon ein bisschen dran und arbeite mich stück für stück durch.
hier mein code:

#include <UTFT_Buttons.h>

#include <UTouch.h>
#include <UTouchCD.h>

#include <memorysaver.h>
#include <UTFT.h>

extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t Dingbats1_XL[];


UTFT display(ITDB32S, 38,39,40,41);
UTouch touch(6,5,4,3,2);
UTFT_Buttons buttons(&display, &touch);

void setup()
{
  display.InitLCD();
  display.clrScr();
  display.setFont(SmallFont);

  touch.InitTouch();
  touch.setPrecision(PREC_MEDIUM);
  
  buttons.setTextFont(BigFont);
  buttons.setSymbolFont(Dingbats1_XL);
  
}

void loop()
{
  
int but1, but2, but3, pressed_Button;
boolean deafault_colors = true;

but1 = buttons.addButton(10, 20, 300, 30, "Referenzfahrt");
but2 = buttons.addButton(10, 60, 300, 30, "Start");
but3 = buttons.addButton(10, 100, 300, 30, "Stop");
buttons.drawButtons();

display.print("Betriebsmodus:", 110, 205);
display.setColor(VGA_BLACK);
display.setBackColor(VGA_LIME);
display.print("Nichts ausgewaehlt", 110, 220);

while(1);
{
 if(touch.dataAvailable() == true)
  {
     pressed_Button = buttons.checkButtons();
     
     
     if(pressed_Button == but1)
     display.print("Referenzfahrt", 110, 220);
     if(pressed_Button == but2)
     display.print("Start", 110, 220);
     if(pressed_Button == but3)
     display.print("Stop", 110, 220);
  }
}
}

es wird alles angezeigt nur wenn ich auf den bildschirm tippe passiert nichts.
findet wer den fehler?
mfg

Geht das Standard Beispiel von UTFT Buttons? Probier erst mal das bevor du was änderst.

Ich habe bei mir glaube ich ein Problem mit dem Reset des Touch Controllers. Wenn ich einfach USB reinstecke geht es meistens nicht. Wenn ich aber das Netzteil verwende geht es.

Die Beispiele gehen bei mir alle. Es geht auch mit netzteil nicht

Hallo,

bei dir ist ein ; (Strich-Punkt) zuviel hinter while(1)

probiers mal ohne und es wird gehen

Gruß Matthias

Grrr. Jetzt sehe ich es auch. Damit hast du eine Endlosschleife und der Code dahinter wird nie ausgeführt.

Genaugenomen ist das Beispiel für den Arduino etwas unschön. Das mit while(1) braucht man auf einem reinen AVR System. Auf dem Arduino gibt es dafür setup(). Du solltest deinen einmal auszuführenden Code in setup() packen. Dann braucht du kein while(1), da du das schon mit loop() hast.

vielen vielen danke! ich bin immer wieder sehr erstaunt darüber wie schnell die leute antworten DANKE!

SN_GOODLiFE:
Ok vielen Dank.
Kann mir villeicht noch jemand sagen welche Pins ich villeicht vernachlässigen kann?
MfG

nocheinmal zu dieser frage hat da jemand ne antwort?
mfg

Eigentlich keine. Nur die SD Karte wenn du die nicht verwendest.

gut sd karte brauche ich nicht. perfekt vielen dank. mfg