Proyecto "La Rampla"
Alumno: Remigio Valdebenito
Competencia: Desarrollo de Software
Asignatura: Proyecto de Robotica
Alumno: Remigio Valdebenito
Competencia: Desarrollo de Software
Asignatura: Proyecto de Robotica
El robot debe realizar la subida de una rampla, comienza siguiendo la línea verde hasta llegar a la intersección donde debe leer el color negro y activar sus sensores de tacto y continuar el recorrido solo con el choque de los tactos. Cuando llega a otra línea negra debe continuar con la búsqueda del verde. Al momento de llegar a la última línea negra, la cima de la rampla, el robot debe girar en 180º emitir una música y quedar en posición de descenso.
Solución:
Para
poder cumplir con la pista que se nos presentó llamada “La Rampla” fue
indispensable tener 2 sensores de Tactos y 1 sensor de luz. Se nos complicó en
un principio con la estructura del Robot, ya que era muy ancho pero luego lo compactamos un poco y quedó en un
aspecto más acorde a la Pista, igual
hubieron algunos fallos pero fue netamente por la empinación de las
subidas. Utilizamos un contador para las líneas negras, dentro de While, en si
el código no fue tan complejo, si hubieron muchas pruebas y error, pero se
logró cumplir con la Tarea.
El robot debe realizar la subida de una rampla, comienza siguiendo la línea verde hasta llegar a la intersección donde debe leer el color negro y activar sus sensores de tacto y continuar el recorrido solo con el choque de los tactos. Cuando llega a otra línea negra debe continuar con la búsqueda del verde. Al momento de llegar a la última línea negra, la cima de la rampla, el robot debe girar en 180º emitir una música y quedar en posición de descenso.
Solución:
Para
poder cumplir con la pista que se nos presentó llamada “La Rampla” fue
indispensable tener 2 sensores de Tactos y 1 sensor de luz. Se nos complicó en
un principio con la estructura del Robot, ya que era muy ancho pero luego lo compactamos un poco y quedó en un
aspecto más acorde a la Pista, igual
hubieron algunos fallos pero fue netamente por la empinación de las
subidas. Utilizamos un contador para las líneas negras, dentro de While, en si
el código no fue tan complejo, si hubieron muchas pruebas y error, pero se
logró cumplir con la Tarea.
sub fwd_light()
{
si(sensor_1 >= blanco)
{
apaga motores;
avanza c;
gira a;
//segundo giro en caso de no estar en linea verde
si(sensor_1 >= blanco)
{
apaga motores
avanza c;
gira a;
}
}
}
sub fwd_touch()
{
si(sensor_3 == 1)
{
gira ac;
espera 10 centesimas;
avanza a;
espera 30 centesimas;
}
}
task main()
{
establecer potencias a los motores;
encender sensor1_light;
encender sensor2_touch;
encender sensor3_touch;
//inicia contador linea negra
count=0;
cuando(true)
{
avanza ac;
si(count modulo 2 = 0)
{
//luz
llama fwd_light();
}si no
{
// tacto
llama fwd_touch();
}
si (sensor_1 <= negro)
{
// Avance y giro
sonido;
espera 20 centesimas;
avanza ac;
espera 1 segundo y 30 centesimas;
gira c;
espera 80 centesimas;
apaga motores;
espera 1 segundo;
// aumento contador
count++;
// giro 360
si (count == 7)
{
// HACER GIRO
avanza c;
gira a;
espera 2 seg. y 30 centesimas;
apaga motores;
musica;
break;
}
} // /negro
} // /while
} // /main
{
si(sensor_1 >= blanco)
{
apaga motores;
avanza c;
gira a;
//segundo giro en caso de no estar en linea verde
si(sensor_1 >= blanco)
{
apaga motores
avanza c;
gira a;
}
}
}
sub fwd_touch()
{
si(sensor_3 == 1)
{
gira ac;
espera 10 centesimas;
avanza a;
espera 30 centesimas;
}
}
task main()
{
establecer potencias a los motores;
encender sensor1_light;
encender sensor2_touch;
encender sensor3_touch;
//inicia contador linea negra
count=0;
cuando(true)
{
avanza ac;
si(count modulo 2 = 0)
{
//luz
llama fwd_light();
}si no
{
// tacto
llama fwd_touch();
}
si (sensor_1 <= negro)
{
// Avance y giro
sonido;
espera 20 centesimas;
avanza ac;
espera 1 segundo y 30 centesimas;
gira c;
espera 80 centesimas;
apaga motores;
espera 1 segundo;
// aumento contador
count++;
// giro 360
si (count == 7)
{
// HACER GIRO
avanza c;
gira a;
espera 2 seg. y 30 centesimas;
apaga motores;
musica;
break;
}
} // /negro
} // /while
} // /main
Código:
Código Fuente:
#define NEGRO 39
#define VERDE 46
#define BLANCO 51
#define AVANCE 8
#define GIRO 8
#define GIRO_R 10
// Avance del robot
sub fwd_light() {
if (SENSOR_1 >= BLANCO) {
Off(OUT_AC);
OnFwd(OUT_C); OnRev(OUT_A);
Wait(GIRO);
// segundo giro en caso de no estar
// en la linea verde
if (SENSOR_1 >= BLANCO) {
Off(OUT_AC);
OnFwd(OUT_A); OnRev(OUT_C);
Wait(GIRO_R);
}
}
} // /fwd_touch
sub fwd_touch() {
if (SENSOR_3 == 1) {
OnRev(OUT_AC); Wait(10);
OnFwd(OUT_C); Wait(30);
}
if (SENSOR_2 == 1) {
OnRev(OUT_AC); Wait(10);
OnFwd(OUT_A); Wait(30);
}
} // /fwd_touch
task main() {
// Power
SetPower(OUT_A, 5);
SetPower(OUT_C, 6);
// Sensors
SetSensor(SENSOR_1, SENSOR_LIGHT);
SetSensor(SENSOR_2, SENSOR_TOUCH);
SetSensor(SENSOR_3, SENSOR_TOUCH);
// Variable que contara la cantidad de veces que
// el robot pasa por una linea negra.
int count = 0;
while (true) {
OnFwd(OUT_AC);
// if % 2 == 0 => Tacto
// else Luz
if (count % 2 == 0) {
// luz
fwd_light();
}
else {
// tacto
fwd_touch();
}
if (SENSOR_1 <= NEGRO) {
// Avance y giro
// sonido
PlaySound(3); Wait(20);
OnFwd(OUT_AC); Wait(130);
OnRev(OUT_C); Wait(80);
// espera 1 seg
Off(OUT_AC); Wait(100);
// aumento contador
count++;
// giro 360
if (count == 7) {
// HACER GIRO !!
OnFwd(OUT_C);
OnRev(OUT_A); Wait(230);
Off(OUT_AC);
PlayTone(262,40); Wait(50);
PlayTone(294,40); Wait(50);
PlayTone(330,40); Wait(50);
PlayTone(294,40); Wait(50);
PlayTone(262,160); Wait(200);
break;
}
} // /negro
} // /while
} // /main
Cabe destacar que los // sirven para comentar cada código.
Como podemos ver, hay distintos tipos de instrucciones echas en nuestro código, tales como el PlayTone (realiza un sonido), OnFwd(anvanza con cierto motor), OnRev(retrocede con cierto motor), tambien hay convinaciones como la siguiente que es para que el robot gire OnFwd(OUT_A); OnRev(OUT_C); .
Como dicen por ahí, una imagen vale mas que mil palabras así que presentaré un vídeo de este proyecto.
Código Fuente:
#define NEGRO 39
#define VERDE 46
#define BLANCO 51
#define AVANCE 8
#define GIRO 8
#define GIRO_R 10
// Avance del robot
sub fwd_light() {
if (SENSOR_1 >= BLANCO) {
Off(OUT_AC);
OnFwd(OUT_C); OnRev(OUT_A);
Wait(GIRO);
// segundo giro en caso de no estar
// en la linea verde
if (SENSOR_1 >= BLANCO) {
Off(OUT_AC);
OnFwd(OUT_A); OnRev(OUT_C);
Wait(GIRO_R);
}
}
} // /fwd_touch
sub fwd_touch() {
if (SENSOR_3 == 1) {
OnRev(OUT_AC); Wait(10);
OnFwd(OUT_C); Wait(30);
}
if (SENSOR_2 == 1) {
OnRev(OUT_AC); Wait(10);
OnFwd(OUT_A); Wait(30);
}
} // /fwd_touch
task main() {
// Power
SetPower(OUT_A, 5);
SetPower(OUT_C, 6);
// Sensors
SetSensor(SENSOR_1, SENSOR_LIGHT);
SetSensor(SENSOR_2, SENSOR_TOUCH);
SetSensor(SENSOR_3, SENSOR_TOUCH);
// Variable que contara la cantidad de veces que
// el robot pasa por una linea negra.
int count = 0;
while (true) {
OnFwd(OUT_AC);
// if % 2 == 0 => Tacto
// else Luz
if (count % 2 == 0) {
// luz
fwd_light();
}
else {
// tacto
fwd_touch();
}
if (SENSOR_1 <= NEGRO) {
// Avance y giro
// sonido
PlaySound(3); Wait(20);
OnFwd(OUT_AC); Wait(130);
OnRev(OUT_C); Wait(80);
// espera 1 seg
Off(OUT_AC); Wait(100);
// aumento contador
count++;
// giro 360
if (count == 7) {
// HACER GIRO !!
OnFwd(OUT_C);
OnRev(OUT_A); Wait(230);
Off(OUT_AC);
PlayTone(262,40); Wait(50);
PlayTone(294,40); Wait(50);
PlayTone(330,40); Wait(50);
PlayTone(294,40); Wait(50);
PlayTone(262,160); Wait(200);
break;
}
} // /negro
} // /while
} // /main
Cabe destacar que los // sirven para comentar cada código.
Como podemos ver, hay distintos tipos de instrucciones echas en nuestro código, tales como el PlayTone (realiza un sonido), OnFwd(anvanza con cierto motor), OnRev(retrocede con cierto motor), tambien hay convinaciones como la siguiente que es para que el robot gire OnFwd(OUT_A); OnRev(OUT_C); .
Como dicen por ahí, una imagen vale mas que mil palabras así que presentaré un vídeo de este proyecto.
