Archivos para septiembre, 2016

En publicaciones anteriores hemos visto diferentes mecanismos de control para nuestro robot, tanto manuales (Construyendo Nuestro Propio Robot Desde Cero – Parte 3) como autónomos (Arduino Robot Seguidor de Líneas y Laberintos). Ahora veremos una alternativa más, también inalámbrica, mucho más eficiente que los rayos infrarrojos (IR) y muy popular entre los teléfonos móviles (sí, controlaremos nuestro robot a través de nuestro teléfono móvil/tablet). De entre todos los módulos de control inalámbricos existentes para Arduino, el Bluetooth es, en mi humilde opinión, el más interesante. Es un módulo de muy bajo costo, muy sencillo de conectar (solo posee dos pines omitiendo VCC y GND), funciona como un puerto serie estándar, es compatible con cualquier dispositivo existente el mercado actual, como laptops, tablets y teléfonos móviles, lo que le otorga una ventaja más a las mencionadas anteriormente: versatilidad.

Básicamente existen 3 tipos de módulos Bluetooth en el mercado actual:

  • HC-05: Maestro/Esclavo. Puede conectarse a otros módulos (Modo Maestro) o aceptar conexiones de otros módulos comportándose como puente inalámbrico serie (Modo Esclavo).
  • HC-06: Esclavo. Sólo puede aceptar conexiones de otros módulos, comportándose como puente inalámbrico serie (Modo Esclavo).
  • HC-07: Esclavo (de muy bajo costo, menor a HC-06 y escasa documentación. Set de comandos AT limitado).

Para controlar nuestro robot utilizaremos el último módulo de la lista, HC-07, ya que sólo necesitamos establecer una conexión desde nuestro teléfono móvil/tablet hacia nuestro robot para enviar los comandos necesarios.

Lista de Componentes
1 Plataforma Turtle2WD con placa Arduino UNO R3 y Shield de Control de Motores ensamblados anteriormente.
1 Módulo Bluetooth HC-07.
Teléfono móvil o Tablet con Sistema Operativo Android 2.3.3 o superior.
Aplicación “Arduino Bluetooth Controller” (disponible en Google Play Store).

La aplicación “Arduino Bluetooth Controller” nos ofrece diferentes modos para controlar nuestro robot, incluyendo una terminal para enviar y/o recibir datos mediante el enlace bluetooth. Para nuestro caso particular, utilizaremos los modos “Vehicle Mode” y “Controller Mode“. El primero nos permite controlar nuestro robot utilizando el giroscopio y acelerómetro de nuestro teléfono móvil/tablet y el segundo nos permite controlar nuestro robot mediante un joystick táctil.

En primer lugar, debemos descargar e instalar en nuestro teléfono móvil/tablet la aplicación mencionada anteriormente disponible en Google Play Store.
Habiendo finalizado exitosamente el paso anterior, compilaremos y cargaremos en nuestro Arduino Uno R3 el sketch correspondiente, cuyo código fuente se encuentra a continuación:

/*
Caracteristicas:
- Aplicacion "Arduino Bluetooth Controller" (FREE - Play Store)
- Manejo por enlace bluetooth mediante las teclas:
W: Adelante
S: Atras
A: Izquierda
D: Derecha
L: Inicio/Parada Modo Vehiculo
V: Inicio/Parada Modo Joystick

Q: Incrementar Velocidad
T: Disminuir Velocidad
x: Encendido/Apagado Luz Frontal

- Detencion automatica en caso de detectar bordes.
*/

#define     PWM_RIGHT   3     // (Control Velocidad Motor Derecho) Timer2 8 bits D3
#define     PWM_LEFT    11    // (Control Velocidad Motor Izquierdo) Timer2 8 bits D11
#define     DIR_A       12    // (Control de Direccion de Motores) D12
#define     DIR_B       13    // (Control de Direccion de Motores) D13
#define		MAX_SPEED	200   // Velocidad Maxima
#define		MIN_SPEED	100   // Velocidad Minima
// -----

// Iluminacion
#define     LED_LIGHT   7
// -----

// Sensores Reflectivos Detectores de Bordes
#define		BORDER_L	A2    // Sensor Izquierdo Externo
#define		BORDER_R	A5    // Sensor Derecho Externo

// Serial commands
#define     DIR_FORWARD		'W'
#define     DIR_BACKWARD	'S'
#define     DIR_LEFT		'A'
#define     DIR_RIGHT		'D'
#define     START_STOP_V	'L'
#define		START_STOP_J	'V'
#define		INC_SPEED		'Q'
#define		DEC_SPEED		'T'
#define		FRONT_LIGHT		'X'
// -----

boolean stopped;

byte speed;

char data;

void forward() {
	digitalWrite(DIR_A, LOW);
	digitalWrite(DIR_B, LOW);
}

void backward() {
	digitalWrite(DIR_A, HIGH);
	digitalWrite(DIR_B, HIGH);
}

void rotateleft() {
	digitalWrite(DIR_A, LOW);
	digitalWrite(DIR_B, HIGH);
}

void rotateright() {
	digitalWrite(DIR_A, HIGH);
	digitalWrite(DIR_B, LOW);
}

void stop() {
	analogWrite(PWM_LEFT, 0);
	analogWrite(PWM_RIGHT, 0);
}

void setspeed(boolean sp) {
	if (sp) {
		if (speed < MAX_SPEED) {
			speed += 50;
			analogWrite(PWM_LEFT, speed);
			analogWrite(PWM_RIGHT, speed);
		}
	}
	else
	{
		if (speed > MIN_SPEED) {
			speed -= 50;
			analogWrite(PWM_LEFT, speed);
			analogWrite(PWM_RIGHT, speed);
		}
	}
}

void setlight() {
	digitalWrite(LED_LIGHT, !(digitalRead(LED_LIGHT)));
}

boolean isborder() {
	if (!((digitalRead(BORDER_L) == LOW) && (digitalRead(BORDER_R) == LOW)))
		return true;
	else
		return false;
}

void setup() {
	pinMode(PWM_LEFT, OUTPUT);
	pinMode(PWM_RIGHT, OUTPUT);
	pinMode(DIR_A, OUTPUT);
	pinMode(DIR_B, OUTPUT);
	pinMode(LED_LIGHT, OUTPUT);

	pinMode(BORDER_L, INPUT);
	pinMode(BORDER_R, INPUT);

	digitalWrite(LED_LIGHT, LOW);

	stopped = true;

	speed = MIN_SPEED;

	Serial.begin(9600);
}

void loop() {
	if (Serial.available()) {

		data = Serial.read();

		if ((data == START_STOP_J) || (data == START_STOP_V)) {
			if (stopped) {
				forward();

				analogWrite(PWM_LEFT, speed);
				analogWrite(PWM_RIGHT, speed);

				stopped = false;
			}
			else
			{
				stop();
				stopped = true;
			}
		}

		switch (data) {
			case DIR_FORWARD:
				if (!stopped)
					forward();
				break;

			case DIR_BACKWARD:
				if (!stopped)
					backward();
				break;

			case DIR_LEFT:
				if (!stopped)
					rotateleft();
				break;

			case DIR_RIGHT:
				if (!stopped)
					rotateright();
				break;

			case INC_SPEED:
				if (!stopped)
					setspeed(true);
				break;

			case DEC_SPEED:
				if (!stopped)
					setspeed(false);
				break;

			case FRONT_LIGHT:
				setlight();
				break;

			default:
				break;
		}
	}

	if (isborder())
		stop();
}

Ahora procedemos a conectar nuestro módulo Módulo Bluetooth HC-07 de la siguiente manera:

Módulo Bluetooth HC-07 –> Arduino Uno R3
TX      –>   D0 (RX)
RX     –>   D1 (TX)
5V     –>   5V
GND  –>  GND

Ahora encenderemos nuestro robot y lo buscamos en nuestro teléfono móvil/tablet (normalmente con el nombre “HC-07“, aunque esto puede variar) y lo emparejaremos con nuestro dispositivo, la contraseña por defecto es “1234” (sin comillas) o “0000” (sin comillas). En la siguiente imagen observamos nuestro dispositivo emparejado con nuestro robot:

Habiendo finalizado exitosamente el paso anterior, el cual es fundamental para continuar, ahora lanzaremos la aplicación “Arduino Bluetooth Controller“, que aparecerá en nuestro teléfono móvil/tablet con el nombre “ArduinoRC“, observaremos lo que se muestra en la siguiente imagen:

Presionamos el botón “Proceed“.
Luego nos aparecerá una lista de los dispositivos emparejados a nuestro teléfono móvil/tablet. Seleccionamos nuestro robot:

Si la conexión se estableció correctamente, nos aparecerá lo que observamos en la siguiente imagen y presionamos el botón “Vehicle Mode“:

Ahora debemos personalizar la configuración de la aplicación, para esto debemos presionar el menú desplegable y seleccionar la opción “Set Commands“, como se muestra en la siguiente imagen:

Ahora procedemos a personalizar la configuración según las siguientes imágenes:

Finalizada exitosamente la configuración, podremos controlar los movimientos de nuestro robot utilizando el giroscopio y acelerómetro de nuestro teléfono móvil/tablet. El botón de Android controla “Inicio/Parada” de nuestro robot.

Habiendo configurado y verificado el correcto funcionamiento de este modo de control, a continuación regresaremos al inicio de nuestra aplicación y presionaremos el botón “Controller Mode“.

Ahora debemos personalizar la configuración de la aplicación, para esto debemos presionar el menú desplegable y seleccionar la opción “Set Commands“, como se muestra en la siguiente imagen:

Ahora procedemos a personalizar la configuración según las siguientes imágenes:

Finalizada exitosamente la configuración, podremos controlar los movimientos de nuestro robot utilizando el joystick táctil de la aplicación. En la siguiente imagen observamos la función de cada botón del joystick:


Anuncios