System LeJOS to fimeware do Lego NXT wgrywany zamiast oryginalnego oprogramowania. Wywodzi się z maszyny wirtualnej Javy TinyVM. Umożliwia on pisanie programów sterujących działaniem robota Lego w Javie. Pobierając wtyczkę do Eclipse ze strony projektu mamy wygodny edytor kodu, który przy odpowiedniej konfiguracji pozwala edytować oraz wysyłać i uruchamiać kod w naszym robocie Lego.

Lego mindstorms

Jednym z wzorcowych modeli robotów jakie możemy wykonać dzięki klockom Lego NXT jest shooterbot. Potrafi on strzelać kulkami. Z przodu robota ustawiony jest czujnik ultradźwiękowy pozwalający mierzyć odległość od przeszkód.

W napisanym programie testowym robot ma się obracać czekając na “wroga”. Jeżeli ktoś zbliży się do niego na małą odległość (30cm), zatrzymuje się i oddaje strzał. Po strzale dalej obraca się. Schemat algorytmu:

lego_nxt_lejos_1

Jego realizacja w postaci programu Java:

import lejos.nxt.Button;
import lejos.nxt.LCD;
import lejos.nxt.Motor;
import lejos.nxt.SensorPort;
import lejos.nxt.UltrasonicSensor;
import lejos.util.Delay;</code>

public class Test
{

public static void main(String[] args)
{
  LCD.drawString("Test program", 0, 0);  
  UltrasonicSensor ultra = new UltrasonicSensor(SensorPort.S3);
  Motor.A.setSpeed(200);
  Motor.B.setSpeed(200);
  boolean play = true;
  ultra.continuous();
  Motor.A.forward();
  Motor.B.backward();
  while(play){
    int dist = ultra.getDistance();
    Delay.msDelay(50L);
    LCD.clear();
    LCD.drawString(Integer.toString(dist),0,0);
    if(dist &lt; 30){  
      fire();
    }
 if(Button.readButtons() == Button.ID_ENTER) play = false;
 Delay.msDelay(200L);
}

}

private static void fire(){
  Motor.A.stop(); 
  Motor.B.stop();
  Motor.C.forward();
  Delay.msDelay(1000L);
  Motor.C.stop();
  Motor.A.forward();
  Motor.B.backward();
}

}

Działanie algorytmu przedstawiam na filmiku:

Lego NXT z Enchanting.

Jeżeli chcemy uczyć dzieci ze szkoły podstawowej to potrzebujemy prostszego sposobu na tworzenie programów. Oryginalne oprogramowanie dołączane razem z robotem niestety nie działa na Linuksie. Poza tym to oprogramowanie ma inne mankamenty. Program ten wygląda ciekawie, jednak szybko można odczuć jego braki. Ciężko napisać w nim jakiś większy kod, ponieważ bloki graficzne, z których buduje się program bardzo rozciągają się na ekranie i trudno jest prześledzić wzrokiem jego przebieg. Do tego nie znalazłem opcji skalowania rozmiaru widoku programu. Sam program bardziej przypomina schematy blokowe niż język programowania.

enchanting

Na szczęście istnieje projekt Enchanting wykorzystujący znany program do nauki programowania dla dzieci Scratch. Napisany w języku Squeek program pozwala tworzyć kod w oparciu o graficzne elementy symbolizujące wyrażenia języka programowania. Pozwala on rysować po ekranie podobnie do LOGO. Twórcy Enchanting wpadli na pomysł, że zamiast sterować pisakiem po ekranie równie dobrze można sterować robotem Lego. Przygotowali wersję Scratch, która potrafi generować z ułożonych przez użytkownika graficznych puzzli kod przeznaczony dla Lego NXT. Kod ten środowisko Enchanting przesyła za pośrednictwem USB lub Bluetooth do pamięci robota. Twórcy wykorzystali firmeware LeJOS. Trzeba jednak pamiętać, że wgrywanie firmewaru zastępuje oryginalny i uniemożliwi nam korzystanie z dotychczasowego oprogramowania (bez ponownego wgrania oryginalnego firmewaru).

W Scratch (i Enchanting) programowanie jest zbliżone w wyglądzie do typowego programowania. Występują te same elementy jak pętle, zwrotnice, przypisania itp. Tyle, że można je wykorzystywać wybierając i przeciągając na formatkę naszego programu. Dzięki takiemu rozwiązaniu znacznie łatwiej jest prześledzić działanie kodu programu, czytając go od góry do dołu. Oto przykład prostego algorytmu ruchu robota. Robot porusza się do przodu. W momencie gdy czujnik ultradźwiękowy wykryje przeszkodę robot obraca się i kontynuuje jazdę.

Działanie algorytmu na filmiku: