Go Down

Topic: Cubo led 8x8x8 (Read 5091 times) previous topic - next topic

Diego_F

Hola
Estoy realizando un cubo led 8x8x8 y tengo algunos problemas. Anteriormente había realizado un cubo 5x5x5 el cual lo conectaba directamente al arduino, ahí todo iba perfecto y podía hacer efectos sin problemas. Sin embargo para el nuevo cubo debí usar los integrados 74hc595 y resulta que éstos actúan demasiado lentos como para que los efectos se vean bien. Por favor ¿podrían orientarme respecto a que puedo hacer para evitar dicho inconveniente o al menos mejorarlo un poco? gracias.

surbyte

Que es lento? Define la velocidad que esperas que refrezque el sistema.
Cuantos 595 estabas usando?

noter

Comienza por ilustrarnos cómo lo tienes conectado actualmente, y qué código estás utilizando; y a buen seguro que se te darán ideas en ambas vertientes.

Diego_F

#3
May 18, 2016, 04:54 am Last Edit: May 18, 2016, 05:00 am by Diego_F
En este momento el cubo que tengo es de tamaño 10, pero debido al problema que se presentó estamos pensando en dejarlo de tamaño 8. Dado el segundo caso tengo conectado 8 74hc595 en cascada de la forma que se indica aqui: https://www.arduino.cc/en/Tutorial/ShiftOut

El data, clock y latch pin del integrado los he conectado a los pines 13,12 y 11 del arduino (leonardo), respectivamente.

Las salidas de los 595 las uso para controlar las columnas del cubo (ánodo) y para controlar las capas estoy usando directamente los pines del arduino del 0 al 7. Todo el cubo lo estoy alimentando independiente para evitar algún otro problema.


Para el control de los 74hc595 he trabajado sobre un código que encontré:



Code: [Select]
boolean registers[64]={0};

void digitalW(int x, int y)
{
 registers[x]=y;
 writereg();
}

void writereg()
{
digitalWrite(L_p, LOW);
for (int i = 63; i>=0; i--)
{
digitalWrite(C_p, LOW);
digitalWrite(D_p, registers[i]);
digitalWrite(C_p, HIGH);
}
digitalWrite(L_p, HIGH);
}


Este código me permite controlar cada una de las salidas de los integrados, sin embargo dado que los efectos del cubo requieren de rapidez esto no me ha funcionado bien.
Lo que quiero por ahora es hacer que aparezcan letras, para lo cual he probado este código:

Code: [Select]
void letra1(byte arreglo[])
{
 int i,j,k,n=0;
 for(k=0;k<10;k++)
 {
 for(j=0;j<=7;j++)
 {
   for(i=0;i<=7;i++)
   {
     digitalW(j,1);
     digitalWrite(i,hbit(arreglo[j],i));
   }
   
     delay(5);

   digitalW(j,0);
   apagarcapas();

 }
 }
}


Ahí recibo el respectivo dato en binario con la función hbit

Code: [Select]
bool hbit (byte N, int pos)
{   // pos = 7 6 5 4 3 2 1 0
   int b = N >> pos ;         // Shift bits
   b = b & 1 ;                // coger solo el ultimo bit
   return b ;
}


Y con apagarcapas() pongo las salidas 0-7 del arduino en 0.

Este código hace el efecto pov recorriendo cada columna (de arriba a abajo), es decir, activo la columna y luego las capas según corresponda,  antes lo tenia al revés pero fue peor; con este las letras se forman pero no son estáticas, sino que dan pulsaciones que lo hacen ver muy mal. Espero su ayuda, gracias.

surbyte

Bueno pero no me has dicho cual es la velocidad de refrezco?

Diego_F

Hola, pues no tengo muy presente lo que me quieres decir, pero resulta que cuando había realizado antes mi cubo 5x5x5 directamente con un arduino mega me funcionaba perfecto y logre sacar algunos efectos con letras y se miraban bien, como corresponde al efecto pov. En este cubo solía dar el tiempo de barrido para cada columna en 15 ms y utilizaba el delay. Ahora con los 8 595 conectados ya no me ha sido posible, digamos que incluso bajando el tiempo de barrido por columna a 1ms tambien con el delay se ven las letras parpadeando y los leds alumbran muy poco. Probé con ese mismo tiempo en una sola tira de leds solo con el arduino y ahi no hay parpadeos, mientras que haciendo lo mismo con los 595 se nota a los leds parpadear muchísimo.

surbyte

Puedes poner todo el código? 

Diego_F

#7
May 18, 2016, 02:51 pm Last Edit: May 18, 2016, 02:56 pm by Diego_F
Este es el código, hay un cambio en la función letra porque últimamente lo había estado probando de nuevo en el cubo de tamaño 10, de modo que las letras salgan centradas en el cubo asemejando un cubo de tamaño 8. Si es posible corregir el problema me gustaría dejarlo de tamaño 10. Para este he conectado 13 595 y las capas a los pines 0-9.

Code: [Select]


int capa[10]={0,1,2,3,4,5,6,7,8,9};
int D_p = 13;
int L_p = 11;
int C_p = 12;
int t=10;
void setup() {

  for(int i = 0; i<10; i++)
    pinMode(capa[i], OUTPUT);

  pinMode(D_p,OUTPUT);
  pinMode(L_p,OUTPUT);
  pinMode(C_p,OUTPUT);
  writereg();
  apagarcapas();  
  apagarcolumnas();
}

bool hbit( byte N, int pos)
{   // pos = 7 6 5 4 3 2 1 0
    int b = N >> pos ;         // Shift bits
    b = b & 1 ;                // coger solo el ultimo bit
    return b ;
}
        
boolean registers[104]={0};

void digitalW(int x, int y)
{
  registers[x]=y;
  writereg();
}

void writereg()
{
digitalWrite(L_p, LOW);
for (int i = 103; i>=0; i--)
{
digitalWrite(C_p, LOW);
digitalWrite(D_p, registers[i]);
digitalWrite(C_p, HIGH);
}
digitalWrite(L_p, HIGH);
}

void apagarcapas()
{
  int i;
  for(i=0;i<10;i++)
    digitalWrite(capa[i],0);
}

void apagarcolumnas()
{
  int i;
  for(i=0;i<100;i++)
    digitalW(i,0);
}

void encendercolumnas()
{
  for(int i=0;i<100;i++)
    digitalW(i,1);
}

void encendercapas()
{
  for(int i=0;i<10;i++)
    digitalWrite(capa[i],1);
}

void letra1(byte arreglo[])
{
  int i,j,k,n=0;
  for(k=0;k<10;k++)
  {
  for(j=1;j<=8;j++)
  {
    for(i=1;i<=8;i++)
    {
      digitalW(j,1);
      digitalWrite(i,hbit(arreglo[j-1],i-1));
    }

    delay(5);
    digitalW(j,0);
    apagarcapas();
  }
  }
}

void loop() {
  
   byte S[8]={0x0,0xDF,0xDF,0xDB,0xDB,0xFB,0xFB,0x0};
   letra1(S);
}

noter

Hola.
La función digitalW te está "matando", y me explico:
Cada vez que llamas a esa función para actualizar un solo bit de un 595, estás reenviando la información de los trece registros, pues hace una llamada a writereg. Entonces, lo que deberías hacer es primero actualizar primero una columna completa en el array, y después llamar a writereg. Con esto ya deberías multiplicar bastante la velocidad de refresco.
Creo que se puede multiplicar aún más, pero sería bueno un esquema de cómo lo tienes conectado, por ver cuántos pines te quedan disponibles y buscar otras posibilidades, como por ejemplo manejar directamente la columna con arduino y escritura directa de puertos, y separar en dos cascadas los 595, una para fila y otra para capa.


surbyte

Tienes que sentarte y optimizar tu código.
Usar un timer que garantice que hara un refrezco en un tiempo tal que satisfaga esos 15fps que te mencioné antes.

noter

Hola.
Mira a ver qué tal se comporta este código, aunque no sé si he entendido cómo va tu montaje.
Code: [Select]

const int D_p = 13;
const int L_p = 11;
const int C_p = 12;
int t=10;
void setup() {

for(int i = 0; i<10; i++)
pinMode(i, OUTPUT);
pinMode(D_p,OUTPUT);
pinMode(L_p,OUTPUT);
pinMode(C_p,OUTPUT);
apagarcapas();
}

// usaremos dos bytes por fila (unsigned int), porque son diez bits, aunque nos sobren seis
void escribeCapa(unsigned int arreglo[])
{
digitalWrite(L_p, LOW);
for (int fila=0; fila<10; fila++) {
unsigned int tmp = arreglo[fila];
for (int columna=0; columna<10; columna++) {
digitalWrite(C_p, LOW);
digitalWrite(D_p, tmp & 1);
tmp >>= 1;
digitalWrite(C_p, HIGH);
}
}
digitalWrite(L_p, HIGH);
}

void apagarcapas()
{
int i;
for(i=0;i<10;i++)
digitalWrite(i,0);
}

void loop() {
// Unsigned ints, pero sólo utilizaremos los diez bytes inferiores, osea que el valor máximo será 3FF 
unsigned int S[10]={0x3FF, 0x0, 0xDF, 0xDF, 0xDB, 0xDB, 0xFB, 0xFB, 0x0, 0x3FF};
for (int a=0; a<10; a++) {
escribeCapa(S);
digitalWrite(a, HIGH);
delay(50);
digitalWrite(a, LOW);
}
}

surbyte

Cual es tu esquema de conexionado?
Es tu diseño o lo tomaste de algun sitio web?
Puedes postearlo.
Verlo ayuda a entender. Al menos a mi.

Diego_F

Hola, primero agradezco sus aportes y especialmente a Edison porque al revisar su código pude mejorar un poco el mio y las letras se hicieron mas estables. Sin embargo la estabilidad se pierde un poco a medida que utilizo los pines de los últimos integrados en cascada, así que me gustaría conseguir una solución.
Los esquemas que seguí para construir el cubo 10x10x10 se basan en los que están es estas direcciones:

http://www.taringa.net/posts/hazlo-tu-mismo/14608212/Realiza-cubo-3D-con-led.html

https://www.youtube.com/watch?v=VxLAtcOu18s

con la diferencia que estoy usando 595 y un arduino leonardo.
Espero su ayuda, gracias.

noter

Supongo que Edison soy yo  :smiley-roll: .
Sería deseable que pusieras la última versión de tu código (y conexión si varía) para saber de qué punto iniciamos el intento de mejora.

Supongo que has probado a disminuir o eliminar el delay(50) en el bucle del loop, ¿no? Si no es así, prueba primero eso.

Concretamente para tus letras, tal y como están hechas, podrías hacerlo así:

Code: [Select]

void loop() {
// Unsigned ints, pero sólo utilizaremos los diez bytes inferiores, osea que el valor máximo será 3FF
unsigned int S[10]={0x3FF, 0x0, 0xDF, 0xDF, 0xDB, 0xDB, 0xFB, 0xFB, 0x0, 0x3FF};
escribeCapa(S);
for (int a=0; a<10; a++) {
digitalWrite(a, HIGH);
delay(1);
digitalWrite(a, LOW);
}
}


Pero este código tiene "truco", pues sirve porque todas las capas tienen el mismo patrón. No obstante, si tu idea es hacer exclusivamente "tubos" de formas, sería la opción inmediata. Si no es el caso, y has probado a reducir el delay, quedan aún unas pocas cosas que se pueden hacer. Pero mejor pon el código actual para no dar palos de ciego.



SandraCubos

#14
Dec 04, 2018, 11:19 pm Last Edit: Dec 04, 2018, 11:50 pm by surbyte
Hola, necesito ayuda. Estoy empezando y es mi segundo proyecto con arduino el primero fue un cubo 4x4x4 y anda genial, ahora hice un cubo 8x8x8 y ni siquiera prende 1 led.... Saque el diagrama y codigo de la web, a todos les funciona y a mi no me compila, no reconoce la libreria string, la agregue a la libreria de arduino en la carpeta de programas porque desde el IDE no me deja. no se que hacer.
Alguien me da una mano?
este es el link con codigo y diagramas
CUBO LED + ARDUINO + LED 360

Go Up