erste Version
This commit is contained in:
commit
3fa536d4fe
4 changed files with 372 additions and 0 deletions
372
src/_5x5x5_Led_Cube (working).ino
Normal file
372
src/_5x5x5_Led_Cube (working).ino
Normal file
|
|
@ -0,0 +1,372 @@
|
|||
#include <Timer1.h>
|
||||
|
||||
#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 ++;
|
||||
}
|
||||
BIN
tools/5x5x5 Bohrschablone (1,27cm).odg
Normal file
BIN
tools/5x5x5 Bohrschablone (1,27cm).odg
Normal file
Binary file not shown.
BIN
tools/Ebenen-Template.fcstd
Normal file
BIN
tools/Ebenen-Template.fcstd
Normal file
Binary file not shown.
BIN
tools/Ebenen-Template.fcstd1
Normal file
BIN
tools/Ebenen-Template.fcstd1
Normal file
Binary file not shown.
Loading…
Reference in a new issue