Niezawodne programowanie
Programowanie LEGO Mindstorms w języku Ada
11/11/14 04:46

Pod systemem Microsoft Windows™ dostępne jest środowisko GNAT GPS umożliwiające programowanie LEGO Mindstorms w języku Ada.
W swoim opisie będę korzystał z wersji dostępnej pod systemem Linux. Można pobrać ją ze strony Universidad Politecnica de Madrid.
Aby zainstalować środowisko pod Linuxem (wersja z Adą 2012) należy pobrać plik adaformindstorms-linux-2012-x86-gdb-bin.tar.gz, następnie rozpakować jego zawartość np. w katalogu /usr/local i ustawić w zmiennej środowiskowej PATH ścieżkę do katalogu /usr/local/gnatmindstorms2012/bin.
W katalogu /usr/local/gnatmindstorms2012/share/examples/mindstorms/demos znajdują się przykładowe programy. Aby je skompilować wystarczy, po przejściu do odpowiedniego podkatalogu, wykonać polecenie make.
Przed uruchomieniem skompilowanego programu na cegle NXT 2.0 należy usunąć z niej oryginalny firmware. W tym celu należy wcisnąć na kilka sekund przycisk reset umieszczony w otworze od spodu obudowy po stronie gniazda USB:

Gdy cegła NXT będzie gotowa do transmisji programu będzie słychać z wbudowanego w nią głośniczka charakterystyczne tykanie (uaktywniony tryb SAMBA).
Aby uruchomić na cegle NXT skompilowany program, należy podłączyć ją z komputerem, na którym kompilowałeś program, kablem USB i uruchomić program fwexec z parametrem będącym nazwą pliku ze skompilowanym programem. Prawdopodobnie do poprawnego działania programu fwexec trzeba go będzie uruchamiać w trybie administratora np. używając polecenie sudo (aby korzystać z polecenia sudo należy być w grupie 27 sudo).
Jeśli chcesz odtworzyć na cegle NXT oryginalny firmware, pobierz ze strony NXT Firmware Download archiwum zip, rozpakuj je a następnie wyślij plik LEGO MINDSTORMS NXT Firmware V1.31.rfw do cegły poleceniem fwflash (również w trybie administratora).
Na początek możesz spróbować skompilować poniższy program hello.adb:
with Ada.Real_Time; use Ada.Real_Time;
with NXT.AVR;
with NXT.Display; use NXT.Display;
with NXT.Last_Chance;
procedure Hello is
begin
Put_Line("Hello world!”);
Put_Line("wait 5 secs for power down”);
loop
delay until Clock + Seconds(5);
NXT.AVR.Power_Down;
end loop;
end Hello;
Powyższy program pisze na wyświetlaczu LCD, a następnie po pięciu sekundach wyłącza cegłę NXT.