Go Down

Topic: Arduino vw sedan (Read 1 time) previous topic - next topic

vweber

Buenos días.

Estoy trabajando en un nuevo proyecto para mi coche el cual consiste en controlar todo el vehículo desde un arduino Mega. Las luces, encendido, etc. estarán controlados por 3 módulos de 4 reveladores, la comunicación sera por bluetooth a mi celular. Diseñé una aplicación en app inventor donde me muestra la información de los sensores de presión y temperatura así como voltaje y velocidad. La aplicación también cuenta con botones para poder accionar los relevadores, cundo se presiona un botón se envia una letra mayúscula al arduino para activar el relavador y si se presiona otra vez envía una letra minuscula para desactivar el relevador.
 Para poder obtener la velocidad tengo un modulo GPS neo 6M.

Hardware utilizado:
Arduino MEGA 2560
Modulo bluetooth HC-06
Modulo GPS GY-NEO6MV2  con EEPROM de control de vuelo y antena APM2.5
Modulo relevador de 4 canales
Módulo Sensor Detector De Voltaje Hasta 25 V para conectar a los sensores


El problema lo tengo con la comunicación bluetooth y comunicación al monitor serial. Ya probé el modulo de gps con un código de ejemplo y funciona bien, puedo ver la información en el monitor serial, pero cuando cargo el código que yo diseñe y conecto el celular al modulo bluetooth no logro tener ninguna comunicación. Los leds TX y RX en el arduino tampoco se encienden cuando presiono algún botón en el celular.

Anexo el código para ver si ustedes pueden notar algún error en el.

Code: [Select]

///INCLUI BIBLIOTECA GPS/COMUNICACION SERIAL///
#include <SoftwareSerial.h>
#include "TinyGPS++.h"
TinyGPSPlus gps;

////DEFINE ENTRADAS SWITCHES///
int boton_ignicion=2;
int boton_marcha=3;
int boton_luces=4;
int boton_luces_aux=5;
int boton_dir_izq=6;
int boton_dir_der=7;
int boton_wiper=8;
int boton_claxon=9;
int switch_puerta=10;
int switch_stop=11;
int switch_reversa=12;

////DEFINE ENTRADAS SENSORES////
int sensor_pres=A0;
int sensor_temp=A1;
int sensor_volt=A2;
int sensor_gas=A3;

/////DEFINE SALIDAS////
int corriente_relay1=52;
int corriente_relay2=53;
int salida_ignicion=22;
int salida_marcha=23;
int salida_luces_bajas=24;
int salida_luces_altas=25;
int salida_luces_aux1=26;
int salida_luces_aux2=27;
int salida_dir_izq=28;
int salida_dir_der=29;
int salida_wiper=30;
int salida_bomba_agua=31;
int d=0;
int i=0;
int estado=0;

////DEFINE VARIABLES/////
char buffer [10];  
float valorpres;
float valortemp;
float valorvolt;
float valorgas;
float rangoP;
float rangoT;
float rangoV;
float rangoG;

/////INICIA CONFIGURACION/////
  void setup() {
      Serial.begin(19200);
      Serial1.begin(9600); ///comunicacion bluetooth
      Serial2.begin(9600); ///comunicacion GPS
  
//////ENTRADAS//////
    pinMode(boton_ignicion,INPUT);
    pinMode(boton_marcha,INPUT);
    pinMode(boton_luces,INPUT);
    pinMode(boton_luces_aux,INPUT);
    pinMode(boton_dir_izq,INPUT);
    pinMode(boton_dir_der,INPUT);
    pinMode(boton_wiper,INPUT);
    pinMode(boton_claxon,INPUT);
    pinMode(switch_puerta,INPUT);
    pinMode(switch_stop,INPUT);
    pinMode(switch_reversa,INPUT);

///////////////SALIDAS///////////////
    pinMode(corriente_relay1,OUTPUT);
    pinMode(corriente_relay2,OUTPUT);
    pinMode(salida_ignicion,OUTPUT);
    pinMode(salida_marcha,OUTPUT);
    pinMode(salida_luces_bajas,OUTPUT);
    pinMode(salida_luces_altas,OUTPUT);
    pinMode(salida_luces_aux1,OUTPUT);
    pinMode(salida_luces_aux2,OUTPUT);
    pinMode(salida_dir_izq=28,OUTPUT);
    pinMode(salida_dir_der=29,OUTPUT);
    pinMode(salida_wiper=30,OUTPUT);
    pinMode(salida_bomba_agua=31,OUTPUT);
  
////SECUENCIA INICIO RELEVADORES////
    digitalWrite(salida_ignicion,HIGH);
    digitalWrite(salida_marcha,HIGH);
    Serial.print("ENCENDIDO");
    delay(100);
    digitalWrite(corriente_relay1,HIGH);
    digitalWrite(corriente_relay2,HIGH);
    delay(300);
    digitalWrite(salida_luces_bajas,HIGH);
    digitalWrite(salida_luces_altas,HIGH);
    digitalWrite(salida_luces_aux1,HIGH);
    digitalWrite(salida_luces_aux2,HIGH);
    digitalWrite(salida_dir_izq=28,HIGH);
    digitalWrite(salida_dir_der=29,HIGH);
    digitalWrite(salida_wiper=30,HIGH);
    digitalWrite(salida_bomba_agua=31,HIGH);
  }
/////LECTURA SENSORES/////
    float oilPres(){
      valorpres = analogRead(sensor_pres);
      rangoP=(float (valorpres)/1023)*50; //falta calcular valores para obtener dato real
      return rangoP;
    }

   float oilTemp(){
    valortemp = analogRead(sensor_temp);
    rangoT=(float (valortemp)/1023)*50;
    return rangoT;
   }

    float volts(){
      valorvolt = analogRead(sensor_volt);
      rangoV=(float (valorvolt)/1023)*50;
      return rangoV;
    }
    
    float fuel(){
      valorgas = analogRead(sensor_gas);
      rangoG=(float (valorgas)/1023)*50;
      return rangoG;
    }

//////INICIA SECUENCIA//////
  void loop() {
    //////LECTURA GPS/////////

while(Serial2.available()){ // check for gps data
  if(gps.encode(Serial2.read())){ // encode gps data
   Serial.print("Velocidad: ");Serial.print(gps.speed.kmph());Serial.println(" Km/hs");
  
//////LECTURA SENSORES//////
int temperatura=oilTemp();
int presion=oilPres();
int voltaje=volts();
int gasolina=fuel();
int velocidad=gps.speed.kmph();
  sprintf(buffer,"%d/%d/%d/%d/%d",velocidad/presion/temperatura/gasolina/voltaje);//concadena varias variables  diferentes como int, char en una sola cadena, aprovecho la coma para dividir en appinventor los datos
  Serial.println(buffer);
  Serial1.println(buffer);

  }
}
    
///////ACTIVACIO SWITCHES//////
    if(Serial1.available()>0){
    estado = Serial1.read();
    Serial.print(estado);
    }
      while(salida_ignicion,HIGH){
        if((estado =='A')or(boton_ignicion,HIGH)){
          digitalWrite(salida_ignicion,LOW);
        }
      }
      while(salida_ignicion,LOW){
        if((estado=='a')or(boton_ignicion,HIGH)){
          digitalWrite(salida_ignicion,HIGH);
        }
      }
      while(salida_ignicion,LOW){  
        if ((estado =='B')or(boton_marcha,HIGH)){
          digitalWrite(salida_marcha,LOW);
        }
        if((estado=='b')or(boton_marcha,LOW)){
          digitalWrite(salida_marcha,HIGH);
        }
      }
      while((salida_luces_bajas,HIGH)and(salida_luces_altas,HIGH)){
        if ((estado =='E')or(boton_luces,HIGH)){
          digitalWrite(salida_luces_bajas,LOW);
        }
      }
      while((salida_luces_bajas,LOW)and(salida_luces_altas,HIGH)){
        if((estado=='F')or(boton_luces,HIGH)){
          digitalWrite(salida_luces_bajas,HIGH);
          digitalWrite(salida_luces_altas,LOW);
        }
      }  
      while((salida_luces_bajas,HIGH)and(salida_luces_altas,LOW)){
        if(estado=='f'){
          digitalWrite(salida_luces_altas,HIGH);
        }
      }

      if ((estado =='G')or(boton_luces_aux,HIGH)){
        digitalWrite(salida_luces_aux1,LOW);
        digitalWrite(salida_luces_aux2,LOW);
      }
      if((estado=='g')or(boton_luces_aux,HIGH)){
        digitalWrite(salida_luces_aux1,HIGH);
        digitalWrite(salida_luces_aux2,HIGH);
      }
      if ((estado =='C')or(boton_dir_izq,HIGH)){
         for(int i = 0; i<10; i++) ///enciende y apaga la dir izquierda 10 veces
            digitalWrite(salida_dir_izq,LOW);
            delay(1500);
            digitalWrite(salida_dir_izq,HIGH);
            delay(1500);
      }
      if(estado=='c'){
        digitalWrite(salida_dir_izq,HIGH);
      }
      if ((estado =='D')or(boton_dir_der,HIGH)){
         for(int d = 0; d<10; d++) ///enciende y apaga la dir derecha  10 veces
            digitalWrite(salida_dir_der,LOW);
            delay(1500);
            digitalWrite(salida_dir_der,HIGH);
            delay(1500);
      }
      if(estado=='d'){
        digitalWrite(salida_dir_der,HIGH);
      }
      while(salida_wiper,LOW){
        if ((estado =='H')or(boton_wiper,HIGH)){
          digitalWrite(salida_wiper,LOW);
        }
      }
      while(salida_wiper,HIGH){
        if((estado=='h')or(boton_wiper,HIGH)){
          digitalWrite(salida_wiper,HIGH);
        }
      }
      while(salida_bomba_agua,LOW){
        if (estado =='I'){
          digitalWrite(salida_bomba_agua,LOW);
          delay(3000);
          digitalWrite(salida_bomba_agua,HIGH);
        }
      }
      while(salida_bomba_agua,HIGH){
        if (estado =='i'){
          digitalWrite(salida_bomba_agua,HIGH);
        }
      }
  }



surbyte

Poco tiene que ver pero para que pusiste esto?

Code: [Select]
#include <SoftwareSerial.h>

Probaste el BT con Arduino SOLOS? sin nada mas un simple código que lea todo lo que envias con el celular?

vweber

Quote
Poco tiene que ver pero para que pusiste esto?

Code: [Select]
#include <SoftwareSerial.h>
no tiene razón de estar, es solo porque el inicio del código lo tome de un ejemplo para un arduino UNO.

Quote
Probaste el BT con Arduino SOLOS? sin nada mas un simple código que lea todo lo que envias con el celular?
Ya probé con todas la combinaciones y no lo logro, de hecho ya no se puede conectar el celular con el modulo bluetooth, solo emparejar, pero cuando selecciono el modulo bluetooth desde la aplicacion me aparece ERROR 507, algo que antes no hacia. No se si dañe el modulo de tanto estar jugando con las configuraciones de nombres y velocidad.

surbyte

Quote
No se si dañe el modulo de tanto estar jugando con las configuraciones de nombres y velocidad.
Si algo te aseguro es que no puedes dañarlo asi. Pero si pudiste desconfigurarlo y ahora estar con diferentes baudios entre BT y arduino o BT 
Intenta volver a ponerlo en la configuración que te responda y puedas ver respuestas a tus comandos AT.
Luego sigue haciendo lo mismo pero con el telelfono Android y recibe datos en tu Arduino x el monitor Serie.
No sigas hasta asegurar que eso funcione.

vweber

instale la aplicación en otro teléfono y con este si se puede conectar el bluetooth, logre que el celular reciba la información pero todavía no puedo hacer que el arduino reciba la información enviada por el celular.

surbyte

Como es posible. Envias de arduino via BT al Android pero no puedes recibir?
Coloca tu código porque las conexiones estan bien ya que recibes en el celular.

vweber

Ya logre hacer que la comunicación vía bluetooth sea bi-direccional. Cambia la variable estado de "int" por "char" y separe las funciones de gps y lectura de sensores en un void y la del bluetooth en otro void.
Ahora el problema que tengo es que cuando presiono un botón en el celular se para la secuencia, dejo de recibir y enviar datos. Ya hice varias pruebas y me di cuenta de que esto solo sucede si cuando le asigno  una tarea después de recibir una letra, si elimino esa parte del código y solo la dejo hasta la parte donde imprime la letra enviada en el monitor serial.

Code: [Select]


////////////INCLUI BIBLIOTECA GPS/COMUNICACION SERIAL//////////////////////
#include "TinyGPS++.h"
TinyGPSPlus gps;

////////////DEFINE ENTRADAS SWITCHES/////////////////
int boton_ignicion=2;
int boton_marcha=3;
int boton_luces=4;
int boton_luces_aux=5;
int boton_dir_izq=6;
int boton_dir_der=7;
int boton_wiper=8;
int boton_claxon=9;
int switch_puerta=10;
int switch_stop=11;
int switch_reversa=12;

////////////DEFINE ENTRADAS SENSORES/////////////////
int sensor_pres=A0;
int sensor_temp=A1;
int sensor_volt=A2;
int sensor_gas=A3;

////////////DEFINE SALIDAS/////////////////
int corriente_relay1=52;
int corriente_relay2=53;
int salida_ignicion=22;
int salida_marcha=23;
int salida_luces_bajas=24;
int salida_luces_altas=25;
int salida_luces_aux1=26;
int salida_luces_aux2=27;
int salida_dir_izq=28;
int salida_dir_der=29;
int salida_wiper=30;
int salida_bomba_agua=31;
int d=0;
int i=0;
char estado=0;

////////DEFINE VARIABLES//////////
char buffer[10]; 
float valorpres;
float valortemp;
float valorvolt;
float valorgas;
float rangoP;
float rangoT;
float rangoV;
float rangoG;

///////////INICIA CONFIGURACION////////////////////
  void setup() {

      Serial.begin(9600);
      Serial2.begin(9600); ///comunicacion bluetooth
      Serial3.begin(9600); ///comunicacion GPS
 
///////////ENTRADAS/////////////////////
    pinMode(boton_ignicion,INPUT);
    pinMode(boton_marcha,INPUT);
    pinMode(boton_luces,INPUT);
    pinMode(boton_luces_aux,INPUT);
    pinMode(boton_dir_izq,INPUT);
    pinMode(boton_dir_der,INPUT);
    pinMode(boton_wiper,INPUT);
    pinMode(boton_claxon,INPUT);
    pinMode(switch_puerta,INPUT);
    pinMode(switch_stop,INPUT);
    pinMode(switch_reversa,INPUT);

///////////////SALIDAS///////////////
    pinMode(corriente_relay1,OUTPUT);
    pinMode(corriente_relay2,OUTPUT);
    pinMode(salida_ignicion,OUTPUT);
    pinMode(salida_marcha,OUTPUT);
    pinMode(salida_luces_bajas,OUTPUT);
    pinMode(salida_luces_altas,OUTPUT);
    pinMode(salida_luces_aux1,OUTPUT);
    pinMode(salida_luces_aux2,OUTPUT);
    pinMode(salida_dir_izq,OUTPUT);
    pinMode(salida_dir_der,OUTPUT);
    pinMode(salida_wiper,OUTPUT);
    pinMode(salida_bomba_agua,OUTPUT);
 
//////////SECUENCIA INICIO RELEVADORES////////////
    digitalWrite(salida_ignicion,HIGH);
    digitalWrite(salida_marcha,HIGH);
    Serial.println("ENCENDIDO");
    delay(100);
    digitalWrite(corriente_relay1,HIGH);
    digitalWrite(corriente_relay2,HIGH);
    delay(300);
    digitalWrite(salida_luces_bajas,HIGH);
    digitalWrite(salida_luces_altas,HIGH);
    digitalWrite(salida_luces_aux1,HIGH);
    digitalWrite(salida_luces_aux2,HIGH);
    digitalWrite(salida_dir_izq,HIGH);
    digitalWrite(salida_dir_der,HIGH);
    digitalWrite(salida_wiper,HIGH);
    digitalWrite(salida_bomba_agua,HIGH);
  }
//////////////////LECTURA SENSORES/////////////
    float oilPres(){
      //valorpres = analogRead(sensor_pres);
      rangoP=float (1023)/1023; //falta calcular valores para obtener dato real
      return rangoP;
    }

   float oilTemp(){
    //valortemp = analogRead(sensor_temp);
    rangoT=float (1023)/1023; //falta calcular valores para obtener dato real
    return rangoT;
   }

    float volts(){
      //valorvolt = analogRead(sensor_volt);
      rangoV=float (1023)/1023; //falta calcular valores para obtener dato real
      return rangoV;
    }
   
    float fuel(){
      //valorgas = analogRead(sensor_gas);
      rangoG=float (1023)/1023;
      return rangoG;
    }

////////////INICIA SECUENCIA///////////////
  void loop() {
   botones();
   gps_1();
  }
 
    /////////////LECTURA GPS/////////////////
void gps_1(){
while(Serial3.available()){ // check for gps data
  if(gps.encode(Serial3.read())){ // encode gps data
  Serial.print("Velocidad: ");Serial.print(gps.speed.kmph());Serial.println(" Km/hs");
    }
}

//////////LECTURA SENSORES///////////////
int temperatura=oilTemp();
int presion=oilPres();
int voltaje=volts();
int gasolina=fuel();
int velocidad=gps.speed.kmph();

  sprintf(buffer,"%d,%d,%d,%d,%d",velocidad,presion,temperatura,gasolina,voltaje);//concadena varias variables  diferentes como int, char en una sola cadena, aprovecho la coma para dividir en appinventor los datos
  Serial.println(buffer);
  Serial2.print(buffer);
  Serial.flush();
  Serial2.flush();
}

void botones(){
////////////////ACTIVACIO SWITCHES////////////////
    if(Serial2.available()>0){
    estado = Serial2.read();
    Serial.println(estado);
//////////SI BORRO EL CODIGO DESPUES DE ESTA LINEA LA APLICACION CONTINUA RECIBIENDO
/////////Y ENVIANDO DATOS DESPUES DE PRESIONAR EL BOTON, SI DEJO EL CODIGO COMPLETO LA APLICACION
/////////DEJA DE RECIBIR Y ENVIAR DATOS DESPUES DE PRESIONAR ALGUN BOON EN EL CELULAR//////////////////////

      while(salida_ignicion,HIGH){
        if((estado =='A')or(boton_ignicion,HIGH)){
          digitalWrite(salida_ignicion,LOW);
        }
      }
     
      while(salida_ignicion,LOW){
        if((estado=='a')or(boton_ignicion,HIGH)){
          digitalWrite(salida_ignicion,HIGH);
        }
      }
     
      while(salida_ignicion,LOW){ 
        if ((estado =='B')or(boton_marcha,HIGH)){
          digitalWrite(salida_marcha,LOW);
          }
      }
        if((estado=='b')or(boton_marcha,LOW)){
          digitalWrite(salida_marcha,HIGH);
      }
     
      while((salida_luces_bajas,HIGH)and(salida_luces_altas,HIGH)){
        if ((estado =='E')or(boton_luces,HIGH)){
          digitalWrite(salida_luces_bajas,LOW);
        }
      }
     
      while((salida_luces_bajas,LOW)and(salida_luces_altas,HIGH)){
        if((estado=='F')or(boton_luces,HIGH)){
          digitalWrite(salida_luces_bajas,HIGH);
          digitalWrite(salida_luces_altas,LOW);
        }
      }
       
      while((salida_luces_bajas,HIGH)and(salida_luces_altas,LOW)){
        if(estado=='f'){
          digitalWrite(salida_luces_altas,HIGH);
        }
      }

      if ((estado =='G')or(boton_luces_aux,HIGH)){
        digitalWrite(salida_luces_aux1,LOW);
        digitalWrite(salida_luces_aux2,LOW);
      }
     
      if((estado=='g')or(boton_luces_aux,HIGH)){
        digitalWrite(salida_luces_aux1,HIGH);
        digitalWrite(salida_luces_aux2,HIGH);
      }
     
      if ((estado =='C')or(boton_dir_izq,HIGH)){
         for(int i = 0; i<10; i++) ///enciende y apaga la direccional izquierda 10 veces
            digitalWrite(salida_dir_izq,LOW);
            delay(1500);
            digitalWrite(salida_dir_izq,HIGH);
            delay(1500);
      }
     
      if(estado=='c'){
        digitalWrite(salida_dir_izq,HIGH);
      }
     
      if ((estado =='D')or(boton_dir_der,HIGH)){
         for(int d = 0; d<10; d++) ///enciende y apaga la direccional derecha  10 veces
            digitalWrite(salida_dir_der,LOW);
            delay(1500);
            digitalWrite(salida_dir_der,HIGH);
            delay(1500);
      }
     
      if(estado=='d'){
        digitalWrite(salida_dir_der,HIGH);
      }
     
      while(salida_wiper,LOW){
        if ((estado =='H')or(boton_wiper,HIGH)){
          digitalWrite(salida_wiper,LOW);
        }
      }
     
      while(salida_wiper,HIGH){
        if((estado=='h')or(boton_wiper,HIGH)){
          digitalWrite(salida_wiper,HIGH);
        }
      }
     
      while(salida_bomba_agua,LOW){
        if (estado =='I'){
          digitalWrite(salida_bomba_agua,LOW);
          delay(3000);
          digitalWrite(salida_bomba_agua,HIGH);
        }
      }
     
      while(salida_bomba_agua,HIGH){
        if (estado =='i'){
          digitalWrite(salida_bomba_agua,HIGH);
        }
      }
  }

}


El otro problema que tengo es que la lectura de la velocidad del GPS tarda mucho en actualizarse, pueden pasar 15 segundos sin recibir un nuevo dato.

betomax

algunos modulos tienen un refresh de mas de 1 hz x ej de 5hz intenta cambiar la configuracion del tuyo, ademas mira en que parte estas poniendo la lectura, trata de darle prioridad

Go Up