Projekt 02: Lego Mindstorms EV3 Segway

Aus HSHL Mechatronik
Version vom 14. Januar 2014, 13:27 Uhr von Carsten Pawliczek (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „'''Aufgabenstellung:''' * Bauen eines Segways mit dem EV3 * Verwendung eines selbst gewählten Low-Cost-Gyrosensors * Steuerbar über die LEGO-App == Auswahl …“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Aufgabenstellung:

  • Bauen eines Segways mit dem EV3
  • Verwendung eines selbst gewählten Low-Cost-Gyrosensors
  • Steuerbar über die LEGO-App

Auswahl des passenden Reglers für ein Segway

Nach Recherche haben wir uns für die Umsetzung des Segways mit einem PID-Regler entschieden.

Umbau eines BMA020 Sensors für EV3/NXT

Nach unserer Recherche haben wir uns aufgrund der guten Dokumentation auf der Seite von [Stefan Frings] für den Umbau eines Bosch BMA020 Beschleunigungssensors entschieden. Dieser Sensor ist aufgrund der Referenz Erdanziehungskraft außerdem in der Lage, den Neigungswinkel zu messen.

Ansteuerung des EV3 über MATLAB/Simulink

Vorbereitungen mittels QUT-Toolkit und Kompilierer

Für die Kommunikation haben wir uns an die Anleitung der Queensland University of Technology, kurz QUT, gehalten, welche als Erste eine Kommunikation zwischen dem EV3 und MATLAB herstellen kann [[1]]. Wichtig hierbei ist die Neukompilierung mittels Visual Studio von 32bit auf 64bit der dort hochgeladenen hidapi.dll-Datei für 32bit-Systeme, auch wenn dort steht, dass dies nur bei 32bit-Systemen nötig sei. Dies ist nicht der Fall und führt ansonsten nicht zum Ziel. Das Toolkit muss, wie in MATLAB üblich, über Set Path eingebunden werden. Nachfolgend wird über den MATLAB-Befehl mex -setup ein passender Kompilierer ausgewählt, z.B. Visual Studio 2010 oder der frei verfügbare Windows SDK [[2]].

Verbindungsaufbau zwischen MATLAB und EV3

Zum momentanen Zeitpunkt ist noch keine Kommunikation zwischen Simulink und dem EV3 möglich, da noch keine passende Toolbox vorhanden ist. Die Verbindung kann im Anschluss an die Vorbereitungen über b = Brick('ioType','usb') hergestellt werden. Danach sollte im Workspace die Variable b vorhanden sein und die Größe 1x1 Brick haben. Der Verbindungsaufbau hat in unserem 2-Mann-Team allerdings trotz gleicher MATLAB-Version (2013a, 64bit) und selbem Betriebssystem (Windows 7, 64bit) nur auf einem Laptop funktioniert.

Programmierung des Segways

Da wir leider in unserem Projekt für längere Zeit keine Kommunikation mit dem EV3 herstellen konnten (basierend auf oben genannten Schwierigkeiten und Unklarheiten der Dokumentationen der QUT) ist unser Programm beschränkt auf die generelle Kommunikation zum EV3 und ledigliches Prinzipverhalten eines Segways, d.h. Gegensteuern bei Neigung in die eine oder andere Richtung. Aufgrund der Zeitnot durch die Kommunikationsschwierigkeiten stellt unser Programm einen Ansatz dar, der noch weiter ausgebaut werden müsste.

Programmcode

while(true)
   PAnteil = b.inputReadSI(0,0,0);     % Absoluter Winkel
   pause(0.1);			       % Pause, da der Sensor nicht schnell genug auf die Abfrage reagiert
   PAnteil = b.inputReadSI(0,0,0)      % Wiederholung da der erste Aufruf NaN-Fehler erzeugt
   pause(0.1);
   DAnteil = b.inputReadSI(0,0,1);     % Winkelgeschwindigkeit in deg/s
   pause(0.1);
   DAnteil = b.inputReadSI(0,0,1)      % Wiederholung da der erste Aufruf NaN-Fehler erzeugt
   pause(0.1);
   
   if PAnteil < reading   		% wenn aktueller Winkel < initialisierter, senkrechter Winkel
           motorPower = (kp*PAnteil + kd*DAnteil);    			% motorPower setzt sich zusammen, kp = 2, kd = 1 
           b.outputPower(0,Device.MotorA+Device.MotorB,motorPower);	% Motoren bekommen die zuvor berechnete Motorpower
           pause(0.0001);
   else PAnteil > reading		% analog für den Fall, dass aktueller Winkel > initialisierter, senkrechter Winkel
           motorPower = -(kp*PAnteil + kd*DAnteil);           		% motorPower mit negativem Vorzeichen
           b.outputPower(0,Device.MotorA+Device.MotorB,motorPower);
           pause(0.0001);
   end
end


Kleine Sammlung an EV3-Befehlen

Eine Bibliothek über die MATLAB-Befehle für die Kommunikation zum EV3 ist derzeit noch nicht verfügbar, so dass wir uns die Befehle für die Ansteuerung aus den Beispielen der QUT-Seite raussuchen mussten. Nachfolgend ein paar Beispiele:

  • disp ('Text') Zeigt Text auf dem Bildschirm des Bricks an
  • b.beep() lässt den Brick ein Geräusch machen, hilfreich z.B. nach dem Verbindungsaufbau im Code
  • motorpower = 0 sollte in jedem Programm, in dem Motoren verwendet werden, zu Beginn stehen
  • b.outputPower(0,Device.MotorA+Device.MotorB,motorPower) weist den Motoren auf den Kanälen A und B auf layer 0 die zuvor initialisierte motorPower zu, startet diese jedoch noch nicht
  • b.outputStart(0,Device.MotorA+Device.MotorB) startet die Motoren auf den Kanälen A und B
  • reading = b.inputReadSI(0,0,0) liest Sensoren aus. In der Klammer steht die erste Null für den layer, die Zweite für den Anschluss (beginnt bei 0) und die Dritte für den Modus. Der Gyrosensor hat hier z.B. die Möglichkeit, im Modus 0 den derzeitigen Winkel und im Modus 1 eine Winkelgeschwindigkeit zu liefern.
  • pause(0.1) mussten wir überall zwischen den Sensorabfragen einbinden, da wir ansonsten einen NaN-Fehler erhalten haben
  • b.outputStop(0,Device.MotorA+Device.MotorB,0); stoppt die zuvor verwendeten Motoren auf den Kanälen A und B

Lessons learned - ein kleines Fazit

In unserem Projekt konnten wir sehr gut unser bisher erlerntes Wissen über die Mess- und Regelungstechnik anwenden. Dies half uns bei der Wahl des passenden Regelkreises sowie bei der Wahl des Sensors, auch wenn wir aufgrund der Probleme mit MATLAB und EV3 nicht mehr zur Implementierung des eigenen Sensors gekommen sind, da die Implementierung das Schreiben eines passenden Treibers erfordert hätte.