En este nuevo artículo sobre TETRIX (el anterior fue TETRIX: Primeras Impresiones) quiero centrarme en la experiencia de construcción con este nuevo tipo de pieza, que no tiene demasiado en común con la pieza a la que LEGO nos tiene acostumbrados. Aunque los elementos estructurales son muy ligeros (están hechos de aluminio), debemos tener en cuenta que la electrónica de estos modelos es muy pesada, entre otros motivos porque requiere de una batería adicional.
Primero quiero centrarme en los ejes, en este caso ya no se trata de ejes en forma de cruz, son ejes cilíndricos. Para poder hacer uso de estos ejes debemos utilizar un axle hub o soporte para eje, un elemento de sujeción que mantiene el eje fijo en una postura y está dotado de 4 agujeros para tornillos.
Haciendo uso de estos 4 agujeros podremos unir nuestro eje con otras piezas.
Las uniones entre elementos estructurales se realiza mediante tornillos y tuercas, lo que supone un inmenso cambio con respecto a la facilidad de unión de las piezas Technic mediante pines. Sin embargo, puede ser que simplemente necesitemos un periodo de adaptación.
Después de esta breve introducción, vamos a centrarnos en la construcción de un modelo básico que vendría a ser como un tribot de gran tamaño: la mantis. Este modelo tiene dos motores 12V para tracción y un servo adicional para controlar los movimientos de las patas delanteras. Además hace uso de las ruedas omnidireccionales que harán las veces de la rueda loca que monta el tribot en su parte posterior.
Vamos a ver algunas imágenes del proceso de construcción.
Esta es la base
El lateral
Base ensamblada
Detalle de la parte trasera
Modelo completo
Es un modelo bastante grande y muy pesado cuyo tiempo de construcción se aleja bastante de los 30 minutos (teóricos) para construir el tribot. Para ser más concretos se tardaron 2 horas en terminar este primer robot de TETRIX. Puede también que parte de esa demora se deba a la adaptación al nuevo tipo de pieza. Aunque la verdad es que mientras lo estás montando lo único que piensas es en terminar y en verlo funcionar, ya que impresiona mucho. Más en vivo que en foto.
Programación del robot TETRIX
Para controlar los elementos de TETRIX hacemos uso del NXT, pero ahora tenemos electrónica nueva, con lo que no podremos programarlo de la forma habitual, necesitaremos hacer uso de las nuevas herramientas de programación adaptadas a este sistema.
Podéis descargar el bloque para NXT-G (descarga TETRIX), aunque este bloque sólo nos permite controlar los motores 12V que conectamos al Mindstorms a través del controlador HiTechnic, no nos permite controlar los servos.
Así que, si queremos hacer uso de todas las posibilidades de control, tendremos que programarlo con RobotC, que en su versión 2.x ya incluye soporte para TETRIX.
Para poder hacer uso de la plataforma TETRIX en RobotC, lo primero que debemos hacer es configurar el programa, para ello tendremos que ir a:
Robot-> Platform Type -> LEGO Mindstorms NXT+TETRIX
Una vez hecho esto tendremos que configurar los motores/servos/controladores, para ello RobotC tiene una herramienta que nos permite configurarlo gráficamente incluyendo directamente el código en nuestro programa.
Robot-> Motors and Sensors Setup
Y nos abrirá esta ventana
Aquí tendremos que configurar el puerto del controlador, los motores que tenemos conectados y los servos. Al aceptar la configuración, aparecerá en pantalla un código como este:
#pragma config(Hubs,S1,HTMotor,HTServo,none, none)
#pragma config(Sensor,S4,sonic,sensorSONAR)
#pragma config(Motor,mtr_S1_C1_1,motorD,tmotorNormal,openLoop)
#pragma config(Motor,mtr_S1_C1_2,motorE,tmotorNormal,openLoop,reversed)
#pragma config(Servo,srvo_S1_C2_1,servo1,tServoNormal)
/*!Code automatically generated by 'ROBOTC' configuration wizard!*/
NOTA: Atención a la nomenclatura necesaria para declarar los motores y sensores, aunque RobotC escriba el código por nosotros, no está de más saber qué hace.
mtr_S1_C1_2
Los controladores de motores HiTehcnic controlan 2 motores 12V DC y tienen entrada para 2 encoders. además tienen 2 entradas/salidas para la batería.
srvo_S1_C2_1
Los controladores de servos HiTechnic tienen 6 canales para servos y 2 entradas/salidas para la batería.
Una vez hecho esto ya podremos escribir el programa propiamente dicho. El ejemplo de programa que tenemos a continuación hace de nuestra mantis un Bump&Go algo más sofisticado, ya que no necesita chocar con los objetos, basta con que se encuentren a poca distancia de su sensor ultrasónico.
Para ser más exactos, cuando detecta un objeto a menos de 30 cm se para y lo amenaza haciendo subir y bajar sus patas delanteras hasta 3 veces, si el objeto se retira antes de completar el ciclo de 3 amenazas el robot seguirá su camino. Si por el contrario, el objeto no se aparta, la mantis dará la vuelta y seguirá avanzando hasta detectar otro obstáculo.
Aquí tenéis el código de este programa.
#pragma config(Hubs,S1,HTMotor,HTServo,none,none)
#pragma config(Sensor,S4,sonic,sensorSONAR)
#pragma config(Motor,mtr_S1_C1_1,motorD,tmotorNormal,openLoop)
#pragma config(Motor,mtr_S1_C1_2,motorE,tmotorNormal,openLoop,reversed)
#pragma config(Servo, srvo_S1_C2_1, servo1, tServoNormal)
/*!Code automatically generated by 'ROBOTC' configuration wizard!*/
task main()
{
int delta = 4;
int flag=0;
while (true) //Bucle infinito
{
while (flag<=1) // flag que controla cuantas veces repetimos el movimiento
{
while(SensorValue[sonic]>30) //Mientras que la distancia sea menor que 30 cm
{
motor[motorD]=40; // Avanzamos en línea recta
motor[motorE]=40;
}
motor[motorD]=0; // Paramos los motores
motor[motorE]=0;
wait1Msec(1000); // Esperamos 1 segundo
servoChangeRate[servo1] = delta;// servoChangeRate =nº de posiciones por actualización
if(ServoValue[servo1] < 80) //Si no hemos llegado a los 80º, nos movemos hasta alcanzarlos
{
while(ServoValue[servo1] < 80)
{
servo[servo1] = 80;
}
}
wait1Msec(1000); // Espera 1 segundo
if(ServoValue[servo1] >= 80) // Si hemos llegado a los 80º...
{
while(ServoValue[servo1] > 0)
{
servo[servo1] = 0; // ... nos movemos hasta 0
}
}
flag=flag+1; // flag nos permite controlar el nº de veces que repetimos
} // el movimiento del servo
motor[motorD]=20; // Giramos
motor[motorE]=-20;
wait1Msec(1000); // Esperamos 1 segundo
motor[motorD]=0; // Paramos los motores
motor[motorE]=0;
flag=0; // Reseteamos el valor de flag y como es un bucle infinito
} // nos movemos de nuevo en busca de otro objetivo
}
Y para que lo veáis en funcionamiento, un pequeño vídeo.