<< Zvukový senzor | Programování senzorů | >>
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
- SetSensorUltrasonic(Port) -
SetSensorUltrasonic(S4); - SetSensorLowspeed(Port, Zdroj) -
SetSensorSound(S4);
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
}
