Reaali Robootika.COM

NXT robotimaailm ja programmeerimine C-keeles

1. 9 klass 2 õppetundi Robot puldiauto

Tiigrihype_logoSee materjal on loodud Tiigrihüppe Sihtasutuse programmi ProgeTiiger raames.

Tee oma robotist puldiauto, mida saab juhtida lülitite abil. See projekt annab ülevaate, kuidas toimivad while-tsüklid ja if-tingimuslaused koos lülitite ja mootoritega erinevates kombinatsioonides.

 

Alustuseks vaatame erinevaid võimalikke lähenemisi puldiauto juhtimisele. Esimesed on lihtsamad ning järgmised muutuvad keerukamateks.

Ehitada tuleb tavaline baasrobot, mis on võimeline liikuma edasi-tagasi ja keerama paremale-vasakule. Sellele tuleb lisada kõige pikema juhtmega üks või kaks puuteandurit vastavalt ülesandele, mida kasutatakse roboti juhtimiseks.

1.       Puldiauto ühe lülitiga, 2 varianti.

a.        Robot liigub edasi, kui lüliti on vajutatud ning seisab, kui lüliti on lahti lastud.

b.       Robot hakkab liikuma, kui lüliti on alla vajutatud ja lahti lastud (bumped) ning jääb seisma, kui teist korda lüliti alla vajutatakse ja lahti lastakse.

2.       Puldiauto kahe lülitiga, 2 varianti.

a.        Kumbki lüliti juhib ühte mootorit. Lüliti lahti lastud asendis robot seisab, parempoolset lülitit vajutades keerab robot paremale ja vasakpoolsega vasakule. Mõlemat all hoides sõidab robot otse edasi.

b.       Robot hakkab edasi sõitma siis, kui mõlemad lülitid on korraga alla vajutatud ja lahti lastud (bumped). Üksikult kasutades toimivad lülitid roboti paremale-vasakule keeramise juhtimiseks. Teistkordsel üheaegsel vajutamisel (bumped) jääb robot seisma.

Puldiauto ühe lülitiga

Sellel ülesandel on kaks varianti, esimene hästi lihtne ning teine õige pisut keerulisem.

Variant 1. Robot liigub edasi, kui lüliti on vajutatud ning seisab, kui lüliti on lahti lastud.

Programmi käivitudes on esimene käsk SetSensorTouch, mis on vajalik lülitianduri initsialiseerimiseks, st. selle käsuga me ütleme robotile: „Sinu esimeses pordis asub lüliti andur“. Järgmisena käivitub lõpmatu while-tsükkel (lõpmatu, kuna selle tingimuseks on märgitud TRUE). Lõpmatu tsükli sees on if-else tingimuslause. If tingimus kontrollib, kas lüliti on alla vajutatud. Kui lüliti on alla vajutatud, siis käivitub edasisõitmine OnFwd, kui mitte, siis käivitub else ning mootorid lülitatakse välja.

Kuna tegemist on while-tsükliga, siis if-else lauset seal sees täidetakse 10 000 korda sekundis. See tagab, et robot igal juhul nö. märkab lüliti vajutamist ja meil pole võimalust öelda, et „robot ei jõudnud reageerida minu lüliti vajutusele“.


 

Näide. Lihtne puldiauto ühe lülitiga

task main()

{

  SetSensorTouch(S1);

  while(TRUE)

  {

    //kui lüliti on alla vajutatud, sõidab robot edasi

    //kui lüliti on lahti lastud, jääb robot seisma

    if (Sensor(S1))

      OnFwd(OUT_BC, 100);

    else

      Off(OUT_BC);

  }

}

Variant 2. Robot hakkab liikuma, kui lüliti on alla vajutatud ja lahti lastud (bumped) ning jääb seisma, kui lüliti teist korda alla vajutatakse ja lahti lastakse.

Selle programmi while-tsüklid käituvad eelmise variandiga võrreldes täiesti erinevalt. Alguses käivitub esimene lõpmatu while-tsükkel while(TRUE).  Järgmised kaks käsku on samuti while-tsüklid, mille tingimusena kontrollitakse lüliti asendit. Kui lüliti on lahti lastud (nagu alguses on), siis on koheselt käivitunud esimene tsükkel while(!Sensor(S1)), mis käib seni, kuni nupp on lahti lastud asendis. Täpselt nupu alla vajutamisel väljutakse sellest while-tsüklist, kuna nupu väärtus muutus true-ks, mis omakorda while-tsükli jaoks hüüumärgiga vastupidiseks muudeti. Käivitub teine while-tsükkel, millest programm väljub siis, kui kasutaja nupu lahti laseb.

Alles nüüd käivitub käsk, mis paneb mootorid liikuma ja roboti edasi sõitma. Kuna ükski käsk mootori sõitmist ei lõpeta, töötavad mootorid seni, kuni kasutaja on teist korda nupu alla vajutanud ja lahti lasknud, et käivituks käsk Off mootorite väljalülitamiseks.

Ja alles seejärel jõuab programm ringiga algusesse tagasi kõige esimesena käivitunud while-tsükli täitmisele.

Näide. Puldiauto koos bumped-lülitiga

task main()

{

  SetSensorTouch(S1);

  while(TRUE)

  {

    //programm ootab nupu vajutamist ja lahti laskmist

    while(!Sensor(S1));

    while(Sensor(S1));

    //robot sõidab edasi

    OnFwd(OUT_BC, 100);

    //programm ootab nupu vajutamist ja lahti laskmist

    while(!Sensor(S1));

    while(Sensor(S1));

    //robot jääb seisma

    Off(OUT_BC);

  }

}

Puldiauto kahe lülitiga

clip_image002[4]Sellel ülesandel on kaks varianti, esimene lihtsam ja teine veidi keerulisem.

Variant 1. Kumbki lüliti juhib ühte mootorit. Lahti lastud asendis robot seisab, parempoolset nuppu vajutades keerab robot paremale ja vasakpoolsega vasakule. Mõlemat all hoides sõidab robot otse edasi.

Järgnevalt on välja toodud selle roboti plokkskeem. Sellel skeemil tähendavad rombid while-tsükleid või if-lauseid ning ristkülikud tegevusi nagu näiteks mootorite liigutamine.

Siin on näha, et alguses käivitub lõpmatu while-tsükkel, mille sees on if-else-if-else tingimuslause.

Esimese if-tingimusega kontrollitakse, kas mõlemad lülitid on korraga vajutatud. Kui tingimus vastab tõele, siis robot sõidab otse edasi, kui mitte, siis minnakse kontrollima järgmist if-tingimust. Järgmises if-tingimuses kontrollitakse, kas lüliti 1 on vajutatud. Kui on, siis käivitub mootoritele käsk, et robot peab paremale pöörama. Sellele järgnevaid tingimusi eiratakse ning tsükkel jõuab uuesti algusesse tagasi ning kontrollib uuesti if-tingimust.

Kui esimene lüliti ei ole vajutatud, liigub programm edasi ja kontrollib järgmise else-if tingimusega, kas teine lüliti on vajutatud. Kui on, siis robot pöörab vasakule. Kui aga kumbki lüliti pole vajutatud, käivitub else-lause ja robot seiskab oma mootorid.

Näide. Robot kahe lülitiga

task main()

{

  SetSensorTouch(S1);

  SetSensorTouch(S2);

 

  while(TRUE)

  {

    //kui mõlemad lülitid korraga vajutatud, sõidab otse

    if (Sensor(S2) && Sensor(S2))

      OnFwd(OUT_BC, 50);

    //kui esimene lüliti vajutatud, keerab robot paremale

    else if (Sensor(S2))

      OnFwdSync(OUT_BC, 50, -10);

    //kui teine lüliti on vajutatud, keerab robot vasakule

    else if(Sensor(S1))

      OnFwdSync(OUT_BC, 50, 10);

    //kui lülitid pole vajutatud, sõidab robot otse

    else

      Off(OUT_BC);

  }

}

clip_image004[4]Variant 2. Robot hakkab edasi sõitma siis, kui mõlemad lülitid on korraga alla vajutatud ja lahti lastud. Üksikult kasutades toimivad lülitid paremale-vasakule keeramisena. Teistkordsel üheaegsel vajutamisel jääb robot seisma.

Pärast esimese lõpmatu tsükli käivitumist jääb programm järgmise while-tsükli sisse while(!Sensor(S1) && !Sensor(S2)). Tsükli tingimuseks on kaks lülitiandurit koos && märgiga, mis tähendab seda, et while-tsükkel peatub alles seejärel, kui mõlemad lülitid on korraga alla vajutatud. Seejärel käivitub järgmine while-tsükkel, mis ootab, kuni mõlemad lülitid on lahti lastud.

Seejärel käivitub while-tsükkel, mille tingimuseks on uuesti nende lülitite olek, kuid selle while-tsükli sees asuvad ka paremale-vasakule-otse sõitmise if-else-tingimuslaused.

Siinkohal toimib see programm täpselt samamoodi nagu esimene variant kahe lülitiga robotist.

Kui mõlemad lülitid on korraga alla vajutatud, muutub selle while-tsükli tingimus mittetõeseks ning väljutakse tsüklist. Mootorid seisatakse ja programmis käivitub viimane while-tsükkel, mille sees omakorda uuesti kontrollitakse nende kahe lüliti olekut ja oodatakse, kuni kasutaja need lahti laseb.

See viimane kontroll on vajalik selleks, et programm ei suunduks koheselt järgmisele ringile, vaid ootaks enne ära nuppude lahtilaskmise.

Näide. Robot kahe lülitiga ja bumped funktsiooniga

task main()

{

  SetSensorTouch(S1);

  SetSensorTouch(S2);

  while(TRUE)

  {

    //programm ootab vajutust

    while(!Sensor(S1) && !Sensor(S2));

    //programm ootab nupu lahti laskmist

    while(Sensor(S1) && Sensor(S2));

   

    //kui mõlemad nupud koos vajutatud,

    //väljutakse while-tsüklist

    while(!Sensor(S1) || !Sensor(S2))

    {

      //kui esimene lüliti on vajutatud, keerab paremale

      if (Sensor(S2))

        OnFwdSync(OUT_BC, 50, -10);

      //kui teine lüliti on vajutatud, keerab vasakule

      else if(Sensor(S1))

        OnFwdSync(OUT_BC, 50, 10);

      //kui lülitid pole vajutatud, sõidab robot otse

      else

        OnFwd(OUT_BC, 50);

    }

    //pärast while tsüklist väljumist seisatakse mootorid

    Off(OUT_BC);

    //programm ootab nupu lahti laskmist, see on vajalik,

    //et programm ei suunduks automaatselt uuele ringile

    while(Sensor(S1) && Sensor(S2));

  }

}

Add comment

Loading