Labo 1
Labo 1
Labo 1
LABORATORIO NRO: 1
PROGRAMACION DE ROBOTS
1. COMPETENCIA(S) A DESARROLLAR
2. MARCO TEORICO
ROBOTS LEGO
LEGO Mindstorms NXT es un set programable fabricado por LEGO en julio de 2006.
Este set reemplazó a la primera versión de Lego Mindstorms RCX. Dicho aparato
tiene dos versiones, la versión comercial (set#8527) y la versión educativa (set
#9797). El set viene con el programa NXT-G u opcionalmente con el programa de
LabVIEW para Lego Mindstorms. Una nueva versión del NXT salió en 2009, llamada
Lego Mindstorms NXT 2.0, la cual incluía un sensor de color y algunas otras mejoras.
Más tarde salió un nuevo modelo llamado EV3, el último a la fecha (2018).
SENSOR DE TACTO
SENSOR DE SONIDO
SENSOR DE LUZ
SENSOR ULTRASÓNICO
SENSORES OPCIONALES
Sensor Brújula
Le permite al robot saber hacia dónde está apuntando. Este sensor es capaz de medir
el campo magnético terrestre y calcular donde está el norte magnético. Se visualiza
la lectura en grados de 0 a 359º
Sensor de color
Le permite al robot ver colores. No solo blanco y negro, este es un sensor capaz de
distinguir colores reales.
Los nombres de sensores pueden ser usados en cualquier función que requiera el
puerto del sensor como argumento, estos nombres de constantes son IN_1, IN_2,
IN_3 e IN_4. Cuando se necesita adquirir los valores de los sensores se utiliza las
siguientes constantes: SENSOR_1, SENSOR_2, SENSOR_3 y SENSOR_4. Estos
LABORATORIO DE ROBOTICA - INFORME
nombres pueden además ser usados siempre que un programa desea leer el valor
actual del sensor analógico, por ejemplo:
x= SENSOR_1; // lee sensor y almacena en x el valor
Entre algunas funciones importantes sobre el control del sensor tenemos las
siguientes:
void SetSensorType (const byte &port, byte type). Fija el tipo de sensor.
void SetSensorMode (const byte &port, byte mode). Fija el modo del sensor.
void ClearSensor (const byte &port). Limpia el valor del sensor.
void ResetSensor (const byte &port). Reinicia el puerto del sensor.
void SetSensor (const byte &port, const unsigned int config). Fija la configuración del
sensor.
void SetSensorTouch (const byte &port). Configura el sensor de tacto.
void SetSensorLight (const byte &port, bool bActive=true). Configura el sensor de
luz.
void SetSensorUltrasonic (const byte &port). Configura un sensor ultrasonico.
void SetSensorEMeter (const byte &port). Configura un sensor EMeter.
void SetSensorTemperature (const byte &port). Configura un sensor de temperatura.
void SetSensorColorFull (const byte &port). Configura un sensor NXT 2.0 a todo
color.
void SetSensorColorRed (const byte &port). Configura un sensor NXT 2.0 de luz roja.
void SetSensorColorGreen (const byte &port). Configura un sensor NXT 2.0 de luz
verde.
void SetSensorColorBlue (const byte &port). Configura un sensor NXT 2.0 de luz
azul.
void SetSensorColorNone (const byte &port). Configura un sensor NXT 2.0 sin luz.
variant GetInput (const byte &port, const byte field). Obtiene un valor del campo de
entrada.
void SetInput (const byte &port, const int field, variant value). Fija un valor del campo
de
entrada.
unsigned int Sensor(const byte &port). Lee el valor de escala del sensor.
bool SensorBoolean (const byte port). Lee el valor booleano del sensor.
byte SensorDigiPinsDirection (const byte port). Lee la dirección del sensor pins
digital.
byte SensorDigiPinsOutputLevel (const byte port). Lee el nivel de salida del sensor
pins digital.
byte SensorDigiPinsStatus (const byte port). Lee el estado del sensor pins digital.
bool SensorInvalid (const byte &port). Lee el sensor de bandera de datos no valido.
byte SensorMode (const byte &port). Lee el modo del sensor.
LABORATORIO DE ROBOTICA - INFORME
3. MATERIALES
//Programa 1
task main()
{
OnFwd(OUT_A, 75); //Motor conectado a la salida A en el NXT,
para avanzar, con velocidad al 75% de la velocidad máxima.
OnFwd(OUT_C, 75); //Ambos motores están en marcha, y el robot
se mueve hacia adelante.
Wait(4000); //Robot avanza por 4 segundos
OnRev(OUT_AC, 75); //Robot se mueve en reversa
Wait(4000); //Se mueve en reversa por 4 segundos
Off(OUT_AC); //El robot se detiene completamente
}
//Programa 2
#define TIEMPO_MOVIMIENTO 1000
#define TIEMPO_GIRO 360
task main()
{
OnFwd(OUT_AC, 75); //Robot va hacia delante.
Wait(TIEMPO_MOVIMIENTO); // Se mueve hacia adelante por 1s.
OnRev(OUT_C, 75); //Gira a la derecha
Wait(TIEMPO_GIRO); //Gira por 0.36 s para rotar 90 grados
Off(OUT_AC); //Apaga motores
}
//Programa 3
#define TIEMPO_GIRO 360
int TIEMPO_MOVIMIENTO; // define una variable
task main()
{
TIEMPO_MOVIMIENTO = 200; // asigna el valor inicial
repeat(50) // Repite por 50 veces
{
OnFwd(OUT_AC, 75); // avanza hacia adelante
Wait(TIEMPO_MOVIMIENTO); // usa la variable para esperar
OnRev(OUT_C, 75); // Gira a la derecha a 90 grados
Wait(TIEMPO_GIRO);
TIEMPO_MOVIMIENTO += 200; // incrementa la variable
LABORATORIO DE ROBOTICA - INFORME
}
Off(OUT_AC); //después de repetir 50 veces, se detiene
}
//Programa 4
#define TIEMPO_MOVIMIENTO 500
#define TIEMPO_GIRO 360
task main()
{
while(true)
{
OnFwd(OUT_AC, 75); // avanza hacia adelante por un tiempo mov
Wait(TIEMPO_MOVIMIENTO);
if (Random() >= 0) //Si el numero random generado por el
programa es mayor a cero, el robot gira a la derecha.
{
OnRev(OUT_C, 75);
}
else //Si el numero random generado por el
programa es menor a cero, el robot gira a la izquierda.
{
OnRev(OUT_A, 75);
}
Wait(TIEMPO_GIRO);
}
}
//Programa 5
Int TIEMPO_MOVIMIENTO, TIEMPO_GIRO, tiempo_total;
task main()
{
tiempo_total = 0;
do
{
TIEMPO_MOVIMIENTO = Random(1000); //escoge de 0 a 1000 aleatorio
TIEMPO_GIRO = Random(1000); //escoge de 0 a 1000 aleatorio
OnFwd(OUT_AC, 75); //avanza hacia delante por t_mov
Wait(TIEMPO_MOVIMIENTO);
OnRev(OUT_C, 75); //gira derecha por t_giro
Wait(TIEMPO_GIRO);
tiempo_total += TIEMPO_MOVIMIENTO; //suma t_mov a t_total
tiempo_total += TIEMPO_GIRO; //suma t_giro a t_total
}
while (tiempo_total < 20000); //Mientras t_total sea < 20 s
hace toda la tarea.
Off(OUT_AC);
}
LABORATORIO DE ROBOTICA - INFORME
//Programa 6
#define UMBRAL 40
task main()
{
SetSensorLight(IN_1); //Mide valor de sensor de luz
OnFwd(OUT_AC, 75); //avanza hacia adelante
while (true)
{
if (Sensor(IN_1) > UMBRAL) //si valor de luz es mayor a
umbral, gira a la derecha, espera y a menos que el valor sea menor
al umbral, avanza hacia adelante.
{
OnRev(OUT_C, 75);
Wait(100);
until(Sensor(IN_1) <= UMBRAL);
OnFwd(OUT_AC, 75);
}
}
}
//Programa 7
#define CERCA 15 //cm
task main()
{
SetSensorLowspeed(IN_4); //mide valor ultrasonido en cm
while(true)
{
OnFwd(OUT_AC,50); //avanza adelante
while(SensorUS(IN_4)> CERCA); //si valor ultrasonido es mayor a
15 cm, apaga motores y va reversa.
Off(OUT_AC);
OnRev(OUT_C,100);
Wait(800);
}
}
//Programa 8
task main()
{
OnFwd(OUT_AC, 75); //va adelante 5 s
Wait(5000);
Off(OUT_C);
OnFwd(OUT_A, 75); //gira a la izquierda 0.5 s
Wait(500);
OnFwd(OUT_AC, 75); //sigue adelante por 3 s.
Wait(3000);
LABORATORIO DE ROBOTICA - INFORME
Off(OUT_A);
OnFwd(OUT_C, 75); //gira a la derecho por medio Segundo.
Wait(500);
OnFwd(OUT_AC, 75); //sigue adelante por 5 segundos.
Wait(5000);
}
5. TABLAS Y RESULTADOS
En la presente práctica, solo se tenía que comprobar que los programas funcionasen.
Para lo cual todos los programas funcionaron correctamente.
Los programas en NXC consisten en tareas. Los programas tienen una sola tarea,
llamada main, cada programa necesita tener una tarea llamada main que es la que
ejecutará el robot. Una tarea consiste en una serie de comandos, también llamados
declaraciones. Hay corchetes alrededor de las afirmaciones de tal manera que quede
claro que todos pertenecen a esta tarea. Cada declaración termina con un punto y
coma. De esta manera queda claro donde termina una declaración y donde comienza
la siguiente declaración.
Para el programa 1
Básicamente, el robot se mueve hacia adelante por 4 segundos y hacia atrás por
cuatro segundos, volviendo a su posición inicial y se detiene.
Para el programa 2
El robot se mueve hacia delante por 1 segundo, luego activa el motor C para girar a
la derecha, gira por 0.36 s y se detiene.
LABORATORIO DE ROBOTICA - INFORME
Para el programa 3
El robot se mueve hacia delante por 200 ms inicialmente, luego activa el motor C para
girar a la derecha, rotando 90 grados, luego vuelve a repetir la tarea, pero
incrementando la distancia del movimiento hacia adelante, hace esto unas 50 veces
y se detiene.
Para el programa 4
El robot se mueve hacia delante por 0.5 segundos, luego activa el motor C para girar
a la derecha si es que el número random es mayor a 0, caso contrario, gira a la
izquierda.
Para el programa 5
El robot se mueve hacia delante por un tiempo aleatorio, y gira por un tiempo
aleatorio, estos tiempos son sumados en un variable tiempo total, mientras tiempo
total sea < 20 s hace toda la tarea.
Para el programa 6
El robot se mueve hacia delante por y mide valor del sensor de luz, si valor de luz es
mayor a umbral, gira a la derecha, espera y a menos que el valor sea menor al umbral,
avanza hacia adelante.
Para el programa 7
El robot se mueve hacia delante por y mide valor del sensor de ultrasonido, si valor
de ultrasonido es mayor a umbral, apaga los motores y va en reversa.
Para el programa 8
El robot se mueve hacia delante por 5 segundos, gira a la izquierda, sigue adelante
por 3 segundos y gira a la derecha y avanza por 5 segundos.
6. CUESTIONARIO
task main() este línea siempre tiene que estar presente en nuestros programas.
SetSensorTouch indica que vamos a hacer uso del Sensor de tacto e indica en
qué puerto está conectado este sensor: (IN_1)
OnFwd indica que el robot irá hacia adelante y hará uso de los motores A y C
(OUT_AC) y con una potencia de 75.
LABORATORIO DE ROBOTICA - INFORME
7. CONCLUSIONES