Hi Leute, ich habe mir hieran bereits ein Zahn aus gebissen und komm trotzdem nicht weiter. Der Pin A1 eines Arduino UNO, an welchen eine Lichtschranke angeschlossen wurde, soll ausgelesen werden. Das klappt schon einmal. Anschließend soll sobald ein HIGH Signal des Sensors vorliegt ein Servo die Positionen 30° und 90° EINMAL anfahren, und anschließend soll gewartet werden bis der Sensor wieder LOW ist. Nachdem der Sensor erneut HIGH ist, soll der Servo die Positionen wieder nur EINMAL anfahren u.s.w. Das Problem ist das mein Servo die Positionen während einer HIGH Periode 100 mal anfährt. Bitte helft mir. Ich bin am verzweifeln Hier der Code: _________________________________________ #include <Servo.h> Servo servo1; void setup() { servo1.attach(9); } void loop() { int sensorValue = analogRead(A1); if (A1==HIGH){ servo1.write(30); delay (10); servo1.write(90); delay (10); } }
#include <Servo.h> Servo servo1; void setup() { servo1.attach(9); } void loop() { int sensorValue = analogRead(A1); if (A1==HIGH){ servo1.write(30); delay (10); servo1.write(90); delay (10); while (A1==HIGH); } } Aber funktionieren tut dein Code so nicht, du musst doch sensorvalue abfragen?!
:
Bearbeitet durch User
Kann mal bitte ein Moderator, den gleichen Beitrag von Raphael aus dem anderen Thread löschen? Beitrag "Einmaliges ausführen eines Befehls (Arduino LOW;HIGH)"
Raphael B. schrieb: > Bitte helft mir. Ein Bier trinken und schlafen gehen, dann erneut nachdenken. Wenn Deine Schleife zu ende ist, was passiert? Ja, sie wird erneut wieder durchlaufen und fährt wieder den Servo. Was fehlt? Die Abfrage auf High nach der Ausführung, in der so lange nichts getan wird, bis wieder low kommt!
Hi Oder - wenn der µC noch was Anderes zu tun bekommen soll, als auf des Ende der Lichtschranke zu warten: Eine State-Maschine/Endlicher Automat. MfG
Patrick J. schrieb: > Oder - wenn der µC noch was Anderes zu tun bekommen soll, als auf des > Ende der Lichtschranke zu warten: > Eine State-Maschine/Endlicher Automat. Stifte keine Verwirrung, Raphael kaut erstmal an den Grundlagen. Das ist der Weg, so etwa ging das bei mir auch los. Da wurde eigentlich die Lösung schon geliefert: Christopher B. schrieb: > while (A1==HIGH);
Manfred schrieb: > Da wurde eigentlich die Lösung schon geliefert: > Christopher B. schrieb: >> while (A1==HIGH); Böse, böse. Da hängt der Prozessor. Sinnvollerweise spendiert man sich eine Variable, um sich den alten Zustand des Pins z merken und bricht nur in Aktionismus aus, wenn der alte und der neue Zustand unterschiedlich sind.
Wenn das Code für die Arduino IDE sein soll, würde ich noch ein paar Kleinigkeiten anpassen:
1 | #include <Servo.h> |
2 | Servo servo1; |
3 | |
4 | void setup() { |
5 | servo1.attach(9); |
6 | pinMode(A1, INPUT); //Pin A1 auf Eingang setzen |
7 | }
|
8 | |
9 | void loop() { |
10 | |
11 | // int sensorValue = analogRead(A1); //Befehl ist hier überflüssig
|
12 | |
13 | if (digitalRead(A1)==HIGH){ //Pin A1 Lesen |
14 | servo1.write(30); |
15 | delay (100); //100ms |
16 | servo1.write(90); |
17 | delay (100); |
18 | while (digitalRead(A1)==HIGH); //warte solange A1==HIGH |
19 | }
|
20 | }
|
Raphael, weisst du, was Implantate kosten? Da hast du auch schon einen Zahn verloren: Beitrag "Einmaliges ausführen eines Befehls (Arduino LOW;HIGH)" Sei vorsichtig, der Gesamtvorat ist stark begrenzt :-), in dem Tempo gehts nicht lange gut.
Irgendwie kann ich mich des Eindrucks nicht verschließen, daß das Niveau dieses Forum in Folge des Arduino-Hype ziemlich den Bach runter geht... Vielleicht wäre es mal eine gute Idee, eine eigene Rubrik für die Arduidioten einzuführen. Da könnten sich die Kinder dann nach Herzenslust austoben, und die Anderen können sich wieder den ernsthaften Fragen der Elektronik zuwenden.
:
Bearbeitet durch User
Harry L. schrieb: > und die > Anderen können sich wieder den ernsthaften Fragen der Elektronik > zuwenden. Muaharrharr. Danke für diesen schönen Witz zum Feierabend.
Eine +Flanke von "pin"erkennen geht so : If ((pin==high)&(alte_zustand==low)) +Flanke_erkannt=high; else +Flanke_erkannt=low; alte_zustand=pin; Eine -Flanke von "pin" erkennen geht so : If ((pin==low)&(alte_zustand==high)) -Flanke_erkannt=high; else -Flanke_erkannt=low; alte_zustand=pin; Wichtig : Diese variabele "+Flanke_erkannt" bleibt nur eine Durchlauf "high", dan geht sie wieder "Low" bis auf die naechtse +Flanke !! Dieses Verfahren ist nicht "blocking" wie eine "While" schleife, und damit besser geeignet wen die µ-controller auch noch andere Tasks soll machen.
Wolfgang schrieb: > Manfred schrieb: >> Da wurde eigentlich die Lösung schon geliefert: >> Christopher B. schrieb: >>> while (A1==HIGH); > Böse, böse. Da hängt der Prozessor. Wenn ich das richtig sehe, nur so lange, bis A1 wieder low wird. Solange der Prof. nichts weiter zu tun hat ... > Sinnvollerweise spendiert man sich eine Variable, Richtig. Dann wird "Servo" bitte auch eine eigene Routine, die Hauptschleife fragt dann zyklisch den Schalter ab und springt diese nur zwecks Ausführung an.
Harry L. schrieb: > eine eigene Rubrik für die Arduidioten einzuführen. Resultiert diese Verunglimpfung aus Arroganz oder überlegener Dummheit?
Manfred schrieb: > while (A1==HIGH); > Wenn ich das richtig sehe, nur so lange, bis A1 wieder low wird. Solange A1 wird nie Null werden. Auf einem UNO bleibt der Wert von A1 stocksteif auf 15. Der Wert liegt im Flash. Damit ist er unveränderlich. ------- Harry L. schrieb: > Irgendwie kann ich mich des Eindrucks nicht verschließen, daß das Niveau > dieses Forum in Folge des Arduino-Hype ziemlich den Bach runter geht... > > Vielleicht wäre es mal eine gute Idee, eine eigene Rubrik für die > Arduidioten einzuführen. > > Da könnten sich die Kinder dann nach Herzenslust austoben, und die > Anderen können sich wieder den ernsthaften Fragen der Elektronik > zuwenden. Trump Fan?
@Harry L. (mysth) >Irgendwie kann ich mich des Eindrucks nicht verschließen, daß das Niveau >dieses Forum in Folge des Arduino-Hype ziemlich den Bach runter geht... naja, früher war alles besser ;-) >Vielleicht wäre es mal eine gute Idee, eine eigene Rubrik für die >Arduidioten einzuführen. >Da könnten sich die Kinder dann nach Herzenslust austoben, und die >Anderen können sich wieder den ernsthaften Fragen der Elektronik >zuwenden. Gibt es doch schon! Nomen est Omen! http://playground.arduino.cc/ "Let your children play", das wußten schon "The Doors"
Manfred schrieb: > Patrick J. schrieb: >> Oder - wenn der µC noch was Anderes zu tun bekommen soll, als auf des >> Ende der Lichtschranke zu warten: >> Eine State-Maschine/Endlicher Automat. > > Stifte keine Verwirrung, Raphael kaut erstmal an den Grundlagen. Das heißt nicht, dass man ihm erstmal beibringt, es so zu machen, wie man es eigentlich nicht macht. Eine Statemachine ist hier aber etwas oversized. Aber das Programm zu blockieren, bis der Pin wieder low wird, ist nicht der richtige Weg, auch wenn es in der jetzigen Ausbaustufe noch nichts anderes zu tun hat. Er wird damit sehr schnell an die Grenzen kommen und muss dann wieder umdenken. Da kann man ihm auch gleich sagen, wie es richtig geht.
Erstmal Danke für die ganzen Beiträge. Den Code den ich in den Chatt geschrieben habe, ist noch lange nicht fertig gewesen. Und das Problem welches mir bewusst war, war ja ebenda das die Bedingung immer wieder erneut eintritt. Vielleicht sage ich nochmal etwas zum eigentlichen Projekt. Es handelt sich hierbei um eine Ettiketiermaschiene mit einem Laufband. Wenn ein Produkt kommt soll ein Servo die 30° anfahren um so das Produkt zu etikettieren. Problem ist aber gewesen sobald das Produkt gekommen ist hat die Lichtschranke ein LOW signal gegeben solange das Produkt den Sensor Passiert hat. In der Zeit hat der Servo mehr als ein Ettiket rausgelassen weil die If Bedingung erneut abgefragt wurde und als TRUE bestätigt wurde. Ich habe daran schon alles mögliche mit While schleifen und so probiert, habe anschließend aber alles Sinnlose aus dem Code entnommen. Nur mal so viel dazu Also macht mich hier bitte nicht so runter mit Idiot und so. Schließlich habt ihr auch irgendwann mal mit Programmieren angefangen. Trotzdem vielen Dank für die Lösungsvorschläge.
Arduino F. schrieb: > Manfred schrieb: >> while (A1==HIGH); >> Wenn ich das richtig sehe, nur so lange, bis A1 wieder low wird. Solange > A1 wird nie Null werden. > Auf einem UNO bleibt der Wert von A1 stocksteif auf 15. > Der Wert liegt im Flash. Damit ist er unveränderlich. Was habe ich da übersehen? Wie ich die Frage interpretiere, liegt der Sensor als Schalter an A1. Auch einen A-Anschluß der Arduinos kann man digital verwenden, habe ich erst neulich getestet, weil meine D-Pins knapp wurden. Dann sollte doch, wenn A1 nicht High ist, die while-Schleife verlassen werden? Ich sehe gerade am Anfang: "int sensorValue = analogRead(A1);" siehst Du da den Störenfried, werden ab da nur noch Analogwerte geliefert, die man auf 0..1023 abfragen müsste?
Ahh stimmt habs grade im Seriel Monitor abgefragt. Jip er liefert mir immer eine 43 für ein Low signal und eine 1223 für ein HIGH Signal. Danke das muss ich noch abändern.
Was hast du denn da abgefragt ? A1 ? oder sensorValue ?
Raphael schrieb: > Ahh stimmt habs grade im Seriel Monitor abgefragt. Jip er liefert mir > immer eine 43 für ein Low signal und eine 1223 für ein HIGH Signal. Serial Monitor - gut, dann kennst Du also die Möglichkeit, den zu benutzen. 1223 wird er nicht liefern, 1023. Warum setzt Du den Sensor nicht auf einen Digitalport? Wenn die Schranke am Analogpin bleiben muss: Vorne deklarieren: "pinMode (Schranke, INPUT);" und dann "(digitalRead(A1) == HIGH)" sollte auch klappen,
Wie weiter oben schon beschrieben: Beitrag "Re: Einmaliges ausführen eines Befehls (Arduino LOW;HIGH)"
Manfred schrieb: > Arduino F. schrieb: >> Manfred schrieb: >>> while (A1==HIGH); >>> Wenn ich das richtig sehe, nur so lange, bis A1 wieder low wird. Solange >> A1 wird nie Null werden. >> Auf einem UNO bleibt der Wert von A1 stocksteif auf 15. >> Der Wert liegt im Flash. Damit ist er unveränderlich. > > Was habe ich da übersehen? Dass A1 eine Konstante ist, genau wie HIGH. > Wie ich die Frage interpretiere, liegt der Sensor als Schalter an A1. An Pin A1, für dessen Identifikation eine Konstante namens A1 definiert ist. Es macht aber wenig Sinn, die Nummer des Pins mit HIGH zu vergleichen. Man muss schon erstmal seinen Status auslesen. > Ich sehe gerade am Anfang: > "int sensorValue = analogRead(A1);" > > siehst Du da den Störenfried, werden ab da nur noch Analogwerte > geliefert, die man auf 0..1023 abfragen müsste? Eher umgekehrt: Hier wird auch wirklich der Wert gelesen und nicht nur seine Nummer verwendet.
Manfred schrieb: > Ich sehe gerade am Anfang: > "int sensorValue = analogRead(A1);" Es macht keinen Sinn, digitale Werte, analog zu lesen. A1 kann auch digital verwendet werden. Manfred schrieb: > Vorne deklarieren: "pinMode (Schranke, INPUT);" > und dann "(digitalRead(A1) == HIGH)" sollte auch klappen, So ist es! Wobei man sich das " == HIGH" durchaus einsparen kann. Rolf M. schrieb: > Dass A1 eine Konstante ist, genau wie HIGH. So ist es.
Rolf M. schrieb: >> Was habe ich da übersehen? > Dass A1 eine Konstante ist, genau wie HIGH. Jou, danke! Ich sollte keinen fremden Programmkot anschauen. Da habe ich mir mal etwas kopiert: "Wenn Du einen analogen Eingang mit pinMode als digitalen Ein/Ausgang definierst werden aus A0 bis A5 die Pins 14 bis 19." Die Abfrage heisst dann also nicht digitalRead(A1), sondern "digitalRead(14)"
Manfred schrieb: > Die Abfrage heisst dann also nicht digitalRead(A1), sondern > "digitalRead(14)" Nein! Begründung: 14 == A0 15 == A1 (bei allen ATMega328P + ATMega168 Arduinos) Es ist also völlig egal, ob du digitalRead(A1) oder digitalRead(15) schreibst.
Also damit ich es jetzt richtig verstanden habe. Bei digitalRead(14) Würde er mir beim Auslessen ein klares HIGH oder LOW liefern oder?
> Würde er mir beim Auslessen ein klares HIGH oder LOW liefern oder?
Mir sicherheit ja, denn ein unklared High oder Low gibt es nicht. Das
Bit kann nur entweder 1 oder 0 sein.
Super danke Leute. Alles funktioniert. Die Ettiketiermaschiene spukt wie gewollt nur 1 Ettiket aus. Top! Jetzt weiß wo ich nachfragen muss. (-:
Hi Manfred schrieb: > Patrick J. schrieb: >> Oder - wenn der µC noch was Anderes zu tun bekommen soll, als auf des >> Ende der Lichtschranke zu warten: >> Eine State-Maschine/Endlicher Automat. > > Stifte keine Verwirrung, Raphael kaut erstmal an den Grundlagen. Das ist > der Weg, so etwa ging das bei mir auch los. > > Da wurde eigentlich die Lösung schon geliefert: > Christopher B. schrieb: >> while (A1==HIGH); Nicht, daß ich dadurch schlaflose Nächte bekomme - aber warum war mein Post 'nicht lesenswert'? Vll. in diesem konkreten Beispiel nicht das beste Mittel der Wahl - da die Maschine akut wohl läuft, stört das blockierende 'auf den Pin warten' ja auch nicht - hmm, in diesem Sinn war der Post 'nicht das Lesen wert', aber trotzdem nicht 'nicht lesenswert' - entgegen einer ganzen Menge anderer Ergüsse dieses Fadens. @Raphael Glückwunsch zum ersten Projekt! Wenn Du jetzt noch Deinen Code rausrücken würdest, hätten folgende Fragende vll. direkt Ihre Antwort. MfG
> warum war mein Post 'nicht lesenswert'?
Frag nicht. Die Bewertungen beziehen sich nicht immer auf den Beitrag
selbst. Oft bewerten sie, ob jemand die Idee toll findet. Manchmal
bewerten Leute damit auch die Person. Und manchmal steckt einfach gar
nichts ernsthaftes dahinter.
Für erste Projekte finde ich das Nutzen von Warteschleifen völlig Ok. Irgendwann kommt jeder von selbst auf den Zustandsautomaten, spätestens wenn es um Multi-Threading geht.
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.