Indicador Futaba M204SD02AJ en modo serie

imagen

En este artículo quiero compartir la experiencia de usar el indicador FUTABA MSD204AJ en el modo de interfaz en serie. Vamos a programar en arduino.

Para poner el indicador en modo serie, configure los puentes de acuerdo con la hoja de datos :

J3-on
J4-off
J5-on
J6-on
J7-off

imagen

En este modo, la asignación de pines es la siguiente (de acuerdo con la tabla 11):

1 - General
2 - Fuente de alimentación de 5V
3 - Datos de E / S
4 - Pulso estroboscópico
6 - Pulsos de reloj

Un envío típico al indicador consiste en un byte de inicio y directamente un byte de la información que necesitamos (ya sea un comando o datos).

El byte de inicio consta de cinco unidades lógicas, el bit RW Lectura (1) / Escritura (0), el bit identificador Comandos RS (0) / Datos (1), cero lógico: un total de ocho bits. En este caso, los bits se registran en el indicador a lo largo del borde delantero del pulso del reloj. Y la lectura de bits del indicador está en el límite descendente. Cualquier envío de lectura / escritura comienza después del borde descendente de la señal estroboscópica, pero termina en el borde ascendente.

imagen

1 - en este momento comienza la recepción / transmisión.
2 - en este momento la recepción / transmisión termina
3 - en este momento el bit es leído por el indicador
4 - el bit determina Escritura / Lectura

Generalmente nuestra tarea:

1. poner el estroboscopio a cero.
2. Ajuste la salida del reloj a cero.
3. dar un bit de información.
3a. espera un poco
4. Establezca la salida de la señal del reloj en uno.
4a. espera un poco
5a, los párrafos 2-4 hacen 8 veces. - Este será el primer byte.
5b, los puntos 2-4 hacen 8 veces más. - Este será el segundo byte.
6. Ajuste la luz estroboscópica a la unidad.

Por lo tanto, tomamos una maqueta de arduins y un entorno de desarrollo.

Declarar define:

#define _STB 2
#define _SCK 3
#define _SISO 4

Configurar puertos Arduino:

  pinMode(_STB, OUTPUT);
  pinMode(_SCK, OUTPUT);
  pinMode(_SISO, OUTPUT);

Configure el estroboscopio y el reloj en la unidad de registro:

  digitalWrite(_STB,1);
  digitalWrite(_SCK,1);

Y comience a enviar bits al indicador. Porque si necesitamos enviar 2 bytes uno tras otro, lo haremos usando el bucle for anidado para.

Crea un procedimiento, llámalo futab. Ella usará dos variables de entrada. x1 es el primer byte de inicio, x2 es el byte de datos.

void futab(int x1, int x2){
 digitalWrite(_STB,0);						        //.1
 for (j=1; j<3; j++){
  if (j==1)  {cmd = x1;} else {cmd = x2;}     			//. 5, 5
  for (i=7; i>-1; i--) {
                      digitalWrite(_SCK,0);			                //.2
                      digitalWrite(_SISO,bitRead(cmd,i));       //.3    i-   
                      delayMicroseconds(2);			     //.3  
                      digitalWrite(_SCK,1);			            //.4 
                      delayMicroseconds(2);			    //.4  
                      } 
                     }
 digitalWrite(_STB,1);						//.6
}

Eso es todo, puedes usar este procedimiento. Como? Y entonces:

futab(0b11111000,0b00000001); //    4-4-1  .
//  
futab(0b11111000,0b10010101); //    4-4-8   DDRAM = 15h, ..    3-  2- 
//   
futab(0b11111010,0b010000010); //  41h ( ).  4-4-10.

Así es como se ve en la pantalla del osciloscopio.

imagen

imagen

Bueno, entonces simplemente arroje los comandos y datos en el indicador y obtenga todo tipo de inscripciones en el tablero. El sistema de comando en sí es muy similar a los comandos del popular controlador HD44780, con la excepción de un par de bits de control que pueden controlar el brillo del indicador.

Porque No veo la aplicación de este indicador, generaré un simple Hello, world. Escribiré lo que se llama en la frente, deletreando. No hay bibliotecas, solo códigos de caracteres, solo hardcore.

Aqui esta el codigo
/* FUTABA */

#define _STB 2
#define _SCK 3
#define _SISO 4
int i,j,n,m;
int cmd;

void futab(int x1, int x2){
 digitalWrite(_STB,0);
 for (j=1; j<3; j++){
 // delay(1500);
  if (j==1)  {cmd = x1;} else {cmd = x2;}     
  for (i=7; i>-1; i--) {
                      digitalWrite(_SCK,0);
                      digitalWrite(_SISO,bitRead(cmd,i));
                      delayMicroseconds(2);
                      digitalWrite(_SCK,1);
                      delayMicroseconds(2);
                      }
                     }
 digitalWrite(_STB,1);
 delay(50);
}


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);               // starts the serial monitor 

  pinMode(_STB, OUTPUT);        //  "  "
  pinMode(_SCK, OUTPUT);
  pinMode(_SISO, OUTPUT);
  
  digitalWrite(_STB,1);       //     
  digitalWrite(_SCK,1);

 futab(248,1);  //    4-4-1
 delay(2000);    //  
 futab(250,0x87);   // 
 futab(250,0x50);   // 
 futab(250,0x84);   // 
 futab(250,0x42);   // 
 futab(250,0x45);   // 
 futab(250,0x54);   // 

futab(248,0b11000011); //  4-4-8   =43h    ,  

 futab(250,0x48);   // H
 futab(250,0x61);   // a
 futab(250,0x62);   // b
 futab(250,0x72);   // r


futab(248,0b11011111); //  4-4-8   =5Fh  4- , 12 
 futab(250,0x35);   // 5
 futab(250,0x65);   // e
 futab(250,0x72);   // r
 futab(250,0x47);   // G
 futab(250,0x30);   // 0

futab(248,0b10011011); //  4-4-8   =5Dh  3- , 10 
 futab(250,0x30);   // 0
 futab(250,0x37);   // 7
 futab(250,0x2E);   // .
 futab(250,0x30);   // 0
 futab(250,0x34);   // 4
 futab(250,0x2E);   // .
 futab(250,0x32);   // 2
 futab(250,0x30);   // 0
 futab(250,0x31);   // 1
 futab(250,0x36);   // 6


 

for (m=1; m<5; m++){
 for (n=1; n<4; n++){
   futab(248,0b00011100);   // 4-4-5    
   delay(100);
                  }
 for (n=1;n<4;n++){
   futab(248,0b00011000);    // 4-4-5    
   delay(100);
                  }
                   } 
 
 delay(1500);
 for (n=1;n<5;n++){
   futab(248,0b00001000);   // 4-4-4  
   delay(100);
   futab(248,0b00001100);   // 4-4-4  
   delay(100);
                  }

 delay(1500);
                  
 for (n=1;n<5;n++){
 
 futab(248,0b00111101);  // 4-4-6    75%
 delay(100);
 futab(248,0b00111110);  // 4-4-6    50%
 delay(100);
 futab(248,0b00111111);  // 4-4-6    25%
 delay(100);
 futab(248,0b00111110);  // 4-4-6    50%
 delay(100);
 futab(248,0b00111101);  // 4-4-6    75%
 delay(100);
 futab(248,0b00111100);  // 4-4-6    100%
 delay(100);
 }
 delay(1000);

//    
 
 futab(248,0b01001000);  // 4-4-7   CGRAM=8
 futab(250,0b00001110); 
 futab(250,0b00010001); 
 futab(250,0b00010001); 
 futab(250,0b00010011); //
 futab(250,0b00010111); 
 futab(250,0b00011111); 
 futab(250,0b00011111); 
 futab(250,0b00011111); 

 futab(248,0b01010000);  // 4-4-7   CGRAM=16
 futab(250,0b00000000); 
 futab(250,0b00000001); 
 futab(250,0b00000110); 
 futab(250,0b00001100);  //- 
 futab(250,0b00010001); 
 futab(250,0b00000110); 
 futab(250,0b00001100); 
 futab(250,0b00010000); 
 
//     

 futab(248,0b10010011); //    1*20
 futab(250,0b00000001);  //    CGRAM c  1

 futab(248,0b11010011); //    2*20
 futab(250,0b00000010);  //    CGRAM c  2

}
void loop() {
 
}


imagen

Y en conclusión, el video funciona:

Source: https://habr.com/ru/post/es392757/


All Articles