SOFTWARE

Código en Arduino
#include <Servo.h> 

//------- Variable para luces intermitentes ---------//
long tiempo_anterior_luces=0;

//------- Variable para transmisión de datos ---------//
long tiempo_anterior_tx=0;
boolean estado = false;

//------- Variables para medir RPM---------//
byte rpmcount;
unsigned int rpm;
unsigned long timeold;
long timer_3=0;

//------- Variables para medir Voltajes---------//
int analogico4 = A4;
int analogico5 = A5;

//------- Variables de control---------//
int datoserial;
const int avanzar = 6;
const int control_motor = 3;
const int retroceder = 4;
const int ventilador_1 = 7;
const int ventilador_2 = 8;
const int luces_delanteras = 5;
const int luces_traceras = 9;
const int luces_intermitentes_izq = 12;
const int luces_intermitentes_der = 13;
const int buzzer = 10;
Servo volante;  // PIN 11
int alta_veloc = 0; // para encender ventilador del motor

void rpm_fun() {
  rpmcount++;
}

void setup() {  
  Serial.begin(9600);
  volante.attach(11);
  pinMode(control_motor, OUTPUT);
  pinMode(luces_intermitentes_izq,OUTPUT);
  pinMode(luces_intermitentes_der,OUTPUT);
  pinMode(luces_delanteras,OUTPUT);
  pinMode(luces_traceras,OUTPUT);
  pinMode(avanzar,OUTPUT);
  pinMode(retroceder,OUTPUT);
  pinMode(ventilador_1,OUTPUT);
  pinMode(ventilador_2,OUTPUT);
  pinMode(buzzer ,OUTPUT);

  attachInterrupt(0, rpm_fun, FALLING);
  rpmcount = 0;
  rpm = 0;
  timeold = 0;
}


void loop() {

  //---------Lunces intermitentes--------//  
  long tiempo_actual_luces = millis();
  long tiempo_luces = tiempo_actual_luces - tiempo_anterior_luces;

  //------------ Calculo de voltajes------------//
  int bateria_circuitos = analogRead(analogico4);
  int bateria_motor = analogRead(analogico5);
  
  //------------ Encendido de ventiladores ------------//
  long tiempo_ventilador = millis();
  if (tiempo_ventilador >= 60000) {
    digitalWrite(ventilador_1,HIGH);
  }
  else {
    digitalWrite(ventilador_1,LOW);
  }
  if  (alta_veloc == 1) {
    digitalWrite(ventilador_2,HIGH);
  }
  else {
    digitalWrite(ventilador_2,LOW);
  }

  //------------ Calculo de RPM ------------//
  long timer_1 = millis();
  long timer_2 = timer_1 -timer_3;
  if (timer_2 >= 1000){
    detachInterrupt(0);
    rpm = 60000/(millis() - timeold)*rpmcount;
    timeold = millis();
    rpmcount = 0;
    attachInterrupt(0, rpm_fun, FALLING);
    timer_3 = millis();
  }

  ///------------ Trasnmisión de datos Ethernet------------//
  if (estado == true){  // Transmite información cuando recibe
    long tiempo_actual_tx = millis();
    long tiempo_tx = tiempo_actual_tx - tiempo_anterior_tx;  
    if (tiempo_tx >=500){ // trasnmision de datos cada 500ms
      Serial.print("RPM:");
      if (rpm <= 30)Serial.print("0.0");
      if ((rpm>30)&&(rpm<=99)){
        Serial.print("0");
        Serial.print(rpm);
      }
      if ((rpm>=100)&&(rpm<=999))Serial.print(rpm);
      if (rpm>=1000)             Serial.print("0.0");
    
     Serial.print("V1:");
      if (bateria_circuitos <=9) {
        Serial.print("000");
        Serial.print(bateria_circuitos);
      }
      else if ((bateria_circuitos >=10)&&(bateria_circuitos <=99)) {
        Serial.print("00");
        Serial.print(bateria_circuitos);
      }
      else if ((bateria_circuitos >=100)&&(bateria_circuitos <=999)) {
        Serial.print("0");
        Serial.print(bateria_circuitos);
      }
      else Serial.print(bateria_circuitos);
   
      Serial.print("V2:");
      if (bateria_motor <=9) {
        Serial.print("000");
        Serial.println(bateria_motor);
      }
      else if ((bateria_motor >=10)&&(bateria_motor <=99)) {
        Serial.print("00");
        Serial.println(bateria_motor);
      }
       else if ((bateria_motor >=100)&&(bateria_motor <=999)) {
        Serial.print("0");
        Serial.println(bateria_motor);
      }
      else Serial.println(bateria_motor);
      tiempo_anterior_tx = millis();
    }
  }

  //------------ Recepción de datos Ethernet------------//
  if(Serial.available()>0){
    estado = true;   // recibe información para despues transmitir
    datoserial = Serial.read();
    if (datoserial=='W'){  // Marcha delante
      digitalWrite(avanzar, HIGH);
      digitalWrite(retroceder, LOW);
    }
    if (datoserial=='V'){  // Marcha neutral
      digitalWrite(avanzar, LOW);
      digitalWrite(retroceder, LOW);
    }
    if (datoserial=='S'){  // Marcha retro
      digitalWrite(avanzar, LOW);
      digitalWrite(retroceder, HIGH);
    }
    if (datoserial=='0'){  // motor apagado
      analogWrite(control_motor, 0);
      alta_veloc = 0;
    }
    if (datoserial=='1'){
      analogWrite(control_motor, 250); // motor a 50 de velocidad
      alta_veloc = 0;
    }
    if (datoserial=='2'){
      analogWrite(control_motor, 175);// motor a 100 de velocidad
      alta_veloc = 0;
    }
    if (datoserial=='3'){
      analogWrite(control_motor, 200);// motor a 150 de velocidad
      alta_veloc = 1;
    }
    if (datoserial=='4'){
      analogWrite(control_motor, 225);// motor a 200 de velocidad
      alta_veloc= 1;
    }
    if (datoserial=='5'){
      analogWrite(control_motor, 255);// motor a maxima velicidad
      alta_veloc = 1;      
    }
    if (datoserial=='A'){ //Dirección al giro izquierdo del vehículo
      volante.write(115);
      digitalWrite(luces_intermitentes_der, LOW);
      if (tiempo_luces <= 500)                         digitalWrite(luces_intermitentes_izq, HIGH);
      if ((tiempo_luces >= 501)&&(tiempo_luces < 1000))digitalWrite(luces_intermitentes_izq, LOW);
      if (tiempo_luces >= 1001) tiempo_anterior_luces = millis();
    }
    if (datoserial=='H'){ // Dirección neutral del vehículo
      volante.write(90);
      digitalWrite(luces_intermitentes_der, LOW); // intermitentes apagadas
      digitalWrite(luces_intermitentes_izq, LOW);
    }
    if (datoserial=='D'){ //Dirección al giro derecha del vehículo
      volante.write(65);
      digitalWrite(luces_intermitentes_izq, LOW);
      if (tiempo_luces <= 500)                         digitalWrite(luces_intermitentes_der, HIGH);
      if ((tiempo_luces >= 501)&&(tiempo_luces < 1000))digitalWrite(luces_intermitentes_der, LOW);
      if (tiempo_luces >= 1001) tiempo_anterior_luces = millis();            
    }
    if (datoserial=='G'){ // encendido de Luces delanteras
      digitalWrite(luces_delanteras, HIGH);
    }
    if (datoserial=='g'){ // apagado de Luces delanteras
      digitalWrite(luces_delanteras, LOW);
    }
    if (datoserial=='F'){ // encendido de Luces traceras
      digitalWrite(luces_traceras, HIGH);
    }
    if (datoserial=='f'){ // apagado de Luces traceras
      digitalWrite(luces_traceras, LOW);
    }
    if (datoserial=='T'){ // encendido de Buzer
      digitalWrite(buzzer, HIGH);
    }
    if (datoserial=='t'){ // apagado de buzer
      digitalWrite(buzzer, LOW);
    }    
  }
}


Código en LabVIEW 2012




1 comentario:

  1. Hola amigo, Exelente proyecto e interesante pero tengo una duda, quiero hacerlo con el modulo ethernet shield w5100, la programacion en arduino seria sigual?

    ResponderEliminar