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;
}
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.
Show... Começando a entender finalmente!
ResponderExcluir