Como habíamos visto en un post anterior, podemos leer la información de nuestro módulo Bluetooth, pero para profundizar un poco más, debemos de darle un significado a esta forma de comunicación.

Antes veíamos cómo conectar nuestro Bluetooth y sacar datos a través de una aplicación. Pero ahora se nos va a complicar esta manera de interpretar los datos.r

Como habréis observado en la aplicación Robopad++ existen 3 modelos de robot. El renacuajo, el beetle y el evolution. Antes solo habíamos manejado el modelo Renacuajo, en el que cada botón se asociaba a una letra.

  • Arriba (Up) → U(SS)
  • Izquierda (Left) →L(SS)
  • Derecha (Right) →R(SS)
  • Abajo (Down)→ D(SS)
  • Stop →S
  • Modo siguelineas → I
  • Parar siguelineas → M

Ahora utilizaremos el modelos Beetle y observaremos una cosa muy curiosa. Para ello deberemos de instalar el programa que hay publicado en la sección Explora de Bitbloq como readBluetooth o simplemente copiar el programa que se explica en una publicación anterior.

Robopad++ Como se puede observar , este nuevo modelo tiene ahora unas pinzas que se pueden abrir y cerrar en mayor y menor medida. Y el resultado es el siguiente:

Bluetooth_OpenCloseLas primeras instrucciones son las asociadas a los botones de dirección, Arriba, derecha, izquierda, abajo y el modo siguelineas.

Ahora se añade una letra adicional, que es la G. Pero lo más curioso es la letra C que es una instrucción que viene acompañada de un número. Estas instruccioón está asociada a las pinzas del robot que podemos abrir o cerrar según el número. Abrir cuando el número es más bajo (En este caso el valor más pequeño es 10) y cerrarlo progresivamente en incrementos de 3 hasta su máximo que es el valor 55.

Si os fijáis hasta el valor 34 voy abriendo y he apretado el botón de cerrar para volver al estado anterior 31 y después he seguido aumentando.

Esto es así, para no tener que crear un montón de botones para cada nivel de apertura de las pinzas. Pero ahora tenemos que saber interpretar estos valores y separar el texto del número y así mover el motor que controla esas pinzas.

Así pues, los botones de las pinzas siguen el siguiente patrón.

  • Pinzas abiertas al máximo –> C10
  • Abrir pinzas –> C## – 3 (Decrece el valor de tres en tres)
  • Cerrar pinzas –> C## +3 (Aumenta el valor, hasta un máximo de 55)

Así que vamos a ver como se interpreta cada uno de los datos que nos aparecen de esta manera y a ver como separamos las letras de los números y creamos algo chulo. Atención que vamos a aprender un montón. Allá vamos.

Para empezar, conectaremos la placa como habíamos hecho anteriormente. Por ahora no meteremos ningún motor, solamente manejaremos los valores que aparecen por pantalla para tratarlos y después les asociaremos un comportamiento.

BluetoothConnectionEl programa a ejecutar es el siguiente.

Bluetooth_Array

Para entenderlo explico de forma genérica lo que vamos a hacer y después explicaré paso a paso el sentido de cada una de estas funciones:

Como las letras y números nos vienen en paquetitos unidos en función del botón que apretemos, lo que necesitamos hacer es separar estas letras y números e interpretar el significado de cada uno de ellos por separado. Este proceso se realiza mediante la lectura del texto como un array o vector. Que es asociar a cada una de las letras una posición en el texto. En el caso de tener un C42, lo que necesito es separar la C por un lado para saber que quiero mover las pinzas y por otro lado el número para saber, cuánto he de mover el servomotor de las pinzas.

Por ello he creado una variable de texto que como antes; guarde el texto leido a través del módulo Bluetooth y que he llamado BT_data. Por otra parte, tengo una variable de tipo carácter denominada BT_char que se encargará de separar cada una de las letras del texto leido anteriormente uno por uno. Y después una variable numérica para crear un bucle de la longitud del texto leido para ir separando uno por uno.

Si ejecutamos el programa nos aparecerán los datos de esta manera.

Bluetooth_protocolComo se puede apreciar, hemos separado cada una de las letras. Ahora solo tenemos que identificar los números y agruparlos. Pero cuidado que no es tan fácil y esto empieza a complicarse. El código se puede copiar del proyecto Bluetooth_protocol2 dentro de la sección Explora de Bitbloq.

Bluetooth_protocol2

La cuestión es que para tratar todo esto se han tenido que tener en cuenta varios conceptos.

  • Por una parte, hemos añadido un par de variables; una para recoger el número completo BT_num, otro para establecer el exponente en base 10 del número en cuestión n_num.
  • Hemos aplicado una regla matemática muy sencilla, que trata de descomponer el numero en su base decimal. Por ello, tratamos en bucle los número sumando el valor que contenían con el valor 10 elevado a un exponente indicativo a su posición.
    BT_num = BT_num + valor*10^n_num
    Pero esto tiene el problema que si vamos en orden creciente, leeremos primero el número con mayor exponente y esta regla nos invierte el resultado.
  • Por ello, hemos cambiado el orden de lectura, en vez de ser creciente sumando 1 lo haremos con un bucle que lee desde el final hasta el principio restando la posición en 1.
  • La identificación de los carácteres la hemos gestionado mediante un número que se asocia a una letra dentro del denominado código ASCII. El código ASCII(American Standard Code for Information Interchange) es una tabla que relaciona los caracteres y símbolos en números que puede entender una máquina. De esta manera para identificar el valor de un carácter numérico, lo que hacemos es restarle el valor de su referencia 0 en el código ASCII y así obtendremos el valor numérico.

codigo-asciiComo podemos ver en la siguiente tabla, el valor del 0 es igual a 48 y el valor del 9 es 57. Entonces la transformación que deberemos hacer es restar 48 a todos aquellos caracteres entre 0 y 9 y de esta manera obtener ese valor numérico dentro de la placa.

  • 0–>48
  • 1–>49
  • 2–>50
  • 3–>51
  • 4–>52
  • 5–>53
  • 6–>54
  • 7–>55
  • 8–>56
  • 9–>57

De esta manera, obtenemos finalmente nuestros valores esencialmente numéricos y que podremos introducir dentro de los valores de giro de nuestros motores para controlar las pinzas o lo que nos interese controlar.

Bluetooth_protocol2_serial

Es posible que haya alguna manera más fácil de hacer este proceso. Como siempre digo, no hay una única manera de hacer las cosas. Así que si alguien tiene alguna solución mejorada siempre es bienvenida. 🙂