Reaali Robootika.COM

NXT robotimaailm ja programmeerimine C-keeles

Robotid kolmas osa

Noh mida siin veel rääkida peale selle, et mis robotid ma seekord tegin.

Seekord ma tegin “Explorer” robotid ehk “Maadeavastajad”. Ühe Exploreri tegin ainult kinni oleva sonariga ehk kaugus anduriga. Peale seda ma tegin ainult puuteanduriga. Kolmanda ma tegin mootoriga sonariga ja viimase tegin mootoriga sonariga ja puuteanduriga.
Esimese programm nägi välja selline:

task main(){
/*
DIRECTION muutuja abil määratakse kas robot
sõidab edasi või tagasi
DIRECTION = true: sõidab tagasi
DIRECTION = false: sõidab edasi
KAUGUS muutuja abil määrab robot kas peab 
tagasi sõitma
RAND muutuja abil määrab robot kas ta sõidab 
paremale või vasakule
*/
SetSensorLowspeed(S4);
bool DIRECTION;
int KAUGUS = 38;
int RAND;
while (true){
  if (SensorUS(S4) < KAUGUS){ //Kui robot näeb seina lähedamal
 kui 38 cm siis ta sõidab tagasi
    DIRECTION = true;
    if (DIRECTION){
      RAND = Random(2);
      switch (RAND)
      {
        case 0:               //Robot sõidab paremale
        RotateMotorEx(OUT_BC, 100, 332, -50, TRUE, TRUE);
        break;
        case 1:               //Robot sõidab vasakule
        RotateMotorEx(OUT_BC, 100, 332, 50, TRUE, TRUE);
        break;
        }
      }
    }
  else {
    DIRECTION = false;        //Muidu sõidab robot edasi
    OnRevSync(OUT_BC, 100, 0);
  }
}
}

 

Selle programmiga eriliselt raskusi e tulnud kuna ma sain abi oma ühest eelmisest programmist.

Nüüd tuleb siis teise roboti programm ehk ainult lülitiga:

task main(){
/*
muutuja DIRECTION määrab kas robot sõidab 
edasi või tagasi
muutuja RAND määrab suvaliselt kas robot 
pöörab tagurdades paremale või vasakule
*/
SetSensorTouch(S1);
bool DIRECTION;
int RAND;
while(true){
  if (Sensor(S1)== 1){
    DIRECTION = true;
    if(DIRECTION){
      RAND = Random(2);            //määratakse kummale poole 
sõidetakse kui tagurdatakse.
      switch (RAND)
      {
        case 0:                   //robot pöörab vasakule
        RotateMotorEx(OUT_BC, 100, 332, -50, TRUE, TRUE);
        break;
        case 1:                   //robot pöörab paremale
        RotateMotorEx(OUT_BC, 100, 332, 50, TRUE, TRUE);
        break;
        }
    }
  }
else {
     DIRECTION = false;           //robot sõidab edasi
     OnRevSync(OUT_BC, 100, 0);
     }
}
}

 

Selle programmiga mul ka erilisi raskusi ei tekkinud kuna jällegi sai kasutada eelneva programmi abi.
Minu kolmas programm oli siis pöörleva sonariga:

task main(){
SetSensorLowspeed(S4);
int VASAK; Selle muutujaga salvestan vasakule poole vaatamise kauguse
int PAREM; Selle muutujaga salvestan paremale poole vaatamise kauguse
while(true){
  if(SensorUS(S4) < 38){
  Off(OUT_BC);
    RotateMotor(OUT_A, 50, 90); robot vaatab vasakule
    VASAK = SensorUS(S4);
    RotateMotor(OUT_A, 50, -180); robot vaatab paremale
    PAREM = SensorUS(S4);
    RotateMotor(OUT_A, 50, 90); robot läheb omale kohale tagasi
    if(VASAK < PAREM){ kui vasakule vaatamise kaugus on väiksem kui 
paremale siis läheb robot paremale
      RotateMotorEx(OUT_BC, 50, -332, 50, TRUE, TRUE);
      }
    else{ kui vasak on suurem kui parem siis vasakule
      RotateMotorEx(OUT_BC, 50, -332, -50, TRUE, TRUE);
      }
    }
else{ muidu sõidab robot lihtsalt edasi
  OnRevSync(OUT_BC, 100, 0);
  }
}
}

 

Selle programmiga tekkisid mõned raskused näiteks kuidas salvestada sonari praegust näitu muutujasse.

Nüüd tuleb viimane programm mis ma tegin ehk liikuva sonari ja puuteanduriga see on umbes sama mis ainult liikuva sonariga ainult mõndades kohtades on lisatud juurde:

task main(){
SetSensorLowspeed(S4);
SetSensorTouch(S1);
int VASAK;
int PAREM;
while(true){
  if(SensorUS(S4) < 38 || Sensor(S1) == 1){
  Off(OUT_BC);
      if(Sensor(S1)==1){
        RotateMotor(OUT_BC, 50, 360);
      }
        RotateMotor(OUT_A, 50, 90);
        VASAK = SensorUS(S4);
        RotateMotor(OUT_A, 50, -180);
        PAREM = SensorUS(S4);
        RotateMotor(OUT_A, 50, 90);
        if(VASAK < PAREM){
          RotateMotorEx(OUT_BC, 50, -332, 50, TRUE, TRUE);
      }
      else{
        RotateMotorEx(OUT_BC, 50, -332, -50, TRUE, TRUE);
      }
    }
    else{
      OnRevSync(OUT_BC, 100, 0);
    }
}
}

 

Selle programmiga erilisi raskusi ei tekkinud ja sellele programmile ma filmisin ka video juurde:

Comments (1) -

  • Leivo

    1/27/2011 1:58:57 AM | Reply

    Selle esimese programmi juures võtsime välja DIRECTION muutuja.
    Ilmselt oli algselt mingi oluline põhjus selle kasutamisel, kuid praegu on see täitsa mõttetu. Sellega seoses saab ära võtta ka programmi seest ühe IF-lause
    DIRECTION = true;
        if (DIRECTION){ ...

Add comment

Loading