Steuerung für einen kleinen Automaten

Guten Morgen allerseits.

Kurz zur Vorstellung: Ich bin ein 27 Jähriger recht Computer versierter Mensch aber irgendwo stoße ich leider an meine Grenzen.
Nun sind mein Chef und ich auf eine Idee gekommen eines unserer Geräte zu automatisieren und dafür benötige ich nun eure Hilfe.

Seid mir bitte nicht Böse wenn ich nicht alles sofort verstehe oder mich umständlich formuliere aber ich werde mein bestes geben um es uns leicht zu halten.

Folgender Plan:
Wir haben ein Gerät welches gewisse Aktionen ausführt. Bisher haben wir dafür Platinen anfertigen lassen die nun aber zu neige gehen so kamen wir auf die Idee auf Kostengründen soetwas doch mal mit einem touchscreen über etwas selbst produziertes zu steuern.

Dieses Gerät besitzt eine Turbine (wie im Staubsauger nur mit gleichstrom) die mit maximal 24V bestromt wird bedeutet: Aktuell wählen wir das Programm "Turbine" auf unser Platine an und können das ganze über einen zweiten Drehknopf regulieren (der später auf dem touch display simuliert werden soll oder eben ein + und - Zeichen) um die Drehzahl hoch bzw. runter zu setzen.

Zeitgleich dreht sich ein weiterer DC motor (wie bei Heckscheibenwischern im Auto) der einen Aluteller bewegt und nach 1,5 umdrehungen die Drehrichtung wechselt, kann auch zeitgesteuert sein.

Bedeutet vomMenü her sollte dieser Punkt so gestaltet sein das man schonmal das Programm (Menüpunkt) Turbine auswählt der Motor sich in richtung rechts dreht und immer nach c.a. 1,5 Umdrehungen die Drehrichtung wechselt. Hier wäre ein Untermenü super wo man die Turbinengeschwindigkeit (also spannung turbine )sowie die Tellergeschwindigkeit erhöhen und verkleinen kann via aufgemaltem drehknöpfen bzw +, - tasten.

Das nächste Programm würde "Platte" heißen. hier soll sich nur der Plattenmotor bewegen und zwar 5 Umdrehungen in die eine richtung und dann 5 umdrehungen in die andere Richtung. Die Spannung liegt bei 12V für den Aluteller Motor sollte aber auch halt regulierbar sein.
Zusätzlich zum Plattenteller sollte ein Knopf da sein um eine Pumpe (Wischwasserpumpe) mit 6V (5V reichen auch) zu betätigen (Tasterfunktion).

Heißt für mich auf der startseite ein 2. Menüpunkt mit Untermenü +, - für die Tellergeschwindigkeit sowie einem knopf der als Taster fungiert mit dem man die Pumpe ansteuert.

Ansonnsten müsste nur noch eine LED angesteuert werden welche anzeigt das das Gerät betriebsbereit ist.

Leider sind die Teile noch alle mit der Post unterwegs sodass ich hier seid 2 Tagen nur am lesen und schauen bin, allerdings reicht meine Fachkenntniss nicht aus um das alles so zu verstehen wie ich das gerne würde.

Hoffentlich kann mir jemand helfen.

Bestellt ist folgendes:

http://www.ebay.de/itm/Arduino-UNO-R3-Starter-Kit-K-Compatible-Microcontroller-Breadboard-Cable-TE132-/391209325401?hash=item5b15e49359 (Die grundausstattung um zu starten)

http://www.ebay.de/itm/WLAN-WiFi-Shield-fur-Arduino-Uno-Mega-R3-mit-TI-CC3000-und-MicroSD-Karten-Slot-/252030119084?pt=LH_DefaultDomain_77&hash=item3aae2a6cac (für spätere update zwecke, kann erstmal außen vor gelassen werden)

Arduino Compatible Mega Motor Shield 13A, 5-28V - RobotShop (um den Tellermotor sowie die Turbine zu bestromen, Problem ich hab schonmal keine ahnung wie ich das Bauteil ansteuern soll)

http://www.sainsmart.com/sainsmart-due-5-tft-lcd-touch-panel-sd-card-slot-shield-for-arduino.html (ein großer TFT mit touch zum eingeben.)

Folgenden Programmcode habe ich bisher geschrieben um etwas vertraut damit zu werden (der Debug lief schonmal ohne Probleme) geplant ist die Pins erstmal an Laststromrelais zu hängen damit ich sehen kann ob ich die Ansteuerung schonmal verstanden habe da das Motorshield eine sehr lange Lieferzeit hat:

int motorpin1 = 2; //wenn der motor direkt betrieben wird
int motorpin2 = 3; //wenn der motor direkt betrieben wird
int pumpepinrot = 4;
int relaiturbine = 5; //turbinenrelai
int statusled = 6; //LED

void setup(){
pinMode(motorpin1,OUTPUT);
pinMode(motorpin2,OUTPUT);
pinMode(pumpepinrot,OUTPUT);
pinMode(relaiturbine,OUTPUT);
pinMode(statusled,OUTPUT);

}

void plate(){ //Programm Plate
digitalWrite(motorpin1,HIGH);
digitalWrite(motorpin2,LOW);
delay(60000);
digitalWrite(motorpin1,LOW);
digitalWrite(motorpin2,HIGH);
delay(60000);
loop;
}

void platestop() { // Platte stoppen
digitalWrite(motorpin1,LOW);
digitalWrite(motorpin2,LOW);
loop;
}

void vacuummotor(){ //Programm Vacuum motorbewegung
digitalWrite(motorpin1,HIGH);
digitalWrite(motorpin2,LOW);
delay(10000);
digitalWrite(motorpin1,LOW);
digitalWrite(motorpin2,HIGH);
delay(10000);
loop;
}

void pumpe(){ //pumpe laufen lassen
digitalWrite(pumpepinrot,HIGH);
loop;
}

void turbine(){ //Programm turbine
digitalWrite(relaiturbine,HIGH);
loop;
}

void turbinestop() { //turbine stoppen
digitalWrite(relaiturbine,LOW);
loop;
}

void loop(){
plate();
delay(1000);
pumpe();
delay(1000);
turbine();
vacuummotor();
delay(1000)
}

Schaltung ist wie folgt gedacht: Die Pins die ich ansteuer an meine Relais anschließen (Steuerstromkreis) und den Ausgang vom Steuerstromkreis an gnd gehen lassen und den Laststrom mit 24V anschließen um zu schauen ob das alles schaltet. Frage ist wie realiesiere ich es bei meiner Aktuellen relai vorstellung mit dem Drehrichtungswechsel,

wie kriege ich so einen TFT touchscreen ans laufen mit so einem komplizierten Menü?

Bitte schlagt mich nicht gleich tot wenn ich hier totalen mist gemacht habe oder meine Gedankengänge schlecht sind.

Ich würde mich sehr über Hilfe freuen und wünsche allen enien schönen Tag.

Mit freundlichen Grüßen

Die Anweisung

loop;

liefert die Startadresse der Funktion loop(), mit der dann aber nichts gemacht wird.

Das ist also zulässig, aber sinnlos.

Die delay(1000) Anweisungen in loop unde die anderen, noch größeren delays sind Mist, weil sie verhindern, dass dein Beispiel jemals um Touchscreen Funktionalität oder einen verschachtelten Funktionsablauf erweitert werden kann.

Verstehe das Prinzip von BlinkWithoutDelay und trau dich danach an "Endliche Automaten" oder "FiniteStateMachine".

Du programmierst einen Microcontroller, keinen Computer.
loop() ist dafür da, zigtausend mal je sekunde aufgerufen zu werden. (Was durch delay verhindert wird)
[Nachtrag:] Auch die Funktionen, die in loop() aufgerufen werden, sollen darauf ausgelegt sein, zigtausendmal aufgerufen zu werden: feststellen was zu tun ist (normalerweise nichts) und sofort zurückkehren.

Und noch ein persönlicher Tip: Fang klein an, und freu dich an kleinen Erfolgen. Für erste Tests sind LED einfacher anzusteuern als große Motoren. Trenne die Menu-Erstellung von der Motor-Steuerung: Beides hat vollkommen verschiedene Schwierigkeiten.

Das WLAN-Shield kannst du dir für später aufheben :wink:

Hallo.

Danke für die Antwort!

Ich wäre auch gerne weiter vorbereitet nur leider habe ich einen Abgabetermin und muss schauen wie ich das irgendwie hin bekomme deshalb direkt so ein großes projekt. Hobbymäßig wäre ich das sicher ein wenig anders angegangen aber nurn muss ich das beste aus der Situation machen.

Zumindest weiß ich jetzt schonmal das ich diese BlinkWithoutDelay funktion gut benutzen kann um unterschiedliche sachen gleichzeitig machen zu können.

Da war die Wahl eines Touchscreens keine so gute Idee. Das sieht zwar toll, ist aber nicht einfach zu programmieren.

Aber das mehr Zeit für das Interface als die Programm-Logik draufgeht ist auch bei professionellen Projekten normal :slight_smile:

da ich ja jetzt wieder komplett am anfang stehe und BlinkWithoutDelay nicht verstehe geht da wohl noch sehr sehr viel mehr zeit drauf..

Was heißt hier Abgabetermin?

Wenn du noch keinerlei Erfahrungen mit Mikrocontroller hast, wird ein zeitnaher Abgabetermin kaum möglich sein. Du solltest dich erst einmal einlesen. Dazu die Basics wie BlinkWithoutDelays, die Beispiele durcharbeiten, warum und wieso das so gemacht wird ,... etc durcharbeiten.

Mit Touchscreen und TFT Steuerung sollte man nicht direkt anfangen.

so habe mich nochmal mit dem BlinkWithoutDelay beschäftigt.

byte ledPin = 13;
byte ledPin2 = 12;

int led = LOW;
int led2 = HIGH;

unsigned long previousMillis = 0;
unsigned long previousMillis2 = 0;

unsigned long interval = 1000;
unsigned long interval2 = 500;

void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(ledPin2, OUTPUT);
}

void loop()
{

if (millis() - previousMillis > interval) {
previousMillis = millis();
led = !led;
digitalWrite(ledPin, led);
}

if (millis() - previousMillis2 > interval2) {
previousMillis2 = millis();
led2 = !led2;
digitalWrite(ledPin2, led);
}

}

habe einen code auf ner seite gefunden und den miener meinung so abgeändert das LED1 doppelt so schnell blinkt wie LED2 und diese entgegen gesetzt blinken. habe ich das so richtig gemacht ?

Ja, kann man so machen.

Man sollte aber zwecks der Lesbarkeit einrücken und das ganze hier in Code-Tags packen
( links das </> Symbol )

Nun sind mein Chef und ich auf eine Idee gekommen

Wer hatte die Idee mit dem Abgabertermin? :wink:

Dreimal darfst du raten. Ich habe versucht zu erklären das man quasi mit einem leeren Blatt Papier anfängt und dann da drauf schreiben muss was genau passieren muss zu welcher Zeit und wie lange und in welcher Verbindung ect. pp. .

Das Problem ist das viele die sich länger damit beschäftigt haben sagen das es ja so extrem einfach ist und man da keine große Arbeit hat... Ich denke aber das jeder klein angefangen hat und das ein recht aufwändiges Projekt ist.

Aber für einen Anfänger der vllt fortgeschritten weiß wie man mit Windows umgeht und solchen Wachen ist das sehr schwer.

Womit ich dienen könnte wäre ein Code von einer unserer Platinen. Ich denke aber nicht das sich das so leicht implementieren lässt bzw umschreiben lässt geschweige denn das mit unserer bestellliste komplett abgearbeitet ist.

Also wenn jemand Interesse hätte könnte man sich den anschauen aber öffentlich kann ich den leider nicht stellen.

theponsman:
Das Problem ist das viele die sich länger damit beschäftigt haben sagen das es ja so extrem einfach ist und man da keine große Arbeit hat... Ich denke aber das jeder klein angefangen hat und das ein recht aufwändiges Projekt ist.

Der Riesenaufwand bei Deinem Projekt entsteht im wesentlichen dadurch, dass Du virtuelle Bedienelemente auf einem vollgrafischen LCD-Touchbildschirm haben möchtest.

Die vollgrafische Touch-Bedienung mag auf einem Computer (Smartphone, Tablet, Raspberry) mit einem Betriebssystem (Android, Windows, Linux, MacOS) eine einfache Sache sein, aber auf einem nackten Mikrocontroller ohne Betriebssystem ist es ein gewaltiger Aufwand, so ein Teil halbwegs vernünftig anzusteuern.

Auf einem Microcontroller ohne Betriebssystem ist ein vollgrafischer LCD-Touchbildschirm so ziemlich das unvernünftigste, was Du als Anfänger ohne Ahnung tun kannst.

Auf einem nackten Mikrocontroller und mit Deinem geringen Kenntnisstand streichst Du das vollgrafische LCD-Touchdisplay am besten aus Deiner Bestellliste und bestellst Dir lieber echte Bedienelemente zum Anfassen:

  • Tastschalter
  • Kippschalter
  • Dreh-Potentiometer
  • 4x4 Keypad Tastenmatrix

Und wenn Du etwas anzuzeigen hast, ein 1602 Text-LCD.

Damit reduzierst Du Deine Lernkurve und den Programmieraufwand schon mal um mehr als 90%.

jurs:
Auf einem nackten Mikrocontroller und mit Deinem geringen Kenntnisstand streichst Du das vollgrafische LCD-Touchdisplay am besten aus Deiner Bestellliste und bestellst Dir lieber echte Bedienelemente zum Anfassen:

  • Tastschalter
  • Kippschalter
  • Dreh-Potentiometer
  • 4x4 Keypad Tastenmatrix

Das haben wir schon davon möchten wir gerne weg das ist es ja.

Wie gesagt ein Menü sollte ja machbar sein es müssen ja keine aufgemalten drehknöpfe oder so sein erstmal reichen auch touch Knöpfe zum regulieren von geschwindigkeit / Programmauswahl.

jurs:
Wie gesagt ein Menü sollte ja machbar sein

Machbar ist es klar. Wenn man sich auskennt. Wenn man sich eine Bibliothek ansieht und von selbst versteht wie man die bedient, was die Funktionen machen, was man davon braucht. Und dann sofort sieht was man machen muss.

Ich habe sowas am Laufen. Mehrere Menüs. Knöpfe die man toggeln kann. Den Wert den man ändern will als Beschriftung des Knopfs. Änderung über +/-/OK.

Aber ich musste mir gut überlegen wie ich das mache und selbst dann ist es recht viel Aufwand mit viel Code für relativ einfache Sachen. Ich habe das zwar bewusst etwas komplizierter gemacht als unbedingt nötig (damit der Code leicht änderbar ist) aber als Anfänger ist das hoffnungslos.

Als Beispiel:
Um die eine Variable als Beschriftung eines Knopfs zu haben und die zu ändern, muss man ein Array für die Beschriftung anlegen. Dann den Integer den man hat mit itoa() in dieses Array formatieren. Und dann den Knopf aktualisieren.
Sehr einfach wenn man weiß wie, aber wärst du da darauf gekommen?

Und das ist allerdings nur die Grundversion. Wenn man dann mehrere Buttons hat und unterschiedliche Limits wie weit man inkrementieren und dekrementieren kann wird es wieder kompliziert. Ich habe da eine Lösung die halbwegs elegant ist, aber trotzdem viel Code.

möglicherweise wäre ich auf das array gekommen aber atoi habe ich noch nie gehört da hört mein schulwissen leider auf

Hi,

ich weiß , das hilft Dir jetzt nicht weiter, aber gleich zum Anfang hin muss Ich Dir erst einmal den Zahn ziehen, etwas in der Richtung, was Du und Dein Chef vorhabt, mal ganz schnell hinzuzaubern. Ich bin Admin in einer Firma, kann programmieren, verstehe ein klitzekleines bischen etwas von Elektronik, ich bin kein Crack, denke aber, daß ich schon ein bischen davon verstehe.

Seid ca. 6 MONATEN sitze ich schon an einer "einfachen Klingelanlage", siehe Link unten !
...

Ich musste den Controller verstehen, C-lernen (was für mich nicht so leicht ist, wenn man aus der FoxPro (DBase-Ecke) kommt). Mit VB.Net habe ich ein größeres Projekt am laufen.

Das ist wie gesagt kein Computer, das vergessen viele. Es ist eine Platine, die Werte verarbeitet und auf irgendwelche Signale reagieren kann. Ist schon eine Menge, aber mehr kann das (KLASSE) Teil
einfach nicht. Was manche trotzdem daraus zaubern, Hut ab !

Holt euch den Mega 2560 mit Netzwerktshield (2 x) (bzw. den Klon) und übt damit. Seht euch Beispielcode an und spielt damit rum, fragt und lasst euch nicht beirren. ALLE haben klein angefangen, ALLE. Mit ein wenig Übung und auch dem richtigen Verständnis kommt man schon recht weit.

Villeicht hilft Dir mein Beispielcode etwas. Den habe ich jetzt soweit gebracht, daß man die Klingelanlage auch per App (3€ Android) komfortabel steuern. Den ArduinoCode kann man anpassen und er ist auch für andere Sachen nutzbar.

Hier der Link :

Anpassbares Grundprogramm Arduino-Sketch inkl. App-Steuerung

Würde mich mal interessieren, was das werden soll. Klingt sehr geheimnisvoll !!!

Hi,

noch ein Hinweis für Dich an dieser Stelle. Ich würde unter KEINEN UMSTÄNDEN
irgendeinen Code von anderen veröffentlichen oder jemandem geben,
wenn nicht sicher ist, daß Du Ihn herausgeben darfst.

So etwas kann unter Umständen richtig böse enden !!!

Einmal im Netz und es ist vorbei. Stichwort : Das Netz vergisst nie.

Außerdem ist es nicht relevant, wie der Code aussieht. Was wollt Ihr erreichen ?

Soll das Gerät mehr Funktionen haben als vorher ???

Erstellt einen Pseudocode (alte Schule) und strukturiert die Funktionen, die Ihr haben wollt !

Bsp.

Wenn Knopf1 gedrückt

Lasse Lampe1 leuchten
Starte die Turbine

ende Wenn

Spielt es durch.

UND Dokumentiert es , versioniert es, Ihr werden erstaunt sein, was alles geht !

der code gehört schon uns wir haben extra mal einen dafür gehabt aber aufgrund der konkurrenz in unserem geschäft will ich den nicht so gerne öffentlich stellen.

Idch würde es auch nicht veröffentlichen, wenn ich in meiner Maschine einen Arduino verbaue.

theponsman:
der code gehört schon uns wir haben extra mal einen dafür gehabt

Also für die Entwicklung eines simplen Codes für 2 Rastschalter, 1 Potentiometer und 1 Tastschalter habt ihr ehemals einen dafür ausgebildeten Mitarbeiter oder einen externen Dienstleister gehabt, und den Code für eine zehnmal so komplizierte Software für virtuelle Bedienelemente auf einem vollgrafischen Streichelbildschirm schüttelt ihr nun selbst ohne die geringste Ahnung zu haben locker aus dem Ärmel?

Das hört sich für mich irgendwie sehr nach einer Schnapsidee an.
Oder nach Sommerloch, während der Chef gerade in Urlaub ist.

Mal so aus Neugier, wann ist denn der vorgesehene Abgabetermin?