Hallo Gemeinde,
der Code für den Tasterzustand macht wahnsinnig. Ich bekomme es nicht hin.
Habe den Originalcode von mir genommen und habe versucht die Tasterzustandsabfrage einzubauen.
Der Wunsch ist folgender:
Wenn AttinyPin, der an Ausgang 0 des Attiny hängt angeschaltet wird, also mit 5V versorgt, dann soll sich der Schrittmotor um x Schritte nach links drehen. Dann soll der Motor und die L293 H Brücke abschalten. Erst wenn sich der Tasterzustand Attinypin von 5V auf 0V ändert, also wieder der Taster gedrückt wird, soll sich der Motor um -x Schritte zurück bewegen.
Im nächsten Schritt ( wenn dies hier funktioniert) muss ich dann noch speichern, wieviele Schritte der Motor gemacht hat, falls mal der Strom ausgeht, damit sich der Motor in eine Grundposition bewegt. Das aber erst später. ( Sei hier nur schon werwähnt, falls es für die Programmierung einfacher ist oder sich dadurch etwas ausschliest.)
#include <Stepper.h> // Hinzufügen der Programmbibliothek.
int Schrittmotor = 200; // Schritte pro Umdrehung.-> testen, da kein Datenblatt vorhanden
int AbfrageeingangAttinyPB0 = 0; // Dieser Eingang soll abgefragt werden, ob high oder low. Eingang 0
int motorStatus = 0; // Variable für Motorstatus
Stepper Motor(Schrittmotor, 3, 4, 2, 1); // Der Schrittmotor erhält die Bezeichnung "Motor" ,welche Pins an Attiny. Das passt. SPU?
void setup()
{
pinMode(AbfrageeingangAttinyPB0, INPUT); // Der AbfrageeingangAttinyPB0-Pin soll als Eingang funktionieren.
boolean nowbutton; // aktuell gelesener Tasterzustand
boolean lastbutton; // letzter gelesener Tasterzustand
}
void loop()
{
nowbutton = digitalRead(AbfrageeingangAttinyPB0); //Nowbutton liest Zustand des AttinyPins ein
if (lastbutton == LOW && nowbutton == HIGH) { //Bedingung1 wenn zuletzt aus und jetzt an
digitalWrite(Motor, HIGH); //Setze Motor unter Strom
Motor.step(10); //Fahre 10 Schritte
Motor.setSpeed(10); //Geschwindigkeit (10) oder wie schnell ich das will
digitalWrite(Motor, LOW); //Nimm den Strom vom Motor weg -> Schrittmotor soll ja nicht heiß laufen
}
lastbutton = nowbutton; Letzter Zustand = jetziger Zustand -> brauch ich das wirklich?
else if
(lastbutton == HIGH && nowbutton == LOW) { // Zustand genau umgekehrt
digitalWrite(Motor, HIGH); // Strom an den Motor an
Motor.step(-10); //Fahre -10 Schritte
Motor.setSpeed(20); // V= 20
digitalWrite(Motor, LOW); //Nimm den Strom vom Motor weg -> Schrittmotor soll ja nicht heiß laufen
}
lastbutton = nowbutton; //Letzter Zustand = jetziger Zustand -> brauch ich das wirklich?
else tu nichts
}
}
}
Zeichne Dir doch mal ein Ablaufdiagramm / Statediagramm und die Bedingungen für die Übergänge. Daraus lässt sich viel leichter ein programm machen als aus den Gedanken im Hirn.
... und wenn Du uns dann das Diagramm auch zeigst, dann kann Dir sicher auch geholfen werden.
Sorry, aber wenn ich diesen Plan gedanklich aufmein Vorhaben ummünze, kann ich den Plan für so ziemlich alles nehmen. Von Ich habe Hunger zu was habe ich mir zu essen gemacht bis zu meinem eigentlichen Problem. Aber inwiefern hilft das beim Ergänzen des Codes?
Also ich als Laie erkenne in dem Plan außer 6 Zuständen nicht. Weder Bedingungen noch Verdrahtungsplan noch Angaben zu Strom o. Ä.. Daher meine Frage, wie so ein Plan beim programmieren hilft.
Dann frag bitte explizit, was du an meinem Ablaufplan nicht verstehst.
Strom an an Pin0, Motor dreht nach rechts für x Umdrehungen.
Strom aus an Pin0, Motor dreht nach links um - x Umdrehungen.
fertig.
Also einfacher kann ich es nicht ausdrücken.
Hallo Ben,
im Gegensatz zu einigen anderen hier möchte ich keine vorgefertigten Code oder den Weg dorthin vorgeben.
Vielmehr bin ich der Meinung, dass meine Erfahrung beim Problemlösen dem Fragesteller weiterhelfen soll um das Problem selbst zu lösen. Getreu dem Motto: "Gib einem armen Mann einen Fisch, er ist satt. Zeig ihm wie man fischt und er leidet nie mehr Hunger!"
Dein Code kompiliert nicht - nach STRG-T ist ersichtlich das eine Klammer zuviel ist.
Dann:
Ist das so richtig?
Und wenn Du Zustände speichern, ändern und vergleichen willst, dann mach das doch.
Das hier wird aber auch nichts, die Variablen verlieren Ihren Inhalt und den Gültigkeitsbereich beim verlassen von setup().
Das Prinzip habe ich auch verstanden. Ich bin auch dankbar für diverse Hilfestellungen, nur habe ich bereits einen Code und den nach meinem besten Gewissen und Möglichkeiten erstellt. Aber darüber hinaus fehlt mit das technische Knowhow, was welcher Begriff macht.
Also ich habe eine Angel und weiß, wie man fischt. Nur welchen Köder ich für welchen Fisch nehme, daran scheitert es.
Also muss ich die anders schreiben oder woanders einsetzen?
Mal stehen die in diversen Beispielen oben, dann im Setup. Mal gibt es auch leere Loop Schleifen....
ich Blicke bei den Mustern nicht durch manchmal. Und je mehr Beispiele ich mit LEDs oder normalen Motoren teste, um so verwirrter bin ich am Ende....
Zwischenfrage:
Hast Du einen UNO/NANO/MEGA? Oder hat der Tiny auch eine Onboard LED, die Du blinken lassen kannst?
Du musst das mit der Tastenlogik und den Variablen erstmal verstehen.
Wenn deine Aufgabe so einfach wäre, hättest du keine Probleme.
(Und bräuchtest auch keinen Ablaufplan)
Was soll passieren, wenn der "Pin 0" sich ändert, während der Motor dreht ?
Gleich Richtungswechsel, oder erst weiterfahren und wenn dann der Taster immer noch "zurück" sagt, zurück drehen ?
Und dass du beim Start irgendwie rauskriegen musst, wo der Motor aktuell steht, hast du schon richtig erkannt. Dass du das aus dem EEPROM liest, halte ich aber nicht für eine gute Idee.
Aber dass das später kommt, ist richtig.
Willst du nicht erstmal das reparieren ? cannot convert 'Stepper' to 'uint8_t '
Tip: keine zwei Beispiele mischen, bevor das erste
läuft
verstanden ist
(Diese Zeilen solltest du einfach weglassen)
Wenn du dann einen Sketch hast, der den Motor vorwärts dreht, wartet, dann rückwärts dreht , wieder wartet, dann das gleiche nochmal macht. dann kannst du diese Version speichern und danach anfangen, das Warten durch eine Tasterabfrage zu ersetzen.
Und ja ich möchte den Code reparieren... Genau das ist ja die Fragestellung
Und wenn ich verstehen würde, was die Fehlermeldung heißt, würde ich das auch tun.
Dann darfst Du jetzt auf einem von denen folgenden Code aufspielen:
#include <Stepper.h>
const byte EingabePin = 2;
const byte AusgabePin = LED_BUILTIN;
const bool links = LOW;
boolean isInStep = false;
boolean dir = links;
void setup()
{
Serial.begin(9600);
Serial.println(F("Start..."));
pinMode(EingabePin, INPUT);
pinMode(AusgabePin, OUTPUT);
}
void loop()
{
if (isInStep == false) // nur wenn Antrieb inaktiv
{
if (digitalRead(EingabePin) == HIGH) // Wenn Eingang aktiv
{
Serial.println(F("Tastendruck erkannt!"));
dir = !dir; // Richtung setzen
Serial.print(F("Drehrichtung: "));
Serial.println(dir == links ? "links" : "rechts");
isInStep = true; // Bewegung setzen
}
}
if (isInStep == true) // Antrieb gesetzt?
{
Serial.println(F("Bewegung gestartet"));
digitalWrite(AusgabePin, dir); // Bewegung ausführen
delay(1000); // Nur zum testen!
isInStep = false; // Antrieb inaktiv setzen
}
}
Mit jedem tastendruck müsste die LED umschalten.
Ich habe es kommentiert, was da passieren soll.
Das delay habe ich jetzt eingebaut um zum einen zu zeigen, das die Tastenabfrage solange gesperrt ist und zum anderen weiss ich nicht, ob Du ein prellen auf dem Eingangspin hast - das spielt damit keine Rolle
Wenn Du später die Stepper.h verwendest, blockiert die eh allein, dann braucht es das nicht.
Ich danke dir wahnsinnig.
So komme ich weiter.
jetzt kann ich mir zu bestimmten Termini, die ich noch nicht kenne durchlesen, was diese bewirken und was sich tut, wenn ich Variablen verändere.
Kannst du mir den Code markieren, wo ich dann statt der LED den Motor einsetzen muss.
ist eigentlich nachvollziehbar, aber nur um sicher zu gehen, dass ich die richtigen Stellen
Nutzen würde.
Gerne auch erst morgen, dass ich nicht spucken kann.
und wissenswerte wäre noch, ob meine ursprüngliche Codierung des Motor Antriebs 1 zu 1 in diese Version überhaupt zu übernehmen wäre.?
Falls nicht wäre ein Tipp gut, welche Termini dann besser funktionieren würden.
Dann könnte ich, wenn ich mit der LED durchsehen, versuchen dass dann für den Motor umzusetzen.
Das sollte mir dann bis zum Wochenende genug Hausaufgaben geben.
und bitte meine Ungeduld nicht falsch verstehen, aber bevor ich nicht einen Code habe, der so läuft, wie ich das brauche, kann ich den Rest nicht zusammenbauen und löten und Fräsen. Und dass dauert auch ewig.
Und ich will mein Werkstück nicht zerstückelt, wenn am Ende herauskäme, dass der Code nicht funktioniert.
Trotzdem weiß ich die Bemühungen jeder Person hier zu schätzen und habe auch Verständnis, dass die Priorität Hilfe zur Selbsthilfe sein soll. Aber das ist eben schwer, weil der Code für mich nur eine kleine Nebensache hätte sein sollen. Ich war naiv und dachte, dass es sowas 1000fach schon gibt.