commit 3fa536d4feee16be414b77f085ccc4588640f2e8 Author: Ingo Rohlf Date: Sat Aug 17 12:40:02 2024 +0200 erste Version diff --git a/src/_5x5x5_Led_Cube (working).ino b/src/_5x5x5_Led_Cube (working).ino new file mode 100644 index 0000000..7e8f3bb --- /dev/null +++ b/src/_5x5x5_Led_Cube (working).ino @@ -0,0 +1,372 @@ +#include + +#define PIN_SER 12 +#define PIN_OE 11 +#define PIN_RCLK 10 +#define PIN_SRCLK 9 +#define PIN_SRCLR 8 + + +typedef void(*CubeEffects)(unsigned int frame); + + + +class ShiftRegisterSlow { + public: + + void reset() { + pinMode(PIN_SER, OUTPUT); + pinMode(PIN_OE, OUTPUT); + pinMode(PIN_RCLK, OUTPUT); + pinMode(PIN_SRCLK, OUTPUT); + pinMode(PIN_SRCLR, OUTPUT); + + output_disable(); + clear_register(); + register_to_output(); + } + + void output_enable() { + digitalWrite(PIN_OE, LOW); + } + void output_disable() { + digitalWrite(PIN_OE, HIGH); + } + + void clear_register() { + digitalWrite(PIN_SRCLR, HIGH); + digitalWrite(PIN_SRCLK, LOW); + digitalWrite(PIN_RCLK, LOW); + digitalWrite(PIN_SRCLR, LOW); + digitalWrite(PIN_SRCLR, LOW); + digitalWrite(PIN_SRCLR, HIGH); + } + + void shift_bit(bool bit) { + digitalWrite(PIN_SER, bit); + digitalWrite(PIN_SRCLK, HIGH); + digitalWrite(PIN_SRCLK, LOW); + } + void register_to_output() { + digitalWrite(PIN_RCLK, HIGH); + digitalWrite(PIN_RCLK, LOW); + } +}; + +class ShiftRegister { + public: + const byte _SER = B00010000; + const byte _OE = B00001000; + const byte _RCLK = B00000100; + const byte _SRCLK = B00000010; + const byte _SRCLR = B00000001; + + void reset() { + // Port B Pin 8 - 13 + //Serial.println("reset"); + DDRB |= _SER; // _SER als Output + DDRB |= _OE; // _OE als Output + DDRB |= _RCLK; // _RCLK als Output + DDRB |= _SRCLK; // _SRCLK als Output + DDRB |= _SRCLR; // _SRCLR als Output + + output_disable(); + clear_register(); + register_to_output(); + // Serial.println(PORTB); + } + + void output_enable() { + // OUTPUT für OE auf 0 setzen + PORTB &= ~_OE; // -> LOW + } + void output_disable() { + // OUTPUT für OE auf 1 setzen + PORTB |= _OE; //-> HIGH + } + void clear_register() { + PORTB |= _SRCLR; // -> HIGH + PORTB &= ~_SRCLK; // -> LOW + PORTB &= ~_RCLK; // -> LOW + PORTB &= ~_SRCLR; // -> LOW + PORTB &= ~_SRCLR; // -> LOW + PORTB |= _SRCLR; // -> HIGH + } + + void shift_bit(bool bit) { + //Serial.println("shift_bit " + (String)(bit)); + if (bit == LOW) { + PORTB &= ~_SER; // -> LOW + } else { + PORTB |= _SER; // -> HIGH + } + PORTB |= _SRCLK; // -> HIGH + PORTB &= ~_SRCLK; // -> LOW + }; + + void register_to_output() { + //Serial.println("register_to_output"); + // PORTB &= ~_RCLK; // -> LOW + PORTB |= _RCLK; // -> HIGH + //Serial.println(PORTB); + PORTB &= ~_RCLK; // -> LOW + // Serial.println(PORTB); + } +}; + +#define CUBESIZE 5 + +//ShiftRegisterSlow Register ; +ShiftRegister Register ; + + + +#define FPS 500 +#define LEDLEVEL 8 + +byte cube[CUBESIZE][CUBESIZE][CUBESIZE]; +volatile unsigned long frame = 0; +unsigned long start; +unsigned long ende; + + + + +class LED { + public: + byte x; + byte y; + byte z; + byte value; + + void show() { + cube[x][y][z] = value; + } + void hide() { + cube[x][y][z] = 0; + } + + void randomize() { + x = random(CUBESIZE + 1); + y = random(CUBESIZE + 1); + z = random(CUBESIZE + 1); + value = random(LEDLEVEL + 1); + } +}; + +class Vector { + public: + int dx; + int dy; + int dz; +}; + +void draw_cube_layer(byte layer, byte level) { + byte data = 0; + //Serial.print("Z "); + //Serial.println(layer); + for (byte z = 0; z < CUBESIZE; z++) { + Register.shift_bit(z == layer); + } + for (byte x = 0; x < CUBESIZE; x++) { + for (byte y = 0; y < CUBESIZE; y++) { + // Serial.print(cube[layer][x][y]); + Register.shift_bit((cube[layer][x][y] > level)); + } + // Serial.println(); + } + Register.register_to_output(); +} + +void setup() { + // Disable Arduino's default millisecond counter (from now on, millis(), micros(), + // delay() and delayMicroseconds() will not work) + + Serial.begin(115200); + //disableMillis(); + Register.reset(); + Register.output_enable(); + //randomize_cube(); + + + // Prepare Timer1 to count + // On 16 MHz Arduino boards, this function has a resolution of 4us + // On 8 MHz Arduino boards, this function has a resolution of 8us + startTimer1(1000000 / (FPS * LEDLEVEL)); + + //draw_cube_layer(1, 1); +} +/* + void randomize_cube() { + for (byte x = 0; x < CUBESIZE; x++) { + for (byte y = 0; y < CUBESIZE; y++) { + for (byte z = 0; z < CUBESIZE; z++) { + cube[z][x][y] = random(LEDLEVEL + 1); + } + } + } + } +*/ + +void glow_cube(int duration) { + ende = millis() + duration * 1000; + int glow = 0; + while (millis() < ende) { + glow = ((ende - millis()) / 200) % (LEDLEVEL + 1); + for (byte x = 0; x < CUBESIZE; x++) { + for (byte y = 0; y < CUBESIZE; y++) { + for (byte z = 0; z < CUBESIZE; z++) { + cube[z][x][y] = glow; + } + } + } + delay(50); + } +} + +void glitzer_cube(int duration) { + start = millis(); + ende = millis() + duration * 1000; + //while ((millis() - start) < 5000 ) { + while (millis() < ende) { + for (byte x = 0; x < CUBESIZE; x++) { + for (byte y = 0; y < CUBESIZE; y++) { + for (byte z = 0; z < CUBESIZE; z++) { + cube[z][x][y] = random(LEDLEVEL + 1); + } + } + } + delay(100); + } +} + + +void glitzer_fade_cube(int duration) { + int cleanup = 5; + + for (byte x = 0; x < CUBESIZE; x++) { + for (byte y = 0; y < CUBESIZE; y++) { + for (byte z = 0; z < CUBESIZE; z++) { + cube[z][x][y] = 0; + } + } + } + /* for (byte n = 0; n < traces; n++) { + punkt.randomize(); + punkt.show(); + } + */ + ende = millis() + duration * 1000; + while (millis() < ende) { + + //while ((millis() - start) < 10000 ) { + //punkt.randomize(); + //punkt.show(); + cube[random(CUBESIZE)][random(CUBESIZE)][random(CUBESIZE)] = random(LEDLEVEL + 1); + cube[random(CUBESIZE)][random(CUBESIZE)][random(CUBESIZE)] = random(LEDLEVEL + 1); + delay(25); + cleanup --; + if (cleanup <= 0) { + cleanup = 5; + for (byte x = 0; x < CUBESIZE; x++) { + for (byte y = 0; y < CUBESIZE; y++) { + for (byte z = 0; z < CUBESIZE; z++) { + if (cube[z][x][y] > 0) { + cube[z][x][y] --; + } + } + } + } + + } + } +} + + + +void traces_cube() { + start = millis(); + int traces = 5; + LED origin[traces]; + LED leds[traces]; + LED ziel[traces]; + + int steps[traces]; + int pos[traces]; + + for (byte n = 0; n < traces; n++) { + origin[n] = LED(); + origin[n].randomize(); + origin[n].z = 0; + leds[n] = LED(); + ziel[n] = LED(); + ziel[n].randomize(); + ziel[n].z = CUBESIZE - 1; + steps[n] = random(5, 20); + pos[n] = 0; + } + for (byte x = 0; x < CUBESIZE; x++) { + for (byte y = 0; y < CUBESIZE; y++) { + for (byte z = 0; z < CUBESIZE; z++) { + cube[z][x][y] = 0; + } + } + } + + while ((millis() - start) < 5000 ) { + for (byte n = 0; n < traces; n++) { + + leds[n].hide(); + pos[n] ++; + leds[n].x = origin[n].x + ( (ziel[n].x - origin[n].x) * pos[n] / steps[n]); + leds[n].y = origin[n].y + ( (ziel[n].y - origin[n].y) * pos[n] / steps[n]); + leds[n].z = (origin[n]).z + ( ((ziel[n]).z - origin[n].z) * pos[n] / steps[n]); + leds[n].show(); + + } + + delay(100); + } +} + + +void loop() { + int next_duration = random(5, 10); + switch (random(10)) { + case 0: + glow_cube(next_duration); + break; + case 1: + glitzer_cube(next_duration); + break; + case 2: + glitzer_fade_cube(next_duration); + break; + } + + + /* glitzer_cube(random(5, 20)); + glitzer_fade_cube(random(5, 20)); + */ +} + + + +// Define the function which will handle the notifications (interrupts) +ISR(timer1Event) +{ + // if (Serial) + // Serial.println(frame); + + // Reset Timer1 (resetTimer1 should be the first operation for better timer precision) + resetTimer1(); + // For a smaller and faster code, the line above could safely be replaced with a call + // to the function resetTimer1Unsafe() as, despite its name, it IS safe to call + // that function in here (interrupts are disabled) + + // Make sure to do your work as fast as possible, since interrupts are automatically + // disabled when this event happens (refer to interrupts() and noInterrupts() for + // more information on that) + draw_cube_layer(frame % CUBESIZE, frame % LEDLEVEL); + frame ++; +} diff --git a/tools/5x5x5 Bohrschablone (1,27cm).odg b/tools/5x5x5 Bohrschablone (1,27cm).odg new file mode 100644 index 0000000..fbfc5b2 Binary files /dev/null and b/tools/5x5x5 Bohrschablone (1,27cm).odg differ diff --git a/tools/Ebenen-Template.fcstd b/tools/Ebenen-Template.fcstd new file mode 100644 index 0000000..364b6fc Binary files /dev/null and b/tools/Ebenen-Template.fcstd differ diff --git a/tools/Ebenen-Template.fcstd1 b/tools/Ebenen-Template.fcstd1 new file mode 100644 index 0000000..310b6df Binary files /dev/null and b/tools/Ebenen-Template.fcstd1 differ