Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
ws2122:game_of_light [2022/04/10 19:33] – [Ergebnis] laraw | ws2122:game_of_light [2022/04/10 20:34] (aktuell) – [Ergebnis] laraw | ||
---|---|---|---|
Zeile 10: | Zeile 10: | ||
* Zellen mit genau 3 Nachbarn werden lebendig | * Zellen mit genau 3 Nachbarn werden lebendig | ||
* Zellen mit mehr als 3 Nachbarn sterben (an " | * Zellen mit mehr als 3 Nachbarn sterben (an " | ||
+ | |||
+ | Durch diese Regeln gibt es bestimmte Muster, die statisch sind, wie z.B. | ||
+ | {{ws2122: | ||
+ | und Muster, die periodisch wiederkehren, | ||
+ | {{ws2122: | ||
+ | Daraus lassen sich faszinierende, | ||
<!-- wie viel noch zu stabilen Zuständen und Mustern? --> | <!-- wie viel noch zu stabilen Zuständen und Mustern? --> | ||
Zeile 33: | Zeile 39: | ||
{{ : | {{ : | ||
Jede Zelle besteht aus einem 3D-gedruckten Zellkörper <!-- Link -->, der so gestaltet ist, dass man die Zellen einfach ineinander schieben kann und somit ein solides Feld erhält. darin müssen die Hall-Sonde, eine LED, ein Arduino Nano und einiges an Kabeln Platz finden, deswegen haben wir die Zellkörper 7cm tief gedruckt. \\ | Jede Zelle besteht aus einem 3D-gedruckten Zellkörper <!-- Link -->, der so gestaltet ist, dass man die Zellen einfach ineinander schieben kann und somit ein solides Feld erhält. darin müssen die Hall-Sonde, eine LED, ein Arduino Nano und einiges an Kabeln Platz finden, deswegen haben wir die Zellkörper 7cm tief gedruckt. \\ | ||
- | Die LED und die Hall-Sonde werden im ebenfalls 3D-gedruckten Deckel befestigt (s. Bild, das noch eingefügt werden muss), damit das Licht von außen gut sichtbar ist und alle Zellen einheitlich leuchten und ebenso einheitlich auf den Magneten reagieren. Außerdem gibt es Aussparungen für die Steckverbindungen der Kabel, die die Kommunikation der Zellen ermöglicht, | + | Die LED und die Hall-Sonde werden im ebenfalls 3D-gedruckten Deckel befestigt (s. Bild rechts), damit das Licht von außen gut sichtbar ist und alle Zellen einheitlich leuchten und ebenso einheitlich auf den Magneten reagieren. Außerdem gibt es Aussparungen für die Steckverbindungen der Kabel, die die Kommunikation der Zellen ermöglicht, |
Abgedeckt ist die 3d-gedruckte Deckelrahmenkonstruktion mit milchigem Acrylglas, das mit dem Laser-Cutter geschnitten wurde. | Abgedeckt ist die 3d-gedruckte Deckelrahmenkonstruktion mit milchigem Acrylglas, das mit dem Laser-Cutter geschnitten wurde. | ||
- | Die Rückseite ist mit einem ebenfalls 3D-gedruckten Deckel verschlossen, | + | Die Rückseite ist mit einem ebenfalls 3D-gedruckten Deckel verschlossen, |
Die 3D-gedruckten Teile wurden mit einem SLA-Drucker gedruckt, da dieser an sich genauer drucken kann als ein FDM-Drucker. Dadurch, dass die Teile nach dem Drucken aber gehärtet werden müssen, besteht bei unseren recht dünnen Wänden eine Neigung zum Neigen. Deswegen drucken wir die Teile doch lieber mit einem FDM-Drucker. | Die 3D-gedruckten Teile wurden mit einem SLA-Drucker gedruckt, da dieser an sich genauer drucken kann als ein FDM-Drucker. Dadurch, dass die Teile nach dem Drucken aber gehärtet werden müssen, besteht bei unseren recht dünnen Wänden eine Neigung zum Neigen. Deswegen drucken wir die Teile doch lieber mit einem FDM-Drucker. | ||
===Software=== | ===Software=== | ||
Zeile 50: | Zeile 56: | ||
- Nachbarn zählen (nach " | - Nachbarn zählen (nach " | ||
- je nach Anzahl der Nachbarn über eigenen Lebensstatus entscheiden | - je nach Anzahl der Nachbarn über eigenen Lebensstatus entscheiden | ||
- | Für Details und Code des Taktgebers siehe den __ordentlich__[[https:// | + | Für Details und Code des Taktgebers siehe den __ordentlich__[[https:// |
+ | \\ | ||
+ | **Tipp:** Speist man mehreren verbundenen Arduinos nur über eine Verbindung zum Laptop, so kann es passieren, dass die Stromstärke zu gering ist und merkwürdiges, | ||
====Ergebnis==== | ====Ergebnis==== | ||
- | Die fertige Zelle sieht am Ende wie folgt aus: {{ : | + | Die fertige Zelle sieht am Ende wie folgt aus: \\ |
+ | {{ : | ||
+ | |||
+ | Im Idealfall sollten deutlich kürzere Kabel verwendet werden, die dann an den Arduino gelötet werden, damit die Zellkörper nicht so vollgestopft werden. Darauf haben wir bis jetzt allerdings verzichtet, damit alle Materialien wiederverwendet werden können.\\ | ||
+ | \\ | ||
+ | {{ : | ||
+ | \\ | ||
+ | |||
+ | |||
+ | Ein komplettes 3x3 Feld konnten wir noch nicht testen, da dafür noch Materialien fehlen, aber ein Test auf einem Steckbrett hat gezeigt, dass alles grundsätzlich funktioniert, | ||
- | Im Idealfall sollten deutlich kürzere Kabel verwendet werden, die dann an den Arduino gelötet werden, damit die Zellkörper nicht so vollgestopft werden. Darauf haben wir bis jetzt allerdings verzichtet, damit alle Materialien wiederverwendet werden können. | + | {{ : |
- | {{ : | + | |
- | Ein komplettes 3x3 Feld konnten wir noch nicht testen, da dafür noch Materialien fehlen, aber ein Test auf einem Steckbrett hat gezeigt, dass alles grundsätzlich funktioniert, | + | |
- | {{ : | + | |
<!-- Bilder und Videos einfügen --> | <!-- Bilder und Videos einfügen --> | ||
Zeile 79: | Zeile 93: | ||
====Code==== | ====Code==== | ||
- | Jeder Arduino nano der in eine Zelle Verbaut | + | Jeder Arduino nano, der in eine Zelle verbaut |
<file php CellGenome.ino> | <file php CellGenome.ino> | ||
- | #define LED 11 // | + | #define LED 11 // |
- | #define sensorPIN A4 //pin zur Senor auswerung | + | #define sensorPIN A4 //pin zur Senor-Auswerung |
#define sensorVALUE analogRead(A4) | #define sensorVALUE analogRead(A4) | ||
- | #define stepPIN A5 //pin zur koordinierung. | + | #define stepPIN A5 //pin zur koordinierung. |
- | #define readPIN (stepSTATE+3)%8+2 | + | #define readPIN (stepSTATE+3)%8+2 |
- | #define writePIN stepSTATE+1 | + | #define writePIN stepSTATE+1 |
#define stepINPUT digitalRead(A5) | #define stepINPUT digitalRead(A5) | ||
- | int stepSTATE = 0; //extern angegebener Counter für den Lese/ | + | int stepSTATE = 0; //extern angegebener Counter für den Lese/ |
boolean stepTOGGLE = false; | boolean stepTOGGLE = false; | ||
- | int jobSTATE = 0; // | + | int jobSTATE = 0; // |
boolean liveSTATE = false; | boolean liveSTATE = false; | ||
- | int liveNEIGHBOUR = 0; //Anzahl der " | + | int liveNEIGHBOUR = 0; //Anzahl der " |
const int threshold = 450; //Grenzwert ab dem der Sensor anschlagen soll | const int threshold = 450; //Grenzwert ab dem der Sensor anschlagen soll | ||
Zeile 104: | Zeile 118: | ||
pinMode(LED, | pinMode(LED, | ||
pinMode(sensorPIN, | pinMode(sensorPIN, | ||
- | pinMode(stepPIN, | + | pinMode(stepPIN, |
pinMode(12, OUTPUT); | pinMode(12, OUTPUT); | ||
pinMode(12, LOW); | pinMode(12, LOW); | ||
Zeile 115: | Zeile 129: | ||
| | ||
if(stepTOGGLE == false && stepINPUT == true){ | if(stepTOGGLE == false && stepINPUT == true){ | ||
- | stepTOGGLE = true; // | + | stepTOGGLE = true; // |
- | stepSTATE += 1; //und eine genaration | + | stepSTATE += 1; //und eine Generation |
} | } | ||
- | if(stepTOGGLE == true && stepINPUT == false){ | + | if(stepTOGGLE == true && stepINPUT == false){ |
stepTOGGLE = false; | stepTOGGLE = false; | ||
} | } | ||
| | ||
- | if (stepSTATE == 0){ // | + | if (stepSTATE == 0){ // |
if (sensorVALUE <= threshold && sensorTOGGLE == false){ | if (sensorVALUE <= threshold && sensorTOGGLE == false){ | ||
- | sensorTOGGLE = true; // | + | sensorTOGGLE = true; // |
liveSTATE = !liveSTATE; | liveSTATE = !liveSTATE; | ||
Serial.println(sensorVALUE); | Serial.println(sensorVALUE); | ||
Zeile 139: | Zeile 153: | ||
} | } | ||
pinMode(writePIN, | pinMode(writePIN, | ||
- | digitalWrite(writePIN, | + | digitalWrite(writePIN, |
pinMode(readPIN, | pinMode(readPIN, | ||
digitalWrite(readPIN, | digitalWrite(readPIN, | ||
pinMode(readPIN, | pinMode(readPIN, | ||
- | liveNEIGHBOUR += digitalRead(readPIN); | + | liveNEIGHBOUR += digitalRead(readPIN); |
jobSTATE++; | jobSTATE++; | ||
Serial.print(liveNEIGHBOUR); | Serial.print(liveNEIGHBOUR); | ||
Zeile 153: | Zeile 167: | ||
else if (stepSTATE ==9 && jobSTATE == stepSTATE - 1){ // | else if (stepSTATE ==9 && jobSTATE == stepSTATE - 1){ // | ||
if (liveSTATE == false && liveNEIGHBOUR == 3){ //tote Zelle mit genau drei Lebenden Nachbarn | if (liveSTATE == false && liveNEIGHBOUR == 3){ //tote Zelle mit genau drei Lebenden Nachbarn | ||
- | liveSTATE = true; // | + | liveSTATE = true; // |
} | } | ||
- | else if (liveSTATE == true && liveNEIGHBOUR < 2){ // | + | else if (liveSTATE == true && liveNEIGHBOUR < 2){ // |
liveSTATE = false; | liveSTATE = false; | ||
} | } | ||
- | else if (liveSTATE == true && liveNEIGHBOUR > 3){ // | + | else if (liveSTATE == true && liveNEIGHBOUR > 3){ // |
liveSTATE = false; | liveSTATE = false; | ||
} | } | ||
Zeile 176: | Zeile 190: | ||
<file php controllpanell.ino> | <file php controllpanell.ino> | ||
#define button 8 //Der druckknopf für's schritweise fortschreiten der Genarationen wird an diesen Pin angeschlossen | #define button 8 //Der druckknopf für's schritweise fortschreiten der Genarationen wird an diesen Pin angeschlossen | ||
- | #define Switch 7 //Der Kippschalter mit dem zwischen " | + | #define Switch 7 //Der Kippschalter, mit dem zwischen " |
#define PulseOut A5 // | #define PulseOut A5 // | ||
#define Delay 5 // | #define Delay 5 // | ||
- | boolean stepTOGGLE = false; | + | boolean stepTOGGLE = false; |
void setup() { | void setup() { | ||
Zeile 190: | Zeile 204: | ||
void loop() { | void loop() { | ||
- | if(digitalRead(Switch)== true){ | + | if(digitalRead(Switch)== true){ |
for (int i = 1; i <= 9; i++ ){ // | for (int i = 1; i <= 9; i++ ){ // | ||
digitalWrite(PulseOut, | digitalWrite(PulseOut, |