Professional Documents
Culture Documents
squadra: 8080BT
creatore: Ferrari Marco - Verona Diego
anno: 2010
progetto: robotcup rescue
scopo: realizzare un robot in grado di muoversi tra macerie e localizzare
il ferito e portarlo al sicuro
note:
------------------------------------------------------------------------------*/
//libreria
#include "NXCDefs.h"
#define NERO 48 //intensità del colore nero visto dai sensori light
#define BIANCO 60 //intensità del colore del pavimento visto dai sensori
light
#define ARGENTO 70 //intensità del colore argento visto dai sensori light
//Fwd indietro
//Rev avanti
//dichiarazione variabili
int comand_linea; //determina l'attivazione del task linea
int comand_vista; //determina l'attivazione del task vista
int comand_esplora; //determina l'attivazione del task esplorazione
int muro; //controlla se nella zona rossa gira verso destra o verso
sinistra
int num_parete; //controlla quando il robot deve cambiare direzione
nell'esplorazione
int i; //contatore linea argentata
//***************************************************************
//esegue i movimenti dritto > destra (evita ostacoli)
sub A(){
do{
j=j-1; //decremento j
dritto(); //vado dritto
Wait(3550); //durata movimento
}while(j==0) //ripeto finche j è uguale a zero
destra(); //giro a destra
Wait(1200); //durata movimento
}
//***********************************************************
//movimento del robot per evitare le pareti (zona rossa) (motore destro)
task paretea(){
for(;;){ //ciclo infinito
if(parete==1){ //se parete è uguale a uno (attivo il task)
if(muro==1){ //deve girare a destra
retromarcia(); //faccio
retromarcia
Wait(PAUSA_B); //durata
retromarcia
RotateMotor(MD, VEL_STERZO, ANGOLO); //ruoto il motore
destro indietro
Wait(PAUSA_C); //aspetto che il
motore giri
RotateMotor(MD, VEL_STERZO, -400); //ruoto il motore
destro in avanti
Wait(PAUSA_C); //aspetto che il
motore giri
RotateMotor(MD, VEL_STERZO, ANGOLO); //ruoto il motore
destro indietro
muro=0; //resetto la
variabile (alla prossima parete giro a sinistra)
}
else{ //deve girare a sinistra
retromarcia(); //faccio
retromarcia
Wait(PAUSA_B); //durata
retromarcia
RotateMotor(MD, VEL_STERZO, -ANGOLO); //ruoto il motore
destro in avanti
Wait(PAUSA_C); //aspetto che il
motore giri
RotateMotor(MD, VEL_STERZO, -400); //ruoto il motore
destro in avanti
Wait(PAUSA_C); //aspetto che il
motore giri
RotateMotor(MD, VEL_STERZO, -ANGOLO); //ruoto il motore
destro in avanti
muro=1; //setto la
variabile (alla prossima parete gira a destra)
}
}
}
}
//movimento del robot per evitare le pareti (zona rossa) (motore sinistro)
task pareteb(){
for(;;){ //ciclo infinito
if(parete==1){ //se parete è uguale a uno (attivo il task)
if(muro==1){ //devo girare a destra
Wait(PAUSA_B); //durata
retromarcia
RotateMotor(MS, VEL_STERZO, -ANGOLO); //ruoto il motore
sinistro in avanti
Wait(PAUSA_C); //aspetto che il
motore giri
RotateMotor(MS, VEL_STERZO, -400); //ruoto il motore
sinistro in avanti
Wait(PAUSA_C); //aspetto che il
motore giri
RotateMotor(MS, VEL_STERZO, -ANGOLO); //ruoto il motore
sinistro in avanti
muro=0; //resetto la
variabile (alla prossima parete giro a sinistra)
}
else{ //devo girare a sinistra
Wait(PAUSA_B); //durata
retromarcia (aspetto l'altro motore)
RotateMotor(MS, VEL_STERZO, ANGOLO); //ruoto il motore
sinistro indietro
Wait(PAUSA_C); //aspetto che il
motore giri
RotateMotor(MS, VEL_STERZO, -400); //ruoto il motore
sinistro in avanti
Wait(PAUSA_C); //aspetto che il
motore giri
RotateMotor(MS, VEL_STERZO, ANGOLO); //ruoto il motore
sinistro indietro
muro=1; //setto la
variabile (alla prossima parete gira a destra)
}
}
}
}
//*************************************
//movimento del robot per cambiare movimento di esplorazione (zona rossa) (motore destro)
task paretec(){
for(;;){ //ciclo infinito
if(parete_b==1){ //se parete_b è uguale a uno attivo il task
Wait(PAUSA_B); //pausa
RotateMotor(MD, VEL_STERZO, -600); //ruoto il motore
destro in avanti
Wait(PAUSA_C); //aspetto che il
motore giri
}
}
}
//movimento del robot per cambiare movimento di esplorazione (zona rossa) (motore
sinistro)
task pareted(){
for(;;){ //ciclo infinito
if(parete_b==1){ //se parete_b è uguale a uno attivo il task
Wait(PAUSA_B); //pausa
RotateMotor(MS, VEL_STERZO, 600); //ruoto il motore
sinistro indietro
Wait(PAUSA_C); //aspetto che il
motore giri
}
}
}
//*****************************************************************
//afferra vittima e la solleva
sub mano(){
OnFwd(MANO, VEL_MANO); //chiudi la mano e sollevala
Wait(PAUSA); //pasua, durata
}
//rilascia la vittima
sub rilascio(){
dritto(); //mi avvicino
Wait(PAUSA_B); //durata movimento
Off(MANO); //rilascio la vittima (spengo motore MANO)
OnRev(MANO, VEL_R_MANO); //apro la mano
Wait(PAUSA_C); //pasua, durata movimento
retromarcia(); //faccio retromarcia
Wait(PAUSA_C); //durata retromarcia
fine=1; //setto la variabile (compare la scritta "SALVATO")
fermo(); //mi fermo
retromarcia(); //faccio retromarcia
Wait(PAUSA_C); //durata retromarcia
fermo(); //mi fermo (spengo i motori cingoli)
Off(MANO); //spengo il motore della mano
suono(); //avviso
}
Wait(PAUSA_C); //pausa
Wait(PAUSA_C); //pausa
Wait(PAUSA_C); //pausa
//avvia i task
sub avvio(){
start controllo; //avvia task
start s_sinistra; //avvia task
start s_destra; //avvia task
start bussola; //avvia task
start vista; //avvia task
start variabili; //avvia task
start esplorazione; //avvia task
start paretea; //avvia task
start pareteb; //avvia task
start paretec; //avvia task
start pareted; //avvia task
start ostacolo; //avvia task
}
//task principale
task main(){
suono(); //emette un suono di
avvertimento
TextOut(DISTANZA_S,LCD_LINE1,"....START...."); //dai sul display una scritta
di segnalazione
settaggio(); //sottoprogramma che attiva i
sensori
reset_var(); //sottoprogramma che resetta le
variabili
Wait(PAUSA_B); //fai una pausa di durata
PAUSA_B
ClearScreen(); //pulisci schermo display
avvio(); //avvia task
}