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 }