jueves, 30 de enero de 2014

Coche dirigido con telefono android.











Empezamos el proyecto planificandolo con GanttProject, ordenando las tareas tanto iniciales como las que realizaremos posteriormente asi nuestra planificacion sera efectiva y beneficiosa, esta planificacion no es la definitiva sobre la marcha iremos modificando pero siempre nos basaremos en la principal que es esta, adjunto GanttProject, para su visualizacion.


Los primeros pasos para montar nuestro coche es la colocacion de la parte baja del chasis con los soportes de los motores y los cuatro motores que los hemos conseguido en ebay por un precio bastante economico.
Adjunto fotografia del vehiculo.


Una vez que tenemos los motores colocados en su sitio pasamos a puentear los dos del lado derecho 
y los dos del lado izquierdo asi conseguiremos que los motores funcionen en parejas diferenciando lado derecho y lado izquierdo, adjunto una fotografia de como quedarian los motores conectados en parejas.


Cuando ya estan puenteados solo deben de quedarnos cuatro cables dos de lado izquierdo y dos de lado derecho.

  • El siguiente paso sera montar un puente en H, con el integrado L298.
Un a placa de arduino no puede gestionar directamente los motores de corriente continua, dado que la maxima intensidad que es capaz e suministrar en sus pines de salida es de unos 20 mA aproximadamente, por lo tanto necesitamos un controlador de motores, mas conocido como drivers, dicho controlador sera gestionado por arduino. siempre debemos de seleccionar un drivers con suficiente potencia para los motores que vallamos a utilizar. en nuestro caso los cuatro motores funcionan a 6 voltios y a plena potencia consumen unis 300 mA dado que tenemos 4 motores obtenemos un consumo aproximado de 4 * 300 = 1.2 amperios. es una buena opcion este integrado ya que es pequeño y facil de acoplar a nuestro coche.
puente en H con integrado l 298.
Como obserbamos en la fotografia tenemos entrada de motor en rojo al lado derecho, y emtrada de motor verde lado izquierdo.Enlace puente en H economico.

ALIMENTACION:
La alimentacion es bien sencilla, colocaremos un zocalo de 5  pilas AA que obtendremos un total de 
7,5 voltios el cual nos sera suficiente para alimentar tanto los motores como el arduino, si queremos mayor autonomoia tendremos que montar un bateria de iguales caracteristicas o dos zocalos de pilas. En nuestro caso con uno solo tenemos suficiente, lo alojamos en la parte baja del chasis mirando hacia el suelo y lo sujetamos con dos tornillos.

ARDUINO QUE VAMOS A UTILIZAR:
Tenemos distintos tipos de arduino para poder utilizar en nuestro carro, pero debido a la gran cantidad de salidas diguitales que vamos a utilizar y a la cantidad de sensores que vamos a montar necesitaremos un arduino Mega 2560 que tiene suficiente patillaje para todos nuestro proyecto.
Tambien necesitaremos el arduino 328 que compramos el integrado por unos 3€ y le fabricamos una placa sencilla, con este arduino aremos que nuestro programa atrabes de procesing nos envie por wirelees los datos al pc y nos almacene la temperatura con un sensor de temperatura y umedad, esto nos creara una grafica y nos ira guardando en un documento de texto todo lo que lea el sensor. Adjunto PCB CON ARES, para poder descargar directamente y circuito ESQUEMATICO con ISIS.
placa arduino 328 casera.


arduino mega 2560.


Para probar nuestros motores, nuestro driver, y nuestro arduino y verificar que todo funciona correctamente antes de empezar con la programacion, he echo un programa muy sencillito que movera el coche hacia delante, giro derecha, giro izquierda etc...  asi verificamos que funciona todo correctamente.
Presento el codigo que debemos de meter en arduino.
Donde  I1, I2, I3, I4, EA, EB . Son las patillas del driver 
Donde 6, 7, 8, 9, 10, 11,. Patillas digitales del arduino con las cuales hace funcionar al driver.
EA, EB,  Enables que lo que hacen es que el drivers se desactive o no.

#define MOTOR1_CTL1  8  // I1  
#define MOTOR1_CTL2  9  // I2  
#define MOTOR1_PWM   11 // EA  

#define MOTOR2_CTL1  6  // I3  
#define MOTOR2_CTL2  7  // I4  
#define MOTOR2_PWM   10 // EB  
  
#define MOTOR_DIR_FORWARD  0  
#define MOTOR_DIR_BACKWARD   1  
  
void setup()  
{  
  // Setup pins for motor 1  
   pinMode(MOTOR1_CTL1,OUTPUT);  
   pinMode(MOTOR1_CTL2,OUTPUT);  
   pinMode(MOTOR1_PWM,OUTPUT);  
     
  // Setup pins for motor 2  
   pinMode(MOTOR2_CTL1,OUTPUT);  
   pinMode(MOTOR2_CTL2,OUTPUT);  
   pinMode(MOTOR2_PWM,OUTPUT);     
}  
  
void setSpeed(char motor_num, char motor_speed)  
{  
   if (motor_num == 1)  
   {  
      analogWrite(MOTOR1_PWM, motor_speed);  
   }     
   else  
   {  
      analogWrite(MOTOR2_PWM, motor_speed);  
   }  
}  
  
void motorStart(char motor_num, byte direction)  
{  
    
   char pin_ctl1;  
   char pin_ctl2;  
     
   if (motor_num == 1)  
   {  
      pin_ctl1 = MOTOR1_CTL1;  
      pin_ctl2 = MOTOR1_CTL2;  
   }     
   else  
   {  
      pin_ctl1 = MOTOR2_CTL1;  
      pin_ctl2 = MOTOR2_CTL2;       
   }  
    
   switch (direction)  
   {  
     case MOTOR_DIR_FORWARD:  
     {  
       digitalWrite(pin_ctl1,LOW);  
       digitalWrite(pin_ctl2,HIGH);            
     }  
     break;   
            
     case MOTOR_DIR_BACKWARD:  
     {  
        digitalWrite(pin_ctl1,HIGH);  
        digitalWrite(pin_ctl2,LOW);            
     }  
     break;           
   }  
}  
  
void motorStop(char motor_num)  
{  
   setSpeed(motor_num, 0);  
   if (motor_num == 1)  
   {  
     digitalWrite(MOTOR1_CTL1,HIGH);  
     digitalWrite(MOTOR1_CTL2,HIGH);       
   }  
   else  
   {  
     digitalWrite(MOTOR2_CTL1,HIGH);  
     digitalWrite(MOTOR2_CTL2,HIGH);       
   }  
}  
  
void loop()  
{  
  // Start motors!  
  motorStart(1, MOTOR_DIR_FORWARD);    
  setSpeed(1, 200);  
  motorStart(2, MOTOR_DIR_FORWARD);        
  setSpeed(2, 200);  
    
  delay(2000);  
    
  motorStart(1, MOTOR_DIR_BACKWARD);    
  setSpeed(1, 200);  
  motorStart(2, MOTOR_DIR_BACKWARD);        
  setSpeed(2, 200);  
    
  delay(2000);  
    
  motorStart(1, MOTOR_DIR_FORWARD);    
  setSpeed(1, 140);  
  motorStart(2, MOTOR_DIR_BACKWARD);        
  setSpeed(2, 140);    
    
  delay(2000);  
    
  motorStart(1, MOTOR_DIR_BACKWARD);    
  setSpeed(1, 140);  
  motorStart(2, MOTOR_DIR_FORWARD);        
  setSpeed(2, 140);    
    
  delay(2000);   

}

    



Una vez realizado este paso y con todo correctamente pasamos a crear la interfaz para nuestro dispositivo movil android se pueda comunicar con arduino mediante bluetooth.
Para ello vamos a utilizar app inventor que es una aplicacion sencilla http://appinventor.mit.edu/explore/

entramos en el anterior enlace y nos pedira una cuenta de correo etc ... metemos los datos y empezamos a trastear, veremos que nos sale una pantalla que es la misma que nos saldra en nuestro dispositivo movil una vez que la tengamos terminada y la cargemos al movil.
empezaremos poniendo los botoncitos que necesitemos, imagenes, y esto va al gusto de cada uno.
una vez realizada nuestra pantalla tendremos que ir al diagrama de bloques y programarlo que concuerde con nuestro programa de arduino para que todo funcione correctamente.






ejemplos sencillos appinventOR
Como se veria en nuestro dispositivo movil APP INVENTOR.

PCB sensores de HC-SR04
Fabricacion de placa para sensores de ultrasonido ha medida del chasis de nuestro coche, aprobechamos para reforzar el metraquilato con la placa de sensores, asi queda mas robusto en caso de que sufra un accidente, y gracias a esta placa nos quitamos los problemas que tenemos de ruido por una masa no eficaz.
Adjunto pcb de como quedaria la placa.

PCB SENSORES ULTRASONIDO.

Adjunto fotografias con las placas de ultrasonido montadas y el puente en H junto con el cableado y la alimentacion correspondiente a bateria para su autonomia asi se ve el proceso de montaje que vamos llevando. 

 
- Para mas comodidad montamos cables macho-hembra.
Una vez que tenemos montados los ultrasonidos que son cuatro dos para la parte delantera y dos para la parte trasera, y mientras que nos llegaban los ultrasonidos he echo el codigo fuente de los sensores que hara los siguiente, cada ultrasonido mide independientemente, estan continuamente midiendo entonces si se encuentra un obstaculos (que lo pueda detectar claro) a menos de 20 centimetros el vehiculo debe de pararse automaticamente, y no dejar reanudar la marcha en esa misma direccion, a no ser que cuando lea el obstaculo no este entonces debe de permitir seguir, otra cosa que hemos tenido en cuenta  es que si el vehiculo va hacia delane por ejemplo  los sensores traseros aunque lean que hay un obstaculo deben de pasar de esa orden y seguir permitiendo que avance el vehiculo.
Hemos tenido problemas con los sensores ya que los motores del coche nos producian ruido y el sensor no nos leia bien, de vez en cuando nos metia un 0 cm y nos detenia el coche, la solucion a este problema tan comun, a sido la de hacer las placas anteriormente expuestas. y con ello las masas del arduino junto con la del puente en H y los ultrasonidos se mejoran bastante y nos desaparece ese ruido.

Aqui tengo el codigo de la deteccion de objetos casi terminado el cual se modificara mas adelante para meter los demas sensores. Este es de prueba pinchas en el enlace y se descarga.

Programa detectar objetos con ultrasonidos y comunicacion bluetooth.

#include <Ultrasonic.h> // Libreria que debemos de utilizar

Ultrasonic ultrasonic1(40,41,30000;  //Patillaje arduino echo- trig.)
Ultrasonic ultrasonic2(42,43,30000); 
Ultrasonic ultrasonic3(44,45,30000); 
Ultrasonic ultrasonic4(46,47,30000); 


#define MOTOR1_CTL1  7  // I1  
#define MOTOR1_CTL2  8  // I2  
#define MOTOR1_PWM   6 // EA  

#define MOTOR2_CTL1  9  // I3  
#define MOTOR2_CTL2  10  // I4  
#define MOTOR2_PWM   11 // EB  
  
#define MOTOR_ADELANTE  0  
#define MOTOR_ATRAS   1  

int x;
char rec;

void setup()
{
  dht.begin();
  
  Serial.begin(9600);  
  Serial3.begin(9600);
  //Serial3.println("Conectado");
  
  
   pinMode(13, OUTPUT);
    
  // Setup pins for motor 1  
   pinMode(MOTOR1_CTL1,OUTPUT);  
   pinMode(MOTOR1_CTL2,OUTPUT);  
   pinMode(MOTOR1_PWM,OUTPUT);  
     
  // Setup pins for motor 2  
   pinMode(MOTOR2_CTL1,OUTPUT);  
   pinMode(MOTOR2_CTL2,OUTPUT);  
   pinMode(MOTOR2_PWM,OUTPUT);

  
  //pinMode(trigger,OUTPUT);
 // pinMode(echo,INPUT);
  
            
}

void loop(){
         //d=distan();
                 
          //ULTRASONIDO verificacion por el serial.
  
  Serial.print("UP1: ");  
  Serial.print(ultrasonic1.Ranging(CM)); 
  Serial.print(" cm     "); 
  Serial.print("UP2: ");
  Serial.print(ultrasonic2.Ranging(CM));   
  Serial.print(" cm     "); 
  //Serial.print("\r");
  Serial.print("DOWN1: ");  
  Serial.print(ultrasonic3.Ranging(CM)); 
  Serial.print(" cm     "); 
  Serial.print("DOWN2: ");
  Serial.print(ultrasonic4.Ranging(CM));   
  Serial.println(" cm     "); 
  //delay(1000);
  
  
  if((ultrasonic3.Ranging(CM)<=30 || ultrasonic4.Ranging(CM) <=30) && x==1)
  {
    motorStop(1);
    motorStop(2);
  }
  
  
  if(ultrasonic1.Ranging(CM)<=30 && x==2 ||ultrasonic2.Ranging(CM)<=30 && x==2)
  {          
    motorStop(1);
    motorStop(2);        
  }
  
  if(ultrasonic2.Ranging(CM)<=30 && x==3 ||ultrasonic3.Ranging(CM)<=30 && x==3)
  {
    motorStop(1);
    motorStop(2);
  }
  
  if(ultrasonic1.Ranging(CM)<=30 && x==4 || ultrasonic4.Ranging(CM)<=30 && x==4)
  {
    motorStop(1);
    motorStop(2);
  }
  
        //BLUETOOTH usmos el serial 3.
  
  if(Serial3.available()){ 
    rec=Serial3.read();
    switch(rec){
      
      x=0;
           
       case 's':
        
        if(ultrasonic3.Ranging(CM)>=30||ultrasonic4.Ranging(CM)>=30)
        {
          motorStart(1, MOTOR_ADELANTE);    
          setSpeed(1, 200);  
          motorStart(2, MOTOR_ATRAS);        
          setSpeed(2, 200);       
          //delay(500); 
          x=1;
        }
        break;

        case 'w':
        
        if(ultrasonic1.Ranging(CM)>=30||ultrasonic2.Ranging(CM)>=30)
        {
          motorStart(1, MOTOR_ATRAS);    
          setSpeed(1, 200);  
          motorStart(2, MOTOR_ADELANTE);        
          setSpeed(2, 200);       
          //delay(500);
          x=2;
        }
        break;
       
      case 'd':
      
      if(ultrasonic1.Ranging(CM)>=30||ultrasonic4.Ranging(CM)>=30)
        {
          motorStart(1, MOTOR_ADELANTE);    
          setSpeed(1, 200);  
          motorStart(2, MOTOR_ADELANTE);        
          setSpeed(2, 200);       
          //delay(500);
          x=3;
        }
        break;
   
        case 'a':
        
        if(ultrasonic2.Ranging(CM)>=30||ultrasonic3.Ranging(CM)>=30)
        {
          motorStart(1, MOTOR_ATRAS);    
          setSpeed(1, 200);  
          motorStart(2, MOTOR_ATRAS);        
          setSpeed(2, 200);        
          //delay(500);
          x=4;
        }
        break;
       
      case '1':
        digitalWrite(13, HIGH);
        //delay(500);
        break;
        
      case '0':
        digitalWrite(13, LOW);
        motorStop(1);
        motorStop(2);
        //delay(500);
        break;     
        
     
    }
  }
}
            //FUNCIONES MOTORES
  
void setSpeed(char motor_num, char motor_speed)  
{  
   if (motor_num == 1)  
   {  
      analogWrite(MOTOR1_PWM, motor_speed);  
   }     
   else  
   {  
      analogWrite(MOTOR2_PWM, motor_speed);  
   }  
}  
  
void motorStart(char motor_num, byte direction)  
{  
    
   char pin_ctl1;  
   char pin_ctl2;  
     
   if (motor_num == 1)  
   {  
      pin_ctl1 = MOTOR1_CTL1;  
      pin_ctl2 = MOTOR1_CTL2;  
   }     
   else  
   {  
      pin_ctl1 = MOTOR2_CTL1;  
      pin_ctl2 = MOTOR2_CTL2;       
   }  
    
   switch (direction)  
   {  
     case MOTOR_ADELANTE:  
     {  
       digitalWrite(pin_ctl1,LOW);  
       digitalWrite(pin_ctl2,HIGH);            
     }  
     break;   
            
     case MOTOR_ATRAS:  
     {  
        digitalWrite(pin_ctl1,HIGH);  
        digitalWrite(pin_ctl2,LOW);            
     }  
     break;           
   }  
}  
  
void motorStop(char motor_num)  
{  
   setSpeed(motor_num, 0);  
   if (motor_num == 1)  
   {  
     digitalWrite(MOTOR1_CTL1,HIGH);  
     digitalWrite(MOTOR1_CTL2,HIGH);       
   }  
   else  
   {  
     digitalWrite(MOTOR2_CTL1,HIGH);  
     digitalWrite(MOTOR2_CTL2,HIGH);       
   }  
}  



Posteriormente incorporamos sonda temperatura, comunocacion con procesing, bluetooth etc.. .

Estamos fabricando una placa que simula nuestro vehiculo la cual incorpora en SMD un Arduino Mega 2560, unos leds para simular las luces del coche fantastico, patillaje para poder poner los cuatro ultrasonidos y patillaje y circuiteria necesaria para sonda de temperatura, bluetooth, puente en H, etc.. . La placa la sacaremos por el metodo de la fotoinsolacion y sera a doble cara necesario por todo el patillaje que lleva. Nose si nos dara tiempo a montarla pero LA INTENCION ES MONTARLA Y PROGRAMARLA.
Aqui os dejo un enlace para que tengais una idea de como va a ser.


Fabricacion placa con ISIS 7 Profesional y ARES.

SENSOR DE TEMPEATURA DHT11 PARA ARDUINO.
En este proyecto necesitamos que nuestro sensor DHT11 nos vaya diciendo la temperatura y la humedad ambiente que va registrando mientras circula el vehiculo y tambien necesitamos que nos cree una grafica con las mediciones, para ello usaremos procesing y crearemos dos barritas graficas una para humedad y otra para temperatura las cuales iran marcando en todo momento lo que el sensor valla midiendo.
Tambien necesitamos que guarde todas las temperaturas registradas desde el inicio del vehiculo asta que salimos del programa. Para ello hemos tenido que hacer dos programas uno para processing y claro esta otro para arduino. Con esto concluimos la parte de almacenaje de datos y graficas de sensores.
SENSOR DHT11.

PROGRAMA PROCESSING: GRAFICA SENSOR DTH11.

//Librerias
import processing.serial.*;
import controlP5.*;  // Interfaz grafica
import javax.swing.*;

//Creo objetos
ControlP5 controlP5;
Serial myPort;    
Object puerto;
String puertoS;

//Variables globales
Serial port;
float temp=0;
float humedad=0;
int bt=0;  //para leer byte de temperatura,1, o humedad,0. 
Slider t,h;
PrintWriter output; // Para guardar datos en un fichero

//Funciones dibujatitulo, Interfaz y Salir

void dibujatitulo(){
 fill(0,0,255);
 textSize(19);
 textAlign(LEFT);
 text("Gráfica temperatura y humedad",70,30);
 textSize(15);
 text("Pedro",320,60);
 textSize(20);
 text("Sensor DHT11",70,60);
}

public void Salir(int theValue) {
  println("Salir: "+theValue);
  output.flush(); 
  output.close();
  exit(); // Salimos del programa
}

void interfaz(){  // DIBUJA GRAFICOS
  size(470, 280);
  dibujatitulo();
  frameRate(80);
  controlP5 = new ControlP5(this);
  controlP5.addButton("Salir",0,430,10,30,19);
  h=controlP5.addSlider("Humedad %",0,100,humedad,80,160,10,100);
  t=controlP5.addSlider("Temperatura C",0,50,temp,150,160,10,100);
  smooth();
}
//aqui hacemos que el programa nos pida el puerto com y si no que nos de un error
void setup(){
  
  Object[] puertosList = Serial.list();
  
  if(puertosList != null){
    puerto = JOptionPane.showInputDialog(null, "Seleccione puerto COM:", "Seleccione COM", 3, null, puertosList, null);
  }else{
    JOptionPane.showMessageDialog(null, "Ningun puerto COM detectado");
  }
  
  if(puerto != null){
    puertoS = puerto.toString();
    }else{
    exit();
  }
  
  myPort = new Serial(this, puertoS, 9600);
  
  interfaz();
  output = createWriter("datos_sensores.txt");  //Los datos se almacenan en un fichero que llamamos datos_sensores.txt
}

void serialEvent (Serial myPort) {
 // get the ASCII string:
 String inString = myPort.readStringUntil('\n');
 if (inString != null) {
 inString = trim(inString);
  if(bt==0){
     println(bt);  //Quitar comentario en caso de problemas y verificar
     //que el primer byre que llega es el valor de la humedad
     humedad = float(inString);
     h.setValue(humedad);
     bt=1; //el próximo byte que leeré será temperatura
     output.print(humedad+""+TAB);  //Guardo en fichero el valor de humedad
  }
    else if(bt==1){
    temp = float(inString);
    t.setValue(temp);
    bt=0; //el próximo byte que leeré será humedad
    output.print(temp); //Guardo en fichero el valor de temperatura
    output.println(""); //Salto de línea
   }
 }
}

void draw(){
  background(0,191,255);
  dibujatitulo();
}

PROGRAMA ARDUINO PARA COMUNICAR DTH11 CON PROCESING.

#include "DHT.h"
#define DHTPIN 2   //este es el pin que lee
#define DHTTYPE DHT11   // DHT 11

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  dht.begin();
void loop() {
// lee la temperatura y la humedad cada 250 milisegundos aprox.
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(t) || isnan(h)) {
  } else {
    Serial.print(h);  // La modificación del código es aquí, para sincronizar los datos
    Serial.print("\n temperatura\n"); //Con Processing lo hacemos mediante "\n"
    Serial.print(t);
    Serial.print("\n humedad\n");
  }
}

Los programas estan bastante comentados y facil de entender.
Con esto aporto todo lo que llevo echo asta el momento, y sigo desarrollando una placa para poder conectra en wilrelees, el bluetooth y el sensor de temperatura DTH11, todo en la misma placa para solucionarnos el alojamiento y facilitarnos el montaje en el vehiculo asi como juntar sus masas y Vcc. Cuando este montado subire fotos y facilitare documentacion y PCB.

Tambien estoy realizando la programacion de un encoder para poder saber la velocidad a la que circula el vehiculo asi como un plaquita pequeña para poder alojarlo junto a los motores en una rueda que lleva alojada llena de ranuras.
PCB encoder.
Encoder montado en alojamiento.


Una vez que he recibido el wireless NRF2401, ya puedo hacer la placa para montar el bluetooth, y la sonda de temperatura todo junto en la misma placa. Adjunto PCB y fotografia de como quedaria, incorpora materiales en SMD.
wireless NRF2401.
PCB, wireless, bluetooth, y sensor temperatura, todo conectado a 3.3v.

Descargar PCB.
Con esto facilitamos el montaje y mejoramos el conexionado hacia el arduino evitando tener varios cables de VCC y de GND todos estos componentes van conectados ha la patilla de 3.3v de arduino.
Proximamenrte y para terminar lo propuesto en mi proyecto presentare el codigo fuente de arduino para comunicarse por wirelees con el pc y poder mandar datos de sensores.

Estudio de eficiencia energetica: el estudio lo hemos realizado aplicandole tres voltajes diferente de 9, 11.1, y 12 voltios. Y la otra variable es ir modificando valores de PWM desde 80 que es lo minimo que arranca nuestros motores asta 255 que es mo maximo que se le puede meter. Adjunto  graficas y medidas.TABLAS EFICIENCIA ENERGETICA
En mi caso por la reductora de mis motores y la velocidad desea escojo la medida de 12 voltios y 200 de valor PWM aunque el consumo no es el mejor, las prestaciones son las deseadas.

Programa final control arduino.

#include <Ultrasonic.h>


#include <DHT.h>
#define DHTPIN 12
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
 int ledPin = 13;
int speakerOut = 48;



int timeUpDown[] = {3822, 3606, 3404, 3214, 3032, 2862,
2702, 2550, 2406, 2272, 2144, 2024,
1911, 1803, 1702, 1607, 1516, 1431,
1351, 1275, 1203, 1136, 1072, 1012};




  byte song[] = {7,7,7,12,12,12,16,16,7,7,7,12,12,12,16,16,16,16,16,16,16,12,12,11,11,9,9,7,7,7,7,7};
// do do do re mi re do mi re re do...

byte beat = 0;
int MAXCOUNT = 32;
float TEMPO_SECONDS = 0.2;
byte statePin = LOW;
byte period = 0;
int i, timeUp;


Ultrasonic ultrasonic1(40,41,30000);
Ultrasonic ultrasonic2(42,43,30000);
Ultrasonic ultrasonic3(44,45,30000);
Ultrasonic ultrasonic4(46,47,30000);


#define MOTOR1_CTL1  7  // I1
#define MOTOR1_CTL2  8  // I2
#define MOTOR1_PWM   6 // EA

#define MOTOR2_CTL1  9  // I3
#define MOTOR2_CTL2  10  // I4
#define MOTOR2_PWM   11 // EB

#define MOTOR_ADELANTE  0
#define MOTOR_ATRAS   1

int x;
char rec;

int temp;


void setup()
{
  pinMode(ledPin, OUTPUT);
  pinMode(speakerOut, OUTPUT);// buzzer
  dht.begin();


  Serial.begin(9600);
  Serial3.begin(9600);


   pinMode(13, OUTPUT);
 
  // Setup pins for motor 1
   pinMode(MOTOR1_CTL1,OUTPUT);
   pinMode(MOTOR1_CTL2,OUTPUT);
   pinMode(MOTOR1_PWM,OUTPUT);
   
  // Setup pins for motor 2
   pinMode(MOTOR2_CTL1,OUTPUT);
   pinMode(MOTOR2_CTL2,OUTPUT);
   pinMode(MOTOR2_PWM,OUTPUT);


  //pinMode(trigger,OUTPUT);
 // pinMode(echo,INPUT);

         
}


void loop(){

 
       
       
         //TEMPERATURA
       
   float h = dht.readHumidity();
   float t = dht.readTemperature();  
 
   if (isnan(t) || isnan(h)) {}
 
   else {
   
    Serial.print(h);  // La modificación del código es aquí, para sincronizar los datos
    Serial.print("\n temperatura\n"); //Con Processing lo hacemos mediante "\n"
    Serial.print(t);
    Serial.println("\n humedad\n");
 
       temp = (int) t;
       Serial.print("ENTERO");
       Serial.println(temp);
  }
     
       
       
          //ULTRASONIDO PARA EL SERIAL SAQUE LO QUE ESTA MIEDIENDO

  Serial.print("UP1: ");
  Serial.print(ultrasonic1.Ranging(CM));
  Serial.print(" cm     ");
  Serial.print("UP2: ");
  Serial.print(ultrasonic2.Ranging(CM));
  Serial.print(" cm     ");
  //Serial.print("\r");
  Serial.print("DOWN1: ");
  Serial.print(ultrasonic3.Ranging(CM));
  Serial.print(" cm     ");
  Serial.print("DOWN2: ");
  Serial.print(ultrasonic4.Ranging(CM));
  Serial.println(" cm     ");
  //delay(1000);


  if((ultrasonic3.Ranging(CM)<=30 || ultrasonic4.Ranging(CM) <=30) && x==1)
//COMPROBACION DISTANCIA MOTORES  LA VARIABLE X ES PARA QUE CUANDO VA HACIA DELANTE PASE DEL DE ATRAS.
  {
    motorStop(1);
    motorStop(2);
  }


  if(ultrasonic1.Ranging(CM)<=30 && x==2 ||ultrasonic2.Ranging(CM)<=30 && x==2)
  {        
    motorStop(1);
    motorStop(2);      
  }

  if(ultrasonic2.Ranging(CM)<=30 && x==3 ||ultrasonic3.Ranging(CM)<=30 && x==3)
  {
    motorStop(1);
    motorStop(2);
  }

  if(ultrasonic1.Ranging(CM)<=30 && x==4 || ultrasonic4.Ranging(CM)<=30 && x==4)
  {
    motorStop(1);
    motorStop(2);
  }




        //BLUETOOTH

  if(Serial3.available()){
    rec=Serial3.read();
    switch(rec){
   
      x=0;
   
        case 'p':                         //Claxon la cucaracha
        digitalWrite(speakerOut, LOW);
for (beat = 0; beat < MAXCOUNT; beat++) {
statePin = !statePin;
digitalWrite(ledPin, statePin);

timeUp = timeUpDown[song[beat]];

period = ((1000000 / timeUp) / 2) * TEMPO_SECONDS;
for (i = 0; i < period; i++) {
digitalWrite(speakerOut, HIGH);
delayMicroseconds(timeUp);
digitalWrite(speakerOut, LOW);
delayMicroseconds(timeUp);
}
 //delay(1);
}
digitalWrite(speakerOut, LOW);
delay(1000);
     
       break;
   
               
       case 'c':
   
                         //Envia Temperatura por bluetooth  
       temp = (int) t;
       Serial.print(temp);
       Serial3.print(temp);
     
       break;
     
     
       case 's':
     
        if(ultrasonic3.Ranging(CM)>=30||ultrasonic4.Ranging(CM)>=30)
        {
          motorStart(1, MOTOR_ADELANTE);  
          setSpeed(1, 200);
          motorStart(2, MOTOR_ATRAS);      
          setSpeed(2, 200);    
          //delay(500);
          x=1;
        }
        break;
     
     
        case 'w':
     
        if(ultrasonic1.Ranging(CM)>=30||ultrasonic2.Ranging(CM)>=30)
        {
          motorStart(1, MOTOR_ATRAS);  
          setSpeed(1, 200);
          motorStart(2, MOTOR_ADELANTE);      
          setSpeed(2, 200);    
          //delay(500);
          x=2;
        }
        break;
     
     
   
      case 'd':
   
      if(ultrasonic1.Ranging(CM)>=30||ultrasonic4.Ranging(CM)>=30)
        {
          motorStart(1, MOTOR_ADELANTE);  
          setSpeed(1, 200);
          motorStart(2, MOTOR_ADELANTE);      
          setSpeed(2, 200);    
          //delay(500);
          x=3;
        }
        break;
     
   
     
        case 'a':
     
        if(ultrasonic2.Ranging(CM)>=30||ultrasonic3.Ranging(CM)>=30)
        {
          motorStart(1, MOTOR_ATRAS);  
          setSpeed(1, 200);
          motorStart(2, MOTOR_ATRAS);      
          setSpeed(2, 200);      
          //delay(500);
          x=4;
        }
        break;
     
     
     
     
      case '1':
        digitalWrite(13, HIGH);
        //delay(500);
        break;
     
      case '0':
        digitalWrite(13, LOW);
        motorStop(1);
        motorStop(2);
        //delay(500);
        break;  
     
   
    }
  }
}
     

                                                  //FUNCIONES MOTORES

void setSpeed(char motor_num, char motor_speed)
{
   if (motor_num == 1)
   {
      analogWrite(MOTOR1_PWM, motor_speed);
   }  
   else
   {
      analogWrite(MOTOR2_PWM, motor_speed);
   }
}

void motorStart(char motor_num, byte direction)
{
 
   char pin_ctl1;
   char pin_ctl2;
   
   if (motor_num == 1)
   {
      pin_ctl1 = MOTOR1_CTL1;
      pin_ctl2 = MOTOR1_CTL2;
   }  
   else
   {
      pin_ctl1 = MOTOR2_CTL1;
      pin_ctl2 = MOTOR2_CTL2;    
   }
 
   switch (direction)
   {
     case MOTOR_ADELANTE:
     {
       digitalWrite(pin_ctl1,LOW);
       digitalWrite(pin_ctl2,HIGH);          
     }
     break;
         
     case MOTOR_ATRAS:
     {
        digitalWrite(pin_ctl1,HIGH);
        digitalWrite(pin_ctl2,LOW);          
     }
     break;        
   }
}

void motorStop(char motor_num)
{
   setSpeed(motor_num, 0);
   if (motor_num == 1)
   {
     digitalWrite(MOTOR1_CTL1,HIGH);
     digitalWrite(MOTOR1_CTL2,HIGH);    
   }
   else
   {
     digitalWrite(MOTOR2_CTL1,HIGH);
     digitalWrite(MOTOR2_CTL2,HIGH);    
   }
}










Resumen del proyecto.

Para finalizar he metido dentro dle codigo el uso de un buzzer que metiendole las frecuenzias adecuadas nos canta la cancion de la cucaracha cada vez que pulsamos un boton en nuetro dispositivo android,
tambien he conseguido que el medidor de temperatura cuando pulso una tecla en el dispositivo android nos manda los grados que hacen en donde este el vehiculo.
Las demas lineas de codigo siguen siendo las mismas que anteriormente expuestas, que hacen las funciones de detectar obstaculos a una distancia de 30 cm, diferenciando los sentidos de marcha y los distintos sensores.
Por otro lado tenemos el programa de procesing el cual no muestra la temperatura y humedad de la zona del vehiculo y nos la va mostrando graficamente en nuestro pc.
Tenia la intencion de montar el wireless nrf24l01, para la comunicacion de procesing con el pc y que no fuese por bluetooth. peor por cuestiones de tiempo no me ha dado tiempo.
Espero que os guste.









No hay comentarios:

Publicar un comentario