Forum: Mikrocontroller und Digitale Elektronik Einmaliges ausführen eines Befehls (Arduino LOW;HIGH)


von Raphael B. (raphael_b647)


Lesenswert?

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);
}
}

von Christopher B. (chrimbo) Benutzerseite


Lesenswert?

#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
von Theor (Gast)


Lesenswert?

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)"

von Manfred (Gast)


Lesenswert?

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!

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

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

von Manfred (Gast)


Lesenswert?

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);

von Wolfgang (Gast)


Lesenswert?

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.

von Willi (Gast)


Lesenswert?

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
}

von H.Joachim S. (crazyhorse)


Lesenswert?

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.

von Harry L. (mysth)


Lesenswert?

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
von Joe F. (easylife)


Lesenswert?

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.

von RP6conrad (Gast)


Lesenswert?

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.

von Manfred (Gast)


Lesenswert?

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.

von Manfred (Gast)


Lesenswert?

Harry L. schrieb:
> eine eigene Rubrik für die Arduidioten einzuführen.

Resultiert diese Verunglimpfung aus Arroganz oder überlegener Dummheit?

von Einer K. (Gast)


Lesenswert?

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?

von Falk B. (falk)


Lesenswert?

@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"

von Rolf M. (rmagnus)


Lesenswert?

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.

von Raphael (Gast)


Lesenswert?

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.

von Manfred (Gast)


Lesenswert?

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?

von Raphael (Gast)


Lesenswert?

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.

von Willi (Gast)


Lesenswert?

Was hast du denn da abgefragt ?
A1 ? oder sensorValue ?

von Manfred (Gast)


Lesenswert?

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,

von Willi (Gast)


Lesenswert?


von Rolf M. (rmagnus)


Lesenswert?

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.

von Einer K. (Gast)


Lesenswert?

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.

von Manfred (Gast)


Lesenswert?

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)"

von Einer K. (Gast)


Lesenswert?

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.

von Raphael (Gast)


Lesenswert?

Also damit ich es jetzt richtig verstanden habe. Bei digitalRead(14)

Würde er mir beim Auslessen ein klares HIGH oder LOW liefern oder?

von Stefan F. (Gast)


Lesenswert?

> 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.

von Raphael (Gast)


Lesenswert?

Super danke Leute. Alles funktioniert.
Die Ettiketiermaschiene spukt wie gewollt nur 1 Ettiket aus.
Top! Jetzt weiß wo ich nachfragen muss.
                 (-:

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

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

von Stefan F. (Gast)


Lesenswert?

> 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.

von Stefan F. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.