quinta-feira, 21 de maio de 2015

Iniciando o projeto do being 737 800 PMDG.

Iníciando

O objetivo deste blog é documentar o desenvolvimento do meu home cockpit baseado no Boeng 737 800 PMDG e Flight Simulator X.

Programas utilizados:
- Flight Simulator X
    Simconnect.
    Fsuipc 4.9 resgistrado.
    LINDA
    737 800 PMDG.
- Link2FS 6f.
- Programador do arduíno 1.61

1 - Lista de offset do PDMG.

2 - Programação Arduíno.

3 - Hardware


MCP   35 botoes sendo 7 encoders, desdes encoders um é uma chave rotativa de 4 posições. duplo para a função HDG e BANK ANG.

Botões tipo push:   17 sendo 14 quadrados.
Botões tipo chave L/D

Display
V/S 5 normais mais um especial para + e -
Altitude 5
HDG 3
Course 3 + 3
Speed 4
Total 24 Display 7 segmentos.

---------------------------------------------------------------------------------------
Iniciando a programação do Arduino para leitura das chaves do MCP

O principio da programação é esta:
Apenas um exemplo, já que a luz de taxi não está ligado ao MCP.
Definir as variaveis:
int taxi=10 //significa que o botão para a chave da luz de taxi será ligado no pino 10 do arduino.
int taxinew; // utilizado para receber o valor da porta 10, será 1 ou 0, ligado ou desligado.
int taxiold; // será utilizado para armazenar o ultimo valor lido da porta 10, no caso será o valor da variavel taxinew.

void setup(){
pinMode(taxi,INPUT_PULLUP); //define o pino 10 como entrada e em nivel alto.
Serial.begin(9600); // configura a serial
}

void loop(){ 

  taxinew = (digitalRead(taxi)); //Faz a leitura da porta TAXI (neste caso pino 10), e joga o resultado na variavel TAXINEW
if(taxinew != taxiold){ //Compara com o ultimo estado da porta, se houver modificação, ele segue no IF, caso não houve nenhuma mudança no estado da porta, passa direto.
    if (taxinew==1) {Serial.println("Taxi on");}    //Se estiver ligada, imprime na serial
    if (taxinew==0) {Serial.println("Taxi off");} // Se estiver desliga, imprime na serial
    taxiold=taxinew; /* joga o valor atual para a variavel TAXIOLD, para ser comparado ali em cima,
    pois caso a posição da chave não mudou, passa direto evitando enviar dados sem necessidade pela serial.*/
    }
}

Isso resolve como o arduino fará a leitura das chaves.
--------------------------------
Multiplicando a quantidade de portas do arduino uno.

Trabalhando somente com as portas digitais, temos de 0 a 13 num total de 14 portas.
Utilizamos 8 portas para multiplicar, sendo que o fator multiplicador será 4 bits( 4 portas ).
Sendo assim temos um gasto total de:
8 portas para chaves.
4 portas para controle.
Utilizando 4 portas para ativar cada circuito intregado 74ls245, temos os seguintes bits.
1-0000
2-0001
3-0010
4-0011
5-0100
6-0101
7-0110
8-0111
9-1000
10-1001
11-1010
12-1011
13-1100
14-1101
15-1110
16-1111

16 CI 74LS245 contendo 8 portas cada um, num total de 128 portas.

Resumindo, utilizando 12 portas para produzir 128, é um excelente ganho.
Mais 2 portas digitais que não foram utilizadas.
Total 130 portas digitais no Arduino.

Caso não necessite de todas as 128 portas, poderemos utilizar menos.
Exemplo:
Ao invés de 4 bit de controle podemos utilizar apenas 3.
1-000
2-001
3-010
4-011
5-100
6-101
7-110
8-111

8 CI 74LS245 num total 64 portas.
Mais 3 portas digitais que não foram utilizadas.
Total 67  portas digitais no Arduino.
------------------------------------------------------------------------
Utilizando uma porta analógica para fazer o seletor BANK ANGLE do MCP.

São cinco posiçoes, 10,15,20,25 e 30 graus.
Uma chave rotatória de cinco posições deve ser usada.
O esquema de ligação consiste em colocar 4 resistores de 10k em serie conforme a imagem abaixo.

A parte de programação fica desta forma:
int bank;  // variavel para armazenar o valor da porta A0
int bank_old; // utilizado para guardar o ultimo valor da porta A0.

void setup(){ // setup
pinMode(A0,INPUT); // definir a porta analogia A0 como entrada.
Serial.begin(115200); // configura a serial.
}

void loop(){ // o programa em si.
  bank=(analogRead(A0)); // faz a leitura da porta analogica A0, cada posição tem um resistor de 10k
  if(bank !=bank_old){  // verifica se ultima posição da chave foi mudada, caso sim continua.
      if(bank >=0 && bank <=100 ){Serial.println("ZZ700210");}// bank angle 10
      if(bank >=200 && bank <=300){Serial.println("ZZ700211");} //bank angle 15
      if(bank >=400 && bank <=600){Serial.println("ZZ700212");} //bank angle 20
      if(bank >=650 && bank <=850){Serial.println("ZZ700213");} //bank angle 25
      if(bank >=900 && bank <=1250){Serial.println("ZZ700214");} //bank angle 30
  bank_old=bank;
 }

Obs.: Os valores da cada leitura são 0,256,512,768 e 1023. Porém, poderá haver uma leitura não precisa destes valores dependendo da precisão dos resistores. Por esse motivo eu deixei uma margem de segurança nas leituras dos valores.
Ex.: posição 2: Leitura esperada 256, faixa entre 200 e 300.

Abaixo o esquema elétrico ainda não terminado.

---------------------------------------------------------------------------
Display 7 segmentos com MAX7219

Necessário a biblioteca LeControl.h, pode ser baixada via site do Arduino.
Comando para mostrar um caracter no display
lc.setChar (int addr, int digit,char value, boolean dp)
sendo que ADDR, endereço do display, 0 se for o primeiro chip max7219
DIGIT, a posição no display, exemplo, int 0, o caracter será mostrado no primeiro display da esquerda para direita.
VALUE, o valor a ser mostrado no display.
BOOLEAN DP, ativa o ponto decimal.

---------------------------------
Problema com o Link2fs.