<< Zvukový senzor | Programování senzorů | >>

Zvětšit

Vlastnosti ultrazvukového senzoru

  • v senzoru je integrován vysílač a přijímač ultrazvuku
  • vysílač generuje UZ impulzy s frekvencí kolem 40 000 Hz
  • impulzy po odrazu na překážce zachycuje se zpožděním přijímač
  • ze zpoždění zachyceného impulzu je vyhodnocena digitálně vzdálenost překážky
  • vzdálenost je možné vyhodnocovat v centimetrech nebo palcích
  • UZ senzor je třeba připojovat na port 4, protože vyžaduje napájení 9V
  • problémem při detekci překážky je sklon odrazové plochy a pohltivost překážky
  • v nové verzi Lego EV3 HOME byl UZ senzor nahrazen IR senzorem a funguje navíc jako IR přijímač pro dálkové ovládání

Inicializace senzoru

Příklady programů s UZ senzorem

Zobrazení vzdálenosti od překážky

task main()
{
  SetSensorLowspeed(S4);                     //aktivace UZ senzoru na portu 4
  while(true)                                //trvalé opakování
  {
    NumOut(0, LCD_LINE1, SensorUS(S4), true);//výpis vzdálenosti z UZ senzoru
    Wait(100);                               //časová prodleva 0,1 s
  }
}

Robotický vysavač

#define Prekazka 25                     //Definice vzdálenosti pro detekci
#define Vzdalenost IN_4                 //Definice názvu pro port 4
task main(){
  SetSensorUltrasonic(Vzdalenost);      //Aktivace UZ senzoru
  while(true)
  {
    TextOut(0, LCD_LINE1, "Vzdalenost ", true); //Vypis textu
    NumOut(70, LCD_LINE1, SensorUS(IN_4));      //Vypis vzdalenosti v cm
    if(SensorUS(Vzdalenost) < Prekazka)         //Testování překážky
    {
       if(Random(2) == 0)                       //Volba náhodného směru
          {RotateMotorEx(OUT_BC, 40, 180, -100, true, false);}//Zatoč vlevo
       else
          {RotateMotorEx(OUT_BC, 40, 180, 100, true, false);} //Zatoč vpravo
    }
    else
       {OnFwd(OUT_BC, 80);}             //Pokračuj rovně
    Wait(100);                          //Prodleva před dalším testem
  }
}

Víceúlohové řízení pohybu s detekcí překážky

#define MIN 15 //cm                  //definice min. vzdálenosti 15 cm

mutex motor_mutex;                   //využití speciálního typu proměnné
                                     //pro sdílení motoru ve více úlohách
task test_prekazky()                 //podúloha pro monitorování překážky
{
   while(1)
   {
     if (SensorUS(S4) < MIN)         //monitorování min vzdálenosti
     {
        Acquire(motor_mutex);        //převzetí řízení motorů
        Off(OUT_BC);                 //zastavení motorů
        OnRev(OUT_C,40);             //couvnutí a natočení
        Wait(800);
        Release(motor_mutex);        //předání řízení motorů
     }
   }
}
task pohyb()                         //podúloha pro pohyb v přímém směru
{
   while(true)                       //trvalé opakování
   {
     Acquire(motor_mutex);           //převzetí řízení motorů
     OnFwd(OUT_BC,50);               //jízda v přímém směru vpřed
     Release(motor_mutex);           //předání řízení motorů
   }
}
task main()                          //hlavní úloha
{
   SetSensorLowspeed(S4);            //aktivace UZ senzoru na portu 4
   Precedes(test_prekazky, pohyb);   //souběžné spuštění podúloh
}