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