Reparo do vidro elétrico traseiro do meu Marea 99.
Translate
segunda-feira, 12 de setembro de 2016
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.
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
quinta-feira, 12 de setembro de 2013
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/".
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/ |
![]() |
| Figura 2: Serigrafia da 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.
![]() |
| Figura 4: Configuração da gravadora de acordo com o CI utilizado. |
![]() |
| 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.
![]() | ||
| 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.
![]() |
| Figura 8: Interface do IC-Prog com destaque na aba de seleção do CI. |
Você pode baixar estes e outros arquivos do projeto aqui.
terça-feira, 2 de julho de 2013
Assinar:
Postagens (Atom)







