some animations by @zigazou
This commit is contained in:
parent
fbe8ce8326
commit
01d397f757
369
8x8x8.ino
369
8x8x8.ino
|
@ -4,6 +4,8 @@
|
||||||
* GNU GPL V2
|
* GNU GPL V2
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
//************** Low level functions *********************
|
||||||
#define pinOE 11
|
#define pinOE 11
|
||||||
boolean cube[8][8][8];
|
boolean cube[8][8][8];
|
||||||
|
|
||||||
|
@ -13,113 +15,332 @@ const int busPins[]={0,1,2,3,4,5,6,7};
|
||||||
// IC Pins are "hard coded". here just for info,
|
// IC Pins are "hard coded". here just for info,
|
||||||
const int ICPins[]={8,9,10};
|
const int ICPins[]={8,9,10};
|
||||||
// If you change IC pin configuration,
|
// If you change IC pin configuration,
|
||||||
// You'll have to modify const ICtable[9]
|
// You'll have to modify write cube void
|
||||||
|
|
||||||
//see SN74HC138 specs
|
//see SN74HC138 specs
|
||||||
//http://www.ti.com/lit/ds/symlink/sn54hc138.pdf page 2
|
//http://www.ti.com/lit/ds/symlink/sn54hc138.pdf page 2
|
||||||
const byte ICtable[9]={
|
|
||||||
B00000000,
|
|
||||||
B00000001,
|
|
||||||
B00000010,
|
|
||||||
B00000011,
|
|
||||||
B00000100,
|
|
||||||
B00000101,
|
|
||||||
B00000110,
|
|
||||||
B00000111,
|
|
||||||
B00000000 //une façon de boucler sur 0
|
|
||||||
};
|
|
||||||
|
|
||||||
void writeCube(int tdelay){
|
void writeCube(int tdelay){
|
||||||
static int currentLayer=0;
|
static int currentLayer = 0;
|
||||||
unsigned long startedAt = millis();
|
unsigned long startedAt = millis();
|
||||||
while(millis() - startedAt < tdelay){
|
while(millis() - startedAt < tdelay) {
|
||||||
|
// Wait for a bit on previous layer
|
||||||
|
delay(1);
|
||||||
|
|
||||||
delay(1);// wait a bit on previous layer
|
// Turn off all layers
|
||||||
digitalWrite(layersPins[currentLayer],LOW);//turn off current Layer
|
for(int pin = 0; pin < 8; pin++){
|
||||||
|
digitalWrite(layersPins[pin],LOW);
|
||||||
|
}
|
||||||
|
|
||||||
//change currentLayer
|
// Output Enabled off
|
||||||
if(currentLayer == 8)
|
digitalWrite(pinOE, HIGH);
|
||||||
currentLayer=0;
|
|
||||||
else
|
|
||||||
currentLayer++;
|
|
||||||
|
|
||||||
digitalWrite(pinOE, HIGH);//Output Enabled off
|
// Lines
|
||||||
//lines
|
// Set IC
|
||||||
PORTB=ICtable[0];//set IC
|
PORTB = 0;
|
||||||
for(int ligne=0;ligne < 8; ligne++){
|
for(int ligne = 0; ligne < 8; ligne++) {
|
||||||
//write BUS for this leds'line
|
// Write BUS for this leds'line
|
||||||
for (int led=0;led <8;led++){
|
for (int led=0;led <8;led++) {
|
||||||
digitalWrite(busPins[led], cube[currentLayer][ligne][led]);
|
digitalWrite(busPins[led], cube[currentLayer][ligne][led]);
|
||||||
}
|
}
|
||||||
PORTB=ICtable[ligne +1]; //74HC574 is writen when clock pin goes LOW to HIGH. SO go to the next value for IC.
|
|
||||||
|
// 74HC574 is writed when clock pin goes LOW to HIGH. SO go to the next value for IC.
|
||||||
|
PORTB = (ligne + 1) & B00000111;
|
||||||
}
|
}
|
||||||
//OE ON
|
|
||||||
|
// Output Enabled on
|
||||||
digitalWrite(pinOE, LOW);
|
digitalWrite(pinOE, LOW);
|
||||||
//layer on
|
|
||||||
|
// Layer on
|
||||||
digitalWrite(layersPins[currentLayer],HIGH);
|
digitalWrite(layersPins[currentLayer],HIGH);
|
||||||
}
|
|
||||||
}
|
// Change currentLayer
|
||||||
void fillCube(){
|
if(currentLayer == 8) {
|
||||||
for (int i=0;i<8;i++){
|
currentLayer = 0;
|
||||||
for(int j=0;j<8;j++){
|
} else {
|
||||||
for(int k=0;k<8;k++){
|
currentLayer++;
|
||||||
cube[i][j][k]=true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void lowCube(){
|
|
||||||
for (int i=0;i<8;i++){
|
|
||||||
for(int j=0;j<8;j++){
|
|
||||||
for(int k=0;k<8;k++){
|
|
||||||
cube[i][j][k]=false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setup(){
|
void fillCube() {
|
||||||
|
for(int i=0; i < 512; i++) ((byte *)cube)[i] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void lowCube() {
|
||||||
|
for(int i=0; i < 512; i++) ((byte *)cube)[i] = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup() {
|
||||||
for(int pin=0; pin<8; pin++){
|
for(int pin=0; pin<8; pin++){
|
||||||
pinMode(layersPins[pin], OUTPUT);
|
pinMode(layersPins[pin], OUTPUT);
|
||||||
pinMode(busPins[pin], OUTPUT);
|
pinMode(busPins[pin], OUTPUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int pin=0;pin<3;pin++){
|
for(int pin=0;pin<3;pin++){
|
||||||
pinMode(ICPins[pin],OUTPUT);
|
pinMode(ICPins[pin],OUTPUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
pinMode(pinOE, OUTPUT);
|
pinMode(pinOE, OUTPUT);
|
||||||
digitalWrite(pinOE, LOW);
|
digitalWrite(pinOE, LOW);
|
||||||
lowCube();
|
lowCube();
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop(){
|
//***************** Some animate samples **************************
|
||||||
//remplir tout le layer haut
|
|
||||||
for(int i=0;i<8;i++){
|
|
||||||
for(int j=0;j<8;j++){
|
|
||||||
cube[7][i][j]=true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
writeCube(1000);
|
|
||||||
|
|
||||||
//descendre les leds 1 par une
|
void drawline(int x1, int y1, int z1, const int x2, const int y2, const int z2, byte value){
|
||||||
for(int i=0;i<8;i++){
|
// Bresenham3D from https://gist.github.com/yamamushi/5823518
|
||||||
for(int j=0;j<8;j++){
|
int i, dx, dy, dz, l, m, n, x_inc, y_inc, z_inc, err_1, err_2, dx2, dy2, dz2;
|
||||||
for(int layer=7; layer >0; layer--){
|
int point[3];
|
||||||
cube[layer][i][j]=false;
|
|
||||||
cube[layer -1][i][j]=true;
|
|
||||||
writeCube(15);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
point[0] = x1;
|
||||||
}
|
point[1] = y1;
|
||||||
//monter
|
point[2] = z1;
|
||||||
for(int i=7;i>=0;i--){
|
dx = x2 - x1;
|
||||||
for(int j=7;j>=0;j--){
|
dy = y2 - y1;
|
||||||
for(int layer=0; layer <7; layer++){
|
dz = z2 - z1;
|
||||||
cube[layer][i][j]=false;
|
x_inc = (dx < 0) ? -1 : 1;
|
||||||
cube[layer +1][i][j]=true;
|
l = abs(dx);
|
||||||
writeCube(15);
|
y_inc = (dy < 0) ? -1 : 1;
|
||||||
}
|
m = abs(dy);
|
||||||
|
z_inc = (dz < 0) ? -1 : 1;
|
||||||
|
n = abs(dz);
|
||||||
|
dx2 = l << 1;
|
||||||
|
dy2 = m << 1;
|
||||||
|
dz2 = n << 1;
|
||||||
|
|
||||||
|
if ((l >= m) && (l >= n)) {
|
||||||
|
err_1 = dy2 - l;
|
||||||
|
err_2 = dz2 - l;
|
||||||
|
for (i = 0; i < l; i++) {
|
||||||
|
cube[point[0]][point[1]][point[2]] ^= value;
|
||||||
|
if (err_1 > 0) {
|
||||||
|
point[1] += y_inc;
|
||||||
|
err_1 -= dx2;
|
||||||
}
|
}
|
||||||
|
if (err_2 > 0) {
|
||||||
|
point[2] += z_inc;
|
||||||
|
err_2 -= dx2;
|
||||||
|
}
|
||||||
|
err_1 += dy2;
|
||||||
|
err_2 += dz2;
|
||||||
|
point[0] += x_inc;
|
||||||
|
}
|
||||||
|
} else if ((m >= l) && (m >= n)) {
|
||||||
|
err_1 = dx2 - m;
|
||||||
|
err_2 = dz2 - m;
|
||||||
|
for (i = 0; i < m; i++) {
|
||||||
|
cube[point[0]][point[1]][point[2]] ^= value;
|
||||||
|
if (err_1 > 0) {
|
||||||
|
point[0] += x_inc;
|
||||||
|
err_1 -= dy2;
|
||||||
|
}
|
||||||
|
if (err_2 > 0) {
|
||||||
|
point[2] += z_inc;
|
||||||
|
err_2 -= dy2;
|
||||||
|
}
|
||||||
|
err_1 += dx2;
|
||||||
|
err_2 += dz2;
|
||||||
|
point[1] += y_inc;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
err_1 = dy2 - n;
|
||||||
|
err_2 = dx2 - n;
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
cube[point[0]][point[1]][point[2]] ^= value;
|
||||||
|
if (err_1 > 0) {
|
||||||
|
point[1] += y_inc;
|
||||||
|
err_1 -= dz2;
|
||||||
|
}
|
||||||
|
if (err_2 > 0) {
|
||||||
|
point[0] += x_inc;
|
||||||
|
err_2 -= dz2;
|
||||||
|
}
|
||||||
|
err_1 += dy2;
|
||||||
|
err_2 += dx2;
|
||||||
|
point[2] += z_inc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cube[point[0]][point[1]][point[2]] ^= value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void dolines() {
|
||||||
|
for(int i = 0; i < 8; i++) {
|
||||||
|
drawline(0, 0, i, 7, i, 7, true);
|
||||||
|
drawline(0, i, 0, i, 7, 7, true);
|
||||||
|
drawline(i, 0, 0, 7, 7, i, true);
|
||||||
|
writeCube(100);
|
||||||
|
}
|
||||||
|
for(int i = 0; i < 8; i++) {
|
||||||
|
drawline(i, 0, i, 7, i, 7, true);
|
||||||
|
drawline(0, i, 0, i, 7, 7, true);
|
||||||
|
drawline(i, 0, i, 7, 7, i, true);
|
||||||
|
writeCube(100);
|
||||||
|
}
|
||||||
|
for(int i = 0; i < 8; i++) {
|
||||||
|
drawline(i, 0, 0, 7, i, 7, true);
|
||||||
|
drawline(0, i, 0, i, 7, 7, true);
|
||||||
|
drawline(0, 0, i, 7, 7, i, true);
|
||||||
|
writeCube(100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void fillface() {
|
||||||
|
int i,j;
|
||||||
|
|
||||||
|
for(i = 0; i < 8; i++) {
|
||||||
|
for(j= 0; j < 8; j++) {
|
||||||
|
drawline(4,4,4,i,j,0, true);
|
||||||
|
writeCube(60);
|
||||||
|
drawline(4,4,4,i,j,0, true);
|
||||||
|
cube[i][j][0] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 0; i < 8; i++) {
|
||||||
|
for(j= 0; j < 8; j++) {
|
||||||
|
drawline(4,4,4,0,i,j, true);
|
||||||
|
writeCube(60);
|
||||||
|
drawline(4,4,4,0,i,j, true);
|
||||||
|
cube[0][i][j] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 0; i < 8; i++) {
|
||||||
|
for(j= 0; j < 8; j++) {
|
||||||
|
drawline(4,4,4,i,0,j, true);
|
||||||
|
writeCube(60);
|
||||||
|
drawline(4,4,4,i,0,j, true);
|
||||||
|
cube[i][0][j] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 0; i < 8; i++) {
|
||||||
|
for(j= 0; j < 8; j++) {
|
||||||
|
drawline(4,4,4,i,j,7, true);
|
||||||
|
writeCube(60);
|
||||||
|
drawline(4,4,4,i,j,7, true);
|
||||||
|
cube[i][j][7] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 0; i < 8; i++) {
|
||||||
|
for(j= 0; j < 8; j++) {
|
||||||
|
drawline(4,4,4,7,i,j, true);
|
||||||
|
writeCube(60);
|
||||||
|
drawline(4,4,4,7,i,j, true);
|
||||||
|
cube[7][i][j] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 0; i < 8; i++) {
|
||||||
|
for(j= 0; j < 8; j++) {
|
||||||
|
drawline(4,4,4,i,7,j, true);
|
||||||
|
writeCube(60);
|
||||||
|
drawline(4,4,4,i,7,j, true);
|
||||||
|
cube[i][7][j] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 0; i < 8; i++) {
|
||||||
|
for(j= 0; j < 8; j++) {
|
||||||
|
drawline(4,4,4,i,j,0, true);
|
||||||
|
writeCube(60);
|
||||||
|
drawline(4,4,4,i,j,0, true);
|
||||||
|
cube[i][j][0] = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 0; i < 8; i++) {
|
||||||
|
for(j= 0; j < 8; j++) {
|
||||||
|
drawline(4,4,4,0,i,j, true);
|
||||||
|
writeCube(60);
|
||||||
|
drawline(4,4,4,0,i,j, true);
|
||||||
|
cube[0][i][j] = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 0; i < 8; i++) {
|
||||||
|
for(j= 0; j < 8; j++) {
|
||||||
|
drawline(4,4,4,i,0,j, true);
|
||||||
|
writeCube(60);
|
||||||
|
drawline(4,4,4,i,0,j, true);
|
||||||
|
cube[i][0][j] = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 0; i < 8; i++) {
|
||||||
|
for(j= 0; j < 8; j++) {
|
||||||
|
drawline(4,4,4,i,j,7, true);
|
||||||
|
writeCube(60);
|
||||||
|
drawline(4,4,4,i,j,7, true);
|
||||||
|
cube[i][j][7] = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 0; i < 8; i++) {
|
||||||
|
for(j= 0; j < 8; j++) {
|
||||||
|
drawline(4,4,4,7,i,j, false);
|
||||||
|
writeCube(60);
|
||||||
|
drawline(4,4,4,7,i,j, false);
|
||||||
|
cube[7][i][j] = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 0; i < 8; i++) {
|
||||||
|
for(j= 0; j < 8; j++) {
|
||||||
|
drawline(4,4,4,i,7,j, false);
|
||||||
|
writeCube(60);
|
||||||
|
drawline(4,4,4,i,7,j, false);
|
||||||
|
cube[i][7][j] = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lowCube();
|
||||||
|
}
|
||||||
|
|
||||||
|
void laserToOppositeFace(){
|
||||||
|
for(int i = 0; i < 8; i++) {
|
||||||
|
for(int j= 0; j < 8; j++) {
|
||||||
|
drawline(0,0,0,7,i,j, true);
|
||||||
|
writeCube(50);
|
||||||
|
|
||||||
|
|
||||||
|
//lowCube();
|
||||||
|
|
||||||
|
for(int k=0;k<7;k++){
|
||||||
|
for(int l=0;l<7;l++){
|
||||||
|
for(int m=0;m<7;m++){
|
||||||
|
cube[k][l][m]=false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
for(int j= 0; j < 8; j++) {
|
||||||
|
drawline(0,0,0,7-j,i,7, true);
|
||||||
|
writeCube(50);
|
||||||
|
|
||||||
|
//lowCube();
|
||||||
|
|
||||||
|
for(int k=0;k<7;k++){
|
||||||
|
for(int l=0;l<7;l++){
|
||||||
|
for(int m=0;m<7;m++){
|
||||||
|
cube[k][l][m]=false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
laserToOppositeFace();
|
||||||
|
lowCube();
|
||||||
|
fillface();
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user