Skip to content

Latest commit

 

History

History
144 lines (115 loc) · 5.92 KB

programozas-1.md

File metadata and controls

144 lines (115 loc) · 5.92 KB
title layout
LEGO Tanfolyam: Programozás 1
default

LEGO Tanfolyam: Programozás 1

A környezetről

A tanfolyamalkalmak során a Bricx Command Centert használjuk az NXT programozására, ami céltudatosan különböző programozható LEGO termékekhez lett tervezve. A környezetről néhány fontos tudnivaló:

Alapesetben nem ismeri magyar billentyűzetkiosztással a ;-t, ami igazán kellemetlen. Ezen viszont egy makró beállításával könnyen lehet segíteni:

Felső menüpontokból View → Macro manager → Create, majd illeszük be a következő kódrészletet:

macro ;
    begin
    ecString ';'
end

Ezek után ha a makróhoz hozzárendeljük a pontosvesszőhöz tartozó billentyûkombinációt már tudunk is ;-t írni. Ahhoz, hogy a kódot le tudjuk fordítani, először egyszer el kell menteni, különben hibát dob a fordító. Szükséges szoftverek: NXT Phantom Driver, Bricx CC

Bevezetés

A programozáshoz az NXC (Not Exatly C) nyelvet használjuk ami hasonlít a C/C++-hoz:

  • Case-sensitive ("xYz" != "Xyz")
  • Változók (bool, char, unsigned int, mutex stb.)
  • Tömb (array)
  • Operátorok (!= , == , += stb.)
  • Struktúrák
    struct car {
      string car_type;
    };
    
    struct car civic;
    civic.car_type = "honda";
  • Nyelvi elemek (if, while, do, for, switch stb.)

Mivel a nyelv LEGO NXT termékek programozására lett létrehozva, ezért helyenként szükségszerûen különbözik is a C/C++-tól. Az első ilyen különbség amivel a tanfolyam során találkozhatunk az már a programunk vázában is látható. Az NXT maga taskokat futtat, emiatt a legegyszerûbb dologhoz is szükségünk van egyre. Alapértelmezésként ez a kiinduló task a "main" ami a kódban a következőképpen néz ki:

task main() {
  // futtatnivaló kód itt
}

Az NXT használatához fontos alapfüggvények

Szenzorok

Az NXT-nek 4 bemeneti portja van amire szenzorok köthetők, ezeket a programban a beépített IN_1, IN_2, IN_3 és IN_4 előre definiált konstansok segítségével lehet elérni.

Az egyes szenzorok használata előtt be kell állítanunk, hogy hol milyen szenzort szeretnénk használni, amihez a következő függvényeket lehet használni:

  • SetSensorTouch(port); – Nyomógomb inicializálása, argumentumban a port(IN_portszám formátumban) amire be van kötve.
  • SetSensorLowspeed(port); – Ultrahang szenzor inicializálása.
  • SetSensorColorFull(port); – RGB Szenzor inicializálása.

A szenzorok értékét a következő függvényekkel lehet visszakérni:

  • Sensor(port); – visszaadja az adott porton lévő szenzor értékét(nem ultrahang szenzorokra)
  • SensorUS(port); – visszaadja az adott porton lévő ultrahangszenzor értékét.

Mozgás

A motorok használatához az NXT 3 kimeneti portját használhatjuk amiket a programban a beépített OUT_A, OUT_B és OUT_C konstansok segítségével lehet kezelni. Sokszor lehetőség van egyszerre több kimeneti port használatára is, erre használható ezeknek a kombinációja. Ha például az A és C kimeneti portot szeretném használni, az OUT_AC segítségével ez megtehető.

A motorok kezelésére a következő függvények használhatók:

  • OnFwd(port, N); – A megadott porton/portokon lévő motort/motorokat előremenetbe állítja. N-ben az őket hajtó feszültséget (ezáltal a sebességet) lehet állítani %-ban (megj.: ez negatív is lehet)
  • OnRev(port, N); – A megadott porton/portokon lévő motort/motorokat hátramenetbe állítja. N-ben az őket hajtó feszültséget (ezáltal a sebességet) lehet állítani %-ban (megj.: ez negatív is lehet)
  • Off(port); – Kikapcsolja a motorokat.
  • OnFwdSync(port, sebesség, fordulás); – A megadott motorok szinkronizált mozgatárása használható. Az első két argumentum ugyanaz mint az OnFwd(...) esetében, a harmadik argumentumnak viszont megadható a motorok között szinkronizáció -100-tól 100-ig. Ez 0 érték esetén a motorok szinkrónizált egyirányba forgását, míg -100 vagy 100 esetén teljesen ellentétes forgást jelent.
  • OnRevSync(port, sebesség, fordulás); – Pont, mint az OnFwdSync(...), csak hátrafelé.

Egyéb függvények

  • Wait(idő); – Üresjárat megadott ideig (ms-ban).
  • NumOut(0, LCD_LINE1, X, FALSE); – Szám kiírása LCD-re (X változóban lehet a kiírandó szám).
  • TextOut(0, LCD_LINE2, "String", FALSE); – Szöveg kiírása LCD-re.
  • ClearScreen(); – Kijelző törlése.

Példák

Előremegy fél másodpercig, visszamegy fél másodpercig, és folyamatosan írja ki az ultrahang szenzor értékét (távolság).

task main() {
  // Ultrahang szenzor inicializálása
  SetSensorLowspeed(IN_1);
  // A és B portokon lévő motorokat előremenetbe kapcsolja
  OnFwd(OUT_AB, 60);
  // Fél másodpercet vár
  Wait(500);
  // Motorokat hátramenetbe kapcsolja
  OnRev(OUT_AB, 60);
  // Ismét vár
  Wait(500);
  // Kikapcsolja a motorokat
  Off(OUT_AB);
  // Végtelen ciklus
  while(1) {
    // Kiírja a távolságot
    NumOut(0, LCD_LINE1, SensorUS(IN_1), FALSE);
    // Kirja, hogy "Hello World"
    TextOut(0, LCD_LINE2, "Hello World", FALSE);
    // Vár 100ms-ot
    Wait(100);
    // Törli a kijelzőt
    ClearScreen();
  }
}

Megy, amíg meg nem nyomják a gombot, ha kék színt érzékel, akkor megfordul és megy tovább.

task main() {
  // Nyomógomb inicializálása
  SetSensorTouch(IN_3);
  // RGB szenzor inicializálása
  SetSensorColorFull(IN_2);
  // Amíg nincs benyomva a gomb, addig fut
  while(Sensor(IN_3) == 0) {
    // Megy előre
    OnFwd(OUT_AB, 60);
    // Ha kéket érzékel
    if(Sensor(IN_2) == 2) {
      // A porton lévő motor előre
      OnFwd(OUT_A, 50);
      // B hátra
      OnRev(OUT_B, 50);
      // Vár 2,9 másodpercet
      Wait(2900);
    }
  }
}