EM2017SSP13: Unterschied zwischen den Versionen

Aus Verteilte Systeme - Wiki
Zur Navigation springen Zur Suche springen
 
(27 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
 
== Projektbeschreibung ==
 
== Projektbeschreibung ==
In diesem Projekt soll die Programmiersprache Ada erlernt werden und eine beispielhafte Firmware für einen Lego Mindstorms Roboter implementiert werden, welcher autonom (zB. 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.
+
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 ==
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.
+
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 mich auf die Bauteile Ultraschallsensor und 2 Motoren konzentriert.
+
In meinem Projekt habe ich hauptsächlich die Bauteile Ultraschallsensor und 2 Motoren verwendet.
   
 
'''NXT:'''
 
'''NXT:'''
Zeile 11: Zeile 11:
   
   
'''Ultraschall-Sensor:'''
+
'''Motor:'''
   
 
[[Datei:9842.png]]
 
[[Datei:9842.png]]
   
   
'''Motor:'''
+
'''Ultraschall-Sensor:'''
   
  +
[[Datei: 9843.jpg]]
 
  +
[[Datei: 9843.png]]
  +
  +
  +
'''NXT-Anschlüsse:'''
  +
  +
  +
[[Datei:nxtansch.jpg]]
   
 
== Vorbereitung ==
 
== 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:
+
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:
   
   
Zeile 28: Zeile 35:
   
   
'''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
+
'''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
   
   
Zeile 36: Zeile 43:
   
   
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.
+
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 gnat → Ist der normale gnatcompiler für Ada.
 
*sudo apt-get install libusb-dev
 
*sudo apt-get install libusb-dev
*sudo apt-get install git → wird benötigt um libnxt zu bekommen, git ist eine art Repository verwaltung
+
*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 Verzeichnus kopiert
 
  +
*git clone https://github.com/xerpi/libnxt.git → Hier liegt libnxt, es wird ins aktuelle Verzeichnis kopiert.
*sudo apt install scons → ähnlich wie make
 
  +
*sudo apt install scons → Ähnlich wie make.
 
*scons
 
*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.
+
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'''
 
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.
+
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.
+
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.
+
Mit "lsusb" kann man sehen ob das NXT Brick angeschlossen bzw. erkannt wurde.
   
   
Zeile 68: Zeile 76:
   
 
==Fortschritt==
 
==Fortschritt==
  +
* Roboter zusammengebaut
  +
[[Datei: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
  +
** siehe '''Vorbereitung'''
  +
* Standardfirmware auf NXT geladen, um zu testen ob das Übertragen funktioniert
  +
** https://www.lego.com/de-de/mindstorms/downloads
  +
** sudo ./fwflash /home/danielring/Downloads/LEGO\ MINDSTORMS\ NXT\ Firmware\ V1.31.rfw
  +
* 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==
 
==Implementierung==
  +
  +
'''Fahren Realisieren'''
  +
Hierzu mussten erst einmal die richtigen Anschlüsse am NXT Brick (A,B) verwendet werden.
  +
Als nächstes muss der Motor mit dem Anschluss verbunden werden. Dies geschieht in der .ads Datei, welche ähnlich wie einer Header (.h) Datei in C ist.
  +
  +
Right_Motor_Id : constant Motor_Id := Motor_A;
  +
Left_Motor_Id : constant Motor_Id := Motor_B;
  +
  +
Jetzt kann man in der .adb Datei die Motoren Ansteuern und zB. Funktionen bzw. Proceduren Schreiben die dafür sorgen, dass beide Motoren vorwärts fahren.
  +
  +
procedure Forward is
  +
begin
  +
Control_Motor (Right_Motor_Id, Speed_Full, Forward);
  +
Control_Motor (Left_Motor_Id, Speed_Full, Forward);
  +
end Forward;
  +
  +
Wenn man jetzt irgendwo im Hauptprogramm möchte, dass das Fahrzeug vorwärts fährt, kann man einfach die Procedure "Forward" aufrufen:
  +
  +
Forward;
  +
  +
'''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)) < 15 then
  +
  +
Da es leider nicht möglich ist, das Fahrzeug um bspw. 150grad zu drehen (da Sensoren hierfür nicht vorhanden sind) habe ich es nach einigem Herumprobieren durch Zeitliches Drehen realisiert:
  +
  +
Spin_Right; --rechts drehen
  +
delay until Clock + Milliseconds (1000);
  +
  +
Wenn das Programm beendet werden soll, kann man das durch einen druck auf den PowerButton machen:
  +
  +
if Button = Power_Button then
  +
Stop;
  +
Power_Down;
  +
end if;
   
 
==Quellen==
 
==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
  +
  +
http://mindstorms.philipp-stangl.com/nxt.html
  +
  +
https://de.wikipedia.org/wiki/Lego_Mindstorms

Aktuelle Version vom 30. August 2017, 12:42 Uhr

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


NXT-Anschlüsse:


Nxtansch.jpg

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
    • siehe Vorbereitung
  • 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

Fahren Realisieren Hierzu mussten erst einmal die richtigen Anschlüsse am NXT Brick (A,B) verwendet werden. Als nächstes muss der Motor mit dem Anschluss verbunden werden. Dies geschieht in der .ads Datei, welche ähnlich wie einer Header (.h) Datei in C ist.

 Right_Motor_Id : constant Motor_Id := Motor_A;
  Left_Motor_Id : constant Motor_Id := Motor_B;

Jetzt kann man in der .adb Datei die Motoren Ansteuern und zB. Funktionen bzw. Proceduren Schreiben die dafür sorgen, dass beide Motoren vorwärts fahren.

 procedure Forward is
    begin
       Control_Motor (Right_Motor_Id, Speed_Full, Forward);
       Control_Motor (Left_Motor_Id, Speed_Full, Forward);
    end Forward;

Wenn man jetzt irgendwo im Hauptprogramm möchte, dass das Fahrzeug vorwärts fährt, kann man einfach die Procedure "Forward" aufrufen:

 Forward;

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)) < 15 then

Da es leider nicht möglich ist, das Fahrzeug um bspw. 150grad zu drehen (da Sensoren hierfür nicht vorhanden sind) habe ich es nach einigem Herumprobieren durch Zeitliches Drehen realisiert:

 Spin_Right; --rechts drehen
 delay until Clock + Milliseconds (1000);

Wenn das Programm beendet werden soll, kann man das durch einen druck auf den PowerButton machen:

 if Button = Power_Button then
   Stop;
   Power_Down;
 end if;

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

http://mindstorms.philipp-stangl.com/nxt.html

https://de.wikipedia.org/wiki/Lego_Mindstorms