martes, 14 de noviembre de 2017

Tutorial de Arduino y Blender


http://robologs.net/2016/02/29/tutorial-de-arduino-y-blender/

Tutorial de Arduino y Blender


Nota: es recomendable tener unos conocimientos básicos de como funciona la interfaz de Blender para seguir bien el tutorial.
Animaciones, edición de video, videojuegos, realidad virtual… lo que más me gusta de Blender es que permite hacer de todo. Para los que no conozcáis Blender, se trata de una suite de creación 3D con la que se puede hacer modelaje, rigging, VFX, composición e incluso videojuegos. Los usuarios más avanzados pueden crear scripts en Python para hackear personalizar la aplicación a su gusto.

Hoy voy a enseñaros una parte de Blender de la que pocas veces se habla: la posibilidad de recibir datos a través del puerto de serie. Usaremos esta característica para recibir datos de una placa Arduino y mover un objeto en Blender.
Así que poned buena música y empezamos.



1- Instalar Blender

La última versión de Blender puede bajarse desde la página de descargas de blender.org. En el momento de redactar este tutorial, la versión que tengo es la 2.76. Descargad Blender, descomprimid el archivo y recordad cuál es su directorio.
Un par de apuntes para los que estéis en Linux: os recomiendo que no os bajéis la versión de Blender que hay en los repositoros de vuestra distribución. A mi no me ha dejado utilizar la librería pySerial, mientras la versión que he descargado de blender.org no me ha dado problemas.
Por otra parte, en Linux hay que ejecutar Blender en modo superusuario para poder utilizar el puerto de serie. Para hacerlo, abrid la Terminal dentro de la carpeta donde tengáis Blender y escribid:
sudo ./blender
Este es el splash screen de la v2.76.


2- pySerial y Blender

Blender lleva por defecto muchas librerías que podemos aprovechar para nuestros proyectos. Pero la librería pySerial no está, y habrá que instalarla. Por suerte, Blender es muy configurable y podemos hacerlo sin problema.
Lo primero es descargar la librería pySerial desde aquí y descomprimir el .tar.gz . Dentro de la carpeta que aparece después de la extracción, hay otra carpeta llamada “serial”. Hay que copiarla dentro de la carpeta de Blender->2.76->python->lib->python3.4
Este es mi path al directorio donde hay que copiar la carpeta “serial”:

Ahora, ¿cómo puede uno estar seguro de haber seguido bien todos los pasos? Abrid Blender. Arriba, en la barra de información hay un menú desplegable con distintas configuraciones para la pantalla. Pulsad la que pone Scripting.


La configuración del espacio de trabajo cambiará a esta:

La parte de abajo (esa ventana negra con el texto azul) es la consola de Python de Blender. Funciona como una consola de Python normal, sólo que en vez de utilizar las librerías Python del sistema usa las de Blender.
Si tecleáis “import serial” en la consola y no da ningún error, es que la librería pySerial se ha instalado bien.
La librería pySerial está lista
Pero si aparece algún mensaje de error, tendréis que revisar todos los pasos hechos hasta ahora.


3- Código de Arduino

El ejemplo más sencillo que se me ocurre es mover un cubo de Blender con Arduino.
Este programa envía por serial el mensaje 0.1 para que el cubo avance, y -0.1 para que retroceda.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void setup()
{
   Serial.begin(9600);
}
 
 
void loop()
{
   for(int i = 0; i < 100; i++)
   {
      Serial.print("&0.1"); Serial.print("\n");
      delay(10);
   }
  
   for(int i = 0; i < 100; i++)
   {
      Serial.print("&-0.1"); Serial.print("\n");
      delay(10);
   }
}
Si habéis leído el código, veréis que al principio de cada mensaje he puesto el carácter “&”. A veces, Blender no lee bien los strings que le llegan por Serial y cambia su contenido. Este “&” sirve como detector de errores: cuando escribamos el script en python para el Blender Game Engine, vamos a hacer que ignore cualquier mensaje que no empiece por este carácter.


4- Código de Blender

Vamos a colocar un script python al cubo que viene por defecto en la escena, para que se mueva según lo que llegue por serial.
Primero habrá que cambiar la configuración del espacio de trabajo a Game Logic. Id al desplegable de la barra de información y seleccionad la opción “Game Logic“.


La configuración de la pantalla cambiará a esta:

También cambiad el motor de Blender Render a Blender Game:

La ventana gris de arriba a la derecha es un editor de texto. Aquí es dónde vamos a programar el script en python para leer el puerto serial. Como no quiero que perdáis la vista, colocad el cursor sobre el editor de texto y pulsad Ctrl+Flecha Arriba para hacer grande la ventana.

*crujido de dedos* Vamos allá
Cread un nuevo script pulsando el botón “New” que hay en la barra de abajo, y cambiadle el nombre a “main.py”. Ahora copiad el script de abajo en el editor. ¡Eh, pero no tan rápido! Antes cambiad el “/dev/ttyUSB0” de la línea 6 por la dirección de vuestra placa Arduino.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import serial #Comunicacion Serial
import bge #Funciones propias de blender
 
#Abrimos el puerto serial
ser = serial.Serial("/dev/ttyUSB0", 9600)
 
 
#Guardamos el controlador que esta ejecutando este script
cont = bge.logic.getCurrentController()
 
#Buscamos el propietario del controlador (el cubo)
obj = cont.owner
 
a = ser.readline() #Leer hasta el final de linea \n
a = a.decode("ascii") #Decodificar la linea
 
if a[0] == "&" and len(a) >= 4:
   a = a[1:] #Eliminamos el detector de errores
   a = a[:-1] #Eliminamos el final de linea
   obj.applyMovement([float(a),0,0], False) #Movemos el cubo
 
 
ser.close()
Comprobad que todos los tabuladores hayan quedado bien.
Cuando tengáis copiado el código habrá que asignarlo al cubo. Pulsad Ctrl+Flecha abajo para volver el editor de texto a su tamaño original.
Con el cubo seleccionado con el botón derecho, Id a la ventana de Game Logic Editor y añadid un sensor de tipo always. Activad el TRUE level triggering y poned Skip a 0.



Configuración del sensor Always

Después, hay que añadir un controlador de tipo “python”. Cambiad el nombre del script a main.py:


Por último, hay que juntar el Sensor Always con el Controlador Python. Para hacerlo, pulsad el círculo negro que hay a la derecha del sensor con el Botón Izquierdo del ratón y arrastrad hasta el anillo que hay a su derecha.

5- Probar el “juego”

Con Arduino conectado a través de USB a vuestro ordenador, si situáis el cursor encima de la escena 3D (dónde está el cubo) y pulsáis la tecla “P”, veréis como el Cubo se mueve de un lado a otro.
Espero que este tutorial os haya servido. Si tenéis dificultades en algún paso, podéis escribirme un comentario y os echaré una mano. ¡Hasta la próxima!

1 comentario:

  1. Buenas tardes, no puedo ver las imágenes y si quiero dirigirme a la fuente (http://robologs.net/2016/02/29/tutorial-de-arduino-y-blender/) me pide nombre de usuario y contraseña. Agradecería me compartiese la documentación. Saludos, Eduardo.

    ResponderEliminar