En esta entrada del curso de programación con Protocoder vamos a aprender cómo controlar mediante la voz un Printbot.
Para controlar el Printbot, en este caso el PrintBot Evolution, utilizaremos un “sketch” de Arduino que, entre otras cosas, controlará el movimiento, y un programa de Protocoder en el que utilizaremos el control por voz.
Código Arduino
El código Arduino se ha explicado en esta entrada por si quieres volver a recordarlo. No se necesita realizar ninguna modificación. Crearemos el código de Protocoder para que funcione con ese código Arduino.

- Movimiento manual: avanzar, retroceder, izquierda, derecha y 180
- Movimiento automático: obstáculos, siguelíneas y sigueluz
En la función writeData determinamos qué palabra se ha leído a través de la conexión Bluetooth y determinamos cuáles serán las funciones a realizar:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
void writeData() { if (inString == "avanzar") { avanzar(); } if (inString == "retroceder") { retroceder(); } if (inString == "izquierda") { izquierda(); delay(defaultDelay); parar(); inString = ""; } if (inString == "derecha") { derecha(); delay(defaultDelay); parar(); inString = ""; } if (inString == "parar") { parar(); } if (inString == "obstaculos") { obstaculos(); } if (inString == "siguelineas") { sigueLineas(); } if (inString == "sigueluz") { sigueLuz(); } if (inString == "180") { giro_180_grados(); inString = ""; } } |
Código Protocoder

1 2 3 4 5 6 7 8 9 10 11 12 |
ui.toolbar.title("Voice-control Printbot"); ui.toolbar.bgColor(55, 155, 155, 255); ui.toolbar.show(true); //ui.screenMode("fullscreen"); ui.screenOrientation("portrait"); ui.allowScroll(false); device.screenAlwaysOn(true); var margin = 10; var w = ui.screenWidth - 2*margin; var h = 150 + margin; var y = h + margin; |
Para controlar la conexión Bluetooth utilizaremos un botón para conectar y otro para desconectar.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
var btStatus=0; // Variable que almacena el estado (conectado/no conectado o 1,0) del bluetooth var btClient; // "objeto" que usaremos para conectar,desconectar y trabajar con el bluetooth var btnConectar = ui.addButton("Connect bluetooth", margin, margin,w,h).onClick(function() { // Creamos el botón del bluetooth btClient = network.bluetooth.connectSerial(function(status) { console.log("connected " + status); if (status){ ui.toast("Connected"); btStatus = status; console.log("btStatus = " +btStatus); } }); }); var btnDesconectar = ui.addButton("Disconnect", margin, h,w,h).onClick(function() { // Creamos el botón de conectar btClient.disconnect(); // Desconectamos una vez se ha pulsado btStatus=false; // Cambiamos la variable de estado a desconectado (0) }); |
Al pulsar sobre connect, aparecerá un diálogo donde podremos escoger el dispositivo al que conectarnos, que previamente se ha emparejado a través de los ajustes Bluetooth de Android.
Al pulsar sobre Disconnect, se cerrará la conexión y cambiaremos el valor de la variable btStatus a false, que utilizamos para conocer el estado de la conexión Bluetooth desde otras partes del programa.
Además, utilizamos la función send para enviar cadenas de caracteres a través de Bluetooth:
1 2 3 4 5 6 7 |
function send(str) { // Función que utilizamos para enviar un string (cadena de caracteres) if (btStatus === true) { // Si el bluetooth está conectado, se ejecuta el código de las siguientes lineas btClient.send("="+str+"+"); // Enviamos la cadena de caracteres entre los simbolos = y + console.log("="+str+"+"); // Mostramos en la consola la cadena de caracteres que se esta enviando. } rightOrder = false; } |
La variable rightOrder la utilizamos para determinar si las ordenes que se han leído por los comandos de voz son correctas o no. En el caso de que sean correctas imprimirá en pantalla la orden que se ha dicho. En el caso de que sean incorrectas se mostrará un mensaje de error.
Para utilizar el control por voz, creamos un botón en el que incluiremos la función y creamos dos variables str, a la que asignaremos el texto a enviar por Bluetooth, y rightOrder.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
var str; var rightOrder = false; var btnReconocimiento = ui.addButton("Voice Recognition",margin, 3*h,w,2*h).onClick(function(){ if (btStatus === true){ media.voiceRecognition(function(text) { if(text == "líneas"){ str = "siguelineas"; rightOrder = true; } if(text == "luz"){ str = "sigueluz"; rightOrder = true; } if(text == "obstáculos"){ str = "obstaculos"; rightOrder = true; } if(text == "avanzar"){ str = "avanzar"; rightOrder = true; } if(text == "retroceder"){ str = "retroceder"; rightOrder = true; } if(text == "izquierda"){ str = "izquierda"; rightOrder = true; } if(text == "derecha"){ str = "derecha"; rightOrder = true; } if(text == "parar"){ str = "parar"; rightOrder = true; } if(text == "vuelta"){ str = "180"; rightOrder = true; } if ( rightOrder === true){ input.setText(str); send(str); }else{ input.setText("Not recognized"); } }); }else{ ui.toast("Not connected!"); } }); |
En primer lugar se comprueba que hayamos conectado a Bluetooth con la orden if(btStatus). Si se ha conectado, se iniciará el reconocimiento por voz con la función media.voiceRecognition(function (text){ });. Cuando se haya detectado alguna palabra, se comparará con las ordenes preestablecidas, se asignará la palabra clave a enviar a la variable str y asignaremos el valor true a la variable rightOrder. Si rightOrder tiene el valor true se modificará el texto de pantalla por la orden a enviar y se enviará a través de la función send().
Para continuar, generamos la variable de texto que utilizaremos para mostrar por pantalla el texto que se ha reconocido mediante comandos de voz y cambiamos su tamaño a 40:
1 2 |
var input = ui.addText("Input Text", 10*margin, 6*h,w,3*h); input.textSize(40); |
Para finalizar, creamos un botón de parada para mayor seguridad, aunque también es posible parar el PrintBot mediante comandos de voz:
1 2 3 4 |
var btnStop = ui.addButton("STOP!!",margin,8*h,w,h).onClick(function(){ send("parar"); }); |