LEGO Mindstorms 2011
Transkrypt
LEGO Mindstorms 2011
Obsługa czujników w leJOS Krzysztof Szarzyński – [email protected] Andrzej Wójtowicz – [email protected] Każdy robot musi jakoś poznawać świat. NXT udostępnia cztery porty do których można podłączyć sensory. Porty numerowane są od 1 do 4. Zazwyczaj skrótowo opisuje się je jako S1, S2, S3 i S4. Czasami do portów podłącza się też zaawansowane urządzenia. W podstawowym zestawie NXT dostępne jest pięć czujników: ◦ ◦ ◦ ◦ Ultrasonic – czujnik odległości Light – czujnik natężenia światła Sound – czujnik natężenia dźwięku Touch – czujnik dotyku (dwie sztuki) W NXT2.0 dodano czujnik koloru, który potrafi rozróżnić do 15 różnych kolorów. Są to bardzo proste czujniki! Przez co mało dokładne. ◦ Ale skuteczne! Lego sprzedaje też kilka innych dodatkowych czujników: ◦ Compass Sensor ◦ Accelerometer Sensor ◦ RF ID Sensor Prostota interfejsu I2C sprawiła, że wiele innych firm (często amatorskich) produkuje własne czujniki. Dwie największe to HiTechnic i Mindsensors. Angle Sensor Acceleration / Tilt Sensor Barometric Sensor Electro Optical Proximity Detector Sensor Gyro Sensor IRLink / IRReceiver Sensor Compass Sensor Magnetic Sensor IRSeeker http://www.hitechnic.com/ NXTCam Line Sensor Realtime Clock High Precision Short/Medium/Long Range IR distance Sensor Pneumatic Pressure Sensor Power Meter Sensor Multi-Sensivity Acceleration Sensor Sony PlayStation 2 Controller interface Touch Panel Numeric Pad http://mindsensors.com/ leJOS API wystawia klasy do obsługi podstawowych, a także niektórych zaawansowanych czujników. W przypadku nietypowych sensorów można napisać własną klasę komunikującą się za pomocą portu I2C. Jak to działa? ◦ Tworzymy zmienną typu czujnika, którego chcemy użyć: TouchSensor touch; ◦ Tworzymy nowy obiekt tego typu, w konstruktorze podajemy port pod jaki jest podpięty: touch = new TouchSensor(SensorPort.S1); ◦ Korzystamy z metod wystawionych przez obiekt, wywołując je na naszej zmiennej: while(!touch.isPressed()); Odpowiada za czujnik dotyku. Udostępnia metodę: ◦ boolean isPressed() Która zwraca czy przycisk jest wciśnięty czy nie. Tyle… import lejos.nxt.*; public class TouchExample { public static void main(String[] args) { TouchSensor touch; touch = new TouchSensor(SensorPort.S1); while(!touch.isPressed()) { // do nothing } System.out.println("Button pressed!"); } } Obsługuje ultradźwiękowy czujnik odległości. Czujnik jest dokładny… ◦ … choć tylko w wąskim zakresie ◦ … i pod odpowiednim kątem. Ma kilka trybów pracy: ◦ ping – pojedynczy impuls ◦ continous – ciągłe wysyłanie impulsów ◦ capture – zbieranie impulsów z innych czujników Aby pobrać odległość należy wywołać ◦ int getDistance(); import lejos.nxt.*; public class USExample { public static void main(String[] args) { UltrasonicSensor us; us= new UltrasonicSensor(SensorPort.S2); while(!Button.ESCAPE.isPressed()) { int distance = us.getDistance(); if (distance<30) { Sound.beep(); } } } } Obsługuje czujnik natżenia światła. Czujnik zwraca wartości z zakresu: Czujnik działa w dwóch trybach: Klasa wystawia metody: ◦ 0 – ciemność ◦ 100 – białe światło ◦ Aktywnym – z pomocą czerwonej diody. ◦ Pasywnym – jasność otoczenia. ◦ int getLightValue(); - odczyt wartości ◦ boolean isFloodLightOn(); - czy czujnik działa w trybie aktywnym ◦ void setFloodlight(boolean active); - zmienia tryb pracy czujnika active == true; - tryb aktywny active == false; - tryb pasywny import lejos.nxt.*; public class LightExample { public static void main(String[] args) { LightSensor light; light = new LightSensor(SensorPort.S3); while(!Button.ESCAPE.isPressed()) { int value = light.getLightValue(); LCD.drawInt(value, 0,0); if (Button.RIGHT.isPressed()) { boolean act = light.isFloodlightOn(); light.setFloodlight(!act); } } } } Obsługuje czujnik nateżenia dźwięku. Czujnik zwraca natężenie w decybelach. Obsługuje dwa tryby wartości: ◦ DB – logarytmiczna skala dB. ◦ DBA – ważona skala dB (za pomocą krzywej typu A). Udostępnia dwie metody: ◦ int readValue(); ◦ void setDBA(boolean dba); dba == true – przejście na tryb DBA; dba == false – przejście na tryb DB; import lejos.nxt.*; public class SoundExample { public static void main(String[] args) { SoundSensor sound = new SoundSensor(SensorPort.S4); while(!Button.ESCAPE.isPressed()) { int value = sound.readValue(); LCD.drawInt(value, 0,0); } } } Wyprodukowana przez firmę Mindsensors. Programujemy za pomocą połączenia USB. Używamy przez port czujników. Potrafi śledzić obiekty. ◦ Rozpoznaje je po kolorze ◦ Identyfikuje ich maksymalnie 8. Posiada dwa główne tryby: ◦ Śledzenie obiektów ◦ Śledzenie linii Na stanie koła są dwie kamerki v2. Jest też dostępna wersja v3. ◦ Dodano możliwość pisania własnego oprogramowania. Od około miesiąca dostępna jest też v4! Zapytaliśmy producenta jakie nowości wprowadził. Otrzymaliśmy maila… We are continually improving our products, and this is one of the results of that effort. Physically, the NXTCam-v4 uses improved materials, it has better form factor and improved appearance. Internally it is designed for simplified and more efficient manufacturing. There is no change at the API interface and all the existing software and libraries are compatible with this model. Regards. Podłączamy kamerę za pomocą kabla USB do komputera ◦ Sterowniki i instrukcje dostępne są na stronie producenta www.mindsensors.com Programujemy kolory i tryb w jakim ma pracować kamera. ◦ Używamy programu NXTCam View ◦ Pobieramy obraz z kamery. Testujemy kamerę na sucho Podłączamy kamerkę do robota. ◦ NXTCam View daje możliwość przetestowania tego co widzi kamerka. ◦ Programujemy go… ◦ leJOS ma klasę NXTCam ◦ I już… chyba import lejos.nxt.*; import lejos.nxt.addon.NXTCam; import java.awt.Rectangle; public class CamExample { public static void main(String[] args) { NXTCam camera = new NXTCam(SensorPort.S4); camera.sortBy(NXTCam.SIZE); camera.enableTracking(true); while(!Button.ESCAPE.isPressed()) { Rectangle object = camera.getRectangle(0); int pos = (object.x + object.width) / 2; LCD.drawInt(pos, 0,0); } } }