INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Lineare Schrittkette, Beispiel 1
16.10.2019, 22:44 (Dieser Beitrag wurde zuletzt bearbeitet: 16.10.2019 22:50 von Bitklopfer.)
Beitrag #1
Lineare Schrittkette, Beispiel 1
Liebe Arduinofreunde!

Um meinem fast 75 Jahre alten Schädel noch etwas Futter zu geben, habe ich mir vor ein paar Tagen einen Arduino Mega 2560 gekauft. Bei Internetrecherchen habe ich festgestellt, dass es kaum Anwendungsbeispiele gibt für die Benutzung der digitalen Ein- und Ausgänge der Pins 22 bis 53 gibt. Deshalb habe ich ein kleines Programm geschrieben, das eine Grundanwendung einer linearen Schrittkette darstellt: die Programmierung eines Stromstoßschalters. Als Eingang benutze ich den Pin 22, für die Anzeige des Prozesses die Pins 48, 49, 50 und 51. Mit dem ersten Prozessschritt wird der Ausgang am Pin 53 eingeschaltet und mit dem dritten Prozessschritt ausgeschaltet.

Code:
void setup()
  {      
    // Festlegung des digitalen Eingangs
  pinMode(22, INPUT);
    // Festlegung der digitalen Ausgänge    
  pinMode(48, OUTPUT); pinMode(49, OUTPUT); pinMode(50, OUTPUT);
  pinMode(51, OUTPUT); pinMode(53, OUTPUT);

    // Festlegung der Grundbedingungen
    digitalWrite(48,0); digitalWrite(49,0); digitalWrite(50,0);
    digitalWrite(51,0); digitalWrite(53,0);  
  }
void loop()// Stromstoßschalter
  {
  // Neu_Start_Bedingung und erster Schritt
    if(   (digitalRead(48)==0)
        &&(digitalRead(49)==0)
        &&(digitalRead(50)==0)
        &&(digitalRead(51)==0)
        &&(digitalRead(22)==1))
            digitalWrite(48,1);
        
  //  erster (Wiederholungs)-Schritt      
    if (  (digitalRead(51)==1)
        &&(digitalRead(22)==1))  
            digitalWrite(48,1);
  // Rücksetzen des ersten Schrittes
    if    (digitalRead(49)==1)    
            digitalWrite(48,0);
    
  // zweiter Schritt
    if (  (digitalRead(48)==1)
        &&(digitalRead(22)==0))
            digitalWrite(49,1);
  //Rücksetzen des zweiten Schrittes
    if    (digitalRead(50)==1)
            digitalWrite(49,0);

  // dritter Schritt
    if  (  (digitalRead(49)==1)
         &&(digitalRead(22)==1))    
              digitalWrite(50,1);
  //Rücksetzen des dritten Schrittes
    if    (digitalRead(51)==1)
              digitalWrite(50,0);

  //vierter Schritt
    if  ( (digitalRead(50)==1)
        &&(digitalRead(22)==0))
              digitalWrite(51,1);
  //Rücksetzen des vierten Schrittes
    if    (digitalRead(48)==1)
              digitalWrite(51,0);

  //Schrittkettenauswertung
        if  (digitalRead(48)==1)    digitalWrite(53,1);
        if  (digitalRead(50)==1)    digitalWrite(53,0);
  }

/* Auf dem ersten Blick erscheint dieses Programm maßlos ausgeweitet.  Liegt jedoch eine Aufgabe vor, in der zum Beispiel in 25 Arbeitsschritten ein kleiner Arbeitsprozess ablaufen soll, der von verschiedenen Sensoren, Schaltern, Tastern und NOTAUS-Tastern verändert wird, hat man ohne Systematik schnell die Übersicht verloren.

Sollen kostbare Ausgänge eingespart werden, kann ich diese auch teilweise durch „Merker“ ersetzen. */

    //Sperrmerker, ist beim Neustart "0", danach immer "1"
  byte M00=0;

  //Schrittmerker für die 4 Arbeitsschritte
  byte M01=0; byte M02=0;  byte M03=0; byte M04=0;

  void setup()
    {  
  // Festlegung des digitalen Eingangs für den Ein-Taster
  pinMode(22, INPUT);

  // Festlegung des digitalen Ausgangs    
  pinMode(48, OUTPUT);
          }
  void loop()// Stromstoßschalter
    {
  // Neu_Start_Bedingung und erster Schritt,
  // Betätigung des Eintasters
    if( (  digitalRead(22)==1) && (M00==0)) M01=1;if (M01==1) M00=1;
    
  // Erster Wiederholungsschritt
  // Betätigung des Eintasters  
    if( (  digitalRead(22)==1) && (M04==1)) M01=1;if (M01==1) M04=0;
    
  // Zweiter Schritt
  // Loslassen des Tasters  
    if( (  digitalRead(22)==0) && (M01==1)) M02=1;if (M02==1) M01=0;
    
  // Dritter Schritt
  // Betätigung des Eintasters
    if( (  digitalRead(22)==1) && (M02==1)) M03=1;if (M03==1) M02=0;
    
    // Vierter Schritt
    // Loslassen des Tasters
    if( (  digitalRead(22)==0) && (M03==1)) M04=1;if (M04==1) M03=0;

    // Auswertung der Merkerschrittkette
    if  ( M01==1) digitalWrite(48,1);
    if  ( M03==1) digitalWrite(48,0);
            
  }
...gähn...warum lassen alle Newbees so ganz provokativ die Code-Tags "#" weg wo man das doch überall sich ansehen kann...Sad
lgbk Moderator


Soll diese kleine Anregung fortgesetzt werden?

Um freundliche Rückmeldungen bittet
Alfons44
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.10.2019, 08:26
Beitrag #2
RE: Lineare Schrittkette, Beispiel 1
(16.10.2019 22:44)Alfons44 schrieb:  Bei Internetrecherchen habe ich festgestellt, dass es kaum Anwendungsbeispiele gibt für die Benutzung der digitalen Ein- und Ausgänge der Pins 22 bis 53 gibt.
Worin soll der Unterschied in der Behandlung von Pin 2 zu Pin 53 bestehen?

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.10.2019, 12:40
Beitrag #3
RE: Lineare Schrittkette, Beispiel 1
(17.10.2019 08:26)Tommy56 schrieb:  
(16.10.2019 22:44)Alfons44 schrieb:  Bei Internetrecherchen habe ich festgestellt, dass es kaum Anwendungsbeispiele gibt für die Benutzung der digitalen Ein- und Ausgänge der Pins 22 bis 53 gibt.
Worin soll der Unterschied in der Behandlung von Pin 2 zu Pin 53 bestehen?

Gruß Tommy

Die Pins 22 bis 53 sind in erster Linie für digitale Ein- und Ausgänge brauchbar. Die anderen Pins sind als analoge Ein- und Ausgänge oder als PWM-Ausgänge unter Umständen zu schade für digitale Anwendungen, natürlich auch geeignet.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.10.2019, 13:31
Beitrag #4
RE: Lineare Schrittkette, Beispiel 1
Hallo,

(17.10.2019 12:40)Alfons44 schrieb:  Die Pins 22 bis 53 sind in erster Linie für digitale Ein- und Ausgänge brauchbar. Die anderen Pins sind als analoge Ein- und Ausgänge oder als PWM-Ausgänge unter Umständen zu schade für digitale Anwendungen, natürlich auch geeignet.

Sowas ist eher eine Frage der Betrachtungsweise und der geplanten Anwendung.
Erstmal sind alles digitale I/O und eben auch so zu benutzen.
An einigen Portpins hängt interne Zusatzhardware, die je nach Controllertyp variiert.
ADC und PWM-Timer sind das zum Beispiel. Die kann man eben auf bestimmte I/O schalten, die damit eben nicht mehr gleichzeitig als digitale I/O benutzt werden können.
Was Tommy damit eben nur gesagt hat: es gibt keinen Unterscihied der I/O als Digitalpin, egal weche Pinnummer da dransteht.
Insofern lohnen sich da keine speziellen Erklärungen oder Beispeile.

PS: ich habe noch ein paar wenige Jahre bis zu Deinem Alter, also bleib dran, hält mit Sicherheit den Kopf frisch. Smile

Gruß aus Berlin
Michael
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.10.2019, 13:53
Beitrag #5
RE: Lineare Schrittkette, Beispiel 1
Im Sketch ist es aber vollkommen egal, ob ich Pin2 oder Pin22 als digitalen Aus bzw. Eingang nehme. Deshalb gibt es dafür natürlich auch keine spezifischen Beispiele.

Mal ein paar Anregungen von mir, bevor Du da weitermachst:

Wenn Du in einem Post 2 Sketche vorstellst, solltest Du die auch getrennt in Codetags einfassen, damit sie auch als 2 Programme erscheinen. Das ist übersichtlicher.

Zitat:Sollen kostbare Ausgänge eingespart werden, kann ich diese auch teilweise durch „Merker“ ersetzen. */
Ausgänge verwendet man eigentlich nur da, wo sie auch als Ein- Ausgänge zur Peripherie verwendet werden. Wenn ich nur einen Merker brauche, so sollte das immer auch nur ein solcher sein. Für einen reinen logischen Merker verwendet man den Datentyp bool und ordnet die Werte 'true' und 'false' zu. damit ist dann auch eindeutig, das es sich um einen 'Merker' handelt und keine Zahlenvariable.
Code:
bool M01 = false;
und auch die sollten möglichst 'sprechende' Namen haben.

Wenn es aber um den Arbeitsschritt in einer Schrittkette geht, ist es besser, eine Variable zu verwenden, in der direkt die Schrittnummer eingetragen wird:
Code:
byte schrittNr = 0;
Besser dann noch ein enum, damit auch die Schritte sprechende Namen bekommen können. Aber das geht jetzt hier vielleicht schon zu weit Wink

Die Pinnummern schreibt man üblicherweise nicht direkt in den Sketch. Denen gibt man am Anfang des Sketches einen Namen ( der auch die Funktion deutlich macht ), und verwendet dann innerhalb des Sketches nur noch diesen Namen.
Code:
const byte schritt1Pout = 22;
...
pinMode( schritt1Pout, OUTPUT );
...
digitalWrite( schritt1Pout, HIGH );

Ändert sich mal der Anschlußpin, muss man das dann nur an einer einzigen Stelle machen. Da kann man dann auch ganz einfach von pin2 auf Pin22 umstellen Wink .

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.10.2019, 12:07
Beitrag #6
RE: Lineare Schrittkette, Beispiel 1
Ich kann mich nur den Vorrednern anschließen. Ich benutze bei meiner Modellbahnsteuerung ca 2/3 der Pins von 22 bis 53 als Ausgänge. Funktioniert
ohne Probleme oder Störungen.

Mit freundlichen Grüßen
Norbert
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.10.2019, 19:17
Beitrag #7
RE: Lineare Schrittkette, Beispiel 1
(17.10.2019 13:53)MicroBahner schrieb:  Im Sketch ist es aber vollkommen egal, ob ich Pin2 oder Pin22 als digitalen Aus bzw. Eingang nehme. Deshalb gibt es dafür natürlich auch keine spezifischen Beispiele.

Mal ein paar Anregungen von mir, bevor Du da weitermachst:

Wenn Du in einem Post 2 Sketche vorstellst, solltest Du die auch getrennt in Codetags einfassen, damit sie auch als 2 Programme erscheinen. Das ist übersichtlicher.

Zitat:Sollen kostbare Ausgänge eingespart werden, kann ich diese auch teilweise durch „Merker“ ersetzen. */
Ausgänge verwendet man eigentlich nur da, wo sie auch als Ein- Ausgänge zur Peripherie verwendet werden. Wenn ich nur einen Merker brauche, so sollte das immer auch nur ein solcher sein. Für einen reinen logischen Merker verwendet man den Datentyp bool und ordnet die Werte 'true' und 'false' zu. damit ist dann auch eindeutig, das es sich um einen 'Merker' handelt und keine Zahlenvariable.
Code:
bool M01 = false;
und auch die sollten möglichst 'sprechende' Namen haben.

Wenn es aber um den Arbeitsschritt in einer Schrittkette geht, ist es besser, eine Variable zu verwenden, in der direkt die Schrittnummer eingetragen wird:
Code:
byte schrittNr = 0;
Besser dann noch ein enum, damit auch die Schritte sprechende Namen bekommen können. Aber das geht jetzt hier vielleicht schon zu weit Wink

Die Pinnummern schreibt man üblicherweise nicht direkt in den Sketch. Denen gibt man am Anfang des Sketches einen Namen ( der auch die Funktion deutlich macht ), und verwendet dann innerhalb des Sketches nur noch diesen Namen.
Code:
const byte schritt1Pout = 22;
...
pinMode( schritt1Pout, OUTPUT );
...
digitalWrite( schritt1Pout, HIGH );

Ändert sich mal der Anschlußpin, muss man das dann nur an einer einzigen Stelle machen. Da kann man dann auch ganz einfach von pin2 auf Pin22 umstellen Wink .

Vielen Dank für die Anregungen. Ich werde sie beherzigen.

Die große deutsche Firma, die von Handwerkern häufig als Sienehmens bezeichnet wird, benutzt(e?) für die Eingänge die Abkürzung E0.0, E0.1 usw. , für die Ausgänge A0.0, A0.1 usw. und für die Merker der Schrittketten M0.0, M0.1 usw. . Daran hatte ich mich angelehnt.

Kannst du mir kurz an einem Beispiel erklären, wie Timer gesetzt und ausgewertet werden.

Vielen Dank im Voraus!

Alfons44
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.10.2019, 21:14
Beitrag #8
RE: Lineare Schrittkette, Beispiel 1
Hallo Alfons,
ja, eine SPS/S7 ist halt eine andere Welt mit anderen Regeln Wink

Die Frage nach 'Timern' ist etwas arg allgemein. Der Arduino hat - je nach Ausführung mehrere HW-Timer mit denen man ganz verschiedene Dinge machen kann. Das ist aber wohl etwas anders, als ein SPS-Timer.
Für reine Zeitfunktionen bietet die Arduino-SW die rudimentäre millis() Funktion, wobei man da auch was drumrumbauen kann, was dann eher in die Richtung SPS-Timer geht.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Beispiel: Mega Uhr RTC DS3231 Anzeige auf LCD1602 HaWe 3 11.553 04.08.2015 21:26
Letzter Beitrag: HaWe
  Beispiel Button Problem citycar 4 2.416 26.10.2014 22:18
Letzter Beitrag: citycar

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste