Introduction: CarBee (Carro Sensor De Distancia, Temperatura Y Humedad)

A continuación veremos la creación de un "carro tanque" que mide distancias, temperatura y humedad, controlado vía bluetooh a través de una App.

Step 1: Lo Que Necesitamos:

- 1 Arduino Uno.
- 1 Protoboard.
- 2 Moto-reductores.
- 1 Servomotor.
- 1 Sensor de Ultrasonido.
- 1 Módulo Bluetooth.
- 1 Puente H L293D
- 1 Sensor de Humedad y Temperatura dht11
- Un Led.
- Una batería 9V
- Un pin de batería 9V.
- Un Switch.
- Muchos Jumpers (Macho - Hembra y Macho - Macho).
- App del carro instalado en un smartphone android.
- Instalar la librería del sensor de humedad que la pueden encontrar en este link:https://docs.google.com/file/d/0B0hsUkhqWH97NnM5QW...

Step 2: Conectando El Ultrasonido:

Lo primero que se necesita, es hacer funcionar el sensor ultrasónico, para esto, se debe conectar al Arduino y agregarle un Led para que se encienda cada que marque cierta distancia, y de ese modo, verificar que tenga correcto funcionamiento. Después, se conectará un servomotor que será controlado por un potenciómetro para verificar que funcione (luego no será necesario usarlo, pues se remplazará con una acción que se activa desde la App). El servomotor será usado para hacer girar el sensor de ultrasonido.

Para ello usaremos el siguiente código y se verificara por el puerto serial:

#include <Servo.h> 
Servo myservo;
int potenciometro;
#define Pecho 12
#define Ptrig 11
long duracion, distancia;

void setup()
{
myservo.attach(8); //Define pin del servo
  Serial.begin (9600);  // inicializa el puerto seria a 9600 baudios
  pinMode(Pecho, INPUT);     // define el pin 12 como entrada (echo)
  pinMode(Ptrig, OUTPUT);    // define el pin 11 como salida  (triger)
  pinMode(13, 1);            // Define el pin 13 como salida
}<br>

void loop() //Mover Servo con potenciometro 10k (para mover la sensor ultrasonido)
{
potenciometro = analogRead(0);
potenciometro = map(potenciometro, 0, 1023, 0, 179);
myservo.write(potenciometro);
delay(10);

digitalWrite(Ptrig, LOW);
  delayMicroseconds(2);
  digitalWrite(Ptrig, HIGH);   // genera el pulso de triger por 10ms
  delayMicroseconds(10);
  digitalWrite(Ptrig, LOW);
  
  duracion = pulseIn(Pecho, HIGH);
  distancia = (duracion/2) / 29;            // calcula la distancia en centimetros
  
  if (distancia >= 500 || distancia <= 0) // si la distancia es mayor a 500cm o menor a 0cm 
  {  
    Serial.println("---");                  // no mide nada
  }
  else 
  {
    Serial.print(distancia);           // envia el valor de la distancia por el puerto serial
    Serial.println("cm");              // le coloca a la distancia los centimetros "cm"
    digitalWrite(13, 0);               // en bajo el pin 13
  }
  
   if (distancia <= 10 && distancia >= 1)
   {
    digitalWrite(13, 1);                     // en alto el pin 13 si la distancia es menor a 10 cm
    Serial.println("Alarma.......");         // envía la palabra Alarma por el puerto serial
  }
  delay(400);       
}

Step 3: Configurando El Bluetooth (1)

Módulo HC – 06:

Solo basta con conectar el RXD (recepción) y el TXD (transmisión) del módulo, de forma cruzada con el TX y RX del Arduino (TDX → RX, RXD →TX). Para energizarlo, se conecta el VCC a 5V y el GND a GND. Y listo, solo falta sincronizarlo a cualquier dispositivo que cuente con Bluetooth y queda funcionando como puente de datos.

Nota: Si pide contraseña, se debe ingresar 1234 o 0000. En caso de querer configurar el Setup del módulo, se recomienda ingresar al siguiente link (allí encontrarás tutorial con el código y más ejemplos): https://www.youtube.com/watch?v=fokIoKBNCOE

Módulo HC – 05:

Para configurar este, básicamente para que quede funcionando como el HC – 06 (esclavo), se debe seguir unos pasos previos que constan de comandos AT, estos, permitirán que se pueda cambiar la configuración de fábrica, para así, lograr una correcta comunicación entre el Bluetooth, Arduino y dispositivo.

Nota: los dos pines de mas este módulo, no serán usados en modo esclavo (EN/KEY y STATE).

El primer código para configurarlo debe quedar así (en este código, los seriales del software de Arduino y los del módulo, no quedan iguales, pero de ese modo, se puede administrar los códigos AT):
(En este link encontrarás algunos de la gran variedad de códigos AT que puedes utilizar, además de más posibilidades de configuración: http://www.naylampmechatronics.com/blog/24_Configu...)

#include <SoftWareserial.h>

softwareserial.h<br>SoftwareSerial BT1(10, 11); // RX | TX
void setup()
   { 
     Serial.begin(9600);
     BT1.begin(38400); 
     while (!Serial){
      ;
     }<br>Serial.println("Configuracion");
     }

void loop()
   {  if (BT1.available())
            Serial.write(BT1.read());
      if (Serial.available())
            BT1.write(Serial.read());
   }

Después de haber configurado el módulo Bluetooth, podemos proceder a manejarlo como un HC – 06, para ello cambiaremos las entradas y pines como en el HC – 06, agregaremos un Led en el pin 13 para probarlo y le ingresaremos este código (en este, el serial si debe ser igual):

#include <Softwareserial.h>// import the serial library

SoftwareSerial Genotronex(0, 1); // RX, TX
int ledpin=13; // led en pin 13 mostrará on / off
int BluetoothData; // the data given from Computer

void setup() {
// put your setup code here, to run once:
Genotronex.begin(9600);
Genotronex.println("Bluetooth On please press 1 or 0 blink LED ..");
pinMode(ledpin,OUTPUT);
}

void loop() {

if (Genotronex.available()){
BluetoothData=Genotronex.read();
if(BluetoothData=='1'){ // si el numero 1 es presionado ....
digitalWrite(ledpin,1);
Genotronex.println("LED en pin 13 ON ! ");
}
if (BluetoothData=='0'){// si numero 0 es presionado ....
digitalWrite(ledpin,0);
Genotronex.println("LED en pin 13 Off ! ");
}
}
delay(100);// se prepara para el siguiente dato ...
}

Nota: antes de cargar cualquier programa para ser controlado vía Bluetooth, se debe cargar primero el programa y luego conectar el modulo a TX y RX.

Step 4: Bluetooth Y Servomotor

Para agregar el servo, se le hace modificaciones al código para que según se lean datos desde un dispositivo el modulo lo transmita al Arduino y el Servo reaccione a este.

#include <SoftwareSerial.h> // importa la libreria del serial
#include <Servo.h> //importa libreria de servo

SoftwareSerial Genotronex(10, 11); // RX, TX
Servo myservo1;  // se le asigna nombre al servo
char BluetoothData; // los datos recibidos del pc
String readString; //Asignamos la palabra readString a una variable tipo cadena

void setup() {
  Genotronex.begin(9600);
  Genotronex.println("Bluetooth On please press 1 or 0 blink LED ..");
  myservo1.attach(5);  //pin del servo
}

void loop() {
   if (Genotronex.available()){
   BluetoothData=Genotronex.read();
 
   BluetoothData = Serial.read();
    
    if(BluetoothData=='A'){ //si A accione el motor1
      motor1();
    }
    }

void motor1(){
        delay(5);   
        while (Serial.available()) { //ahora los numeros de datos del del servo son recibidos
          //delayMicroseconds(100);                  
          char c = Serial.read();  // Se leen los caracteres que ingresan por el puerto
          readString += c;         //cada caracter crea un string
        }
        if (readString.length() >0) {   //la longitud del dato es verificada
          Serial.println(readString.toInt());  //ahora envia los datos al serial
          myservo1.write(readString.toInt());
          readString=""; // limpia el string
        }
}

Nota: para controlarlo es necesario la App.

Step 5: Agregando Los Motoreductores

Una de las partes más importantes, debido a que es la base de todo el proyecto, es el puente H que configuraremos para hacer funcionar los dos Motoreductores del carro.

Hay varias formas de hacer un puente
H, pero aquí, por comodidad y estética, utilizaremos el integrado L293D.

Lo que hará ese puente H será sencillamente, poner en High o en Low los polos del motor, según como lo programemos, ya sea todos hacia adelante, atrás o uno hacia adelante y otro atrás (lo que permitirá giro).

int izqA = 5; 
int izqB = 6; 
int derA = 9; 
int derB = 10; 
int vel = 255;            // Velocidad de los motores (0-255)
int estado = 'g';         // inicia detenido
int pecho = 2;            // define el pin 2 como (pecho) para el Ultrasonido
int ptrig = 3;            // define el pin 3 como (ptrig) para el Ultrasonido
int duracion, distancia;  // para Calcular distancia

void setup()  { 
  Serial.begin(9600);    // inicia el puerto serial para comunicación con el Bluetooth
  pinMode(derA, OUTPUT);
  pinMode(derB, OUTPUT);
  pinMode(izqA, OUTPUT);
  pinMode(izqB, OUTPUT);
  
  pinMode(pecho, INPUT);   // define el pin 2 como entrada (pecho) 
  pinMode(ptrig,OUTPUT);   // define el pin 3 como salida  (ptrig) 
  pinMode(13,OUTPUT);
}

void loop()  {

if(Serial.available()>0){        // lee el bluetooth y almacena en estado
    estado = Serial.read();
  }
  if(estado=='a'){           // Botón desplazar al Frente
    analogWrite(derB, 0);     
    analogWrite(izqB, 0); 
    analogWrite(derA, vel);  
    analogWrite(izqA, vel);       
  }
  if(estado=='b'){          // Botón IZQ 
    analogWrite(derB, 0);     
    analogWrite(izqB, 0); 
    analogWrite(derA, 0);  
    analogWrite(izqA, vel);      
  }
  if(estado=='c'){         // Botón Parar
    analogWrite(derB, 0);     
    analogWrite(izqB, 0); 
    analogWrite(derA, 0);    
    analogWrite(izqA, 0); 
  }
  if(estado=='d'){          // Botón DER
    analogWrite(derB, 0);     
    analogWrite(izqB, 0);
    analogWrite(izqA, 0);
    analogWrite(derA, vel);  
  }

if(estado=='e'){          // Botón Reversa
    analogWrite(derA, 0);    
    analogWrite(izqA, 0);
    analogWrite(derB, vel);  
    analogWrite(izqB, vel);      
  }
  
  if (estado =='f'){          // Botón ON,  se mueve censado distancia 
  
     digitalWrite(ptrig, HIGH);   // genera el pulso de trigger por 10us
     delay(0.01);
     digitalWrite(ptrig, LOW);
     
     duracion = pulseIn(pecho, HIGH);              // Lee el tiempo del Echo
     distancia = (duracion/2) / 29;            // calcula la distancia en centímetros
     delay(10); 
     
     if (distancia <= 15 && distancia >=2){    // si la distancia es menor de 15 cm
        digitalWrite(13,HIGH);                 // Enciende LED
        
        analogWrite(derB, 0);                  // Parar los motores por 200 mili segundos
        analogWrite(izqB, 0); 
        analogWrite(derA, 0);    
        analogWrite(izqA, 0); 
        delay (200);
        
        analogWrite(derB, vel);               // Reversa durante 500 mili segundos
        analogWrite(izqB, vel); 
        delay(500);           
        
        analogWrite(derB, 0);                // Girar durante 1100 milisegundos   
        analogWrite(izqB, 0); 
        analogWrite(derA, 0);  
        analogWrite(izqA, vel);  
        delay(1100);
        
        digitalWrite(13,LOW);
     }
     else{                   // Si no hay obstáculos se desplaza al frente  
         analogWrite(derB, 0);     
         analogWrite(izqB, 0); 
         analogWrite(derA, vel);  
         analogWrite(izqA, vel); 
     }
  }
  if(estado=='g'){          // Botón OFF, detiene los motores no hace nada 
     analogWrite(derB, 0);     
     analogWrite(izqB, 0); 
     analogWrite(derA, 0);    
     analogWrite(izqA, 0);
  }
}

Step 6: Uniendo Todo.

Ahora, se dará pasa a unir todo, en este además de eso introduciremos el sensor de humedad.
Lo que se hará finalmente es unir en un mismo código todo lo trabajado para enviar las múltiples señales por serial del bluetooth sin generar error. Para ver o modificar la aplicación, se debe ingresar a http://ai2.appinventor.mit.edu/ y cargar el proyecto .aia

Al finalizar, se ensambla todo en un carro y se pulen detalles de su preferencia.

#include <Servo.h>
#include <SoftwareSerial.h>
#include "DHT.h"

#define DHTPIN 7  // se asigna pin al sensor de humedad
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
Servo myservo1;  // create servo object to control a servo
char unChar;
String readString; //Asignamos la palabra readString a una variable tipo cadena

int izqA = 5; 
int izqB = 6; 
int derA = 9; 
int derB = 10; 
int vel = 255;            // Velocidad de los motores (0-255)
int estado = 'g';         // inicia detenido
int pecho = 2;            // define el pin 2 como (pecho) para el Ultrasonido
int ptrig = 3;            // define el pin 3 como (ptrig) para el Ultrasonido
int duracion, distancia;  // para Calcular distacia

void setup()  { 
  
 Serial.begin(9600);    // inicia el puerto serial para comunicacion con el Bluetooth

 dht.begin(); //para el sensor temperatura
  
  myservo1.attach(11);  // Define el pin 11
  
  pinMode(derA, OUTPUT);
  pinMode(derB, OUTPUT);
  pinMode(izqA, OUTPUT);
  pinMode(izqB, OUTPUT);
  
  pinMode(pecho, INPUT);   // define el pin 2 como entrada (pecho) 
  pinMode(ptrig,OUTPUT);   // define el pin 3 como salida  (ptrig) 
  pinMode(13,OUTPUT);
}

void loop() {

    int h = dht.readHumidity();// Lee la humedad
    int t= dht.readTemperature();//Lee la temperatura

if(Serial.available()){        // lee el bluetooth y almacena en estado
    estado = Serial.read();
    unChar = Serial.read();
    if(unChar=='s'){ //Si lee "s" se envía una función al servomotor
    motor1();
      }
  }
  if (estado=='a'){        // Va hacia adelante 
    analogWrite(derB, 0);     
    analogWrite(izqB, 0); 
    analogWrite(derA, vel);  
    analogWrite(izqA, vel); 
     }
  
  if(estado=='b'){          // Boton IZQ 
    analogWrite(derB, 0);     
    analogWrite(izqB, 0);
    analogWrite(izqA, 0);
    analogWrite(derA, vel);
  }
  if(estado=='c'){         // Boton Parar
    analogWrite(derB, 0);     
    analogWrite(izqB, 0); 
    analogWrite(derA, 0);    
    analogWrite(izqA, 0); 
  }
  if(estado=='d'){          // Boton DER
    analogWrite(derB, 0);     
    analogWrite(izqB, 0); 
    analogWrite(derA, 0);  
    analogWrite(izqA, vel); 
  }

if(estado=='e'){          // Boton Reversa
    analogWrite(derA, 0);    
    analogWrite(izqA, 0);
    analogWrite(derB, vel);  
    analogWrite(izqB, vel);      
  }
  
     digitalWrite(ptrig, HIGH);   // genera el pulso de trigger por 10us
     delay(0.01);
     digitalWrite(ptrig, LOW);
     
     duracion = pulseIn(pecho, HIGH);              // Lee el tiempo del Echo
     distancia = (duracion/2) / 29;            // calcula la distancia en centimetros
     delay(10); 
     
     if (distancia <= 15 && distancia >=2){    // si la distancia es menor de 15cm
        digitalWrite(13,HIGH);                 // Enciende LED
        
        analogWrite(derB, 0);                  // Parar los motores por 200 mili segundos
        analogWrite(izqB, 0); 
        analogWrite(derA, 0);    
        analogWrite(izqA, 0); 
        delay (200);
        
        analogWrite(derB, vel);               // Reversa durante 500 mili segundos
        analogWrite(izqB, vel); 
        delay(500);           
        
        analogWrite(derB, 0);                // Girar durante 1100 milisegundos   
        analogWrite(izqB, 0); 
        analogWrite(derA, 0);  
        analogWrite(izqA, vel);  
        delay(1100);

	analogWrite(derB, 0);            // Parar los motores por 200 mili segundos
        analogWrite(izqB, 0); 
        analogWrite(derA, 0);    
        analogWrite(izqA, 0); 
        delay (200);
        
        digitalWrite(13,LOW);
     }
     
  if(estado=='g'){          // Boton OFF, detiene los motores no hace nada 
     analogWrite(derB, 0);     
     analogWrite(izqB, 0); 
     analogWrite(derA, 0);    
     analogWrite(izqA, 0);
     }
     
  if (estado=='o'){ //imprime el valor del sensor ultrasonico

  Serial.println (distancia);
  delay(5000);
  }

  if (estado=='h'){ //imprime el valor del sensor humedad
  Serial.println (h);
  delay(1000);
  }

  if (estado=='t'){ //imprime el valor del sensor temperatura
  Serial.println (t);
  delay(1000);
  }
  
}

void motor1(){
        
  while (Serial.available()) { //El dato numérico del datos enviados por el servomotor es recibido
          //delayMicroseconds(100);                  
          char c = Serial.read();  // Se leen los caracteres que ingresan por el puerto
          readString += c;         // Cada uno de caracteres se convierte en un string
        }
    if (readString.length() >0) {   //la longitud del dato es verificado
          Serial.println(readString.toInt());  //Aquí uno envía los datos al serial y servo
          myservo1.write(readString.toInt());
          readString=""; // Limpia datos almacenados
        }
        delay(1);  //Se define el delay
}