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/".