<< 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 }