Cinta Transportadora en Unity controlada por Arduino

Introducción

En este artícu­lo vamos a ver una solu­ción descar­gable que con­siste en una cin­ta trans­porta­do­ra hecha en Uni­ty, cuyo fun­cionamien­to es con­tro­la­do uti­lizan­do una pla­ca Arduino.

Me fui a la cima de la meseta a grabar esto pero no me acuerdo por qué
👉

Archivos para descargar

En el sigu­iente paque­te encon­trarás dos car­petas, una con los archivos de Uni­ty y otra con los archivos de Arduino.

Den­tro de la car­pe­ta Uni­ty encon­trarás una com­pi­lación para pro­bar la sim­u­lación y tam­bién un paque­te de Uni­ty que puedes impor­tar en tu proyec­to y acced­er a los assets de esta simulación. 

GDT Con­vey­or Belt in Uni­ty Con­trolled by Arduino Shield
Ver­sión:1.0
Pub­li­ca­do:enero 28, 2020

Grabar programa en Arduino

En las descar­gas encon­trarás una car­pe­ta lla­ma­da "Arduino", que con­tiene el pro­gra­ma que se encar­ga de leer las entradas dig­i­tales, for­mar una pal­abra y enviar­la por el puer­to serial.

El pro­gra­ma es bas­tante sim­ple por lo que fun­cionará en cualquier pla­ca Arduino que puedas con­seguir, en mi caso usé un Arduino Mega.

En el sigu­iente video se puede ver cómo grabar el pro­gra­ma en la pla­ca Arduino, nece­si­tarás el soft­ware de Arduino.

Video 1: Grabar pro­gra­ma en Arduino.

Circuito para las entradas digitales

El pro­gra­ma de Arduino que viene en la descar­ga uti­liza los pines 2 y 3 para las entradas dig­i­tales. El pin 2 con­tro­la el esta­do de la máquina ali­men­ta­do­ra y el pin 3 con­tro­la el esta­do de la cin­ta transportadora.

Hay muchas for­mas de conec­tar señales a la entra­da dig­i­tal del Arduino, voy a mostrar dos alter­na­ti­vas uti­lizan­do switches.

ADVERTENCIA
ASEGURARSE DE CONECTAR BIEN LOS ELEMENTOS AL ARDUINO, UN CORTOCIRCUITO PUEDE DESTRUIR LA PLACA.
ES NECESARIO CONOCER LA DISTRIBUCIÓN DE PATAS DE CADA CONTACTO EN PARTICULAR, MEJOR SI SE DISPONE DE UN TESTER PARA MEDIR CONTINUIDAD.

Alternativa 1: Switch de dos posiciones

En mi caso usé switch­es de dos posi­ciones para las entradas dig­i­tales, en estos switch­es el ter­mi­nal del medio hace con­tac­to con un extremo o el otro depen­di­en­do de la posi­ción en la que esté el switch. Por lo tan­to, en los extremos conec­ta­mos las señales de volta­je alto y bajo (en mi caso 5 Volts y 0 Volts respec­ti­va­mente). El ter­mi­nal del medio del switch se conec­ta a la entra­da dig­i­tal del Arduino. 

Reit­ero la adver­ten­cia, el switch que usé es como el que se obser­va en la figu­ra 1 y en este caso en par­tic­u­lar se conec­ta de esa forma.

switch de dos posiciones para entradas digitales de arduino
Fig. 1: Esque­ma de conex­ión de un switch de dos posi­ciones para entra­da dig­i­tal del Arduino.

Alternativa 2: Interruptor con resistencia pull-up

Tal vez sólo dispones de un switch inter­rup­tor, es decir un con­tac­to que se cier­ra o se abre. En las entradas dig­i­tales del Arduino debe haber con­stan­te­mente señales de volta­je alto o bajo, no debe­mos dejar entradas dig­i­tales sin conec­tar a nada (conex­ión al aire como le dec­i­mos acá) ya que esto con­ducirá a com­por­tamien­tos impredecibles. 

Para esto hay que imple­men­tar un pequeño cir­cuito con resisten­cia pull-up, como el que se obser­va en la figu­ra 2.

En este caso usamos una resisten­cia conec­ta­da al ter­mi­nal GND del Arduino y el otro extremo conec­ta­do por un lado a la entra­da dig­i­tal y por otro al switch inter­rup­tor, el otro extremo del switch lo conec­ta­mos a la señal de volta­je alto (5 Volt por ejemplo).

conexión de switch interruptor con resistencia pull-up para entradas digitales de arduino
Fig. 2: Esque­ma de conex­ión de un inter­rup­tor con resisten­cia pull-up para entra­da dig­i­tal del Arduino. 

El cir­cuito de la figu­ra 2 fun­ciona de la sigu­iente man­era: cuan­do el inter­rup­tor está abier­to no hay cir­cu­lación de cor­ri­ente a través de la resisten­cia, por lo tan­to los 0 Volts se trasladan a la entra­da dig­i­tal y el Arduino lee un niv­el bajo. Cuan­do accionamos el switch la cor­ri­ente cir­cu­lará por la resisten­cia y en la entra­da del Arduino habrá una señal de niv­el alto.

Comprobar que el programa Arduino está funcionando

El pro­gra­ma de Arduino se encar­ga de leer el esta­do de las entradas dig­i­tales, crear una pal­abra bina­ria que rep­re­sen­ta esos esta­dos y enviar­la por puer­to serie.

Si abri­mos el mon­i­tor Serie, des­de la pes­taña Tools, deberíamos ver los esta­dos de las entradas dig­i­tales men­sajes. Como se obser­va en el sigu­iente video. 

Video 2: Com­pro­bar que el pro­gra­ma de Arduino está funcionando

Probar la simulación

Una vez que hemos graba­do el pro­gra­ma en la pla­ca Arduino, podemos eje­cu­tar la com­pi­lación que viene en la descarga.

Al entrar en la sim­u­lación, en la esquina supe­ri­or izquier­da hay un botón para conec­tar Uni­ty con la pla­ca Arduino.

En esta parte pueden sur­gir prob­le­mas con la conex­ión, prob­a­ble­mente cor­ri­ja esto en otra ver­sión de la solu­ción. Para ase­gu­rarse de que la conex­ión fun­cione, la pla­ca Arduino debe estar conec­ta­da antes de abrir la com­pi­lación y el pro­ce­so de conex­ión puede tar­dar var­ios segun­dos en conc­re­tarse. Si luego de 30 segun­dos la pla­ca no se ha conec­ta­do, ver­i­ficar el paso ante­ri­or y volver a abrir la sim­u­lación e inten­tar de nuevo.

Video 3: Prue­ba de la cin­ta trans­porta­do­ra en Uni­ty con­tro­la­da por Arduino.

Importar paquete y corregir error API Compatibility Level

Para acced­er a los archivos fuente de la sim­u­lación está el paque­te de Uni­ty, lo puedes impor­tar como se ve en el sigu­iente video.

Video 4: Impor­tar paque­te y cor­re­gir error de API Com­pat­i­bil­i­ty Level.

Al impor­tar el paque­te nos apare­cerán errores ya que algunos Scripts no pueden acced­er al paque­te con las clases que per­miten acced­er al puer­to serie.

Para solu­cionarlo seguimos los pasos que se ven en el video 4. Vamos a la pes­taña Edit > Project Set­tings > Play­er > Oth­er Set­tings y en el cam­po "API Com­pat­i­bil­i­ty Lev­el" seteamos ".NET 4.x".

Funcionamiento de la cinta transportadora en Unity controlada por Arduino

Den­tro del paque­te está la esce­na que se ve en la sim­u­lación, podemos acced­er a ella y ver sus ele­men­tos, en la figu­ra 3 podemos ver la jer­ar­quía de la escena.

En la jer­ar­quía ten­emos tres máquinas, "Toori Machine" es la máquina que se encar­ga de colo­car obje­tos sobre la cin­ta trans­porta­do­ra. "GDT Con­vey­or Belt" es la cin­ta trans­porta­do­ra y "Box" es la caja donde caen los obje­tos y son destruidos.

jerarquia de la simulacion de la cinta transportadora en unity controlada por arduino
Fig. 3: Jer­ar­quía de la esce­na que viene den­tro del paquete. 

Cinta transportadora

La cin­ta trans­porta­do­ra es un mod­e­lo 3D con una estruc­tura y una banda. 

Para lograr la ani­mación del fun­cionamien­to lo que se hace es agre­gar off­set al mapa UV de la tex­tu­ra. En este caso como la tex­tu­ra se encuen­tra dis­tribui­da ver­ti­cal­mente agreg­amos off­set a la com­po­nente Y del mapa UV. Cuan­do el mapa UV tiene un off­set de 1 en la com­po­nente Y la tex­tu­ra vuelve al esta­do inicial.

Entonces para lograr el efec­to de que la cin­ta trans­porta­do­ra avan­za o retro­cede incre­men­ta­mos grad­ual­mente el off­set del mapa UV en algu­na de las componentes.

Para lograr que la cin­ta trans­porte obje­tos, se tiene un box Col­lid­er en modo Trig­ger que detec­ta cuán­do un obje­to está sobre la cin­ta, estos obje­tos deben ten­er asig­na­da una com­po­nente RigidBody. 

Script que controla la cinta transportadora en Unity.
Fig. 4: Script que con­tro­la la cin­ta trans­porta­do­ra en Unity.

Entonces en el Script de la cin­ta trans­porta­do­ra se define la fun­ción OnTrig­ger­Stay que se lla­mará cuan­do un obje­to esté sobre la cin­ta trans­porta­do­ra. Esta fun­ción se encar­gará de mover el obje­to, para sin­cronizar el movimien­to de la cin­ta con el movimien­to del obje­to hay un parámetro en el inspec­tor lla­ma­do "Syn­cU­VMove­ment­Fac­tor", por defec­to está setea­do en 2, como se obser­va en la figu­ra 2.

La cin­ta trans­porta­do­ra tiene una fun­ción públi­ca que per­mite acti­var­la o desac­ti­var­la y que puede ser lla­ma­da des­de cualquier otro Script. Eje­cu­ta­mos esta fun­ción con la infor­ma­ción que leemos de la pla­ca Arduino, es decir se acti­vará o desac­ti­vará de acuer­do al esta­do de la entra­da dig­i­tal 3 de la placa.

Máquina alimentadora

Para que la sim­u­lación sea un poco más com­ple­ta se incluye una máquina que colo­ca obje­tos sobre la cin­ta trans­porta­do­ra. Esta máquina se con­tro­la con el Script "Feed­ing­Ma­chine" y tam­bién tiene un méto­do públi­co que per­mite encen­der­la o apa­gar­la. Esta máquina se con­tro­lará con la entra­da dig­i­tal 2 del Arduino.

Script que controla la máquina que coloca objetos sobre la cinta transportadora en unity
Fig. 5: Script que con­tro­la la máquina que colo­ca obje­tos sobre la cin­ta transportadora.

En el inspec­tor podemos colo­car el pre­fab de los obje­tos que debe colo­car sobre la cin­ta trans­porta­do­ra y podemos cam­biar los tiem­pos entre un obje­to y otro.

Comunicación entre Arduino y Unity

Esta parte se resuelve uti­lizan­do una ver­sión mod­i­fi­ca­da de la solu­ción WRMHL com­par­ti­da por el equipo RELATIVTY. Te ani­mo a vis­i­tar los links para ver la solu­ción orig­i­nal y los proyectos.

Para poder comu­nicar Uni­ty con Arduino se debe ten­er un GameOb­ject en la jer­ar­quía con el Script "wrmhlRead" asignado. 

Fig. 6: Script que con­tro­la la comu­ni­cación entre Arduino y Unity. 

He agre­ga­do un entero lla­ma­do "arduinoMes­sage­Length" en el inspec­tor, que indi­ca la lon­gi­tud de la pal­abra bina­ria que se envía des­de el Arduino. Esto se uti­liza para sin­cronizar cor­rec­ta­mente Uni­ty con Arduino en caso de exi­s­tir más dis­pos­i­tivos uti­lizan­do el puer­to serie. 

En nue­stro caso, como des­de el Arduino envi­amos una pal­abra de dos dígi­tos, en ese cam­po se debe pon­er dos. En caso de agre­gar más dígi­tos a la pal­abra, se debe mod­i­ficar apropi­ada­mente este campo.

La lec­tura del men­saje del Arduino se hace en el méto­do "ReadMes­sage­An­dAc­tion()". Aquí aden­tro podemos realizar la acción que quer­amos en Uni­ty. En nue­stro caso eje­cu­ta­mos los méto­dos públi­cos de los Scripts Con­vey­or­Belt y Feed­ing­Ma­chine, para acti­var o desac­ti­var las máquinas de acuer­do a la orden del Arduino.

Conclusión

Hemos vis­to cómo fun­ciona la solu­ción de la cin­ta trans­porta­do­ra en Uni­ty con­tro­la­da por Arduino.

Con los archivos pro­vis­tos se puede crear una nue­va sim­u­lación de acuer­do a las necesi­dades de cada uno. 

YouTube
Scroll al inicio
Secured By miniOrange