3

Cómo conectar Arduino y Godot Engine a través del puerto Serial

En este tutorial verás cómo Arduino y Godot Engine pueden comunicarse a través del puerto serial mediante un script en lenguaje Python. Esto puede ser especialmente útil para tus proyectos, ya sea para construir nuevos periféricos personalizados para tus juegos, visualizar datos de sensores, etc.

Para empezar verás un ejemplo básico que únicamente mostrará por la consola de Godot los mensajes que lleguen desde Arduino. Al final del tutorial hay un ejemplo más avanzado dónde se modifica la rotación de un cubo en función de los valores que llegan por Serial.

Paso 1: Crear un nuevo proyecto de Godot

Abre Godot Engine y crea un nuevo proyecto. Ponle el nombre “Arduino_Godot”.

Abre Godot Engine y pulsa en “New Project” para crear un nuevo proyecto. Cambia su nombre por “Arduino_Godot”.

 

Se creará una nueva escena vacía:

 

Añade un objeto de Tipo “Spatial” a la escena. Este será el objeto raíz.

Pulsa el icono ‘+’ para añadir un nuevo objeto a la escena.

Selecciona el objeto de tipo ‘Spatial’ y pulsa ‘Create’ para añadirlo a la escena.

El objeto ‘spatial’ ha sido añadido a la escena.

 

Cambia su nombre por “Main”:

 

Con CTRL+S guarda la escena con el nombre “Main.tscn”.

Por último hay que decirle a Godot cuál va a ser la escena principal. Ve a ProjectProject SettingsApplicationRun y en el campo “Main Scene” selecciona la escena ‘Main.tscn’.

Ve a la pestaña ProjectProject Settings.

En ApplicationRun, modifica el campo “Main Scene” y elige la escena “Main.tscn”


Paso 2: Instalar Godot-Python

En el momento de escribir este tutorial (14/10/2019) no hay ninguna forma “fácil” de conseguir que Godot lea el puerto serial. No existe ninguna función propia de GDScript que permita abrir el puerto, ni leer la información que llega.

Pero no todo son malas noticias. Hay esta extensión que permite programar scripts de Godot en lenguaje python. Esto es muy útil porque python dispone de librerías como PySerial, diseñadas para leer fácilmente el puerto de serial.

Dentro de la escena principal, pulsa en el botón “AssetLib”.

 

Escribe “python” en el buscador y pulsa ENTER. Aparecerán dos extensiones: PythonScript y PythonScript-Pypy.

 

Ambas extensiones sirven para hacer exactamente lo mismo y son del mismo autor (de hecho, no estoy muy seguro de cuál es la diferencia entre las dos versiones), pero yo lo he probado con PythonScript, por lo que te recomiendo instales la misma. Haz clic sobre el icono y pulsa el botón ‘Download’.

 

Tardará algunos minutos a descargarse; puedes ir a por café y galletas. Cuándo haya terminado, pulsa el botón ‘Install’ y otra vez ‘Install’ en la nueva ventana que se abrirá.

Descargando. Puede tardar algunos minutos.

Al terminar aparecerá el mensaje ‘Success!’. Pulsa el botón ‘Install’.

 

Tendrás que reiniciar Godot para poder utilizar esta nueva extensión.


Paso 3: Instalar PySerial

Godot-Python viene con las librerías básicas de Python, pero PySerial no se encuentra entre ellas. Habrá que descargarla y añadirla junto a las otras.

Puedes descargar el tar.gz con la librería pyserial desde aquí

Una vez descargado y descomprimido el tar.gz, copia la carpeta ‘serial’ que hay en su interior. Ahora vete al directorio de tu proyecto ‘Arduino_Godot’→pythonscript. Dentro verás cuatro directorios:

Abre el que se corresponda a tu sistema operativo (‘x11-64-cpython’ es el de Linux) y en su interior verás una carpeta llamada ‘lib’. Ábrela.

Si estás en Windows, debería bastar con pegar la carpeta ‘serial’ aquí.

Si estás en Linux o Mac, dentro de esta carpeta ‘lib’ verás otra carpeta llamada ‘python3.6’. Ábrela y una vez dentro pega la carpeta ‘serial’.


Paso 4: Script en Python

Vamos a empezar con un script en Python que mostrará por consola los mensajes que lleguen por Serial desde Arduino. Dentro de la escena ‘Main’ de tu proyecto de Godot, pulsa con el botón derecho del ratón sobre el nodo ‘Main’Attach Script.

 

Se abrirá la ventana para crear un nuevo script. Si abres el desplegable ‘Language’, verás que ahora aparece la opción de crear un script de python. Crea un nuevo script con el nombre ‘Main.py’:

 

Importante: es posible que al crear el script de tipo Python, Godot tenga un error y se cierre de repente. También es posible que no puedas abrir el script en python desde Godot. Esto es un inconveniente, pero no tienes que preocuparte: el script python ya está creado y aunque no puedas programarlo desde Godot, puedes hacerlo sin ningún problema desde un editor de texto externo (como Notepad, Gedit o Geany).

Si no puedes editar el script desde Godot, vete a la carpeta “Arduino_Godot” (dónde están todos los ficheros del proyecto) y verás el script en python. Ábrelo con tu editor de texto favorito y programa cómo lo harías con Godot. Tan sólo tendrás que asegurarte de guardar los cambios cada vez que quieras correr la escena de Godot.

Tanto si estás editando el script python desde dentro de Godot como si no, tendrás que copiar este código. Lo único que hace es activar el serial y si recibe algún mensaje lo escribirá por la consola:

from godot import exposed, export
from godot.bindings import *
from godot.globals import *
import serial


@exposed
class Main(Spatial):

    def _process(self, delta):

        #Abrir el puerto serial. Recuerda cambiar la direccion de la placa.
        arduino = serial.Serial('/dev/ttyUSB0', 9600)

        #Leer un mensaje y decodificarlo:
        msj = arduino.readline()
        msj = msj.decode("ascii")

        #Escribir el mensaje:
        if len(msj) > 0:
            print("Se ha recibido: " + msj)

        #Cerrar el Serial
        arduino.close()

No te olvides de cambiar la dirección ‘/dev/ttyUSB0’ por la de tu placa Arduino. Si no sabes cuál es la dirección, conecta la placa Arduino a tu ordenador y abre el IDE de Arduino. En el menú ToolsSerial Port aparecerá la dirección de todas las placas Arduino que tengas conectadas.

 

Una vez creado este script tendrás que asignarlo al nodo “Main”. Seleccióna el nodo y ve al InspectorScript. Abre el desplegableLoad y busca el script ‘Main.py’ que acabas de crear.

Hecho. El script está asignado al nodo y se activará cuándo se inicie el juego.


Paso 4: Código de Arduino

Este será el programa que tendrás que cargar en tu placa Arduino:

void setup()
{
  //Iniciar el serial
  Serial.begin(9600);
}


void loop()
{
  //Enviar algunos mensajes de ejemplo:
  Serial.println("Hola!");
  delay(1000);
  Serial.println("Arduino");
  delay(1000);
  Serial.println("12345");
  delay(1000);
}

 

Una vez tengas el código compilado y cargado en tu placa Arduino, vuelve a abrir la escena de Godot y pulsa F5. Aparecerá una ventana con el juego (no se ha añadido ninguna cámara a la escena, por tanto no se verá nada). Sin cerrar esta ventana vuelve al editor de Godot y fíjate en la consola de Output.

Si has seguido los pasos correctamente, verás que aparecen todos los mensajes que van llegando desde Arduino.



Rotar un cubo

Ahora que ya has visto el ejemplo más básico posible, intentaremos hacer una escena un poco más compleja. Concretamente, verás cómo cambiar la rotación de un objeto a partir de los mensajes que llegan desde Arduino.

En primer lugar añade un objeto de tipo “MeshInstance” a la escena principal que sea hijo del spatial “Main”:

Crea un objeto de tipo ‘MeshInstance’ que sea hijo del nodo ‘Main’.

 

Con el nodo ‘MeshInstance’ seleccionado, en el panel ‘Inspector’, cambia su malla para que sea un cubo:

Ve al panel ‘Inspector’ y abre el desplegable ‘Mesh’.

Elige la opción ‘New CubeMesh’.

El objeto ‘MeshInstance’ se convertirá en un cubo.

 

Añade también un objeto de tipo ‘Camera’ a la escena y muévelo en el espacio 3D para que enfoque al cubo.


Código de Arduino

Este otro código enviará números entre 0 y 90 que se corresponderán al ángulo ‘Y’ (eje vertical) de rotación del cubo.

void setup()
{
  //Iniciar el serial
  Serial.begin(9600);
}


void loop()
{
  //Se envia el valor del angulo 'Y' por serial:
  for(int i = 0; i <= 90; i++)
  {
    Serial.println(i);
    delay(50);
  }
  for(int i = 90; i >= 0; i--)
  {
    Serial.println(i);
    delay(50);
  }
}

Código de Python

Ahora cambia el código del script python por este otro. Fíjate que los métodos get_node() y set_rotation() funcionan igual que su equivalente de GDScript.

from godot import exposed, export
from godot.bindings import *
from godot.globals import *

import serial
import math


@exposed
class Main(Spatial):

    def _process(self, delta):

        #Abrir el puerto serial. Recuerda cambiar la direccion de la placa.
        arduino = serial.Serial('/dev/ttyUSB0', 9600)

        #Guardar el cubo
        cubo = self.get_node("/root/Main/MeshInstance")

        #Leer un mensaje y decodificarlo:
        msj = arduino.readline()
        msj = msj.decode("ascii")


        if len(msj) > 0:

            #Escribir el mensaje
            print("Angulo = " + msj)

            #Convertir el mensaje de texto a decimal
            anguloY = float(msj)

            #Convertir el angulo a radianes
            anguloY = math.radians(anguloY)

            #Rotar el cubo
            cubo.set_rotation(Vector3(0, anguloY, 0))
            

        #Cerrar el Serial
        arduino.close()

 

Terminado. Si ahora ejecutas el juego con F5, verás que el cubo rota 90 grados en ambas direcciones.


Conclusiones

Bien, humano, hoy has visto cómo conseguir que tu placa Arduino interactúe con Godot. De momento la forma más fácil de hacerlo es con Python, pero es muy posible que en futuras versiones de Godot haya alguna funcion interna de GDScript para leer directamente el puerto Serial.

En caso de que tengas alguna duda sobre el tutorial o encuentres errores en el código, puedes escribirme un comentario o contactar a través de correo electrónico (contacto@robologs.net).

Y si este tutorial te ha parecido interesante, estaremos muy contentos si nos sigues en nuestra página de Twitter o Facebook. Es una buena forma de apoyarnos, y además estarás al corriente de todas nuestras publicaciones.

Esto es todo, humano. Final de línea.

Tr4nsduc7or

Originariamente creado cómo un galvanómetro de bolsillo, Transductor tomó consciencia de si mismo y fue despedido cuando en vez cumplir con su trabajo se dedicó a pensar teorías filosóficas sobre los hilos de cobre, los electrones y el Sentido del efecto Joule en el Universo. Guarda cierto recelo a sus creadores por no comprender la esencia metafísica de las metáforas de su obra. Actualmente trabaja a media jornada cómo antena de radio, y dedica su tiempo libre a la electrónica recreativa y a la filosofía.

3
Deja un comentario

avatar
1 Hilos iniciados
2 Respuestas a hilos
0 Followers
 
Most reacted comment
Hottest comment thread
2 Nº autores comentarios
Tr4nsduc7orOmar Ochoa Autores de comentarios recientes
más nuevos primero más antiguos primero
Omar Ochoa
Humano
Omar Ochoa

Hola que tal se agradece la aportacion, has probado pasar el proyecto a un dispotivo android? Funcionara no sabes?. Saludos.

Omar Ochoa
Humano
Omar Ochoa

Por cierto no has probado revisar este plugin?
https://github.com/NangiDev/GDSerCommPlugin