Go Down

Topic: Keine Ahnung vom programmieren (Read 3 times) previous topic - next topic

sth77

Na dann hatten wir eine unterschiedliche Auffassung des Wortes sequentiell. Ich bleibe dabei: Recht einfach realisierbar. ;)
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

michael_x

Du beschreibst es wie eine Filmhandlung, nicht wie einen Flugsimulator. Da passt sequentiell schon ganz gut.
Du willst ja nicht interaktiv eingreifen und mit einer Fernseher-Fernbedienung (sorry: heutzutage ist Smartphone angesagter)  Teile des Programms von Hand kontrollieren.
Und am Ende des Programms wartet Arduino ewig (auf einen Reset) oder hat einen Pin übrig mit dem er sich selbst abschaltet ?

Ob delay oder millis(): Stell dir eine Liste auf wann was passiert, bis sie etwa so genau ist wie dies:
Code: [Select]

Zeit (ms) Pin  Wert  Kommentar
---------------------------------------
  1000,  LED_A ,  1   // 6 LED an
  3000,      0 ,  0   // nur warten ( 3 sek )
-2000,   LED_B,  1   // zufällige Wartezeit ( 0 .. 2 sek ) ,  dann 8 LED an
   500,    M1 , 50      // Motor langsam hochfahren
   800,    M1 , 80      // in mehreren Stufen
   800,    M1 , 120
   300,    M1 , 160
   200,    M1,  120
   500,    M2 , 50
   800,    M2 , 80
   800,    M2 , 120
   300,    M2 , 160
   100,    M3,  50     // M3 startet 
   100,    M2,  120    // M2 Startphase Ende
... ( alle Motoren starten )
  5000,  LED_X, 1    // Navigationslichter an
  3000,  M1, 255      // alle Motoren Vollgas
    20, M4, 255       // fast gleichzeitig
     0, M3, 255
    10, M2, 255
... das weitere ist mir zu mühsam, aber dir macht es sicher Spass, Nasenbaer.
...
10000, LED_A , 0    // letzte 6 LED aus.


Jetzt fehlt nur noch , diese Tabelle in C-Syntax zu konvertieren, sie im Flash-Speicher abzulegen, und dann einen kleinen Interpreter su schreiben der sie Zeile für Zeile abarbeitet.  ;)

Alternativ schreibt man die Liste als Reihe von Funktionsaufrufen:
Code: [Select]
  Step(1, 1000,  LED_A ,  1); 
  Step(2, 3000,      0 ,  0);   // nur warten ( 3 sek )
  Step(3, -2000,   LED_B,  1);   // zufällige Wartezeit ( 0 .. 2 sek ) ,  dann 8 LED an
  Step(4, 500,    M1 , 50);
  Step(5, 800,    M1 , 80);
  ...


Ohne delay muss jeder Step-Aufruf wissen, wer er ist und die Steps koordinieren sich über eine globale Variable.
Mit delay bräuchte man tatsächlich den ersten Funktionsparameter ( 1, 2,3 ...) nicht und könnte leichter Schriite rausnehmen und einfügen...

Aber das geht schon viel zu sehr ins Detail, da will ich dem der's schlussendlich schreibt, nicht vorgreifen. 

jurs


Ob delay oder millis(): Stell dir eine Liste auf wann was passiert, bis sie etwa so genau ist wie dies:
...
Jetzt fehlt nur noch , diese Tabelle in C-Syntax zu konvertieren, sie im Flash-Speicher abzulegen, und dann einen kleinen Interpreter su schreiben der sie Zeile für Zeile abarbeitet.  ;)


Genau, das sieht alles ganz einfach aus und der "Interpreter", der in der loop die Datenstruktur abarbeitet, kann auch recht einfach sein.

Ich würde übrigens in der abzuarbeitenden Liste noch einen vierten Parameter mit dazunehmen, ein einzelner Buchstabe reicht. Und zwar würde ich in diesem Buchstaben die auszuführende Funktion codieren.

Also mehr in der Art:
Code: [Select]

 F  Zeit (ms) Pin  Wert  Kommentar
---------------------------------------
'D',  1000,  LED_A ,  1   // 6 LED an
'W', 3000,      0 ,  0   // nur warten ( 3 sek )
'W', -2000,   LED_B,  1   // zufällige Wartezeit ( 0 .. 2 sek ) ,  dann 8 LED an
'A',  500,    M1 , 50      // Motor langsam hochfahren
'A',   800,    M1 , 80      // in mehreren Stufen


Wobei der Buchstabe dann codiert, was für eine Funktion jeweils gestartet wird:
'D' ==> Eine Funktion mit "digitalWrite()" und warten auf die nächste Aktion
'W' ==> Eine reine Warten-Funktion
'A' ==> Eine Funktion mit "analogWrite()" und warten auf die nächste Aktion

Und weitere Aktionen könnte man mit zusätzlichen Buchstaben codieren. Mal angenommen, jemand programmiert eine Waschmaschine und zwischendurch soll eine Heizung die Waschlauge auf Waschtemperatur bringen. Dann würde man einfach eine neue Funktion, sagen wir 'T' in die Liste schreiben, und dazu eine Arduino-Funktion erstellen, die vom Interpreter aufgerufen werden kann:
'T' ==> Eine Funktion, die die Heizung einschaltet und bis auf gemessene Sensortemperatur=60°C wartet
(zum Beispiel)

Es gibt ja auch Programmsteuerungen, die nicht nur zeitgesteuert sind, sondern bei denen auch zwischendrin Sensoren auszuwerten sind, und der Fortgang des Schaltprogramms ist davon abhängig, dass vorher zuerst bestimmte Sensorwerte erreicht werden.

Ich habe mal ein bisschen durch das Forum gesucht: Schrittsteuerungen werden hier zwar nicht besonders oft explizit nachgefragt, aber gelegentlich kommt es doch vor. Oder der Fragesteller fragt nach etwas, das mit einer Schrittsteuerung zu lösen ist, ohne dass ihm das so klar ist.

Da sowas nicht besonders viel Code erfordert und im Grunde auch an keine spezielle Hardware gebunden ist, mache ich bei Gelegenheit vielleicht mal eines meiner berüchtigten "erweiterten Demoprogramme" für eine "universelle Schrittsteuerung mit Arduino", mit dem solche Schaltlisten bequem als Daten vorgegeben werden können und die loop arbeitet die Schaltbefehle und Wartezeiten ab.

michael_x

Quote
eines meiner berüchtigten "erweiterten Demoprogramme"

Ich habe mich schon gewundert wo es bleibt ... ;)

Die Schönheit kommt natürlich dadurch, dass die Liste aus Elementen vom Typ   class Schaltschritt;   besteht und im Flash liegt,
und als leicht schreib/lesbare Include.h oder Steuerung.cpp Datei definert wird.

oder als Text von SD Card gelesen wird ...

Nasenbaer wartet sicher auch schon.

Den soundfile kann man doch sicher mit einem Digital-Pin, der einen mp3 player aktiviert, realiseren.



Alternativ kam mir in den Sinn, nicht so sehr die Sequenzierung zu betonen, sondern jedem Element eine absolute Startzeit und Dauer zu geben, mit dem es aktiviert wird. ( D.h. jedes Element wartet, startet, läuft, stoppt )
So lassen sich "beliebig viele" Aktionen parallel beschreiben. Dann braucht man keinen Schrittfolgen-Interpreter,
sondern jedes Element ist eine Funktion in loop(), die in quasi beliebiger Reihenfolge dort aufgelistet sind.
(Auch recht änderungsfreundlich)

jurs


Quote
eines meiner berüchtigten "erweiterten Demoprogramme"

Ich habe mich schon gewundert wo es bleibt ... ;)


Hehe. Vielleicht hat jemand anderes ja schon was in der Schublade liegen. Oder kennt einen Link auf einen passenden Sketch, in dem sowas bereits realisiert ist. Dann kann ich mir die Mühe vielleicht sparen. Oder ich sehe mir erstmal an, was es gibt und poste dann meinen Sketch als Alternative. Bei der "Leuchtturm-Karte" gab es hier im Forum auch zwei komplett unterschiedliche Lösungen, die gepostet wurden.


Die Schönheit kommt natürlich dadurch, dass die Liste aus Elementen vom Typ   class Schaltschritt;   besteht


Bei mir im Vorab-Entwurf steht: struct schaltFunktion
;)


und im Flash liegt, und als leicht schreib/lesbare Include.h oder Steuerung.cpp Datei definert wird.

oder als Text von SD Card gelesen wird ...


Nun mal nicht übertreiben, bei einem kleinen Demoprogramm!


Nasenbaer wartet sicher auch schon.


Keine Ahnung. Kommt mir fast vor, als wenn er sich ausgeklinkt hat und mit der Antwort zufrieden ist, dass es relativ einfach machbar ist.


Den soundfile kann man doch sicher mit einem Digital-Pin, der einen mp3 player aktiviert, realiseren.


Ja, das denke ich auch. Das Abspielen von Sound ist mit Sicherheit mit einem autarken Abspieler, der nur per Pin aktiviert werden braucht, am einfachsten hinzubekommen. Insbesondere für jemanden, der sich den Threadtitel "Keine Ahnung vom programmieren" ausgesucht hat.


Alternativ kam mir in den Sinn, nicht so sehr die Sequenzierung zu betonen, sondern jedem Element eine absolute Startzeit und Dauer zu geben, mit dem es aktiviert wird. ( D.h. jedes Element wartet, startet, läuft, stoppt )
So lassen sich "beliebig viele" Aktionen parallel beschreiben. Dann braucht man keinen Schrittfolgen-Interpreter,
sondern jedes Element ist eine Funktion in loop(), die in quasi beliebiger Reihenfolge dort aufgelistet sind.
(Auch recht änderungsfreundlich)


Es gibt ja bekanntlich immer verschiedene Möglichkeiten.
Und das nicht nur beim Leuchtturm-Sketch.
;)

Go Up