Pages: [1] 2 3   Go Down
Author Topic: Keine Ahnung vom programmieren  (Read 3885 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo zusammen,
ich bin der Jürgen, begeisterter Modellbauer, und habe jetzt ein riesiges Problem. Leider habe ich null Ahnung vom programmieren. Habe mir für ein Projekt ein Arduino Leonardo zugelegt. Mit dem Arduino möchte ich so eine Art Funktionsmodell realisieren. Folgendes soll geschaltet werden, LEDs, vier Motoren (nur eine Drehrichtung), und falls machbar, noch Motorsound von SD. Vorhanden sind Arduino, zwei Motortreiber L293D, Breadboard, Kartenlesegerät WTV020-SD Mini (16Pin) und der üblichen Kleinkram. Die Motoren sind Micromotoren aus Microservos (1,5 bis 3 Volt), und sollen lediglich einen kleinen Propeller antreiben.
Vorgestellt habe ich mir den Programmablauf so (gestartet soll das Programm mittels Schalter oder Taster):

1. sechs LEDs werden gleichzeitig eingeschaltet, und bleiben an bis Programmende
2. acht LEDs werden zugeschaltet, und bleiben an bis Programmende
3. erster Motor wird gestartet (langsam zu schnell) und bleibt an
4. zweiter Motor startet
5. dritter Motor startet
6. vierter Motor startet
6a. Falls möglich, sollte mit dem Start des ersten Motors ein Soundfile abgespielt werden.
7. zwei LEDs werden eingeschaltet und leuchten ca. 1 Minute
8. drei LEDs werden nacheinander eingeschaltet (jeweils mit 10 Sek. Verzögerung) und bleiben 2 Minuten an
9. alle Motoren fahren gleichzeitig runter (schnell zu 0)
10. Das Programm endet ca. 20 Sek. nach Motorstillstand.
Als Gesamtlaufzeit habe ich mir so ca. 10 Minuten vorgestellt.

Ist sowas überhaupt möglich?

Was das "handwerkliche" angeht, habe ich wie gesagt keine Probleme, aber an das Programmieren traue ich mich nicht so recht ran. Ich weiß, ich will da ne ganze Menge , aber vielleicht kann mir ja trotzdem jemand helfen?
In der Hoffnung auf Antwort
Jürgen
Logged

Germany
Offline Offline
Edison Member
*
Karma: 48
Posts: 2346
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Weil die Reihenfolge genau festgelegt ist, kann man das sehr leicht umsetzen - auch ohne große Programmierkenntnisse.

Du brauchst die 4 PWM-Pins für die Motoren (die man auch über einen Transistor steuern kann), und wenn ich richtig gezählt habe 6 digitale Ausgänge für die LEDs. Nur Mut, das packen wir schon! smiley-wink

[edit] Sound abspielen könnte komplexer werden, das heben wir uns als krönenden Abschluss auf. smiley-grin
« Last Edit: April 08, 2013, 06:40:18 am by sth77 » Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Offline Offline
Sr. Member
****
Karma: 10
Posts: 361
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das ist möglich, und sogar sehr einfach :-).
Eigentlich ein gutes Beispiel zum lernen!
Ich würde an deiner Stelle langsam anfangen, z.B. mit den 6 und den 8 LEDs.
gruß
Bernward
Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 174
Posts: 3288
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ist sowas überhaupt möglich?

Ja, natürlich ist das möglich.

Um 6 oder 8 LEDs auf einmal zu schalten, würdest Du zwar noch einen Schalttransistor oder Relais benötigen. Und Dein Motortreiber ist ein Schrittmotortreiber und daher nicht zur Regelung von Gleichstrommotoren geeignet. Also die Hardware müßtest Du nochmal überdenken.

Sofern alle Schritte sequentiell nacheinander ablaufen und jeder nachfolgende Schritt erst dann startet, wenn der vorangegangene Schritt vollständig abgeschlossen ist, dann ist es softwareseitig sogar extrem einfach realisierbar: Dann kannst Du alle Schaltschritte nacheinander programmieren und zwischendurch hältst Du den Programmablauf mit "delay()" für eine bestimmte Zeit an.

Sobald alerdings Aktionen verschiedener Schritte "gleichzeitig" ablaufen sollen, wird es kompliziert. Beispiele:

1. sechs LEDs werden gleichzeitig eingeschaltet, und bleiben an bis Programmende
==> einfach
Wird kompliziert, sobald auch nur eine einzige LED blinken soll, während nachfolgende Schritte ablaufen.

Oder:
7. zwei LEDs werden eingeschaltet und leuchten ca. 1 Minute
8. drei LEDs werden nacheinander eingeschaltet (jeweils mit 10 Sek. Verzögerung) und bleiben 2 Minuten an
==> einfach, wenn Schritte nacheinander ablaufen
Wird kompliziert, wenn die LEDs aus Punkt 8. bereits angeschaltet werden sollen, während die LEDs aus Punkt 7. noch leuchten.

Sobald Du eine "Not-AUS" Funktion per Schalter benötigst, um die Sequenz abbrechen zu können, würde es ebenfalls kompliziert.  Man könnte alternativ als "Not-AUS" einen "Strom-Aus" Schalter vorsehen.

Wie gesagt, eine reine sequentielle Schritt-nach-Schrittsteuerung ist einfach mit delay() zwischen den Schaltschritten machbar.

Eine echte Programmsteuerung, bei der Aktionen "gleichzeitig" ablaufen, z.B. LEDs blinken während andere Schaltvorgänge stattfinden sollen, wird dagegen recht aufwändig in der Realisierung.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Erst mal vielen Dank für euere Antworten.
@Jurs
Darin liegt ja das Problem, dass es ebend nicht rein sequentiell ablaufen soll. Sequentiell würde ich ja zur Not auch noch selber hinkriegen, aber in meinem Projekt muß ich ja auf das DELAY verzichten, wie ich mich schon informiert habe.  Was den L293D angeht, bist Du da sicher? Nach Datenblatt und Schaltbild beinhaltet der Chip nur zwei Motortreiber, also eigentlich nichts anderes als zwei Transistoren. Die LEDs werden natürlich eine eigene Stromversorgung bekommen. Ob über Relais oder Transistor ist noch nicht ganz klar, wobei ich aber eher zu Transistoren tendiere.
Gruß
Jürgen
Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 174
Posts: 3288
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@Jurs
Darin liegt ja das Problem, dass es ebend nicht rein sequentiell ablaufen soll. Sequentiell würde ich ja zur Not auch noch selber hinkriegen, aber in meinem Projekt muß ich ja auf das DELAY verzichten, wie ich mich schon informiert habe. 

Weil Du parallel zu anderen Aktionen noch WAV-Sound per Arduino von einer SD-Karte abspielen möchtest ohne ein autark abspielfähiges Sound-Shield zu verwenden?

Oder noch aus einem anderen Grund? Weswegen, welcher Schaltschritt erfordert das?

Aus dem von Dir oben gezeigten Ablauf ist es für mich nicht ersichtlich, dass es mit delay() nicht realisierbar weil kein rein sequentieller Ablauf ist.

Wenn es nur eine oder zwei Stellen sind, an denen zeitlich überlappend geschaltet werden muß, kannst Du den Ablauf ggf. durch Einfügen von Zwischenschritten doch noch sequentialisieren. Dazu müßte man aber genau wissen wo. Und Sound könnte man parallel abspielen, wenn man ein autarkes Sound-Shield verwendet, das nach dem Starten eines Sounds von alleine weiterspielt.

Wenn es komplexer werden soll, z.B. LEDs nicht entsprechend der Beschreibung dauernd "ein" sein sollen, sondern beispielsweise rhythmisch blinken sollen während andere Schaltvorgänge ablaufen, wird es dagegen vergleichsweise kompliziert.

Was den L293D angeht, bist Du da sicher? Nach Datenblatt und Schaltbild beinhaltet der Chip nur zwei Motortreiber, also eigentlich nichts anderes als zwei Transistoren. 

Ja klar, die Schrittmotoren brauchen auch Leistung und die muß geschaltet werden. Wenn ich die Angebote bei eBay durchgehe, wird der L293D jedenfalls nur als Schrittmotortreiber für Schrittmotoren kleinster Leistung angeboten.
Logged

im Neckartal
Offline Offline
Jr. Member
**
Karma: 0
Posts: 60
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Zum L293D:
Quote
Der L293D IC beinhaltet 4 Halb-H-Brücken Treiber. Damit lassen sich 2 DC-Motoren bidirektional betreiben (als 2-fach H-Brücke), oder 1 Schrittmotor birektional. Die Belastbarkeit pro Halbbrücke beträgt 600mA. Der L293D beinhaltet im Gegensatz zum pin-kompatiblen L293 und dem großen Bruder L298 die interne Freilaufdioden. Diesen schützen den IC vor den, vom Motor ausgehenden, Spannungsspitzen.
Quelle: http://wiki.ctbot.de/index.php/L293D

Grüßle Bernd
Logged

Theoretisch gibt es keinen Unterschied zwischen Theorie und Praxis ...

Germany
Offline Offline
Edison Member
*
Karma: 48
Posts: 2346
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Erst mal vielen Dank für euere Antworten.
@Jurs
Darin liegt ja das Problem, dass es ebend nicht rein sequentiell ablaufen soll.
Aber die Sequenz hast du doch vorgegeben? Inwiefern erwartest du Änderungen?
Die L293D sind komplette H-Brücken, eignen sich sowohl für kleine Schrittmotoren als auch für "normale" Gleichstrommotoren.
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3091
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wenn du 4 kleine DC-Motoren in nur 1 Richtung, aber mit drosselbarer Geschwindigkeit steuern willst, kannst du das wahlweise auch mit 4 einzelnen Transistoren und 4 PWM Pins machen. ( Freilaufdioden erforderlich )

Ströme unter 100 mA kann man mit bipolaren Transistoren steuern, auch wenn das erste was man liest immer  "MOSFET" ist.

LED's werden über Transistoren, nicht Relais, gesteuert. ( Meine Meinung )
Redest du von kleinen Signal-LED oder von solchen zur Beleuchtung ?

Und eigentlich ist es einfach, mehrere Sachen gleichzeitig und wahlweise unabhängig von anderen zu machen, wenn jede von mehreren Funktionen immer nur kurz läuft und Zeitsteuerung nicht über delays macht.

Vor allem ist es viel besser erweiterbar, also auf Dauer sogar einfacher.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo!
Vielleicht habe ich mich auch ein wenig verquerr ausgedrückt, was die Abfolge angeht. smiley-confuse
Das Programm soll folgendes machen:
Die ersten 6 LEDs werden gleichzeitig eingeschaltet. Nach Ablauf einer Zeit X werden weitere 8 LEDs dazugeschaltet, so das nun 14 LEDs gleichzeitig leuchten. Während die LEDs leuchten werden nacheinander 4 Motoren eingeschaltet (am schönsten wäre es, wenn sie langsam hochlaufen würden) und bleiben genauso wie die LEDs eingeschaltet. Während die 14 LEDs und 4 Motoren in Betrieb sind, sollen noch zusätzlich für eine Zeit X 2 LEDs eingeschaltet, und auch wieder ausgeschaltet werden. Nach einer weiteren Zeit X sollen sich die Motoren ausschalten (wenn möglich langsam runterlaufend, und können das auch alle gleichzeitig machen), während die 14 LEDs noch weiterleuchten, und die sich erst nach einer Zeit X komplett auszuschalten, was auch gleichzeitig das Programmende bedeutet. Auf die Blinkfrequenz der unter 8. erwähnten LEDs könnte ich auch verzichten.
Zur Info: Die Schaltung ist für ein viermotoriges Flugzeugmodell mit Innenbeleuchtung Positionslichtern und Landescheinwerfern gedacht, und da es sich um ein altes Flugzeug handelt, müssen die Motoren auch mit einem gewissen zeitlichen Versatz starten.
Für mich ist ebend das Problem, dass sich die einzelnen Baugruppen zwar nacheinander einschalten, aber dann auch eingeschaltet bleiben müssen, speziell die Motoren. Und wie gesagt, auf die Schalterei der unter 8. erwähnten Dioden könnte ich verzichten, genauso, wie erst mal auf das Abspielen eines Sounds.
Zu den LEDs noch kurz. Es handelt sich durchweg um SMDs die mit max. 1,5 Volt betrieben werden, und nicht mehr als 20mA ziehen. Da die aber eh über Transistor angesteuert werden, ist das alles nicht so kritisch.
Gruss
Jürgen
Logged

Germany
Offline Offline
Edison Member
*
Karma: 48
Posts: 2346
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Na dann hatten wir eine unterschiedliche Auffassung des Wortes sequentiell. Ich bleibe dabei: Recht einfach realisierbar. smiley-wink
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3091
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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.  smiley-wink

Alternativ schreibt man die Liste als Reihe von Funktionsaufrufen:
Code:
  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. 
Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 174
Posts: 3288
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3091
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
eines meiner berüchtigten "erweiterten Demoprogramme"

Ich habe mich schon gewundert wo es bleibt ... smiley-wink

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

Germany S-H
Offline Offline
Faraday Member
**
Karma: 174
Posts: 3288
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
eines meiner berüchtigten "erweiterten Demoprogramme"

Ich habe mich schon gewundert wo es bleibt ... smiley-wink

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
smiley-wink

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.
smiley-wink
Logged

Pages: [1] 2 3   Go Up
Jump to: