Translate

segunda-feira, 2 de dezembro de 2013

Controle de servo motores com Arduino para FSX

Olá a todos,

como muitos sabem, tenho um desejo muito grande em construir um cockpit de 737. Estou caminhando a passos de formiga, descobrindo alguma coisa aqui, outra ali e juntando muitas destas coisas estou vendo uma luz no fim do túnel. Para os amantes de simulação de voo, a construção de um cockpit acarreta em desembolsar muita "GRANA" e como grana não é uma coisa que não me sobra, tenho que buscar alternativas para o meu projeto. Pois bem, trago uma novidade para quem encontra-se no mesmo pé que eu. A poucos dias esbarrei em um site e encontrei um software desenvolvido pelo próprio mantenedor do site. Este é capaz de captar as informações do FSX e enviar para uma porta "com". O software é fantástico. Muito fácil de configurar e o detalhe; é FREE!!!! No vídeo que eu estou disponibilizando construi um protótipo para movimento utilizando servo motores e uma pequena replica. O link do código para ser gravado no Arduino.  Caso o link não funcione, copie e cole na IDE do Arduino o código a seguir. 

OBS: se você não souber programar e ou conhecimento básico em eletrônica, recomendo que estude antes de aventurar-se nestes testes. 


// Controle de movimento para Cockpit com FSX
// Rodrigo Cainelli - 2013

#include <LiquidCrystal.h>  // Biblioteca para LCD
#include <Servo.h> // Biblioteca para controlar servo motor
String entrada,dados;
char tipo,direcao; 
Servo servo1,servo2,servo3,servo4;
//Servo servo5;
int led_noise_down = 2;
int led_noise_up = 3;
int led_left_down = 4;
int led_left_up = 5;
int led_right_down = 6;
int led_right_up = 7;
int led = 13;
int led_gladeslope = 8;
//int habilita_servo_throler = 9;

int pos,elimina,i;
int valor_flap,flap;
int valor_gearNoise, valor_gearLeft, valor_gearRight;
int valor_apu_speed, airspeed_hold, app_airspeed, valor_throller, var_gladeslope, position_throler;


// Initialize the library with the numbers of the interface pins
//(rs,rw,ena,d4,d5,d6,d7)
LiquidCrystal lcd(10, 11, 12, A2, A0, A1);

void setup(){
  //lcd.begin(16, 2);
  //pinMode(12,OUTPUT);
  pinMode(led_noise_down, OUTPUT);
  pinMode(led_noise_up, OUTPUT);
  pinMode(led_left_down, OUTPUT);
  pinMode(led_left_up, OUTPUT);
  pinMode(led_right_down, OUTPUT);
  pinMode(led_right_up, OUTPUT);
  pinMode(led, OUTPUT);
  pinMode(led_gladeslope,OUTPUT);
  //pinMode(habilita_servo_throler, OUTPUT);
  servo1.attach(9); //Vertical
  servo2.attach(A4); //Horizontal
  servo3.attach(A3); //Flaps 
  servo4.attach(A5); //APU Speed
  //servo5.attach(A6); //Throller
  
  
  //Iniciando a comunicação serial
  //Serial.begin(115200);
  lcd.begin(16, 2);
  Serial.begin(115200);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("FSX - Boeing 737");
  lcd.setCursor(0,1);
  lcd.print("Rodrigo Cainelli");
  delay(4000);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("APU Volts:");
  lcd.setCursor(0,1);
  lcd.print("Eng Volts:");
}

void loop(){
  
  //digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  
  
  if (Serial.available()) {
    delay(10);
    while (Serial.available() > 0) {

      elimina = char(Serial.read()); //Para versão nova do Link2fs
      tipo=char(Serial.read());
      switch (tipo){
        case 'A':
              // Trem de pouso
              //digitalWrite(led, LOW);
              //delay(10);
              entrada= "";
              valor_gearNoise = 0;
              for( i = 0; i < 3; i++){
                entrada += char(Serial.read());
              }
              valor_gearNoise = entrada.toInt();
              
              if(valor_gearNoise > 0 && valor_gearNoise <= 50){
                  digitalWrite(led_noise_up, LOW);
                  digitalWrite(led_noise_down, HIGH);
                  delay(2000);
              }else{
                    if(valor_gearNoise > 50 && valor_gearNoise <= 100){
                      digitalWrite(led_noise_up, HIGH);
                      digitalWrite(led_noise_down, LOW);
                    }else{
                      digitalWrite(led_noise_up, HIGH);
                      digitalWrite(led_noise_down, HIGH);
                    }
              }
              break;
        case 'B':
              // Trem de pouso
              //delay(10);
              entrada= "";
              valor_gearLeft = 0;
              for( i = 0; i < 3; i++){
                entrada += char(Serial.read());
              }
              valor_gearLeft = entrada.toInt();
              if(valor_gearLeft > 0 && valor_gearLeft <= 50){
                  digitalWrite(led_left_up, LOW);
                  digitalWrite(led_left_down, HIGH);
              }else{
                    if(valor_gearLeft > 50 && valor_gearLeft <= 100){
                      digitalWrite(led_left_up, HIGH);
                      digitalWrite(led_left_down, LOW);
                    }else{
                      digitalWrite(led_left_up, HIGH);
                      digitalWrite(led_left_down, HIGH);
                    }
              }
              break;
        case 'C':
              // Trem de pouso
              //delay(10);
              entrada= "";
              valor_gearRight = 0;
              for( i = 0; i < 3; i++){
                entrada += char(Serial.read());
              }
              valor_gearRight = entrada.toInt();
              if(valor_gearRight > 0 && valor_gearRight <= 50){
                  digitalWrite(led_right_up, LOW);
                  digitalWrite(led_right_down, HIGH);
              }else{
                    if(valor_gearRight > 50 && valor_gearRight <= 100){
                      digitalWrite(led_right_up, HIGH);
                      digitalWrite(led_right_down, LOW);
                    }else{
                      digitalWrite(led_right_up, HIGH);
                      digitalWrite(led_right_down, HIGH);
                    }
              }
              break;
              
        case 'g':
               //APU Speed
              //digitalWrite(led, LOW);
              //delay(10);
              entrada= "";
              for( i = 0; i < 3; i++){
                entrada += char(Serial.read());
              }
              valor_apu_speed = entrada.toInt();
              
              valor_apu_speed=map(valor_apu_speed,0,100,180,20);
              servo4.write(valor_apu_speed); 
              break;
            
        case 'G':
               //Flaps    
              //digitalWrite(led, LOW);
              //delay(10);
              entrada= "";
              for( i = 0; i < 3; i++){
                entrada += char(Serial.read());
              }
              valor_flap = entrada.toInt();
              switch (valor_flap){
    case 0: flap = 179;
     break;
    case 1: flap = 159;
     break;
    case 3: flap = 139;
     break;
    case 7: flap = 119;
     break;
                        case 14: flap = 99;
     break;
                        case 21: flap = 79;
     break;
                        case 36: flap = 62;
     break;
                        case 43: flap = 44;
     break;
                        case 57: flap = 19;
     break;
    default:
                            break;
    }
              valor_flap=map(flap,0,57,20,180);
              servo3.write(flap);
              break;
          
        case 'i':
             //APU volts
             entrada = "";
             //entrada += char(Serial.read());
             for( i = 0; i < 2; i++){
                entrada += char(Serial.read());
              }
             airspeed_hold = entrada.toInt();
             //app_airspeed = airspeed_hold;
             lcd.setCursor(11,0);
             lcd.print("  ");
             lcd.setCursor(11,0);
             lcd.print(airspeed_hold);
             delay(20);
             break;  
              
        case 'W':
              // Throller
              entrada= "";
              elimina = char(Serial.read());
              for( i = 0; i < 3; i++){
                  entrada += char(Serial.read());
              }
              valor_throller = entrada.toInt();
              
              break;
              
        case 'r':
             //Gladeslope
             entrada = "";
             entrada += char(Serial.read());
             var_gladeslope = entrada.toInt();
             //app_airspeed = airspeed_hold;
             if ( var_gladeslope > 0 ){
                Serial.println("GLS Localizado.");
                digitalWrite(led_gladeslope, LOW);
              }else{
                digitalWrite(led_gladeslope, HIGH);
                Serial.println("GLS perdido.");
              }
             break;
              
        case 'y':
             //Engine 1 Volts
             entrada = "";
             //entrada += char(Serial.read());
             for( i = 0; i < 2; i++){
                entrada += char(Serial.read());
              }
             var_gladeslope = entrada.toInt();
             //app_airspeed = airspeed_hold;
             lcd.setCursor(11,1);
             lcd.print("  ");
             lcd.setCursor(11,1);
             lcd.print(var_gladeslope);
             delay(20);
             break;
             
       case 'z':
             //Engine 1 Volts
             entrada = "";
             entrada += char(Serial.read());
             var_gladeslope = entrada.toInt();
             //app_airspeed = airspeed_hold;
             //lcd.setCursor(0,1);
             //lcd.print("ENG 2 Volts: "+var_gladeslope);
             break;
       
             
        default: break;
      }
      
      if ((tipo=='Q')||(tipo=='R')){
        digitalWrite(led, LOW);
        
        entrada= "";
        direcao=char(Serial.read());
        for( i = 0; i < 5; i++){
            entrada += char(Serial.read());
          }
        int valor_servo = entrada.toInt();
        valor_servo = valor_servo*10;        
          if (tipo=='Q'){
            if(direcao=='-'){
                valor_servo=map(valor_servo,0,50,90,30);
                servo1.write(valor_servo);
                
            }else{
              if(direcao=='+'){
                valor_servo=map(valor_servo,0,50,90,160);
                servo1.write(valor_servo);
              }
            }
          }
          if (tipo == 'R'){
              if(direcao=='+'){
                valor_servo=map(valor_servo,0,500,90,20);
                servo2.write(valor_servo);
            }else{
              if(direcao=='-'){
                valor_servo=map(valor_servo,0,500,90,160);
                servo2.write(valor_servo);
              }
            }
          }                
       }       
      }
    }

  }





Maiores informações, poste no blog. 

Obrigado pela atenção.





Será um prazer tê-lo como seguidor.

sexta-feira, 13 de setembro de 2013

Este vídeo tem como objetivo instruir sobre a utilização da Máscara para teclado (colméia).



quinta-feira, 12 de setembro de 2013

   Este vídeo tem como objetivo instruir sobre a instalação e utilização do IntelliKeys desenvolvido pela IntelliTools. 
   Obrigado pela atenção e bom proveito.



segunda-feira, 26 de agosto de 2013

Meu cockpit 737

    Este é o cockpit de 737 que estou montando. Este foi montado com restos de móveis, muita sucata e um controle USB de R$ 15,00 para o troller. Para o Overhead montei um código para PIC. O controle dos analógicos virá pela porta Serial com outro PIC e movimentar alguns servos. A placa do MCP e Rádio comprei do USBInterface.


segunda-feira, 19 de agosto de 2013

   Este vídeo mostra as Atividades da Vida Diária do Nick Vujicic. Neste vídeo pode-se observar a utilização de artefatos não intitulados como Tecnologia Assistiva porém, por possibilitarem ao Nick a realização de algumas tarefas, podem ser consideradas dentro deste contesto como Tecnologia Assistiva. Maiores informações sobre o Nick podem ser encontradas em "http://www.lifewithoutlimbs.org/about-nick/bio/".



    Este vídeo editado recebendo apenas as legendas em Português (tradução: Bruna Poletto - legenda: Lael Nervis). O vídeo pode ser conferido no formato original em "http://www.washington.edu/doit/Video/index.php?vid=33".


   Este é um comercial da linha Natura Mamãe Bebê com áudio descrição. A áudio descrição tem como objetivo orientar a pessoa cega ou com baixa visão sobre os acontecimentos nas cenas.


   Este vídeo foi elaborado a partir do documentário "O Universo de Stephen Hawking" exibido no canal National Geographic Chanel. O vídeo foi cortado, editado e acrescentado as legendas posteriormente não estando no formato original.


domingo, 7 de julho de 2013

Gravando PIC


Saudações a todos,

irei abordar nestas linhas, 2 procedimentos que podem ser adotados para gravar um microcontrolador da linha PIC da Microchip. Para os procedimentos, iremos utilizando os gravadores JDM e Multiprog. Ambos são gravadores bons e atendem a uma grande linha de micro controladores da linha PIC gravando desde os CI's de 8 a 40 pinos. O gravador JDM possui seus esquemas eletrônicos amplamente divulgado na internet. Não irei deter-me neste documento no detalhamento do processo de construção do gravador JDM visto que, sua construção é muito simples. Todavia, se alguém encontrar dificuldades com o projeto, poderá enviar sua dúvida por meio do blog.

 
Gravador JDM


Figura 1
Fonte: http://projetoseti.com.br/hardware/eletronica/gravador-de-microcontroladores-pic/
   Este gravador é relativamente simples, possui poucos componentes e pode ser montado em uma placa padrão sem a necessidade de confeccionar a placa. Toda via, se você optar por corroer uma placa, nas figuras 2 e 3, você poderá ver a serigrafia da placa, disposição dos componentes.
Serigrafia para placa do graavdor JDM
Figura 2: Serigrafia da placa.

Imagem com a posição dos componentes na placa.
Figura 3: Disposição dos componentes.


   A figura 4 mostrando a posição dos CI's e configuração das chaves. Este arquivo é bem explicativo. Por exemplo; para gravar um dos modelos de CI de 20 pinos tais como: 16F631, 16F639, 16F677, 16F685, 16F687, 16F689, 16F690, 16F785, o CI deve ficar no final do soquete ZIF (sentido oposto da alavanca do soquete) e com as duas chaves Switch voltadas para o o final do soquete, ou seja, sentido oposto ao da alavanca do soquete ZIF. Procurei destacar esta configuração na figura 5.


Imagem ilustrando a posição e configuração dos CI's para gravação.
Figura 4: Configuração da gravadora de acordo com o CI utilizado.
Imagem ilustrando a posição e configuração do gravador para CI's de 20 pinos.
Figura 5: Imagem ilustrando a posição e configuração do gravador para CI's de 20 pinos.
 

   As figuras 4 e 5 nos informam também os modelos de PIC nos quais esta configuração deverá ser utilizada. Este arquivo está denominado como  "POSIÇÕES DOS MICROCONTROLADORES.pdf" e encontra-se dentro da pasta cujo link você encontrará no final desta postagem. Basta seguir os esquemas para cada modelo de CI. Para estabelecer a comunicação entre o computador e o gravador, iremos precisar de um software. Este será responsável por enviar ao PIC por meio da porta serial o nosso arquivo hexa. Eu recomendo o IC-Prog. É um software que já vem com a biblioteca para comunicação com o gravador JDM. O software é muito intuitivo tornando-o de fácil configuração e utilização. A figura 6 ilustra a interface do IC-Prog.

Interface do IC-Prog
Figura 6: Interface do IC-Prog

     Para iniciarmos o processo de comunicação entre o software e o hardware, espete a gravadora na porta serial do seu computador e em seguida execute o IC-Prog. Normalmente ele encontrará o modelo do gravado mesmo que este esteja sem o CI. Caso ele não seja encontrado verifique: se a posição dos pinos está de acordo, se os componentes foram soldados corretamente, se não há trilhas rompidas ou em curto e etc. Se estiver tudo OK, com o programa aberto, abra o menu "Settings" e clique na opção "Hardware", ou pressione F3. Uma nova janela irá surgir, nesta janela você encontrará um item denominado como "Programmer" onde você irá escolher o modelo de gravador utilizado. Por default ele já vem com a opção de "JDM Programmer" selecionada. Logo abaixo desta opção encontra-se o item "Ports" que serve para selecionar a porta em que o dispositivo foi plugado. A figura 7 ilustra esta situação com destaque em vermelho o que foi mencionado. A opção de escolha da porta de comunicação apresentada na figura 7 está em branco pois executei um PrintScreen da janela do software em meu NOT e como este não possui porta serial, elas apareceram desabilitadas.

Figura 7: janela de configuração da porta e modela de gravador.

    Depois de estabelecida a comunicação entre o PC e o gravador é hora de selecionar o modelo do PIC a ser gravado. Na figura 8, destaquei a aba ode você deverá selecionar o modelo do CI a ser utilizado.

Interface do IC-Prog com destaque na aba de seleção do CI.
Figura 8: Interface do IC-Prog com destaque na aba de seleção do CI.
   Para certificar-se de que o gravador está funcionando corretamente e o software está se comunicando com o PIC, você pode clicar no botão ... continua!!!

Você pode baixar estes e outros arquivos do projeto aqui.