EM2017SSP13

Aus Verteilte Systeme - Wiki
Zur Navigation springen Zur Suche springen

Projektbeschreibung

In diesem Projekt soll die Programmiersprache Ada erlernt werden und eine beispielhafte Firmware für einen Lego Mindstorms Roboter implementiert werden, welcher autonom (z.B. durch einen Raum) fahren kann und mit Hilfe von Abstandsmessung durch einen Ultraschallsensor Hindernissen erkennt. Wenn ein mögliches Hindernis erkannt wird, soll der Roboter seine Fahrtrichtung ändern und somit dem Hindernis ausweichen.

Lego Mindstorms

Lego Mindstorms ist ein programmierbarer Legostein der Firma Lego welcher Sensoren und Motoren ansprechen kann, um Roboter oder andere autonome Systeme zu entwickeln bzw. zu programmieren. In meinem Projekt habe ich hauptsächlich die Bauteile Ultraschallsensor und 2 Motoren verwendet.

NXT:

9841.png


Motor:

9842.png


Ultraschall-Sensor:


9843.png

Vorbereitung

Zu aller Erst muss das richtige Umfeld für die Entwicklung geschaffen werden. Hierzu müssen ein paar Programme, Tools und Dateien heruntergeladen und installiert werden:


Unter folgendem Link kann man sich den Ada für Lego Mindstorms compiler für Linux herunterladen: http://www.dit.upm.es/%7Estr/proyectos/mindstorms/2011/index.html


Adaformindstorms-linux-2011-x86-gdb-bin.tar.gz ← Downloaden. In diesem Verzeichnis liegt das makefile um ein Ada Programm für einen nxt Brick zu kompilieren


Die Firmware für den NXT Brick kann auf: https://lc-www-live-s.legocdn.com/r/www/r/mindstorms/-/media/franchises/mindstorms%202014/downloads/firmware%20and%20software/nxt%20software/firmware131_download1.zip?l.r2=798380141 heruntergeladen werden.


Als nächstes müssen einige Pakete und Treiber unter Linux installiert werden, damit man im Folgenden die USB-Schnittstelle verwenden kann und der NXT Brick erkannt wird.


  • sudo apt-get install gnat → Ist der normale gnatcompiler für Ada.
  • sudo apt-get install libusb-dev
  • sudo apt-get install libusb-1.0
  • sudo apt-get install git → Wird benötigt, um libnxt zu bekommen (git ist eine art Repository Verwaltung).
  • git clone https://github.com/xerpi/libnxt.git → Hier liegt libnxt, es wird ins aktuelle Verzeichnis kopiert.
  • sudo apt install scons → Ähnlich wie make.
  • scons


Um das Programm kompilieren zu können, muss das beiliegende Makefile abgeändert werden. Der Kernel Path muss auf den Pfad geändert werden, in dem das makefile für das Ada-Programm liegt. In meinem Fall: /home/danielring/gnatmindstorms2011/lib/gcc/arm-eabi/4.5.3/rts-ravenscar-sfp/ravenscar


Damit man jetzt mit dem Brick per USB (als serielle Schnittstelle) kommunizieren kann, muss man noch dem User die Gruppe “dialout” geben. Hierzu muss man “sudo adduser username dialout” eingeben. Hier nach muss man sich dann einmal aus- und wieder einloggen, damit die Einstellung wirksam wird.


Wenn man jetzt den Befehl "Group" in die Komandozeile eingibt, kann man testen ob die Gruppe hinzugefügt wurde oder nicht. Mit "lsusb" kann man sehen ob das NXT Brick angeschlossen bzw. erkannt wurde.


Firmware neu aufspielen: cd ~/libnxt sudo ./fwflash /home/danielring/Downloads/LEGO\ MINDSTORMS\ NXT\ Firmware\ V1.31.rfw


Programm auf das Brick laden: cd ~/libnxt sudo ./fwexec /home/danielring/Downloads/vehicle_v12/vehicle_v12.bin

Fortschritt

  • Roboter zusammengebaut

Auto.jpg

  • Erstes einfaches "Hello World" Programm in Ada geschrieben und getestet
    with Ada.Text_IO; 
    use Ada.Text_IO;
    PROCEDURE Hello IS
    BEGIN
        Put_Line ("Hallo Welt!");
    END Hello;
  • Tools heruntergeladen und installiert
  • Standardfirmware auf NXT geladen, um zu testen ob das Übertragen funktioniert
  • Testfirmware mit einfacher Motoransteuerung auf den NXT geladen, um auch hier zu testen ob alles funktioniert
  • Mit der Programmierung und Ansteuerung der Motoren und dem Ultrasonic-Sensor auseinandergesetzt (wie kann man über Ada die Distanz ermitteln und benutzen)
  • Einfaches fahren und drehen/ablenken bei einer Distanz kleiner als 15 cm zum Hindernis

Implementierung

Erste Schritte

Fahrzeug einfach geradeaus fahren lassen und nach ablenken (ohne Benutzung des Ultraschallsensors):

 task body Movement is
 takte : Integer := 0;
   while takte <= 400 loop 
       takte := takte+1;
       case takte is
           when 0 .. 100      => Forward;
           when 101 .. 150    => Stop;
           when 151 .. 250    => Spin_Left;
           when 251 .. 300    => Stop;
           when 301 .. 400    => Forward;
           when 401 .. 450    => Stop;
           when 451 .. 550    => Spin_Left;
           when 551 .. 600    => Stop;
           when others        => Forward;
       end case;
       Forward;
   end loop;


Ultraschallsensor einbinden:

   Ultrasonic_Sensors_Id : Ultrasonic_Sensor := Make (Sensor_1);
   Detected     : Distances (1 .. 8);
   Num_Detected : Natural;
   Index        : Natural;
   Index := Detected'First;
       for K in 1 .. Num_Detected loop
           if Integer(Detected(Index)) < 10 then

Quellen

https://shop.lego.com/en-US/NXT-Intelligent-Brick-9841

https://shop.lego.com/en-US/Interactive-Servo-Motor-9842

https://www.generationrobots.com/de/401180-ultraschallsensor-lego-mindstorms-nxt.html