Hallo Community, da ich in der Schule einen Aufzug programmieren muss, hab ich eine Frage. Ich bin Anfänger in der C-Programmiersprache und hoffe das Ihr mir helfen könnt! Und zwar soll mein Aufzug mit den folgenden Komponenten laufen, die ich bereits gekauft habe: - Arduino UNO - Schrittmotor 28BYJ-48 - Treiberplatine für Motor ULN2003 - 4 Tasten Matrix Folientastatur Der Aufzug hat eine Höhe von einem Meter mit 3 Stockwerken, die jeweils 25 cm hoch sind. Die Aufzugkabine hat ebenfalls eine Höhe von 25 cm. Nun mein Problem, ich muss nun die Stockwerke in einer Funktion definieren, wie funktioniert das? Ich hoffe Ihr habt eine schnelle und positive Antwort für mich. Mit freundlichen Grüßen: Marci
>Ich hoffe Ihr habt eine schnelle und positive Antwort für mich.
Ob eine Antwort positiv bewertet wird ist unsicher, schnell ist sie mit
Sicherheit nicht. Das hängt mit der Komplexität der Aufgabenstellung
zusammen.
Schau mal unter dem Stichwort: "state machine" nach.
Die Aufzugskabine kann, primitiv gesehen, die folgenden Zustände haben:
0 Einschaltüberprüfung und "Ausgangsstellung"
1 Bereit
2 Tür öffnet sich (z.B. Öffnermotor läuft; Zeitüberwachung)
3 Tür ist offen (z.B. Endlage erreicht)
4 Tür bleibt offen (Timer; Lichtschranke)
5 Tür schließt sich (Motor schließt; Richtungsumkehr bei Blockade;
Zeitüberwachung)
6 Tür ist geschlossen (Endlage erreicht)
Man kann fast sehen, dass der übrige Fahrstuhl keinen Ruckler machen
darf, wenn die Tür nicht im Zustand "Bereit" ist.
Ähnlich musst Du beim Fahrstuhl vorgehen.
Ist dieser z.B. oben, so ist die Fahrrichtung "nach oben" Tabu. Knirscht
so hässlich.
Fährt die Kabine gerade nach unten und Du drückst den "Auf"-Knopf, so
sollte die Kabine NICHT halten, so Du im mittleren Stockwerk bist. Es
sei denn Rundfahrten sind vorgesehen.
So kannst/musst Du das ganze System in "Zustände" zerlegen. Diese
logisch gegeneinander verriegeln bzw. miteinander koppeln. Ist echt eine
Fleißaufgabe.
Du kannst sicher sein, dass ich jede Menge Zustände vergessen habe.
Ach so ich Vergaß. Die Zustände sind fast immer mit irgendwelchen Signalen, Schalter oder Zeitgeber, verbunden. Hast Du es eilig, so reichen 3 Schalter bzw. Lichtschranken zur Positionserkennung nicht aus. Da sollten dann Positionsschalter und "kurz vor Position"s-Schalter herhalten. Dadurch hast Du die Möglichkeit kurz vor Erreichen des Stockwerkes abzubremsen. Also 2 für die untere Position, 3 für die mittlere Position und 2 für die obere Position. Und denk bitte an folgendes: Ohne eine Initialisierung (Schritt 0 im Kabinenbeispiel) geht es nicht. Kurz bevor Du Dein System vorführen willst, verschiebt bestimmt jemand die Kabine und öffnet die Fahrstuhltür einen Spalt. Schaltest Du jetzt einfach ein, so wird es bestimmt lustig. Vielleich knirscht der Motor sogar mit den Zähnen.
Amateur schrieb: > Schaltest Du jetzt einfach ein, so wird es > bestimmt lustig Nicht so lustig wie bei einem echten Aufzug, besonders in der Schule. Georg
Vielen Dank für die schnelle Antwort! Also der Aufzug soll bei den verschiedenen Tasten logischerweise hoch bzw. runter fahren. Den Taster und Motor konnte ich problemlos einzeln programmieren, doch ich weiß einfach nicht wie ich den Taster programmieren muss, sodass der Motor z.B. 20 Schritte macht. Hab auch mal ein Ablaufdiagramm erstellt, welches ich angehängt habe. Vielen Dank für deine Hilfe.
Marci schrieb: > 4 Tasten Matrix Folientastatur Nur eine? Dann kann man mit dem Aufzug fahren, wenn er zufällig da ist, aber holen kann man ihn nicht? Typisch Schulaufgabe, voll die Realität. Georg
Amateur schrieb: > 2 Tür öffnet sich (z.B. Öffnermotor läuft; Zeitüberwachung) > 3 Tür ist offen (z.B. Endlage erreicht) > 4 Tür bleibt offen (Timer; Lichtschranke) > 5 Tür schließt sich (Motor schließt; Richtungsumkehr bei Blockade; > Zeitüberwachung) > 6 Tür ist geschlossen (Endlage erreicht) Ich habe vergessen zu schreiben, dass der Aufzug keine Türen besitzt, da es nur zur Veranschaulichung der Aufzugsteuerung ist!
Marci schrieb: > Ich habe vergessen zu schreiben, dass der Aufzug keine Türen besitzt, da > es nur zur Veranschaulichung der Aufzugsteuerung ist! Damit würdest du deinen Lehrer aber flashen ;) Wenn ich sowas machen würde, dann aber schon richtig. Nen Aufzug ist so nen wunderschönes Beispiel für ein state machine...
Marci schrieb: > > Ich habe vergessen zu schreiben, dass der Aufzug keine Türen besitzt, da > es nur zur Veranschaulichung der Aufzugsteuerung ist! Auch keine Sensoren? Amateur hat Dir ja sehr genau skizziert was für eine einigermaßen realistische Steuerung notwendig ist. Aus Deiner Skizze ist nicht ersichtlich woher Du weißt in welchem Stockwerk Du gerade bist. Willst Du Dich auf den Initialisierungszustand und mitzählen verlassen? Ansonsten ist das so einfach (aber auch unzuverlässig), daß Du es in geschätzt 10 Zeilen Code umsetzen kannst mit switch und if/then/else.
physiker schrieb: Willst Du Dich auf den Initialisierungszustand und > mitzählen verlassen? Ansonsten ist das so einfach (aber auch > unzuverlässig), daß Du es in geschätzt 10 Zeilen Code umsetzen kannst > mit switch und if/then/else. Sensoren habe ich bisher keine, wollte am Enden einen Ultraschallsensor einbauen, der den Abstand ständig kontrolliert. Will jetzt nur mal testen ob der Motor das Gewicht packt und ob überhaupt meine Idee funktioniert! Könntest du mir vielleicht einen Beispielcode anhängen? Vielen Dank
Du willst mit dem 28BYJ-48 eine 25cm große Kabine 75cm hoch heben ? OK dann lass die dazu mal ein langen Text einfallen. Den du in der Zeit vortragen kannst in der die Kabine einmal hoch und wieder runter gefahren ist. In welcher Liga muss sich dein Projekt den behaupten ( 10te Klasse, Berufsschule, Studium...) Wenn du schon eine Konstruktion hast dann zeig mal ein Bild ! Schau mal auf google nach Schrittmotoren und Position anfahren. Ohne Türen reicht vielleicht dann schon ein Endschalter am Schachtboden.
Dog G. schrieb: > In welcher Liga muss sich dein Projekt den behaupten ( 10te Klasse, > Berufsschule, Studium...) Den Aufzugschacht hab ich schon fertig, müssen nur noch die Komponenten eingebaut werden (s.Bild). Die Kabine ist noch nicht ganz fertig! Ich bin in der 10ten Klasse...
Wenn Du ein gläubiger Mensch bist, so kannst Du auch folgendes Verfahren anwenden. Du montierst einen Endschalter, eine Lichtschranke oder irgendetwas mit Ultraschall am Boden des Schachtes. Nach dem Einschalten fährst Du sicherheitshalber ein paar Schritte nach oben um dann so lang nach unten zu fahren bis Dein (wie auch immer)-Schalter kommt. Damit hast Du einen Nullpunkt (allein der Glaube macht’s). Jetzt bestimmst Du noch die Anzahl an Schritten, die Du brauchst bis zur Position Oben. Am besten durch messen, probieren oder auswürfeln. Merken. Ab hier kommt Dein Glaubensbekenntnis: Fährst Du nach dem Einschalten die ermittelte Anzahl an Schritten nach oben, so bist Du - oh Wunder - oben. Fährst Du nur die Hälfte an Schritten hoch, so bist Du im mittleren Stock - so dieser auf der Hälfte der Strecke ist. Du brauchst Dir also nur zu merken, an welcher Schrittposition Du gerade bist, und schon kannst Du, im Rahmen des Erlaubten, überall hinfahren. Computi braucht sich nur die aktuelle Position (in Schritten) zu merken. Ob es sinnvoll ist in die Mitte zwischen dem mittleren und dem oberen Stock zu fahren, bleibt Deiner Fantasie überlassen.
Amateur schrieb: > Fährst Du nach dem Einschalten die ermittelte Anzahl an Schritten nach > oben, so bist Du - oh Wunder - oben. > Fährst Du nur die Hälfte an Schritten hoch, so bist Du im mittleren > Stock - so dieser auf der Hälfte der Strecke ist. So hatte ich mir es ja eigentlich überlegt, doch ich komm einfach nicht drauf wie ich das programmieren soll, also wollte ich einfach mal anfangen und den Sensor dran machen wenn es geht!
Marci schrieb: > Könntest du mir vielleicht so ein Beispielcode anhängen? Jetzt kommen wir zum leidigen Thema: Du kriegst hier keine fertige Lösung. Zumindest hoffe ich, daß keiner eine postet, da sonst der Lerneffekt gleich Null ist. Wo hakt es? Kannst Du eins von den eingebauten Beispielprogrammen kompilieren und in den Arduino laden? Hast Du Dir schon eine passende Stepper library ausgesucht? Kannst Du damit ein bisschen den Motor laufen lassen? Die Eingabe vom Keypad auslesen? Und dann: Du mußt Dir das aktuelle Stockwerk merken (Variable!)und hinterlegen wieviele Schritte Du pro Stockwerk fahren mußt und dann entsprechend auf die Eingabe reagieren. Kennst Du die Kontrollstrukturen while, if/then/else... ?
Die meisten Motortreiber für Schrittmotore haben zwei Steueranschlüsse: Einen für Schritt und für Richtung. Also brauchst Du nur mit einem sinnvollen Timing eine Routine, die den "Schritt-Anschluss" einmal auf High und anschließen auf Low bringt. Manche wollen aber statt low-high-low auch high-low-high. Für diese Leute gibt es aber Datenblätter. Es kann nicht schaden, sich VORHER zu überlegen, in welche Richtung es gehen soll. Muss aber nicht sein, wenn Du den Zufall zu schätzen weist. Also eine Routine für Schritt. Jetzt wäre es noch sinnvoll, eine Routine zu haben, die z.B. 300 Schritte, in gewünschter Richtung, generieren kann. Also eine Routine, der Du sagen kannst: Richtung und Anzahl. Wenn Du Dir jetzt noch die aktuelle Position merkst, kann es losgehen. Für eine Einfachst-Demo sollte das reichen. Willst Du aber mehr, so musst Du das Kapitel: Anfahrrampen und Fahrprofile aufschlagen. Da kannst Du Dich dann richtig austoben und das richtige Programmieren lernen. Übrigens: Die Angabe: "Sinnvolles Timing" ist keine Option.
>ich muss nun die Stockwerke in einer Funktion definieren,
Dazu ist es noch viel zu früh. Und wenn Du soweit bist, wirst Du Dir die
Antwort selbst geben können.
Als erstes solltest Du aufschreiben (wirklich aufschreiben!), wie Du
Dir das Endergebnis vorstellst. Und zwar so präzise und detailliert wie
nur möglich. Das ist ein eminent wichtiger Teil der Aufgabe, denn dabei
wirst Du schon eine Menge Klarheit über das eine oder andere Problem
gewinnen. Auch "echte", kommerzielle Projekte starten - aus gutem Grund
- immer mit einem solchen "Wunschkatalog" (dem sogenannten
"Lastenheft"), worin der Auftraggeber seine Anforderungen an das Produkt
spezifiziert.
Anschließend würde ich eine genaue und vollständige Liste aller
Subdevices der Anlage erstellen. Sie muss sämtliche Benutzerkeys,
Switches, Motoren, Kontrollleuchten, Displays, Drehencoder, Alarmsummer
(für Störfälle) etc. pp. enthalten - einfach komplett alles, was in dem
Wunderwerk am Schluss vorhanden sein soll. Weil jedes Device entweder
ein "Eingabedevice" oder aber ein "Ausgabedevice" ist, ist es bestimmt
sinnvoll, die Items der Liste gleich entsprechend zu kennzeichnen.
Dann würde ich überlegen, welche Zustände jedes Device annehmen kann.
Bei einem Taster ist das klar: Er ist entweder geschlossen (weil gerade
jemand draufdrückt) oder offen (weil gerade niemand draufdrückt). Bei
einem Motor muss man schon aufpassen: Nur "on" oder "off" wird der
Realität nicht gerecht, denn ein laufender Motor kann sich in zwei
Richtungen drehen. Falls er unter Umständen sogar mit verschiedenen
Drehzahlen laufen kann, muss auch das selbstverständlich über die
entsprechende Zustandsvariable im Programm abgebildet sein (für einen
Schalter reicht 1 bit, für einen stufenlosen Drehregler muss aber "etwas
größeres" her).
Weiterhin ist klar, dass die Steuereinheit jederzeit über die jeweiligen
aktuellen Zustände sämtlicher Eingabedevices Bescheid wissen muss. Wobei
"jederzeit" als "in einem genügend engen Zeitraster" zu verstehen ist.
Wenn das System die Zustände der Eingabedevices z. B. 100 oder 200 mal
pro Sekunde abfragt, ist das bestimmt in Ordnung (jede Sekunde einmal
ist sicher zu selten, und 10000 mal pro Sekunde wahrscheinlich unnötig
oft).
Interessant wird es nun immer dann, wenn sich irgendwelche Zustände von
Eingabedevices ändern, z. B. wenn gerade irgendjemand in irgendeinem
Stockwerk auf den Anforderungstaster gedrückt hat. Auf viele solcher
Zustandsänderungen muss im Steuerungsprogramm eine genau definierte
Reaktion erfolgen (z. B. das Setzen einer 1-Bit-Speichervariable von 0
auf 1). Herauszufinden, welches die "richtigen" Reaktionen sind, ist der
zentrale Teil der Lösung der Aufgabe.
Vielleicht ist es auch eine gute Idee, den Aufzug von Anfang an für eine
beliebige Anzahl Stockwerke zu konzipieren statt sich auf den Sonderfall
"drei Stockwerke" zu fixieren. Mir zumindest würde die Lösung des
Problems n-Etagen-Aufzug tatsächlich leichter fallen als das Problem
2- oder 3-Etagen-Aufzug.
Das soll mal genügen - Du willst ja auch noch was tun. Aber one more
tip, auch wenn's noch so sehr in den Fingern juckt: Verbiete Dir, auch
nur eine einzige Codezeile in die Tastatur zu kloppen, bevor Du die
Funktionsweise des Aufzugs nicht gründlich durchdacht hast. Solange Du
nicht wirklich verstanden hast, nach welcher Logik das Ding tut und
macht, hast Du kaum eine Chance, das Steuerprogramm zu meistern. Die
Gefahr, sich in irgendwelchen programmiertechnischen Details zu
verrennen, ist auch sonst schon viel zu groß.
Have a lot of fun :-)
@ Marci (Gast) solange man nicht weiß, was die genaue aufgabe ist, kann man dir auch nicht helfen.. ich SCHÄTZE mal die Aufgabe ist wohl eher: du hast 2 Taster: rauf/runter mit einer taste fährt der Lift einen Stock hinauf mit der anderen taste eine Stock hinunter.. ein Stock ist mit einer Anzahl an Schritten des Schrittmotors definiert.. das ganze wäre dann wirklich nur ein paar Zeile code..
physiker schrieb: > Wo hakt es? Kannst Du eins von den eingebauten Beispielprogrammen > kompilieren und in den Arduino laden? Hast Du Dir schon eine passende > Stepper library ausgesucht? Kannst Du damit ein bisschen den Motor > laufen lassen? Die Eingabe vom Keypad auslesen? Ja, klappt alles prima einzeln, doch ich weiß einfach nicht wie ich es programmieren soll, sodass bei Tastendruck 1 der Motor in Bewegung geht. Das wäre mein zeweiter Schritt gewesen! Deshalb hätte ich nur einen Anfang gebraucht um etwas reinzukommen.
Robert L. schrieb: > ich SCHÄTZE mal die Aufgabe ist wohl eher: > > du hast 2 Taster: rauf/runter > mit einer taste fährt der Lift einen Stock hinauf > mit der anderen taste eine Stock hinunter.. > > ein Stock ist mit einer Anzahl an Schritten des Schrittmotors > definiert.. Nein, ich habe 3 Tasten, wenn ich Taste 1 drücke soll der Motor z.b. 50 Schritte machen, bei Taste 2 z.B. 100 und bei Taste 3 dann 150 oder die Werte vom Ultraschallsensor abfahren!
Oh weh...ich sehe schon, zu schnell und übereifrig zu einem Projekt "ja" gesagt. Hattest du jemals was mit Softwareentwicklung zutun? Dafür gibt es die sogenannte Softwarearchitektur, die dir ermöglicht, dass man Problemstellungen in ihrer Komplexität auf das Wesentliche herunterbrechen kann und soll, damit man sich nicht verläuft. Nimm dir einen Zettel und schreibe dir sämtliche Problematiken (nicht Probleme) zusammen und versuche, die Probleme zu verknüpfen. Und dann gehts an die Lösungsfindung!
Stefan Pöllitz schrieb: > Hattest du jemals was mit Softwareentwicklung zutun? Kannst DU noch lesen? Marci der TE schrieb: > ich bin in der 10.Klasse Der Junge versucht an der Aufgabe zu wachsen, er sucht hier Tutoren - nicht Oberlehrer die mit Latrinen auf Spatzen scheissen!
>Nein, ich habe 3 Tasten, wenn ich Taste 1 drücke soll der Motor z.b. 50 >Schritte machen, bei Taste 2 z.B. 100 und bei Taste 3 dann 150 ich hab davon auch null plan: ich würde mir deshalb erstmal eine Library suchen für den Motor die sollte "non blocking" sein , schätz ich mal, weil die sache wohl einfacher macht http://42bots.com/tutorials/28byj-48-stepper-motor-with-uln2003-driver-and-arduino-uno/ wenn man sich den Code anschaut, kann man direkt eine Position anfahren.. klingt doch ideal.. dann die Eingänge, sollte man entprellen suche wir also danach: http://playground.arduino.cc/Code/Bounce danach noch die einzelen Button/Stockwerke kombinationen in ein Array, dann hast den Code so felxibel, dass du beliebig viele stockwerke angeben kannst, ohne den code ändern zu müssen.. for(int i = 0; i < NUMBUTTONS; i++) { debouncer[i].update(); // Status prüfen if(debouncer[i].fell()) // Wenn die Taste gedrückt wird { .... hier fahren wir zu stockwerk i } if(debouncer[i].rose()) // Wenn die Taste losgelassen wird { .... } } das 2. mit ultraschall kann ja dann als 2. Version machen.., wenn das 1. funktioniert hat
Eigentlich ist Marci ja schon fast fertig.
Wie man an dem Bild von Gestern (09.03.2016 16:49) sehen kann.
Wie sich jemand bei diesem "Spielstand" schon Gedanken um die
Siegerehrung machen kann, wird sich mir nie erschließen.
> Könntest du mir vielleicht so ein Beispielcode anhängen?
Gibt es überhaupt so etwas wie die elektrische, elektronische Hardware?
Oder nur 'ne Grabbelkiste mit den oben aufgeführten Teilen?
Gibt es überhaupt so etwas wie eine halbwegs funktionierende Mechanik?
Oder nur ein paar Ideen, wie so etwas gehen könnte?
Gemein, nicht wahr?
Marci schrieb: > mein Problem, ich muss nun die Stockwerke in einer Funktion definieren, > wie funktioniert das? Gar nicht. Vor jedem Programmieren brauchst Du erstmal einen ausführlichen Programmablaufplan (PAP). Den spielst Du dann in Gedanken durch, ob auch alle Fälle und Fehlerzustände enthalten sind und richtig abgearbeitet werden. Danach setzt man ihn nur noch Punkt für Punkt in Codezeilen um. Es ist auch sinnvoll, nicht alles in einen großen PAP zu verwursten, sondern für in sich geschlossene Teilaufgaben jeweils einen eigenen PAP zu erstellen. Das erhöht die Übersicht und verringert Fehler.
jaja, alle Theorie ist Grau.. wenn schon brauchen wir mal ein Lastenheft (hat der Lehrer wohl vergessen) dann erstellen wir ein Pflichtenheft .. und dann ist das Schujahr eh schon vorbei ;-)
Marci schrieb: > Den Aufzugschacht hab ich schon fertig Was Anfänger oft nicht wahrhaben wollen, die Hardware kostet nur 10% der Zeit, die Software aber 90%. Wenn also die Hardware wirklich fertig ist, multipliziere die bis dahin benötigte Zeit einfach * 10.
Robert L. schrieb: > wenn schon > brauchen wir mal ein Lastenheft Das wird wohl ein Lastenaufzug? MfG Paul
Robert L. schrieb: > Array Vielen Dank, jetzt kann ich es nochmal probieren! Was ist ein Array? Könnte mir das jemand erklären?
Wenn du es schaffst den Motor mit verschieden Geschwindigkeiten zu bewegen reicht das erst mal. Baue die Mechanik auf und sorge dafür das die Kabine am Boden des Schachtes ein Taster betätigt. Gebe einem handwerklich nicht so begabten in deinem Team die Aufgabe das von : LostInMusic (Gast) Datum: 10.03.2016 14:11 zu erarbeiten. Das wird euch ungemein bei dem Projekt helfen und wird sich bei der Projektvorstellung super machen. Wenn die Mechanik aufgebaut ist und du mit dem Motor die Kabine rauf und runter fahren kannst ohne zu verkannten fängst du an die Stockwerke zu programmieren. PS: Vielleicht setzt du noch ein zweiten Taster an die Decke des Schachtes und nutzt disen Taster als Öffner für die Stromversorgung deines Motors bis du alles richtig Programmiert hast.
Beitrag #4944207 wurde von einem Moderator gelöscht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.