Arduino Parkplatz mit Schranke

Hallo Leute,
ich habe ein script geschrieben, welches eine Schranke bewegen soll sobald ein Taster gedrückt wird. Auserdem habe ich eine Lichtschranke verbaut welche, wenn sich ein Auto noch in der Durchfahr befindet, die Schranke solange nicht runter fahren lässt. Leider funktioniert es nicht. Ich nutze einen Schrittmotor. Könnte mir bitte jemand helfen mit dem Script, wo sind die Fehler? beim komplimieren kommen keine Fehlermeldung, wenn ich es hochlade reagiert der Motor nicht auf den Taster.... bin komplett aufgeschmissen...

#include <Stepper.h>

int LDR = 0 ;
int stepper = 0 ;
int schranke = 0 ;
int schranke2 = 0 ;
int wartezeit = 0 ;
Stepper Motor(SPU, 3,5,4,6);
int a;

void setup()
{
  pinMode( 3 , INPUT);
  digitalWrite(3, HIGH);

  LDR = 1 ;
 motor = 0
  schranke = 0 ;

  schranke2 = 0 ;

  wartezeit = 2000 ;

  Motor.setSpeed(5 );

  delay( 1000 );
}

void loop()
{
  if (!( digitalRead(3) ))
  {
    Motor.step(1024);
    for (a=1; a<= ( 95 ); ++a )
    {
     
     Motor.step(-1024) ;
      delay( 15 );
    }
    delay( 500 );
    Motor.step(0);
    delay( wartezeit );
    schranke = 1 ;
  }
  if (( ( schranke ) == ( 1 ) ))
  {
    LDR = analogRead(1) ;
    if (( ( 500 ) < ( LDR ) ))
    {
      delay( wartezeit );
      Motor.step(1024);
      for (a=1; a<= ( 95 ); ++a )
      {
        LDR = analogRead(1) ;
        if (( ( schranke ) == ( 1 ) ))
        {
          motor = ( motor + 1 ) ;
          delay( 10 );
          Motor.step( motor );
          schranke2 = 2 ;
        }
        delay( 5 );
        if (( ( LDR ) < ( 500 ) ))
        {
          Motor.step(1024);
          delay( 2000 );
          schranke = 0 ;
        }
      }
      if (( ( schranke ) == ( 0 ) ))
      {
        schranke = 1 ;
        Motor.step(0);
        schranke2 = 0 ;
      }
      if (( ( schranke2 ) == ( 2 ) ))
      {
        schranke = 0 ;
        Motor.step(0);
        delay( 300 );
        schranke2 = 0 ;
      }
    }
  }
}

Wenn Du die quote-Tags durch code-Tags ersetzt, wird der Sketch besser lesbar. Das kannst Du auch nachträglich noch ändern.

Gruß Tommy

habe es geändert, danke!

Tommy56:
Wenn Du die quote-Tags durch code-Tags ersetzt, wird der Sketch besser lesbar. Das kannst Du auch nachträglich noch ändern.

Gruß Tommy

Tommy56:
Wenn Du die quote-Tags durch code-Tags ersetzt, wird der Sketch besser lesbar. Das kannst Du auch nachträglich noch ändern.

Gruß Tommy

meinst du du kannst mir helfen?

Dein Sketch ist nicht leicht zu lesen, weil du keine "sprechende Bezeichner" wählst, sondern Nummern.
Du könntest es etwa so machen:

const byte Stepper_pin=1;
const byte LDR_pin=3;
...
;

Um das Programm verfolgen und Fehler erkennen zu können, solltest du Serial.print Befehle einbauen.
Sonst erkennst du nicht was dein Programm tut.

Schaue auch mal den Unterschied zwischen ++a und a++ an.

Edit: Ich bin auch Anfänger und weiß wie schwer der Einstieg ist.
Versuche Programmbeispiele zu verstehen und schaue dir an, wie andere ihre Programme gestalten

Schaue dir mal die Arduino-Referenz in deutsch an.

Wenn du konkrete Fragen hast, dann bekommst du auch eine Antwort.

Hi

Nebenfrage: Woher hast Du die schiere Anzahl an Klammern?
Mir wäre keine Sprache bekannt, wo Das gefordert wäre, wo man sich Das angewöhnt haben könnte.

Wenn ich Das richtig sehe, hast Du auch zwei Schranken?
Wäre vll. eine Idee gewesen, Das, was Du machen willst, etwas genauer auszuführen - ob jetzt noch mehrere Taster oder 'Was weiß ich noch' in dem Sketch vor kommen, habe ich dann Mal nicht mehr 'untersucht'.

STRG+T hast Du anscheinend in der IDE gedrückt, zumindest ist die Einrückung recht ansprechend.

Zur Deiner Ausgabenstellung:
WAS soll WANN (ziemlich genau und in Kleinstschritten) WIE ablaufen?
MALE Dir Das auf ein Blatt Papier (mache ich auch nur sehr selten ... ich gelobe Besserung).
Dann habe ich die Befürchtung, daß Dein(e?) Stepper, wenn Da was step't, Das blockierend machen - also während Dessen die Lichtschranke völlig egal ist.

MfG

postmaster-ino:
Nebenfrage: Woher hast Du die schiere Anzahl an Klammern?
Mir wäre keine Sprache bekannt, wo Das gefordert wäre, wo man sich Das angewöhnt haben könnte.

Die doppelten Klammern habe ich schon mal beim BASH-Scripting gesehen.

Pin 3 kannst Du nicht für den Schrittmotor und gleichzeitig als Eingang, schätze Startknopf, verwenden.

Welche Aufgabe hat die Variable "motor" (nicht zu verwechseln mit dem Objekt "Motor").

Motor.step(1024);
    for (a=1; a<= ( 95 ); ++a )
    {
     
     Motor.step(-1024) ;
      delay( 15 );
    }

Du bewegst den Motor einmal 1024 Schritte und dann 97280 Schritte in die andere Richtung. Wieso machst Du das? Außerdem wiederholst Du das solange der Startknopf gedrückt ist.

Zeichne Dir mal ein Flußdiagramm wie das Programm funktionieren soll.

Grüße Uwe

Das wäre die Arbeitsweise:

Ausgangssituation:
-Schranke ist geschlossen.
-Nun gibt es 3 mögliche Szenarien, die natürlich auch in Kombination funktionieren.
-Normaler Betrieb
-Eine Fahrer fährt mit seinem Auto an die Schranke
-Drückt den Taster
-Balken öffnet sich
-Zeit
-Fahrer fährt mit seinem Auto durch die Schranke

-Zeit
-Balken beginnt sich zu schließen
-Balken ist geschlossen
Ausgangssituation
-Warte Betrieb
-Eine Fahrer fährt mit seinem Auto an die Schranke
-Drückt den Taster
-Balken öffnet sich
-Zeit
-Fahrer fährt mit seinem Auto durch die Schranke und bleibt in der Schranke stehen
-Schranke wartet bis das Fahrzeug die Schranke verlassen hat
-Zeit
-Balken beginnt sich zu schließen
-Balken ist geschlossen
Ausgangssituation
Not Betrieb
-Eine Fahrer fährt mit seinem Auto an die Schranke
-Drückt den Taster
-Balken öffnet sich
-Zeit
-Fahrer fährt mit seinem Auto durch die Schranke
-Schranke wartet bis das Fahrzeug die Schranke verlassen hat
-Zeit
-Balken beginnt sich zu schließen
-Auto fährt zurück, ein anderes Fahrzeug oder ein Fußgänger betriebt den Schließbereich des Balkens
-Balken öffnet sich in schnellstmöglicher Geschwindigkeit
-Schranke wartet bis der Schließbereich des Balkens frei ist
-Zeit
-Balken beginnt sich zu schließen
-Balken ist geschlossen
Ausgangssituation

das wäre der Ablauf meines Programms...die Klammern waren defintiv etwas zu viel, danke für die Info
ich habe am nächste Woche eine Abgabe und hatte das Programm eigentlich mit einem Servomotor zum laufen gebracht...der ist nur leider verreckt, jetzt versuche ich seit 6 stunden es zu verändern in einen passenden Script mit schrittmotor zu verändern...und es klappt einfach null...bin wirklich verzweifelt und mega unter druck... vllt ist auch das das Problem das ich nicht mehr weiter komme, ich hoffe mir kann jemand helfen...

das script für den servomotor sieht wie folgt aus:

#include <Servo.h>

int LDR = 0 ;
int servo = 0 ;
int schranke = 0 ;
int schranke2 = 0 ;
int wartezeit = 0 ;
Servo servo_pin_9;
int a;

void setup()
{
  pinMode( 3 , INPUT);
  pinMode( 6 , OUTPUT);
  pinMode( 5 , OUTPUT);
  digitalWrite(3, HIGH);
  servo_pin_9.attach(9);
  Serial.begin(9600);

  LDR = 1 ;

  servo = 180 ;

  schranke = 0 ;

  schranke2 = 0 ;

  wartezeit = 2000 ;

  analogWrite(6 , 60);

  analogWrite(5 , 0);

  servo_pin_9.write( 180 );

  delay( 1000 );

  servo_pin_9.detach();

  Serial.print("schranke geschlossen");
  Serial.println();

  Serial.print("schranke wartet auf auto");
  Serial.println();

}

void loop()
{
  if (!( digitalRead(3) ))
  {
    servo = 180 ;
    servo_pin_9.attach(9);
    Serial.print("schranke oefnet sich");
    Serial.println();
    for (a=1; a<= ( 95 ); ++a )
    {
      Serial.print("schrankenstellung");
      Serial.print(servo);
      Serial.println();
      servo = ( servo - 1 ) ;
      delay( 15 );
      servo_pin_9.write( servo );
    }
    delay( 500 );
    servo_pin_9.detach();
    analogWrite(6 , 0);
    analogWrite(5 , 60);
    Serial.print("schranke offen");
    Serial.println();
    Serial.print("schranke wartet bis auto durchfaehrt");
    Serial.println();
    delay( wartezeit );
    Serial.print("ROT an / GRUEN aus");
    Serial.println();
    analogWrite(6 , 60);
    analogWrite(5 , 0);
    delay( wartezeit );
    Serial.print("schranke wartet sicherheitszeit");
    Serial.println();
    schranke = 1 ;
  }
  if (( ( schranke ) == ( 1 ) ))
  {
    LDR = analogRead(1) ;
    if (( ( 500 ) < ( LDR ) ))
    {
      delay( wartezeit );
      Serial.print("schranke schliesst sich");
      Serial.println();
      servo = 95 ;
      servo_pin_9.attach(9);
      for (a=1; a<= ( 95 ); ++a )
      {
        LDR = analogRead(1) ;
        if (( ( schranke ) == ( 1 ) ))
        {
          Serial.print("schrankenstellung");
          Serial.print(servo);
          Serial.println();
          servo = ( servo + 1 ) ;
          delay( 10 );
          servo_pin_9.write( servo );
          schranke2 = 2 ;
        }
        delay( 5 );
        if (( ( LDR ) < ( 500 ) ))
        {
          Serial.print(".  !!!  .");
          Serial.print("notoeffnung wenn Auto in schranke");
          Serial.println();
          servo_pin_9.write( 95 );
          delay( 2000 );
          schranke = 0 ;
        }
      }
      if (( ( schranke ) == ( 0 ) ))
      {
        schranke = 1 ;
        servo_pin_9.detach();
        Serial.print("schranke wartet das auto weg faehrt");
        Serial.println();
        schranke2 = 0 ;
      }
      if (( ( schranke2 ) == ( 2 ) ))
      {
        schranke = 0 ;
        servo_pin_9.detach();
        Serial.print("schranke geschlossen");
        Serial.println();
        delay( 300 );
        Serial.print("schranke warte auf auto");
        Serial.println();
        schranke2 = 0 ;
      }
    }
  }
}

und vielen vielen dank dass so viele darauf eingehen !!! sitze seit heut morgen um 9 dran und verstehe langsam gar nichts mehr :(...

Hi

Wo wird 'motor' eigentlich deklariert?

@agmue
toller Link, hatte die Doppel-Klammer so nicht mehr im Hinterkopf, aber auch dort sind's eigentlich die Eckigen, Die öfter im Rudel auftauchen.
Der letzte Script ist allerdings auch schon einige Jahre her, hatte Mal was für OTR geschrieben (online TV Recorder).

MfG

PS: Beim Arduino nennen sich die Programme Sketch :wink:
Werde mir Deinen Sketch nachher noch anschauen, Deine Erklärung/Ablauf lesen sich ganz gut.
Muß jetzt leider erst weg.

Beschreibe

-Balken beginnt sich zu schließen
-Balken ist geschlossen

genauer.
Grüße Uwe

uwefed:
Beschreibe genauer.
Grüße Uwe

meinst du es so :
balken ist geschlossen wenn er die bestimmte Postion erreicht welche im Sketch für den Schrittmotor dafür eingegeben wurde?

der Schrittmotor soll sich um 45 Grad in die eine Richtung drehen ( nach oben)

und dann wieder um -45Grad

Ich nehme mal an daß Du ein Parkplatzmodel bauen willst.

Wenn nicht dann rate ich dir dringenst von Deinem Vorhaben ab da Du keinerlei Kenntnisse bezüglich der notwendigen Sicherheitsvorkehrungen hast, bzw Dir Gedanken darüber machst. Kauf Dir einen Komerzielle Steuerung.

crystalsareforever:
meinst du es so :
balken ist geschlossen wenn er die bestimmte Postion erreicht welche im Sketch für den Schrittmotor dafür eingegeben wurde?

Wie willst Du kontrollieren, ob nicht etwas unter der Schranke ist, wenn diese sich nach unten bewegt?

Grüße Uwe

Ein typisches Spaghetti-Programm, kein Wunder, dass da niemand durchsieht bzw. durchsehen will.

Man macht zuerst einzelne Funktionen z.B. zum Einlesen der Taste, zum Einlesen der Lichtschranke, zum Steuern des Motors, zum Auslesen des Motor-Status (oben, unten, fährt hoch, fährt runter) ... und testet diese einzeln.

DANN verknüpft man das Ganze mit einer entsprechenden Logik, in der Art wie: " ... wenn Taste gedrückt und Lichtschranke in diesem Status und Motor in diesem Status, dann setze Motor in Bewegung..."

Somit kann bei jedem Verhalten, was nicht dem erwarteten entspricht, rel. einfach festgestellt werden, warum das so ist und man vermeidet "Seiteneffekte", dass z.B. bei der Behebung eines Fehlers neue Fehler entstehen ...

Vlt. sollte sich der TO auch mal mit der Theorie zur "state machine" befasssen.

Stepper Motor(SPU, 3,5,4,6);

Wo wird "SPU" festgelegt?

crystalsareforever:
Ich nutze einen Schrittmotor.

Ein Schrittmotor kennt, im Gegensatz zu einem Servo, nur relative Positionen. Hast Du einen Referenzpunkttaster?

crystalsareforever:
der Schrittmotor soll sich um 45 Grad in die eine Richtung drehen ( nach oben)
und dann wieder um -45Grad

Möchtest Du nicht eine Drehung um 90 Grad?

crystalsareforever:
Leider funktioniert es nicht.

Funktionieren denn die Beispiele der Bibliothek?

crystalsareforever:
Das wäre die Arbeitsweise:

Ist das nicht arg kompliziert gedacht? Mein Vorschlag:

  • Schranke ist geschlossen.
  • Eine Fahrer fährt mit seinem Auto an die Schranke und drückt den Taster.
  • Schranke öffnet sich.
  • Zeit startet.
  • Zeit startet immer neu, solange ein Fahrzeug im Schrankenbereich ist.
  • Nach Ablauf der Zeit schließt die Schranke.

Das Neustarten der Zeit klappt, wenn Du einen endlichen Automaten (Schrittkette) und millis() für die Zeitmessung verwendest.

uwefed:
Wie willst Du kontrollieren, ob nicht etwas unter der Schranke ist, wenn diese sich nach unten bewegt?

Bei Dir mag das anders sein, aber bei uns bekommst Du einfach eins aufs Dach. Deswegen gibt es so viele mit einem Dachschaden. Was bin ich wieder für ein Schelm1) :grin:


Anm.:

  1. Frei nach Heinz Erhardt.