En la revista Elektor nº 255 de agosto de 2001 se publicó un artículo para montar un panel de texto. Ese mismo mes empecé a hacerme con el material necesario.
Primero lo hice sólo con tres módulos, pero no iba bien, ya que en el circuito de Elektor usan un 74LS164 para activar los leds y no los mantiene encendidos mientras se carga la línea siguiente. El efecto era muy malo.
Lo dejé algún tiempo y lo retomé añadiendo un integrado más entre cada 74LS164 y los leds. Todo se controlaba desde un 16F84A.
No recuerdo qué paso ni por qué lo dejé aparcado.
Un tiempo después apareció el Arduino y decidí retomarlo.
Encontré un integrado que hacía la misma función que los dos anteriores, el MBI-5026, que controla 16 LEDs cada uno y es muy fácil de manejar.
No sé por qué volví a aparcar el asunto.
Como cada vez cacharreo menos y a este paso se me va a olvidar la electrónica, lo he vuelto a retomar.
Antes hacía las placas con el EAGLE y con insoladora. Ya no me acuerdo del EAGLE y he hecho las placas con rotulador a mano y también he usado placas de estas con agujeros.
De momento y después de 21 años este es el resultado. Todo el hardware y software es diseño mío, menos la placa del Arduino.

El panel va con un Arduino nano, pero no sé por qué, funcionan sólo una vez y se quedan inutilizados, ya me he cargado dos, por eso de momento he puesto un Arduino UNO. No sé si tendrá algo que ver el Windows 10 y el CH340, ya que hasta hace poco tenía el Windows 7.

Cada fila está controlada por un darlington TIP125. Entre el pin de salida del Arduino y la base del TIP125 hay una resistencia de 6K8 ohms, que es suficiente para que entre en saturación.

Una cosa curiosa que ocurre es que la primera línea sale desplazada un led a la izquierda, como si al acabar la primera línea se produjera un impulso extra de CLK. Es raro que sólo ocurra en la primera línea y no en las otras, ya que el código es igual para las siete.
De momento lo he solucionado desplazando los datos de esa línea una posición a la derecha.
Otro problema curioso es que en la fila de arriba aparecía una secuencia fantasma que se puede ver en este vídeo:
Con respecto a ese problema, después de tirar de osciloscopio, ver que todas las señales son un caos, con lo cual el osciloscopio me ha liado más todavía y hacer muchos cambios y programas y usar varios arduinos distintos, uno antiguo con chip DIL y otro con chip pequeño, he llegado a la conclusión de que en los arduinos el pin 6 está embrujado.
Todo ese "ruido" sale por el pin 6 y entra por la base del TIP 125, sale por el colector, atraviesa los LEDs y llega a los MBI-5026. Esto no tiene mucho sentido pero es la conclusión a la que he llegado.
Para deshacerme del pin 6 he usado los pines del 7 al 13, pero el pin 13 de mis arduinos no funcionan en este circuito.
Como el pin 3 (señal OE), está siempre a cero, he pasado la última fila a ese pin y he hecho una chapucilla momentánea (poco elegante) para dirigirme a ese pin a su tiempo.
Aunque con los cambios anteriores ya funciona bien, he vuelto a dejarlo como al principio para seguir investigando lo de la secuencia fantasma en la primera fila.
Si conecto otra fila al pin 6 la secuencia fantasma aparece en esa otra fila, luego se descarta el TIP125 de la primera fila, ya que todos lo hacen si se conectan al pin 6.
Esa secuencia fantasma aparece en los LEDs controlados por los MBI-5026 1º, 2º y 4º, no en el 3º. Si cambio el 3º por el 2º sigue apareciendo en el 2º y no el 3º, luego se descartan los MBI-5026.
Si desconecto el TIP125 del pin 6 y lo conecto directamente a GND (se activa por 0) sigue apareciendo la secuencia fantasma, luego no le entra por el pin 6 como parecía lógico.
Es decir, si uso en el programa el pin 6, aunque luego no lo use físicamente, aparece el problema. Sólo desaparece si en el programa no uso el pin 6.
Después de hacer muchas pruebas y usar otros Arduinos, (he usado Nano, Uno con chip pequeño, Uno con chip DIL y Diecimilla con ATmega 168), con todos ocurría lo mismo.
La frecuencia de esa secuencia fantasma no variaba si aumentaba los delays o incluso si los quitaba (he visto que no hacen falta).
Por si fuese por la fuente de alimentación conmutada, lo he conectado a una fuente con transformador, puente, condensador y 7805, pero sigue igual. Esa secuencia tiene que salir de los arduinos.
Lo siguiente que he hecho ha sido desactivar las interrupciones, ya que no uso ni interrupciones ni delays, con "noInterrupts()" y mano de santo. Ha desaparecido la secuencia fantasma.
He pasado el programa a un Arduino Nano para dejarlo integrado en el panel (sólo he conseguido programarlo con el IDE 1.0.3).
Y así es como ha quedado el programa:
La simplificación de la tercera secuencia "for" ha sido trabajo de Heli de CCAA.
Primero lo hice sólo con tres módulos, pero no iba bien, ya que en el circuito de Elektor usan un 74LS164 para activar los leds y no los mantiene encendidos mientras se carga la línea siguiente. El efecto era muy malo.
Lo dejé algún tiempo y lo retomé añadiendo un integrado más entre cada 74LS164 y los leds. Todo se controlaba desde un 16F84A.
No recuerdo qué paso ni por qué lo dejé aparcado.
Un tiempo después apareció el Arduino y decidí retomarlo.
Encontré un integrado que hacía la misma función que los dos anteriores, el MBI-5026, que controla 16 LEDs cada uno y es muy fácil de manejar.
No sé por qué volví a aparcar el asunto.
Como cada vez cacharreo menos y a este paso se me va a olvidar la electrónica, lo he vuelto a retomar.
Antes hacía las placas con el EAGLE y con insoladora. Ya no me acuerdo del EAGLE y he hecho las placas con rotulador a mano y también he usado placas de estas con agujeros.
De momento y después de 21 años este es el resultado. Todo el hardware y software es diseño mío, menos la placa del Arduino.

El panel va con un Arduino nano, pero no sé por qué, funcionan sólo una vez y se quedan inutilizados, ya me he cargado dos, por eso de momento he puesto un Arduino UNO. No sé si tendrá algo que ver el Windows 10 y el CH340, ya que hasta hace poco tenía el Windows 7.

Cada fila está controlada por un darlington TIP125. Entre el pin de salida del Arduino y la base del TIP125 hay una resistencia de 6K8 ohms, que es suficiente para que entre en saturación.

Una cosa curiosa que ocurre es que la primera línea sale desplazada un led a la izquierda, como si al acabar la primera línea se produjera un impulso extra de CLK. Es raro que sólo ocurra en la primera línea y no en las otras, ya que el código es igual para las siete.
De momento lo he solucionado desplazando los datos de esa línea una posición a la derecha.
Código:
// Visualiza palabra => HOLA GENTE
#define CLK 5
#define SDI 4
#define OE 3
#define LE 2
const byte elementos[7][8] = {
{0x02,0x4C,0x83,0x03,0x3D,0x2F,0xA5,0xE6},
{0x04,0xA5,0x09,0x09,0x43,0x44,0x48,0x52},
{0x04,0xA5,0x09,0x08,0x42,0xC4,0x48,0x92},
{0x07,0xA5,0x0F,0x0B,0x72,0x44,0x49,0x1E},
{0x04,0xA5,0x09,0x09,0x42,0x44,0x4A,0x12},
{0x04,0xA5,0x09,0x09,0x42,0x44,0x4A,0x12},
{0x04,0x99,0xE9,0x06,0x7A,0x44,0x33,0xD2},
};
void setup() {
DDRD = DDRD | 0b11111100; // D2 a D12
DDRB = DDRB | 0b00011111; // OUTPUTs
PORTD = PORTD | 0b11000000; // Salidas TIP125
PORTB = PORTB | 0b00011111; // apagadas
}
void loop() {
for (byte fila=0; fila < 8; fila++) {
digitalWrite(LE, LOW);
for (byte columna=0; columna < 8; columna++) {
digitalWrite(SDI, (elementos[fila][columna] & 0x80) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x40) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x20) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x10) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x08) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x04) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x02) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
digitalWrite(SDI, (elementos[fila][columna] & 0x01) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
delayMicroseconds(10);
digitalWrite(CLK, LOW);
}
digitalWrite(fila + 5, HIGH);
digitalWrite(fila + 6, LOW);
digitalWrite(LE, HIGH);
delayMicroseconds(10);
}
}
Este problema estaba causado porque en un momento del programa me dirigía al pin 5 que es el CLK y metía un impulso de más. Ya está corregido con la función "if" añadida.troglodita dijo:Una cosa curiosa que ocurre es que la primera línea sale desplazada un led a la izquierda, como si al acabar la primera línea se produjera un impulso extra de CLK. Es raro que sólo ocurra en la primera línea y no en las otras, ya que el código es igual para las siete.
De momento lo he solucionado desplazando los datos de esa línea una posición a la derecha.
Otro problema curioso es que en la fila de arriba aparecía una secuencia fantasma que se puede ver en este vídeo:
Con respecto a ese problema, después de tirar de osciloscopio, ver que todas las señales son un caos, con lo cual el osciloscopio me ha liado más todavía y hacer muchos cambios y programas y usar varios arduinos distintos, uno antiguo con chip DIL y otro con chip pequeño, he llegado a la conclusión de que en los arduinos el pin 6 está embrujado.
Todo ese "ruido" sale por el pin 6 y entra por la base del TIP 125, sale por el colector, atraviesa los LEDs y llega a los MBI-5026. Esto no tiene mucho sentido pero es la conclusión a la que he llegado.
Para deshacerme del pin 6 he usado los pines del 7 al 13, pero el pin 13 de mis arduinos no funcionan en este circuito.
Como el pin 3 (señal OE), está siempre a cero, he pasado la última fila a ese pin y he hecho una chapucilla momentánea (poco elegante) para dirigirme a ese pin a su tiempo.
Aunque con los cambios anteriores ya funciona bien, he vuelto a dejarlo como al principio para seguir investigando lo de la secuencia fantasma en la primera fila.
Si conecto otra fila al pin 6 la secuencia fantasma aparece en esa otra fila, luego se descarta el TIP125 de la primera fila, ya que todos lo hacen si se conectan al pin 6.
Esa secuencia fantasma aparece en los LEDs controlados por los MBI-5026 1º, 2º y 4º, no en el 3º. Si cambio el 3º por el 2º sigue apareciendo en el 2º y no el 3º, luego se descartan los MBI-5026.
Si desconecto el TIP125 del pin 6 y lo conecto directamente a GND (se activa por 0) sigue apareciendo la secuencia fantasma, luego no le entra por el pin 6 como parecía lógico.
Es decir, si uso en el programa el pin 6, aunque luego no lo use físicamente, aparece el problema. Sólo desaparece si en el programa no uso el pin 6.
Después de hacer muchas pruebas y usar otros Arduinos, (he usado Nano, Uno con chip pequeño, Uno con chip DIL y Diecimilla con ATmega 168), con todos ocurría lo mismo.
La frecuencia de esa secuencia fantasma no variaba si aumentaba los delays o incluso si los quitaba (he visto que no hacen falta).
Por si fuese por la fuente de alimentación conmutada, lo he conectado a una fuente con transformador, puente, condensador y 7805, pero sigue igual. Esa secuencia tiene que salir de los arduinos.
Lo siguiente que he hecho ha sido desactivar las interrupciones, ya que no uso ni interrupciones ni delays, con "noInterrupts()" y mano de santo. Ha desaparecido la secuencia fantasma.
He pasado el programa a un Arduino Nano para dejarlo integrado en el panel (sólo he conseguido programarlo con el IDE 1.0.3).
Y así es como ha quedado el programa:
Código:
// Visualiza => HOLA GENTE
#define CLK 5 //Relog para MBI-5026
#define SDI 4 //Datos al MBI-5026
#define OE 3 //MBI-5026 enable
#define LE 2 //Pasar información de los latches a los LEDs
const byte elementos[7][8] = { //Texto en exadecimal {fila}[columna}
{0x02, 0x27, 0x20, 0x70, 0x73, 0xE8, 0xBE, 0xF8},
{0x02, 0x28, 0xA0, 0x88, 0x8A, 0x0C, 0x88, 0x80},
{0x02, 0x28, 0xA0, 0x88, 0x82, 0x0A, 0x88, 0x80},
{0x03, 0xE8, 0xA0, 0xF8, 0xBB, 0xC9, 0x88, 0xF0},
{0x02, 0x28, 0xA0, 0x88, 0x8A, 0x08, 0x88, 0x80},
{0x02, 0x28, 0xA0, 0x88, 0x8A, 0x08, 0x88, 0x80},
{0x02, 0x27, 0x3E, 0x88, 0x73, 0xE8, 0x88, 0xF8},
};
void setup() {
DDRD = DDRD | 0b11111100; // D2 a D12
DDRB = DDRB | 0b00011111; // OUTPUTs
PORTD = PORTD | 0b11000000; // Salidas TIP125
PORTB = PORTB | 0b00011111; // apagadas
noInterrupts(); // Evita secuencia fantasma tenue en fila 1
}
void loop() {
for (byte fila=0; fila < 8; fila++) { //elementos{fila}[columna}
digitalWrite(LE, LOW);
for (byte columna=0; columna < 8; columna++) {
byte data = elementos[fila][columna];
for (byte bits=0; bits < 8; bits++) {
digitalWrite(SDI, (data & 0x80) ? HIGH : LOW);
digitalWrite(CLK, HIGH);
digitalWrite(CLK, LOW);
data<<=1;
}
}
if (fila == 0) { //Este if es para evitar que al apagar la
digitalWrite(12, HIGH); //fila anterior cuando estamos en la fila
} //primera (pin 6) meta un impulso de CLK
else { //en el pin 5, ya que los TIP125 se apagan
digitalWrite(fila + 5, HIGH); //con HIGH y se encienden con LOW.
}
digitalWrite(fila + 6, LOW);
digitalWrite(LE, HIGH);
}
}
La simplificación de la tercera secuencia "for" ha sido trabajo de Heli de CCAA.