Indicador Futaba M204SD02AJ em modo serial

imagem

Neste artigo, quero compartilhar a experiência de uso do indicador FUTABA MSD204AJ no modo de interface serial. Vamos programar no arduino.

Para colocar o indicador no modo serial, você deve configurar os jumpers de acordo com a folha de dados :

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

imagem

Neste modo, a atribuição dos pinos é a seguinte (de acordo com a tabela 11):

1
- Fonte de alimentação geral 2 - 5V
3 - Dados de E / S
4 - Pulso estroboscópico
6 - Pulso de relógio

Um envio típico para o indicador consiste em um byte inicial e diretamente um byte das informações necessárias (seja um comando ou dados).

O byte inicial consiste em cinco unidades lógicas, o bit RW Leitura (1) / Gravação (0), o bit identificador RS Comandos (0) / Dados (1), zero lógico - um total de oito bits. Nesse caso, os bits são gravados no indicador ao longo da borda principal do pulso do relógio. E a leitura de bits do indicador está no limite decrescente. Qualquer envio de leitura / gravação começa após a borda descendente do sinal Strobe, mas termina na borda ascendente.

imagem

1 - neste momento a recepção / transmissão começa.
2 - nesse momento a recepção / transmissão termina
3 - nesse momento o bit é lido pelo indicador
4 - o bit determina Write / Read

Geralmente, nossa tarefa:

1. definir o estroboscópio para zero.
2. Ajuste a saída do relógio para zero.
3. forneça um pouco de informação.
3a. espera um pouco
4. Defina a saída do sinal do relógio para um.
4a espera um pouco
5a, os parágrafos 2-4 fazem 8 vezes. - este será o primeiro byte.
5b, os pontos 2-4 fazem mais 8 vezes. - este será o segundo byte.
6. Coloque o estroboscópio na unidade.

Então, fazemos um mock-up de arduins e um ambiente de desenvolvimento.

Declarar define:

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

Configure as portas do Arduino:

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

Defina o strob e o relógio para a unidade de log:

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

E comece a enviar bits para o indicador. Porque se precisarmos enviar 2 bytes um após o outro, faremos isso usando o loop for aninhado.

Crie um procedimento, chame-o de futab. Ela usará duas variáveis ​​de entrada. x1 é o primeiro byte inicial, x2 é o byte de dados.

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
}

Isso é tudo, você pode usar este procedimento. Como E assim:

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

É assim que fica na tela do osciloscópio.Bem

imagem

imagem

, basta jogar os comandos e os dados no indicador e obter todos os tipos de inscrições no quadro. O sistema de comando em si é muito semelhante aos comandos do popular controlador HD44780, com exceção de um par de bits de controle que podem controlar o brilho do indicador.

Porque Não vejo a aplicação desse indicador, vou gerar um simples Olá, mundo. Vou escrever o que é chamado na testa, ortografia. Sem bibliotecas, apenas códigos de caracteres, apenas hardcore.

Aqui está o código
/* 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() {
 
}


imagem

E, em conclusão, um vídeo de trabalho:

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


All Articles