PROCEDIMIENTO DE LA APLICACIÓN DE CONTROL REMOTO
El carro se controla a través de una aplicación de teléfono móvil mediante Bluetooth. Esta
aplicación, se desarrolló en el “MIT App Inventor” que es una página web que posibilita la
creación de aplicaciones con comandos muy sencillos. Los pasos para desarrollar la aplicación,
fueron los siguientes:
Se creó los botones con las formas (flechas) de “PowerPoint”, los cuales, se guardaron
independientemente como imágenes.
Luego, estas fueron exportadas a la página de “MIT App Inventor”.
Después, en la página, se creó un proyecto nuevo y se usó el comando “Horizontal
Arrangement” dentro de la opción “Layout” para agregar espacios entre cada una de
las filas. Esto se hizo con distancias medidas en pixeles.
Posteriormente, se usó el comando “Button” dentro de la opción “User Interface”
para insertar los botones con las respectivas imágenes guardadas de “PowerPoint”.
Luego, se utilizó el comando “Bluetooth Client” dentro de la opción “Connectivity”
para que posteriormente, quede todos los botones vinculados a este.
Después, se usó el comando “List Piker” dentro de la opción “User Interface” creando
así, un botón que permita seleccionar al módulo Bluetooth.
Finalmente, se creó los códigos en la ventana “Blocks” vinculando todo al Bluetooth,
se guardó el proyecto con la extensión “. app” y se instaló el proyecto en el teléfono
móvil.
Los botones y el caracter que representan dentro de la codificación, se muestra a
continuación:
Flecha Arriba = Caracter 'a'
Flecha Izquierda = Caracter 'b'
Botón Octágono = Caracter 'c'
Flecha Derecha = Caracter 'd'
Flecha Abajo = Caracter 'e'
Botón ON = Caracter 'f'
Botón OFF = Caracter 'g'
Botón Bluetooth = Es para seleccionar el Modulo Bluetooth a que se va a conectar (El
módulo Bluetooth debe estar previamente sincronizado con el teléfono móvil).
CODIFICACIÓN DE LA APLICACIÓN DE CONTROL REMOTO
La codificación realizada en la página web “MIT App Inventor”, se hace seleccionando
comandos ya preestablecidos y escritos, estos solo se conectan arrastrándolos con el ratón, de
izquierda a derecha, de acuerdo a su ejecución en el programa.
En esencia, la codificación, es hacer un llamado al comando “List Piker” que es un componente
de interfaz de usuario que facilita la visualización de una lista de elementos y que el usuario
haga una selección de esta. En este caso, el elemento seleccionado es el módulo Bluetooth
bajo el nombre de comando “Bluetooth Client” y a este, van a ir conectados todos los códigos
de los botones a través del comando “Button”.
Ahora, de forma específica, la codificación principal se divide en dos grandes partes: el código
para antes de la selección de algún botón y el código para después de la selección de alguno de
estos.
PARA ANTES DE LA SELECCIÓN
Se busca el comando condicional “When – do, Before Picking” y se selecciona “List
Piker 1” para hacer el llamado de la lista.
Ahora continúa la selección del conjunto de instrucciones, para lo cual, se busca el
comando “Set – to”, se selecciona “List Piker1, Elements” y se asocia al comando
condicional ya descrito.
Para finalizar, se asocia al comando “Set – to”, el comando “Bluetooth Client 1,
Addresses and Names”. Este último, permite que posteriormente, cuando se haga la
codificación de cada botón, todos estos códigos queden inmersos dentro de la
conectividad Bluetooth y ninguno se quede fuera.
PARA DESPUÉS DE LA SELECCIÓN
Se busca el comando condicional “When – do, After Picking” y se selecciona “List
Piker 1” para hacer el llamado de la lista.
Ahora continúa la selección del conjunto de instrucciones, para lo cual, se busca el
comando “Set – to”, se selecciona “List Piker 1, Selection” y se asocia al comando
condicional ya descrito.
Después, se asocia al comando anterior, el comando “Call – Connect Address” y se
selecciona “Bluetooth Client 1” para hacer un llamado al módulo Bluetooth.
Luego, se asocia a este último, el comando “List Piker 1, Selection”, para que quede
codificado la dirección del Bluetooth dentro de la lista.
A continuación, se hace la codificación de los botones a través del comando
condicional “When – do, Click” y se selecciona “Button 1”, “Button 2”, …, “Button 6” o
“Button 7”. Dependiendo del botón al que se quiera programar basado en la
terminología usada al momento de crear la parte visible de los botones.
Para finalizar, se conecta al comando anterior, el comando “Call – Send Text” y se va a
seleccionar “Bluetooth Client 1”. A este último, se conecta el comando “Text” en el
que va a ir escrito “ ‘a’ ”, “ ‘b’ ”, …, “ ‘f’ ”, “ ‘g’ ”, todo en forma de carateres entre
comillas simples. Esto se hace para que cada botón represente una letra dentro del
código y esta sea enviada posteriormente a la programación del Arduino.
Figura. Creación de los Íconos para los Botones de la Aplicación.
Figura. Elaboración de la Aplicación en MIT App Inventor.
Figura. Creación del Código de la Aplicación.
Figura. Código Completo de la Aplicación.
CODIFICACIÓN DEL ARDUINO
Para la codificación del Arduino, se va a utilizar los carateres con los que se definió cada uno de
los botones en la codificación de la aplicación. Estos van a servir para que, con los comandos
aquí programados, el carro pueda ejecutar los movimientos descritos por los botones de
dirección y los movimientos totalmente autónomos gracias al sensor de distancia. Los pasos
que se usó para a codificación son los siguientes:
Primero se definió las variables en función a la posición del motor y su dirección de
giro, es decir, para el motor izquierdo, se denominó “izqA” e “izqB” y para el motor
derecho, “derA” y “derB”. Los valores de cada una de estas variables son los pines
PWM (Modulación por ancho de pulso) del Arduino que se van a utilizar para la
conexión con el puente H
Después, se definió la variable “vel” que representa la velocidad de los motores. Esta
igual a 255 (se puede escoger un valor entre 0 a 255), debido a que se está trabajando
con los pines PWM. Asimismo, se definió la variable “estado” que representa al estado
inicial del carro, es decir, apagado.
Luego, se definió las variables “pecho” y “ptrig” que representan al pin echo y al pin
trigger del sensor de distancia, estos van a tener los valores 2 y 3 respectivamente en
los pines del Arduino. De igual manera, se definieron las variables “duración” y
“distancia” que representan, valga la redundancia, la duración y la distancia a la que
va a funcionar el sensor de distancia.
Posteriormente, se usó la función “void setup ()” para realizar instrucciones que solo y
únicamente se ejecutarán al inicio del programa. Aquí, se definió el puerto serial
“[Link] ()” inicializándose en 9600 baudios para la conexión Bluetooth y
también, la salida (OUTPUT) mediante el código “pinmode ()” de cada una de las
variables representadas por los pines del Arduino, a excepción de la varible “pecho”,
que se define como entrada (INPUT).
Después, se dio inicio al programa con la función principal “void loop ()”. En él, están
inmersos todos los comandos e instrucciones del proyecto que se irán repitiendo a lo
largo de todo su funcionamiento. Ya declarada la función principal, se inicializa el
programa con el comando condicional “if” para el puerto serial ([Link] ()>0) y
la instrucción va a recaer sobre la variable “estado”. Esto significa que, si hay un
carácter nuevo en el puerto serial y esta cumple la condición, entonces esta se
almacena en la variable “estado”.
Luego y partir de la definición de la condicional anterior, se viene una serie de
condicionales inmersas dentro de esta. Las condicionales subsiguientes van a
depender del caracter que se almacene dentro de la variable “estado” y de acuerdo a
esta, van a activarse o desactivarse mediante señales digitales (0 o 1) las variables
referidas a los motores (“izqA”, “izqB”, “derA”, “derB”), la velocidad (“vel”) y en un
caso muy particular que se usará cuando el carro funcione con el sensor, a las variables
“pecho”, “ptrig” “duración” y “distancia”. Todas estas, se activan o desactivan con el
comando “analogWrite ()”.
Posteriormente, se programó las condiciones para cuando el carro utilice el sensor y su
correcto funcionamiento con los comandos “digitalWrite ()”, “delay ()” y “pulseIn”. El
primero, permite enviar un pulso mandándolo a colocar en alto (HIGH) y luego
apagarlo (LOW). El segundo, permite programar el tiempo de disparo medido en
milisegundos. El tercero permite leer cuanto tiempo dura un alto que, para este caso,
este resultado será igualado a la variable “duración”. Este último, permite calcular la
“distancia” que será igual a la mitad de la variable “duración” (porque la señal se
emite y se recepciona) dividida entre 29 (representa la velocidad del sonido medida en
cm/µs, 1cm por cada 29µs). Todo esto dentro de la condicional para el botón “ON”.
Finalmente, se establece la condicional para la variable “distancia”, la cual debe ser
mayor o igual a 2cm (el sensor tiene un rango de funcionamiento 2cm a 5m) y menor,
para este caso, a 15cm. Un led conectado al Arduino, indicará cuando el sensor
detecte una distancia dentro del rango de la condicional y se apagará cuando deje de
estar en ese rango. Cuando el carro no esté en ese rango, simplemente irá hacia
adelante; pero si, por el contrario, el carro está en el rango; el carro frenará,
retrocederá e irá a la izquierda respectivamente. Esto se logra con los códigos para las
variables referidas a los motores (“izqA”, “izqB”, “derA”, “derB”), la velocidad (“vel”)
y el tiempo de ejecución (“delay ()”) de cada uno.
Tabla. Equivalencia de las Señales Digitales en el funcionamiento de los Motores.
EJECUCIONES derB izqB derA izqA
PARAR 0 0 0 0
AL FRENTE 0 0 1 1
GIRAR 0 0 0 1
IZQUIERDA
GIRAR DERECHA 0 0 1 0
REVERSA 1 1 0 0
CÓDIGO COMPLETO DEL ARDUINO
ARDUINO L293D (Puente H)
5 10
6 15
9 7
10 2
5V 1, 9, 16
GND 4, 5, 12, 13
El motor 1 se conecta a los pines 3 y 6 del Puente H
El motor 2 se conecta a los pines 11 y 14 del Puente H
La fuente de alimentacion de los Motores se conecta a tierra y
el positivo al pin 8 del puennte H.
Conexion del Modulo Bluetooth HC-06 y el Arduino
ARDUINO Bluetooth HC-06
0 (RX) TX
1 (TX) RX
5V VCC
GND GND
!!Cuidado!! Las conexiones de TX y RX al modulo Bluetooth deben estar desconectadas
en el momento que se realiza la carga del codigo (Sketch) al Arduino.
Conexion Sensor Ultrasonido HC-SR04
ARDUINO Ultrasonido HC-SR04
2 Echo
3 Trig
5V VCC
GND Gnd
Conexion Servo SG90
ARDUINO Ultrasonido HC-SR04
11 Signal
5V VCC
GND Gnd
*/
#include <Servo.h> // Incluye la libreria Servo
Servo servo1; // Crea el objeto servo1 con las caracteristicas de Servo
int izqA = 5;
int izqB = 6;
int derA = 9;
int derB = 10;
int vel = 255; // Velocidad de los motores (0-255)
int estado = 'c'; // 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() {
[Link](9600); // inicia el puerto serial para comunicacion 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);
[Link](11,660,1400); // Asocia el servo1 al pin 11, define el min y max del ancho del
pulso
// eso depende del fabricante del servo
void loop() {
if([Link]()>0){ // lee el bluetooth y almacena en estado
estado = [Link]();
if(estado=='a'){ // Boton desplazar al Frente
analogWrite(derB, 0);
analogWrite(izqB, 0);
analogWrite(derA, vel);
analogWrite(izqA, vel);
}
if(estado=='b'){ // Boton IZQ
analogWrite(derB, 0);
analogWrite(izqB, 0);
analogWrite(derA, 0);
analogWrite(izqA, 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(izqA, 0);
analogWrite(derA, vel);
if(estado=='e'){ // Boton Reversa
analogWrite(derA, 0);
analogWrite(izqA, 0);
analogWrite(derB, vel);
analogWrite(izqB, vel);
if (estado =='f'){ // Boton ON, se mueve sensando 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 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 600 milisegundos
analogWrite(izqB, 0);
analogWrite(derA, 0);
analogWrite(izqA, vel);
delay(600);
digitalWrite(13,LOW);
else{ // Si no hay obstaculos se desplaza al frente
analogWrite(derB, 0);
analogWrite(izqB, 0);
analogWrite(derA, vel);
analogWrite(izqA, vel);
}
if(estado=='g'){ // Boton SER, activa el Servomotor
[Link](30); // Gira el servo a 30 grados
delay(1000); // Espera 1000 mili segundos a que el servo llegue a la posicion
[Link](90); // Gira el servo a 90 grados
delay(700); // Espera 700 mili segundos a que el servo llegue a la posicion
[Link](150); //Gira el servo a 150 grados
delay(700);
if(estado=='h'){ //Programacion de los botones 13-10-9-6-5
digitalWrite(13,1);
if(estado=='m'){
digitalWrite(13,0);
if(estado=='i'){
digitalWrite(derB,1);
if(estado=='n'){
digitalWrite(derB,0);
if(estado=='j'){
digitalWrite(derA,1);
if(estado=='o'){
digitalWrite(derA,0);
}
if(estado=='k'){
digitalWrite(izqB,1);
if(estado=='p'){
digitalWrite(izqB,0);
if(estado=='l'){
digitalWrite(izqA,1);
if(estado=='q'){
digitalWrite(izqA,0);