HI,
Ich habe mir ein LED-Cube (8x8x8) gebaut und das ganze mit einem Arduino
Uno zum laufen gebracht. Da ich leider nicht sonderlich fit bin im
Programmieren von den Controllern habe ich mich auf die suche nach einem
Code gemacht um die Grundfunktion des Würfels zu erhalten. Da habe ich
den, öffentlich zugänglichen, Code gefunden welcher im Anhang zu finden
ist.
Das ganze funktioniert schon mal ganz gut. Jetzt hätte ich jedoch gerne,
dass ich die einzelnen Effekte per Knopfdruck weiter drücken kann und
die einzelnen Effekte sich solange wiederholen bis ich wieder auf den
Knopf drücke.
Jedoch weiß ich nicht wie ich das ganze umsetzen kann?
In der Theorie müsste ich ja ein Input Pin festlegen und die einzelnen
Effekte als Schleife. Dann müsste ich eine neue Variabel festlegen die
die Knopfdrücke zählte und sagt ob die Beddingen erfüllt ist, damit der
Effekt statt findet (also Knopf 1x gedrückt, erster Effekt, noch mal
gerückt 2. Effekt usw.)?
Aber wie kann ich das in diesem Programm umsetzen?
Würde mich über Hilfe sehr freuen.
LG
Hallo Tobias,
schau mal hier https://www.arduino.cc/en/Reference/AttachInterrupt
In Deinem Loop brauchst Du dann nur noch einen Switch und gut ist es.
Allerdings sollest Du beachten, dass der aktuell laufende Effekt zuerst
zu Ende bearbeitet wird bevor der nächste Effekt - der, den Du
ausgewählt hast - startet. Willst Du das nicht, musst Du in jeden Effekt
noch eine zusätzliche Abbruchbedingung integrieren. Also eine zweite
Variable die im Interrupt gesetzt wird und den Effekt abbricht.
Gruß
Frank
Hallo Frank,
danke schon mal für die Antwort. Nun ist es aber so, dass ich Pin
2,3,4,5,6,7,8,9 für die Kathoden Ansteuerung nutze. Aso ist die
Anleitung oben ja nicht ausführbar oder?
So wie ich das sehe wird ja in diesem Teil die einzelnen Effekte
aufgerufen:
Patrick J. schrieb:> Hi>> Die Funktionen, Die Du da aufrufst, müssen ja irgendwo vorhanden sein -> ein Blick darein könnte zum Verständnis positiv beitragen.>> MfG
Hi,
der Komplette Code ist in der Text Datei im Anfangspost.
Frank L. schrieb:> Hallo Tobias,>> Welches Arduino Bosrd nutzt Du genau? Ein Schaltplan würde auch helfen.>> Gruß
Ich Verwende den Arduino Uno. Der Schaltplan ist so aufgebaut wie alle
andren LED Cubs auch die ich kenne. Aber hier findet man ihn noch mal
sehr schön:
http://ledcubeblog.blogspot.de/2013/05/erstellung-der-steuerplatinen.html
LG
Tobias
Hallo Tobias,
Du kannst beim UNO generell jeden PIN als Interrupt fähig betrachten.
Lies Dir bitte dazu das mal durch
http://playground.arduino.cc/Main/PcInt
Um also einen zusätzlichen Taster verwenden zu können, stehen Dir die
Eingänge A0-A5 zur Verfügung.
Möchtest Du A0 als Input für Deinen Taster verwenden, wäre die korrekte
PIN Nummer die 14.
Wenn Du das lauffähig implementiert und verstanden hast, können wir den
nächsten Schritt gehen.
Gruß
Frank
Hi Frank,
um ehrlich zu sein verstehe ich den Inhalt nicht der sich hinter dem
Link befindet. Ich habe zwar jetzt raus das ich die Pins D14-D19 bzw. A0
bis A5 als Interupt nutzen kann, jedoch ist mir die Umsetzung leider
noch schleierhaft :(
LG
Tobias
Hallo Tobias,
kann ich nachvollziehen. Hast Du das Programm mal in einen Sketch
geladen und ein wenig damit herum gespielt?
An sich ist es ziemlich einfach. Folgende Herangehensweise ist sinnvoll:
Wir nehmen an, A0 (14) ist der PIN Deiner Wahl und wir verwenden einen
idealen Taster der nicht prellt.
Im ersten Schritt (Setup) schaltest Du den PIN auf Input und aktivierst
PULLUP damit der Eingang aktiv High ist. Du kannst diesen Eingang dann
durch den Taster auf LOW ziehen.
1
pinMode(14,INPUT_PULLUP);
Im zweiten Schritt, registrierst Du den Interrupt für diesen PIN
1
PCattachInterrupt(14,tick,FALLING);
Hier passiert jetzt folgendes, für den PIN 14 wird ein Interrupt
registriert und eine Funktion (tick) zugewiesen, die bei fallender
Flanke reagieren soll. In Deinem Fall also wenn der Taster gedrückt
wird.
Deine Funktion tick könnte jetzt in etwa so aussehen:
1
volatileuint8_teffect=0;
2
#define MAXEFFECTS 32
3
4
voidtick(void)
5
{
6
effect++;
7
if(effect>MAXEFFECTS)
8
{
9
effect=0;
10
}
11
}
Damit das funktioniert, musst Du alles an Code, der oberhalb von
1
volatilelongticktocks=0;
eins zu eins übernehmen.
In Deiner Loop wertest Du jetzt die Variable effect über ein Switch aus.
1
switch(effect)
2
{
3
case:0
4
effect_wormsqueeze(2,AXIS_Z,-1,100,1000);
5
break;
6
case:1
7
effect_rand_patharound(200,500);
8
break;
9
case:2
10
effect_intro();
11
break;
12
case:3
13
sinelines(4000,10);
14
break;
15
}
Der beschriebene Weg mag nicht der beste sein, er wird aber
funktionieren. Offen ist lediglich das Prellen des Tasters, hier wirst
Du Dir eine Hard- oder Softwarelösung einfallen lassen müssen und die
Möglichkeit über ein Flag einen Effekt abbrechen zu können sobald der
Taster gedrückt wurde.
Gruß
Frank
richtig?
Wo müsste ich das genau im Programm einfügen?
Dann würde ich ja im Void Setup die Deklarierung des pins als Interup
machen und die Funktion tick einfügen richtig? kann ich das einfach
irgendwo einfügen im Void Setup?
Der Teil mit dem Case1,2,3 usw. wäre ja mein Effekt wechsel richtig?
LG
Tobias
Hallo Tobias,
Zu beiden ja :-)
Die ganzen Kommentare am Anfang kannst Du weglassen.
Du kannst ja den Sketch mal soweit fertig machen und ich schaue morgen
nochmal drüber.
Gruß
Frank
Hi super!
Ich habe das ganze, so wie glaube, richtig umgesetzt aber ich bekomme
beim Überprüfen die Meldung "expected primary-expression before ':'
token" und den Verweis auf
1
case:17
Das verstehe ich noch nicht?
Im Anhang ist Sketch, einmal als Datei und einmal als Textdokument.
Alles was ich dazu gemacht habe, habe ich mit einem "NEU" Kommentar
versehen.
Danke schon mal fürs ansehen.
LG
Tobias
Hallo Tobias,
sieht soweit gut aus. Im Loop hast Du eine geschweifte Klammer
vergessen.
An dieser Stelle der kritische Hinweis, gewöhn Dir direkt eine sauber
Formatierung Deines Codes an. Dann findest Du solche Fehler schnell
selber.
Wenn Du jetzt noch einen Taster an A0 anschließt, sollte das ganze schon
funktionieren. Denk aber bitte daran, Dein Taster ist nicht entprellt
d.h. es kann passieren, dass die Variable effect mehrfach hochgezählt
wird und der aktuelle Effekt muss zuerst zu Ende laufen bis der aktuell
gewählte aktiv wird.
Im übrigen, kannst Du nach dem gleichen Muster einen zweiten Taster an
A1 hängen und damit die Effekt vor und zurück aktivieren. Mit einem
kleinen I2C LCD Display könntest Du sogar noch den aktuellen Effekt
namentlich anzeigen lassen. Nur so mal als kleine Idee für ein paar
schicke Erweiterungen.
Zum Thema Tasten entprellen per Hard- oder Software findest Du hier im
Forum einiges. Schau mal in die Artikel.
Gruß
Frank
Hi,
super vielen dank!
Ich habe den Code jetzt kopiert, aber den Fehler bekomme ich trotzdem?
Kannst du mir da vielleicht weiterhelfen?
Laufen die Effekte den jetzt solange im kreis bis ich wieder auf den
Knopf drücke? Doch eigentlich nicht? Oder stellt das
Hallo Tobias,
wenn Du den Fehler immer noch bekommst, dann hast Du wahrscheinlich
immer noch irgendwo eine Klammer zu wenig.
Die Funktionsweise ist, solange, Du nichts tust, wird der eingestellt
Effekt wiederholt. Die Schleife ist das "while" das Switch ist quasi
eine vereinfachte geschachtelte if Struktur. Solange sich der Inhalt der
Variablen effect nicht ändert, wird immer derselbe Effekt wiederholt.
Das break sorgt dafür, dass das Switch verlassen wird. Steht es nicht
da, würde mit dem nächsten Effekt weitergemacht werden.
Falls Du den Fehler nicht finden solltest, stell den aktuellen Code
nochmal rein, aber bitte sauber formatiert. Ich schaue dann morgen früh
noch mal drüber.
Gruß
Frank
Hallo Frank,
ja ok das macht Sinn, also läuft es so lange weiter bis ich wieder die
Taste drücke? Nur wieso muss dann erst der Effekt zu ende sein?
ICh bekomme leider immer immer noch den Fehler und habe auch keine
klammer mehr gefunden die fehlt. Ich hoffe die Formatierung ist jetzt
besser, ich gebe mir zumindest mühe!
Ich habe die .ino Datei jetzt mal auf Google Drive hoch geladen, da
ich nicht weiß wie ich das vernünftig hochladen kann, ohne das die
Formatierung kaputt geht.
https://drive.google.com/file/d/0B50RX0UnIj1yanFpM2JmRmN4bTQ/view?usp=sharing
Ich habe nur noch ein Problem mit dem Parllen. In der Anleitung hier im
Forum dazu gibt es ja schon Code Beispiele. Aber kann ich diese einfach
übernehmen und wo müsste ich die Programmteile dann einfügen? Vor
Hallo Tobias,
jetzt zu Deinen anderen Fragen:
1. Den Taster kannst Du nehmen.
2. Der Programmablauf
Stell Dir den Code innerhalb eines case bis zum nächsten break als
zusammen hängender Block vor. Dieser Block läuft ab egal was passiert.
Dein Taster-Interrupt würde den Block kurz unterbrechen und wenn er mit
seiner Aktion fertig ist an die Stelle zurückkehren, von der er gekommen
ist und den Rest des Blocks weiter abarbeiten.
Erst wenn der Block abgearbeitet ist, wird das Switch beendet und mit
dem neuen Wert von effect wieder betreten. Wurde effect nicht verändert,
würde der gleiche Effekt erneut laufen.
Gruß
Frank
Hi,
Ja super!
Aber ich muss nicht genau das ende des Blockes treffen wenn ich weiter
drücken will oder? Also ich drücke, für die Zeit stoppt der Effekt,
läuft dann wieder weiter und wechselt wenn er fertig ist in den nächsten
Effekt richtig?
Lg
Tobias
Hi Frank,
ja super, dass war echt der Fehler. jetzt läuft es.
Aber mir würde noch eine Kleinigkeit zum glück fehlen: Ist es denn noch
machbar, dass beim Tastendruck direkt der nächste Effekt starrtet und
davor, also praktisch beim Tasten drücken, der Cube einmal komplett blau
ist?
Das war mal so eine Idee, aber leider klappt die natürlich nicht wenn
ich die in Void loop() packe...
Hallo Tobias,
klar geht das, aber ohne das Du Dir Programmierkenntnisse aneignest und
das Programm verstehst, hast Du wenig bis keine Chance.
Als Tipp:
1. Variable für den Abbruch deklarieren
1
volatileuint8_trestart=0;
in der Funktion:
1
voidtick(void)
2
{
3
effect++;
4
if(effect>MAXEFFECTS)
5
{
6
effect=0;
7
}
8
restart=1;
9
}
dann eine zusätzliche Funktion:
1
voidvoideffect_blue()
2
{
3
// Hier muss Dein Code dafür rein
4
}
und dann überall wo er abbrechen soll.
1
if(restart==1)
2
{
3
effect_blue();
4
restart=0;
5
return;
6
}
So in etwa könnte es aussehen.
Viel Spaß :-) Bei Fragen melden.
Gruß
Frank
Hi Frank,
Danke schon mal ich werde das nachher direkt mal ausprobieren.
Die if Schleife für den Abbruch kommt dann praktisch zusätzliche zu den
Effekt aufrufen in den Switch? wenn ja, wo muss der den da hin? Vor ider
hinter den Effekt?
Lg
Tobias
HI Frank,
ich habe jetzt in der Zeit wo ich kein Internet hatte mal etwas anderes
probiert. Das macht auch soweit keine Fehlermeldungen. Aber im Case 9
sagt er mir: was not declared in this scope
Ich habe die Datei noch mal auf Google hoch geladen, magst du vielleicht
noch mal gucken?
Ich habe mich da aus einem anderem Programm für ein LED Cube bedient wo
es so funktioniert wie ich es gerne hätte.
Hier die Datei:
https://drive.google.com/file/d/0B50RX0UnIj1ybHZkeHdRNEtHTk0/view?usp=sharing
LG
Tobias
Hallo Tobias,
ich habe Dir den Code korrigiert, wie immer geschweifte Klammer nicht
mit kopiert :-(.
Aber der Code ist absolut sinn frei, da er nur durch Zufall
funktionieren wird. Wenn Du den Taster nicht genau zum richtigen
Zeitpunkt betätigst oder solange drückst bis der aktuelle Effekt
abgelaufen ist, wird kein neuer Effekt durchlaufen.
Mir ist nicht klar, was Du mit dem neuen Code erreichen wolltest.
Durch die Interruptsteuerung kannst Du den Taster zu jedem Zeitpunkt
betätigen und nach Ablauf des Effekts wird der eingestellte aufgerufen.
Gruß
Frank
Mhm, ich habe eigentlich extra die Klammern gezählt und extrem drauf
geachtet das sie alle da sind :(
Ich habe diese Befehle hier raus genommen (link zum Code in der
Beschreibung) https://www.youtube.com/watch?v=T5Aq7cRc-mU&t=40s
ich hatte die Idee das ganze zu kombinieren, aber das geht ja dann wohl
doch nicht :/
Danke dir trotzdem bis hier für deine Hilfe!
LG
Tobias
Hi
Tobias F. schrieb:> das geht ja dann wohl doch nicht :/
Es geht so ziemlich Alles, was Du Dir vorstellen kannst!
Dein Problem besteht momentan eher darin, daß Du Dir den eigentlichen
Ablauf nicht vorstellen kannst, wodurch es Dir nicht möglich ist, IMMER
auf ein externes Signal entsprechend zu reagieren.
Ansätze wurden Dir ja oben schon genannt.
Da, Wo Du unterbrechen können möchtest, musst Du halt überprüfen, ob
JETZT GERADE unterbrochen werden soll - wenn nicht, dann ganz normal
weiter, wenn doch -> 'Alle Maschinen STOP und zurück zum Anfang'.
Du kannst die einzelnen Effekte als 'Status' durchlaufen lassen.
Bei Knopfdruck 'jetzt den nächsten Effekt' änderst Du den Status auf den
nächsten Effekt - Mehr ist Das nicht.
Wenn der Effekt aus mehreren Status (die Mehrzahl soll ebenfalls Status
heißen, nur das U wird wohl lang gesprochen) besteht, wird eben so
lange '+1' gesprungen, bis der Effekt fertig ist und dort dann an den
Anfang des gerade abgespielten Effekt, oder zum Nächsten - ist Deine
Wahl.
Hier ist 'Programmieren' und 'logisch Denken' gefragt, Beides kann man
Sich aneignen und Niemand hat Das zuvor mit 'dem goldenem Löffel'
serviert bekommen.
Das ist der größte Vorteil beim Programmieren: Es ist ALLES logisch
(macht ein Scheitern aber nicht angenehmer ;) )
MfG