EV3 Basic handbuch

Reinhard Grafl          reinhard.grafl@aon.at

Einen Roboter nach eigenen Ideen zu programmieren macht Spaß. Am einfachsten gelingt das Programmieren einfacher Aufgaben mit der grafischen Software von Lego. Für größere und komplexere Programme braucht man jedoch eine textbasierte Programmiersprache. Es gibt auch viele verschiedene Projekte, um Programmiersprachen für den EV3 zu adaptieren (LeJOS, MonoBrick, RobotC, ev3dev, und andere). Aber alle haben eine Sache gemeinsam: Sie sind unglaublich schwierig zum Laufen zu bringen und zu benutzen. Man benötigt jahrelange Erfahrung, um auch nur eine davon benutzen zu können.

Um diese Lücke zwischen ganz-einfach-aber-eingeschränkt und allmächtig-aber-schwierig zu füllen, habe ich EV3Basic entwickelt. Diese Sprache ist speziell auf EV3-Benutzer zugeschnitten, die über die Beschränkungen der grafischen Programmierung hinausgehen wollen, selbst aber noch keine IT-Profis sind. EV3Basic ist recht einfach zu lernen und bietet trotzdem alle Möglichkeiten, komplexere Steuerungen zu entwickeln. Dabei programmieren zu lernen, ist noch ein zustätzlicher Bonus.

EV3Basic basiert auf der Programmiersprache "Small Basic" von Microsoft, die für Kinder oder allgemein für Anfänger als Möglichkeit eines Einstiegs ins Programmieren geschaffen wurde. "Small Basic" wurde absichtlich einfach gehalten und für meine EV3-Erweiterung have ich versucht, das selbe Prinzip anzuwenden. Ich würde mich sehr freuen, wenn diese Sprache tatsächlich dabei helfen könnte, programmieren zu lernen und den EV3 kreativer zu benutzen.

Erste Schritte

Was man zuerst braucht, ist ein PC mit Microsoft Windows (jede Version seit Windows XP) und die aktuelle Version von Microsoft Small Basic die man sich gratis runterladen kann. Für komplette Programmier-Neulinge empfehle ich die Tutorials auf Small Basic - Webseite um die grundlegenden Prinzipien zu erlernen. Das dauert nicht all zu lange und macht für sich alleine auch schon Spaß.

Der nächste Schritt ist, die EV3-Erweiterung für Small Basic runterzuladen und zu installieren. Bei der neuesten Version gibt es die Datei "EV3BasicInstaller.msi", die man gratis runterladen und installieren kann. Die Installation muss direkt in das selbe Verzeichnis wie Small Basic gespeichert werden. Normalerweise ist das schon richtig voreingestellt, wenn man den Installationspfad vom vorigen Schritt auch nicht verändert hat. Beim nächsten Start von Small Basic, hat man Zugriff auf verschiedene Objekte, mit denen sich die unterschiedlichen Aspekte des EV3-Bricks ansteuern lassen, sowie noch ein paar weitere universell nützliche Objekte.

Als erstes Programm könnte man

  LCD.Clear()    LCD.Write(40,40, "Hello EV3")    Program.Delay(10000)

in das Programm-Fenster tippen (oder kopieren). Sobald der EV3-Brick über ein USB-Kabel mit dem PC verbunden und eingeschaltet ist, kann man das Programm mit dem großen blauen "Ausführen" - Knopf von Small Basic starten.

Während des Programmierens zeigt das Intellisense-System von Small Basic die möglichen Bibliotheksfunktionen und Erklärungen für deren Benutzung. Diese Information is die selbe wie im Kapitel "Programmierbibliotheken". Es sind noch viele zusätzliche Beispiel auf der EV3Basic Webseite als 'Examples.zip' verfügbar.

Den EV3-Brick vom PC aus fernzusteuern ist eine gute Sache, aber für viele Anwendungen ist es besser, das Programm direkt auf dem Roboter auszuführen, unabhängig von einem PC, der jeden einzelnen Schritt festlegen muss.

Um das Programm auf den Brick zu bekommen, gibt es den EV3Explorer, der gleichzeit mit der EV3-Erweiterung mitinstalliert wurde, und nun über das Windows Start Menü (EV3Basic/EV3Explorer) geöffnet werden kann. Dieses Programm zeigt ein Fenster mit zwei Hälften: Links sieht man die Dateien, die am Brick gespeichert sind und rechts die Dateien am PC. Man kann jedes der Beispiele oder jedes eigene Programm übersetzen und am Brick starten, indem man es auswählt und "Compile and Run" drückt. Dadurch wird das Quellprogramm in eine für den Brick verständliche Form übersetzt (in eine Datei mit der Erweiterung .rbf), auf den Brick übertragen und sofort gestartet. Wenn das Programm auch im Menu auf dem Brick sichtbar sein soll, muss zuerst ein Unterverzeichnis des "prjs"-Verzeichnisses mit einem aussagekräftigen Namen erstellt werden, in das das ausführbare Programm hineinkopiert werden muss (Der EV3-Brick zeigt nur Programme im Menü an, die auch in ihrem eigenen Unterverzeichnis liegen).

Kurzreferenz für Small Basic

Für Personen, die bereits in der einen oder anderen Sprache programmieren können, und die nicht die Small Basic Tutorials für die grundlegendsten Dinge durcharbeiten wollen, habe ich hier ein kleines Beispiel zusammengestellt, in dem die meisten Sprachkonstrukte von Small Basic vorkommen. Das Beispiel läuft nicht am EV3-Brick sondern nur am PC, weil es das TextWindow - Objekt benutzt.

' Demo-Programm zur Erklärung der meisten Small Basic - Elemente   

' (alle Kommentare starten mit einfachem Hochkomma)    

' Ausführung startet hier   

A = 5       ' Variablen werden implizit bei der ersten Benutzung deklariert   

a = a + 1   ' Groß- und Kleinschreibung wird nie unterschieden   

B[a] = 55   ' Arrays werden implizit deklariert und wachsen bei Bedarf   

X = "hi"    ' Variablen können auch Text enthalten    

Sub write   ' Definiert ein Unterprogramm (Parameter sind nicht möglich)

    TextWindow.WriteLine(X)  ' Aufruf einer Bibliotheksfunktion, Zugriff auf Variable   

EndSub      ' Ablauf des Hauptprogramms fließt um die Sub-Definition herum    TextWindow.WriteLine("A="+a)        ' Texte werden mit + zusammengesetzt   

WRITE() ' Aufruf eines Unterprogrammes. Groß- und Kleinschreibung ist egal.   write2()' Kann Unterprogramm aufrufen, das erst später im Code definiert wird.    TextWindow.Writeline("B[6]="+B[6])  ' Zugriff auf Arrays      

For i=2 to 5         ' Eine Schleife von 2 bis 5 (inclusive)     TextWindow.Writeline("I:"+I)   

EndFor   

For i=6.5 to 10.5 step 2   ' Eine Schleife mit nicht-ganzzahligen Werten und größeren Schritten

    TextWindow.Writeline("I:"+I)   

EndFor    

Sub write2

    write()          ' Unterprogramm ruft andereres Unterprogramm auf

    write()   

EndSub      ' Ablauf des Hauptprogramms fließt um die Sub-Definition herum     

I=99  ' i und I sind zwei Schreibungen für die gleiche Variable    

while i>3        ' Schleife mit Bedingung      

    i=i/2      

    TextWindow.Writeline("I:"+i)    

endwhile    

TextWindow.WriteLine("PI="+Math.PI) ' Eine Bibliotheks-Eigenschaft (Zugriff ohne Klammern)    

TextWindow.WriteLine("SIN="+Math.Sin(0.5))   ' Eine Bibliotheks-Funktioen mit Rückgabewert     

A=50    

B=20    

If a<5 then ' Eine bedingte Anweisung mit mehreren Möglichkeiten

    TextWindow.WriteLine("first")    

elseif a<10 and b<100 then             ' logische 'and' - Verknüpfung

    TextWindow.WriteLine("second")    

elseif a<20 or (b>40 and b<60) then    ' verschachtelte logische Verknüpfungen     TextWindow.WriteLine("third")    

else

    TextWindow.WriteLine("other")    

endif

Unterschiede zwischen Small Basic and EV3Basic

Obwohl ich versucht habe, das Originalverhalten von Small Basic in meinem EV3-Compiler so gut wie möglich zu imitieren, gibt es doch einige Dinge, die mit der Laufzeitumgebung des EV3-Bricks nicht möglich sind.

Variablen haben einen Datentyp

Während Small Basic in jede Variable abwechselnd sowohl Zahlen oder Texte oder ganze Arrays speichern kann, erhält bei EV3-Basic jede Variable einen der folgenden Datentypen:

Jede Variable bekommt bei der ersten Benutzung im Programm einen dieser Typen zugewiesen und kann ab dann nichts anderes als Werte dieses Types speichern.

Operatoren und Funktionen arbeiten entsprechend der Operanden-Typen

Arithmetische oder logische Operatoren müssen mit spezifischen Datentypen benutzt werden und liefern ebenfalls einen definierten Datentyp als Ergebnis (z.B. der Operator "<" erhält zwei Zahlen und liefert einen Text). Eine Ausnahme sind die Gleichheits/Ungleichheits-Operatoren, die entweder mit Zahlen oder Texten arbeiten, abhängig von den Datentypen der Operanden. Zweite Ausnahme ist der "+" - Operator, der entweder Zahlen addiert, oder Texte zusammenhängt. Ähnliche Einschränkungen gibt es für die Parameter von Bibliotheksfunktionen, die jeweils einen fixen Typ erwarten. Als kleine Erleichterung werden dort Zahlen automatisch in Texte konvertiert, wenn die Funktion einen Text benötigt (aber nicht anders herum).

Arrays

Die Arrays von Small Basic arbeiten sehr universell und können jede Zahl oder jeden Text als Index verwenden. EV3-Basic kann das nicht. Nur Zahlen sind als Index erlaubt, und nur nicht-negative ganze Zahlen funktionieren wie erwartet. (A[4.5] ist das selbe wie A[4], A[-4] liefert aber immer 0 oder "") Es gibt keine Unterstütztung für mehrdimensionale Arrays. Arrays können an Bibliotheksfunktionen übergeben werden. Array-Rückgabewerte müssen aber jeweils sofort in eine Variable gespeichert werden und können nicht statt dessen sofort an andere Funktionen geschickt werden (es gibt keinen automatisch angelegten temporären Speicher für Arrays).

Einschränkungen bei Text

Jede Variable vom Typ Text kann maximal 251 Zeichen enthalten und die möglichen Zeichen beschränken sich auf die Unicode-Werte 1 - 255. Das selbe gilt für alle Elemente eines Text-Arrays.

Bluetooth-Unterstützung

Die einfachste und verlässlichste Methode, den EV3 mit dem PC zu verbinden, ist über ein USB-Kabel. Aber in manchen Fällen ist eine Kabelverbindung zu unpraktisch, vor allem bei mobilen Robotern.

Wenn der PC Bluetooth unterstützt (entweder mit einem Dongle oder schon eingebaut), kann der EV3 so konfiguriert werden, dass die Kommunikation auch drahtlos möglich ist. Wenn es noch nicht bereits geschehen ist, muss der EV3 zur Liste der Bluetooth-Geräte am PC hinzugefügt werden. Zuerst muss Bluetooth am EV3 aktiviert werden. Dazu müssen im Einstellungs-Menü die Punkte "Bluetooth" und "Visibility" angewählt werden. Am PC muss man dann in der Übersicht der Bluetooth-Geräte das neue Gerät suchen und hinzufügen. Nach einigen weiteren geführten Schritten, bei denen man auch am EV3 den Zugriff zulassen, und einen Kopplungs-Code (ist normalerweise "1234") eingeben muss, sollte die Verbindung hergestellt sein.

Sobald es eine Verbindung gibt, und die notwendigen Gerätetreiber automatisch installiert wurden, kann der PC mit dem EV3 über einen sogenannten "Seriellen Anschluss" kommunizieren. Dieser Anschluss hat eine Bezeichnung in der Form "COM1", "COM2", oder ähnlich. Der tatsächlich vergebene Name ist in der Eigenschafts-Seite des Bluetooth-Gerätes ersichtlich.

Um diese neue Verbindung mit EV3-Basic zu verwenden, muss man nur das Programm wie gewohnt vom Small Basic starten, oder den EV3-Explorer benutzen. Falls kein EV3 an einem USB-Anschluss gefunden werden kann, zeigt das Programm weitere Möglichkeiten an. In dem Dialogfenster erscheinen auch alle potentiellen "Seriellen Anschlüsse", an denen ein EV3 verbunden sein könnte. Wenn man den richtigen auswählt, sollte eine Verbindung funktionieren.

WiFi-Unterstützung (WLAN)

Wie die Bluetooth-Verbindung, dient eine Kommunikation über WiFi ebenfalls zur drahtlosen Kommunikation zwischen dem PC und dem EV3-Brick. WiFi hat einige Vorteile, wie höhere Geschwindigkeit, Reichweite und Stabilität. Es hat aber auch Nachteile wie größeren Stromverbrauch und die Tatsache, dass man einen WiFi-Dongle an den EV3 anstecken muss. Außerdem funktioniert das nur, wenn man auch einen WiFi-Router zur Verfügung hat. Teilweise ist es eine Geschmackssache, ob man Bluetooth oder das WiFi verwenden will.

Um die WiFi-Variante zu benutzen, benötigt man einen speziellen Dongle, der kompatibel mit dem EV3 ist. Derzeit gibt es nur ein einziges Modell das mit einem unmodifizierten EV3 funktioniert: "Netgear WNA1100", der an den großen USB-Stecker an der linken Seite des EV3 angesteckt wird. Die Verbindung kann man direkt am Einstellungs-Menü vom EV3 einrichten. Man muss zuerst die Option "WiFi" aktivieren (das dauert ein bisschen bis der Dongle gestartet ist) und dann muss man die Verbindung zum WiFi-Router herstellen. Für den Fall, dass das Wifi-Netzwerk durch Verschlüsselung geschützt ist, muss hier der WPA2-Schlüssel eingegeben werden. Derzeit werden keine anderen Verschlüsselungsmethoden unterstützt.

Sobald eine Verbindung zwischen EV3 und Router hergestelllt ist, sollte der EV3 eine IP-Adresse erhalten haben. Diese Adresse in der Form "10.2.3.4" oder ähnlich, wird im Einstellungs-Menu im Punkt "Brick Info" ganz unten in der Liste angezeigt.

Um endlich den EV3 von Small Basic oder mit dem EV3-Explorer anzusteuern, muss man den "WiFi"-Button im Dialogfenster, das nach der richtigen Verbindungsmethode fragt, drücken. Dort muss die IP-Adresse genauso wie vom Brick angezeigt eingegeben werden. Das muss man nur einmal machen, diese Adresse wird am PC für zukünftige Verwendung gespeichert.

Achtung: Der EV3-Brick verbindet sich nach dem Start nicht automatisch mit dem Router. Das muss jedesmal von Hand veranlasst werden.

Dokumentation der Bibliotheksfunktionen

Die Laufzeit-Bibliothek für den EV3 besteht aus einzelnen Komponenten, die 'Objekte' genannt werden. Jedes Objekt stellt Funktionen für einen spezifischen Teil des Systemes bereit. Diese Liste enthält alle Objekte, die sowohl für Small Basic am PC (mit der EV3-Erweiterung) als auch am EV3-Brick selbst verfügbar sind. Beim Schreiben vom Programmen, die sowieso nur am PC laufen sollen, kann man auch alle weiteren Objekte von Small Basic benutzen. Sie sind hier aber nicht beschrieben.

Assert

Das Assert-Objekt unterstützt den Programmierer dabei, Teile des Programmes auf Korrektheit zu überprüfen. 

Eine 'Assertion' macht implizite Annahmen über das Programmverhalten explizit. Durch Hinzufügen von Assertions, kann man Fehler im Programm leicher finden. Wenn zum Beispiel ein Teil des Programmes davon ausgeht, dass die Variable A einen positiven Wert hat, dann kann man das mit Assert.Greater(A,0,"A muss > 0 sein!") an dieser Stelle überprüfen. 

Falls das Programm auf eine Assertion trifft, die nicht erfüllt ist, wird eine entsprechende Fehlermeldung im Textfenster oder am Bildschirm des EV3 ausgegebeben.

Assert.Equal (a, b, message)

Prüft, ob zwei Werte völlig identisch sind. Bei diesem Test gelten sogar "True" und "tRue" als verschieden.

a

Erster Wert

b

Zweiter Wert

message

Fehlermeldung, die ausgegeben wird, wenn der Test fehlschlägt.

Assert.Failed (message)

Gibt eine Fehlermeldung am Bildschirm aus. Dieser Befehl soll nur verwendet werden, wenn bereits ein Fehler erkannt wurde.

message

Fehlermeldung, die ausgegeben werden soll

Assert.Greater (a, b, message)

Prüft, ob der erste Wert größer als der zweite Wert ist.

a

Erster Wert

b

Zweiter Wert

message

Fehlermeldung, die ausgegeben wird, wenn der Test fehlschlägt.

Assert.GreaterEqual (a, b, message)

Prüft, ob der erste Wert größer als der zweite Wert oder gleich ist.

a

Erster Wert

b

Zweiter Wert

message

Fehlermeldung, die ausgegeben wird, wenn der Test fehlschlägt.

Assert.Less (a, b, message)

Prüft, ob der erste Wert kleiner als der zweite Wert ist.

a

Erster Wert

b

Zweiter Wert

message

Fehlermeldung, die ausgegeben wird, wenn der Test fehlschlägt.

Assert.LessEqual (a, b, message)

Prüft, ob der erste Wert kleiner als der zweite Wert oder gleich ist.

a

Erster Wert

b

Zweiter Wert

message

Fehlermeldung, die ausgegeben wird, wenn der Test fehlschlägt.

Assert.Near (a, b, message)

Prüft, ob zwei Werte gleich beziehungsweise fast gleich sind. 'Fast gleich' bedeutet, dass ein geringer Unterschied, der eventuell durch Rundungsfehler entstanden ist, auch noch zulässig ist.

a

Erster Wert

b

Zweiter Wert

message

Fehlermeldung, die ausgegeben wird, wenn der Test fehlschlägt.

Assert.NotEqual (a, b, message)

Prüft, ob zwei Werte verschieden sind. Bei diesem Test gelten sogar "True" und "tRue" als verschieden.

a

Erster Wert

b

Zweiter Wert

message

Fehlermeldung, die ausgegeben wird, wenn der Test fehlschlägt.

Buttons

Dieses Objekt liest den Zustand der Tasten und die letzten Tastendrücke. 

Die Tasten werden mit den folgenden Buchstaben angesprochen: 

U Hinauf 

D Hinunter 

L Links 

R Rechts 

E Mittlere Taste

Buttons.Current - Eigenschaft

Liest alle Tasten, die gedrückt sind. 

Diese Eigenschaft enthält die Buchstaben für alle Tasten, die jetzt gerade in diesem Moment niedergedrückt sind.

Buttons.Flush ()

Löscht alle gespeicherten Tastendrücke. Spätere Aufrufe von GetClicks liefern nur mehr die Tasten, die nach dem Flush gedrückt wurden.

Buttons.GetClicks ()

Erkennt, welche Tasten in der Zeit seit dem letzten Aufruf von GetClicks am Brick gedrückt wurden. 

Der 'gedrückt' - Zustand der Tasten wird dabei gelöscht. Außerdem wird automatisch ein Klick-Geräusch erzeugt, wenn ein Tastendruck erkannt wurde.

Rückgabewert

Ein Text der die Buchstaben aller gedrückten Tasten enthält (kann auch leer sein)

Buttons.Wait ()

Wartet bis zumindest eine Taste am Brick gedrückt wird. Falls eine Taste bereits vorher gedrückt war und der Tastendruck noch nicht mit GetClicks abgeholt wurde, dann kehrt dieser Befehl sofort zurück.

EV3

Nützliche kleine Funktionen für verschiedene Teile des EV3-Bricks.

EV3.BatteryLevel - Eigenschaft

Aktueller Ladezustand der Batterie in Prozent (Wertebereich 0 bis 100).

EV3.Time - Eigenschaft

Die Zeit in Millisekunden seit dem Start des Programmes.

EV3.QueueNextCommand ()

Reduziert den Kommunikationsaufwand, wenn das Programm am PC läuft und den EV3 fernsteuert: Das nächste Kommando wird nicht sofort an den EV3 geschickt, sondern erst wenn noch ein weiteres Kommando geschickt werden muss. Man kann das Abschicken mit weiteren QueueNextCommand - Befehlen noch weiter verzögern, um möglichst viele Befehle als ganzen Block auf einmal zu schicken. 

Wenn das Programm direkt am EV3 läuft, hat dieser Befehl keine Auswirkung.

EV3.SetLEDColor (color, effect)

Setzt die Farbe der Tasten-Beleuchtung und einen der optischen Effekte.

color

Eines der folgenden: "OFF", "GREEN", "RED", "ORANGE"

effect

Eines der folgenden: "NORMAL", "FLASH", "PULSE"

EV3.SystemCall (commandline)

Führt einen externen Befehl das Linux-Systems aus. Alle Threads des Basic-Programmes werden so lange angehalten, bis der Systembefehl beendet ist. 

Um das vernünftig benutzen zu können, benötigt man entsprechende Linux-Kenntnisse.

commandline

Auszuführendes Systemkommando.

Rückgabewert

Exit-Status des Kommandos.

EV3File

EV3File dient zum Ansprechen des Dateisystems auf dem Brick, um Daten zu lesen und zu schreiben. 

Dateinamen können entweder absolut (mit führendem '/') oder relativ zum 'prjs'-Verzeichnis sein.

EV3File.Close (handle)

Schließt eine offene Datei.

handle

Die Nummer, die vom Open... - Befehl zurückgeben wurde.

EV3File.ConvertToNumber (text)

Befehl um einen Text in eine Zahl zu konvertieren.

text

Ein Text, der die dezimale Darstellung einer Zahl (mit optionalen Nachkommastellen) enthält.

Rückgabewert

Die Zahl

EV3File.OpenAppend (filename)

Öffnet eine Datei zum Hinzufügen von Dateien. Falls die Datei noch nicht existiert, wird sie angelegt.

filename

Name der Datei, die erweitert bzw. angelegt werden soll.

Rückgabewert

Eine Nummer mit der die offene Datei später angesprochen wird.

EV3File.OpenRead (filename)

Öffnet eine Datei zum Lesen. Falls die Datei nicht existiert, wird 0 zurückgeben.

filename

Name der Datei, von der gelesen werden soll.

Rückgabewert

Eine Nummer, mit der die offene Datei später angesprochen wird, oder 0 falls die Datei nicht existiert.

EV3File.OpenWrite (filename)

Öffnet eine Datei zum Schreiben. Falls die Datei schon existiert, wird sie überschrieben.

filename

Name der Datei die angelegt bzw. überschrieben werden soll.

Rückgabewert

Eine Nummer, mit der die offene Datei später angesprochen wird.

EV3File.ReadByte (handle)

Liest ein einzelnes Byte aus einer Datei.

handle

Die Nummer, die vom Open... - Befehl zurückgegeben wurde.

Rückgabewert

Das nächste Byte aus der Datei.

EV3File.ReadLine (handle)

Liest eine Zeile Text aus einer Datei. Der Text wird bis zum Zeilenumbruch (code 10) aus der Datei gelesen und entsprechend ISO-8859-1 dekodiert.

handle

Die Nummer, die vom Open... - Befehl zurückgegeben wurde.

Rückgabewert

Der Text, der aus der Datei gelesen wurde.

EV3File.ReadNumberArray (handle, size)

Liest ein ganzes Array von Zahlen im Binärformat aus einer Datei. Die Zahlen müssen als einfache IEEE-Fließkommazahlen (4 Byte pro Zahl) in der Datei vorliegen.

handle

Die Nummer, die vom Open... - Befehl zurückgeben wurde.

size

Anzahl der Zahlen, die gelesen werden sollen.

Rückgabewert

Ein Array mit den gelesenen Zahlen.

EV3File.TableLookup (filename, bytes_per_row, row, column)

Hilfsfunktion, um aus einer möglicherweise extrem großen Datei ein einzelnes Byte herauszulesen. 

Weil die Datei so groß sein kann, dass der Wertebereich normaler, vom EV3 unterstützter Zahlen, nicht mehr ausreicht, um alle Bytes zu adressieren, ist es möglich die Datei mit einer Zeilen/Spalten-Adressierung anzusprechen.

filename

Der Name der Datei.

bytes_per_row

Wenn man eine Zeilen/Spalten-Adressierung verwenden will, ist das die Länge der einzelnen Zeilen. Ansonsten muss man hier 1 verwenden um jedes Byte als eigene Zeile zu interpretieren.

row

Welche Zeile soll genommen werden (start bei 0)?

column

Welche Spalte soll genommen werden (start bei 0)?

Rückgabewert

Das Byte an der gewünschten Stelle.

EV3File.WriteByte (handle, data)

Schreibt ein einzelnes Byte in die Datei.

handle

Die Nummer, die vom Open... - Befehl zurückgeben wurde.

data

Ein Byte, das geschrieben werden soll (Eine Zahl von 0 bis 255).

EV3File.WriteLine (handle, text)

Schreibt eine Zeile Text in die Datei. Der Text wird entsprechend ISO-8859-1 kodiert und mit einem Zeilenumbruch (code 10) abgeschlossen.

handle

Die Nummer, die vom Open... - Befehl zurückgeben wurde.

text

Der Text, der geschrieben werden soll.

LCD

Steuert die LCD-Anzeige am Brick. 

Der EV3 hat eine schwarz-weiße Anzeige mit 178x128 Pixel. Alle Pixel werden mit X,Y-Koordinaten angesprochen, wobei X=0 der linke Rand und Y=0 der obere Rand ist.

LCD.BmpFile (color, x, y, filename)

Zeichnet ein Bild aus einer Datei. Nur Dateien im .rgf-Format werden unterstützt.

color

0 (normal) oder 1 (invertiert)

x

X-Koordinate der linken Kante

y

Y-Koordinate der oberen Kante

filename

Name der Datei ohne die .rgf - Erweiterung. Dieser Dateiname kann relativ zum 'prjs'-Verzeichnis oder ein absoluter Name (mit führendem '/') sein.

LCD.Circle (color, x, y, radius)

Zeichnet einen Kreis in einer Farbe.

color

0 (Weiß) oder 1 (Schwarz)

x

X-Koordinate des Mittelpunkts

y

Y-Koordinate des Mittelpunkts

radius

Radius des Kreises

LCD.Clear ()

Setzt alle Pixel der Anzeige auf Weiß.

LCD.FillCircle (color, x, y, radius)

Füllt einen Kreis mit einer Farbe.

color

0 (Weiß) oder 1 (Schwarz)

x

X-Koordinate des Mittelpunkts

y

Y-Koordinate des Mittelpunkts

radius

Radius des Kreises

LCD.FillRect (color, x, y, width, height)

Füllt ein Rechteck mit einer Farbe.

color

0 (Weiß) oder 1 (Schwarz)

x

Linke Kante des Rechtecks

y

Obere Kante des Rechtecks

width

Breite des Rechtecks

height

Höhe des Rechtecks

LCD.InverseRect (x, y, width, height)

Invertiert die Farbe aller Pixel innerhalb eines Rechtecks.

x

Linke Kante des Rechtecks

y

Obere Kante des Rechtecks

width

Breite des Rechtecks

height

Höhe des Rechtecks

LCD.Line (color, x1, y1, x2, y2)

Zeichnet eine gerade Linie von Pixel mit einer Farbe.

color

0 (Weiß) oder 1 (Schwarz)

x1

X-Koordinate des Startpunkts

y1

Y-Koordinate des Startpunkts

x2

X-Koordinate des Endpunkts

y2

Y-Koordinate des Endpunkts

LCD.Pixel (color, x, y)

Setzt die Farbe eines einzelnen Pixels auf der Anzeige.

color

0 (Weiß) oder 1 (Schwarz)

x

X-Koordinate

y

Y-Koordinate

LCD.Rect (color, x, y, width, height)

Zeichnet den Umriss eines Rechtecks in einer Farbe.

color

0 (Weiß) oder 1 (Schwarz)

x

Linke Kante des Rechtecks

y

Obere Kante des Rechtecks

width

Breite des Rechtecks

height

Höhe des Rechtecks

LCD.StopUpdate ()

Verhindert, dass nachfolgende Ausgabebefehle sofort auf die Anzeige zeichnen und speichert die Änderungen zuerst nur. 

Beim nächsten Aufruf von Update werden die Änderungen schließlich auf einmal zur Anzeige gebracht. Dieser Befehl kann nützlich sein, um Bildschirmflackern zu verhindern oder die Ausgabe zu beschleunigen.

LCD.Text (color, x, y, font, text)

Schreibt einen Text (oder eine Zahl) in einer Größe und Farbe.

color

0 (Weiß) oder 1 (Schwarz)

x

X-Koordinate, wo der Text anfangen soll

y

Y-Koordinate, wo der Text anfangen soll

font

Schriftgröße: 0 (winzig), 1 (klein), 2 (groß)

text

Der Text (oder die Zahl), die geschrieben werden soll

LCD.Update ()

Zeichnet alle Änderungen seit dem letzten StopUpdate auf die Anzeige. 

Nach Update() werden wieder alle Änderungen sofort auf die Anzeige gebracht, außer man benutzt StopUpdate ein weiteres mal.

LCD.Write (x, y, text)

Schreibt einen Text (oder eine Zahl) in mittlerer Größe und schwarzer Farbe.

x

X-Koordinate, wo der Text anfangen soll

y

Y-Koordinate, wo der Text anfangen soll

text

Der Text (oder die Zahl), die geschrieben werden soll

Mailbox

Kommunikationsystem um Daten von einem EV3-Brick zu einem anderen über Bluetooth-Funk zu übertragen.

Mailbox.Connect (brickname)

Versucht, eine Verbindung zu einem anderen EV3-Brick aufzubauen. 

Nur wenn eine Verbindung geöffnet wurde (entweder mit diesem Befehl oder von Hand mit dem Menu am Brick), können Nachrichten ausgetauscht werden.

brickname

Name des anderen Bricks.

Mailbox.Create (boxname)

Erzeugt einen Briefkasten für ankommenden Nachrichten auf dem Brick. 

Erst wenn solch ein Briefkasten angelegt wurde, können Nachrichten empfangen werden. 

Maximal 30 Briefkästen können auf einem Brick existieren.

boxname

Name des neuen Briefkastens

Rückgabewert

Eine Identifikationsnummer für den Briefkasten. Sie wird benötigt um später Nachrichten herauszuholen

Mailbox.IsAvailable (id)

Prüft, ob bereits eine Nachricht im Briefkasten ist.

id

Identifikationsnummer des lokalen Briefkastens.

Rückgabewert

"True", falls bereits eine Nachricht vorliegt. Sonst "False".

Mailbox.Receive (id)

Entfernt und holt die älteste Nachricht aus dem Briefkasten. Wenn noch keine Nachricht vorhanden ist, blockiert dieser Befehl so lange, bis eine Nachricht eintrifft.

Wenn man blockierendes Warten vermeiden will, kann man zuvor mit IsAvailable() prüfen, ob eine Nachricht da ist. 

Falls gar kein Briefkasten mit der Identifikationsnummer existiert, liefert der Befehl sofort "".

id

Identifikationsnummer des Briefkastens

Rückgabewert

Die Nachricht als einfacher Text. Derzeit werden keine anderen Nachrichtenformate unterstützt.

Mailbox.Send (brickname, boxname, message)

Sendet eine Nachricht an einen Briefkasten eines anderen EV3-Bricks.

brickname

Der Name des Bricks, der die Nachricht empfangen soll. Zuvor muss eine Verbindung zu diesem Brick geöffnet worden sein. Es ist auch möglich, einen Leertext als Namen anzugeben. In diesem Fall wird die Nachricht an alle verbundenen Bricks geschickt.

boxname

Name des Briefkastens in dem die Nachricht gespeichert werden soll.

message

Die Nachricht als einfacher Text. Derzeit werden keine anderen Nachrichtenformate unterstützt.

Math

Das Math-Objekt stellt zahlreiche nützliche mathematische Methoden zur Verfügung

Math.Pi - Eigenschaft

Gibt den Wert der Zahl Pi zurück

Math.Abs (number)

Ruft den absoluten Wert einer Zahl ab. Zum Beispiel gibt -32.233 den Wert 32.233 zurück.

number

Die Zahl, für die der absolute Wert abgerufen werden soll.

Rückgabewert

Der absolute Wert einer Zahl.

Math.ArcCos (cosValue)

Ermittelt den Bogenmaßwinkel anhand des Kosinuswertes.

cosValue

Der Kosinuswert, dessen Winkel benötigt wird.

Rückgabewert

Der Bogenmaßwinkel für den gegebenen Kosinuswert.

Math.ArcSin (sinValue)

Ermittelt den Bogenmaßwinkel anhand des Sinuswertes.

sinValue

Der Sinuswert, dessen Winkel benötigt wird.

Rückgabewert

Der Bogenmaßwinkel für den gegebenen Sinuswert.

Math.ArcTan (tanValue)

Ermittelt den Bogenmaßwinkel anhand des Tangenswertes.

tanValue

Der Tangenswert, dessen Winkel benötigt wird.

Rückgabewert

Der Bogenmaßwinkel für den gegebenen Tangenswert.

Math.Ceiling (number)

Ruft eine Ganzzahl ab, die den gleichen Wert wie die angegebene Dezimalzahl hat oder größer als diese ist. Zum Beispiel gibt 32.233 den Wert 33 zurück.

number

Die Zahl, deren größter Wert erforderlich ist.

Rückgabewert

Der größte Wert einer Zahl.

Math.Cos (angle)

Ermittelt den Kosinus des angegebenen Winkels im Bogenmaß.

angle

Der Winkel (im Bogenmaß), dessen Kosinus benötigt wird.

Rückgabewert

Der Kosinus des gegebenen Winkels.

Math.Floor (number)

Ruft eine Ganzzahl ab, die den gleichen Wert wie die angegebene Dezimalzahl hat oder kleiner als diese ist. Zum Beispiel gibt 32.233 den Wert 32 zurück.

number

Die Zahl, deren kleinster Wert erforderlich ist.

Rückgabewert

Der kleinste Wert einer Zahl.

Math.GetDegrees (angle)

Rechnet einen Winkel im Bogenmaß in Gradmaß um.

angle

Der Winkel im Bogenmaß.

Rückgabewert

Der umgewandelte Winkel in Grad.

Math.GetRadians (angle)

Rechnet einen Winkel im Gradmaß in Bogenmaß um.

angle

Der Winkel in Grad.

Rückgabewert

Der umgewandelte Winkel im Bogenmaß.

Math.GetRandomNumber (maxNumber)

Liefert eine Zufallszahl zwischen 1 und der gegebenen Zahl (inklusive).

maxNumber

Die Obergrenze für die angeforderte Zufallszahl.

Rückgabewert

Eine Zufallszahl die kleiner oder gleich der spezifiziert Zahl ist.

Math.Log (number)

Ermittelt den Logarithmus zur Basis 10 der angegebenen Zahl.

number

Die Zahl, deren Logarithmus ermittelt werden soll.

Rückgabewert

Der Logarithmus der angegebenen Zahl

Math.Max (number1, number2)

Vergleicht zwei Zahlen und gibt die größere der beiden zurück.

number1

Die erste von zwei zu vergleichenden Zahlen.

number2

Die zweite von zwei zu vergleichenden Zahlen.

Rückgabewert

Die Größere der zwei Zahlen.

Math.Min (number1, number2)

Vergleicht zwei Zahlen und gibt die kleinere der beiden zurück.

number1

Die Erste von zwei zu vergleichenden Zahlen.

number2

Die Zweite von zwei zu vergleichenden Zahlen.

Rückgabewert

Die Kleinere der zwei Zahlen.

Math.NaturalLog (number)

Ermittelt den natürlichen Logarithmus der angegebenen Zahl.

number

Die Zahl, deren natürlicher Logarithmuswert erforderlich ist.

Rückgabewert

Der natürliche Logarithmuswert einer Zahl.

Math.Power (baseNumber, exponent)

Berechnet die angegebene Potenz der Zahl baseNumber.

baseNumber

Die Zahl, deren Potenz berechnet werden soll.

exponent

Der Exponent, der bei der Berechnung der Potenz verwendet werden soll.

Rückgabewert

Die angebenene Potenz der Zahl baseNumber.

Math.Remainder (dividend, divisor)

Teilt die erste Zahl durch die zweite Zahl und gibt den Rest zurück.

dividend

Die zu teilende Zahl.

divisor

Die Zahl durch die geteilt werden soll.

Rückgabewert

Der Divisionsrest.

Math.Round (number)

Rundet eine gegebene Zahl auf die nächstliegende ganze Zahl. Die Zahl 32.233 wird zum Beispiel auf 32.0 abgerundet, während 

32.566 auf 33 aufgerundet wird.

number

Die Zahl dessen Näherungswert benötigt wird.

Rückgabewert

Der gerundete Wert der gegebenen Zahl.

Math.Sin (angle)

Ermittelt den Sinus des angegebenen Winkels im Bogenmaß.

angle

Der Winkel (im Bogenmaß), dessen Sinus ermittelt werden soll

Rückgabewert

Der Sinus des angegebenen Winkels

Math.SquareRoot (number)

Ermittelt die Quadratwurzel einer angegebenen Zahl.

number

Die Zahl dessen Quadratwurzel benötigt wird.

Rückgabewert

Die Quadratwurzel der gegebenen Zahl.

Math.Tan (angle)

Ermittelt den Tangens des angegebenen Winkels im Bogenmaß.

angle

Der Winkel (im Bogenmaß), dessen Tangens benötigt wird.

Rückgabewert

Der Tangens des gegebenen Winkels.

Motor

Steuert die angeschlossenen Motoren. 

Bei jedem Befehl muss man einen oder mehrere Motor-Ports angeben, auf den sich der Befehl beziehen soll (zum Beispiel, "A", "BC", "ABD"). 

Falls weitere EV3-Bricks über ein Kabel mit dem Haupt-Brick verbunden sind, muss man eine Ziffer entsprechend der Stelle in der Kette hinzufügen (z.B. "3BC", "2A"). In diesem Fall kann man mit einem Befehl nur die Motoren eines einzelnen Bricks ansprechen. 

Geschwindigkeit oder Leistung: Wenn man einen Motor mit einer gewählten Geschwindigkeit betreiben will, dann reguliert der EV3 die Leistung für den Motor permanent so, dass die Geschwindikgkeit eingehalten wird, egal wie viel Widerstand dem entgegenwirkt (zumindest so lange noch genug Leistungsreserve verfügbar ist).

Motor.GetCount (port)

Fragt den aktuellen Rotationszähler eines Motors ab. 

So lange der Zähler nicht zurückgesetzt wird, misst er alle Bewegungen eines Motors, auch wenn der Motor durch externe Kräfte bewegt wird, während er nicht aktiv läuft.

port

Name des Motor-Ports

Rückgabewert

Der aktuelle Wert des Rotationszählers.

Motor.GetSpeed (port)

Fragt die derzeitige Geschwindigkeit eines Motors ab.

port

Motor port name

Rückgabewert

Aktuelle Geschwindigkeit im Bereich -100 bis 100

Motor.Invert (ports)

Dieser Befehl ist nur in Version 1.2 und später der EV3-Erweiterung verfügbar. Invertiert the Bedeutung von Vorwärts und Rückwärts eines oder mehrerer Motoren. Alle späteren Motor-Befehle werden dann mit umgekehrter Richtung ausgeführt, und auch die Befehle zum Auslesen des Umdrehungszählers und der Geschwindkeit funktionieren umgekehrt. Diese Funktion ist nützlich, wenn man einen Motor umgekehrt in ein Modell einbaut und den Rest des Programm nicht änderen muss. Ein einmaliger Aufruf von Invert ganz am Anfang des Programms kann die Umkehrung kompensieren.

ports

Name des/der Motor-Ports

Motor.IsBusy (ports)

Prüft, ob einer oder mehrere Motoren gerade aktiv laufen.

ports

Name des/der Motor-Ports

Rückgabewert

"True" wenn zumindest einer der Motoren läuft.

Motor.Move (ports, speed, degrees, brake)

Bewegt einen oder mehrere Motoren mit der gewählten Geschindigkeit den angegebenen Winkel weit. 

Dieser Befehl blockiert so lange, bis die Bewegung abgeschlossen ist. 

Für eine feinere Kontrolle über die Bewegung kann man statt dessen auch Motor.Schedule verwenden.

ports

Name des/der Motor-Ports

speed

Geschwindigkeit von -100 (maximal rückwärts) bis 100 (maximal vorwärts).

degrees

Der Winkel den der Motor drehen soll

brake

"True", wenn die Motoren die elektrische Bremse benutzen sollen.

Motor.MovePower (ports, power, degrees, brake)

Bewegt einen oder mehrere Motoren mit der gewählten Leistung den angegebenen Winkel weit. 

Dieser Befehl blockiert so lange, bis die Bewegung abgeschlossen ist. 

Für eine feinere Kontrolle über die Bewegung kann man statt dessen auch Motor.SchedulePower verwenden.

ports

Name des/der Motor-Ports

power

Leistung von -100 (maximal rückwärts) bis 100 (maximal vorwärts).

degrees

Der Winkel den der Motor drehen soll

brake

"True", wenn die Motoren die elektrische Bremse benutzen sollen.

Motor.MoveSteer (ports, speed, turn, degrees, brake)

Dieser Befehl ist nur in Version 1.2 und später der EV3-Erweiterung verfügbar. Dreht 2 Motoren synchronisiert einen gewünschten Winkel weit. Synchronisiert bedeutet, dass die Regelung immer versucht, das Geschwindigkeitsverhältnis beizubehalten, auch wenn ein Motor gebremst wird. In diesem Fall wird der zweite Motor automatisch auch langsamer. Das ist besonders nützlich für Fahrzeuge mit unabhängig angetriebenen Rädern, die aber trotzdem gerade oder eine definierte Kurve fahren sollen. 

Der Winkel für die Gesamtrotation wird immer beim Motor mit der höheren Geschwindigkeit gemessen. 

Dieser Befehl blockiert so lange bis die Bewegung abgeschlossen ist.

ports

Name der beiden Motor-Ports

speed

Geschwindigkeit von -100 (maximal rückwärts) bis 100 (maximal vorwärts) des schnelleren Motors.

turn

Kurvenform von -100 (im Stehen links drehen) bis 100 (im Stehen rechts drehen).

degrees

Der Winkel, den der schnellere Motor zurücklegen soll

brake

"True", wenn die Motoren die elektrische Bremse benutzen sollen.

Motor.MoveSync (ports, speed1, speed2, degrees, brake)

Dreht 2 Motoren synchronisiert einen gewünschten Winkel weit. 

Synchronisiert bedeutet, dass die Regelung immer versucht, das Geschwindigkeitsverhältnis beizubehalten, auch wenn ein Motor gebremst wird. In diesem Fall wird der zweite Motor automatisch auch langsamer. Das ist besonders nützlich für ein Fahrzeug mit mit unabhängig angetriebenen Rädern, das aber trotzdem gerade oder eine definierte Kurve fahren soll. 

Der Winkel für die Gesamtrotation wird immer beim Motor mit der höheren Geschwindigkeit gemessen. 

Dieser Befehl blockiert so lange bis die Bewegung abgeschlossen ist.

ports

Name der beiden Motor-Ports

speed1

Geschwindigkeit von -100 (maximal rückwärts) bis 100 (maximal vorwärts) des Motors mit dem niedrigeren Port-Namen (A vor B, etc.).

speed2

Geschwindigkeit von -100 (maximal rückwärts) bis 100 (maximal vorwärts) des Motors mit dem höheren Port-Namen (A vor B, etc.).

degrees

Der Winkel, den der schnellere Motor zurücklegen soll

brake

"True", wenn die Motoren die elektrische Bremse benutzen sollen.

Motor.ResetCount (ports)

Setzen den Rotationszähler eines oder mehrerer Motoren auf 0 zurück.

ports

Name des/der Motor-Ports

Motor.Schedule (ports, speed, degrees1, degrees2, degrees3, brake)

Bewegt einen oder mehrere Motoren entsprechend mehrerer Geschwindigkeits-Parameter. Die Geschwindkeit kann positionsabhängig gesteigert oder verringert werden, um einen sanften Anlauf oder Stopp zu erreichen. 

Der Gesamtwinkel, den der Motor drehen soll, ist degrees1+degrees2+degrees3. Am Ende der Bewegung stoppt der Motor automatisch (mit oder ohne Bremsen).

Dieses Kommand kehrt sofort zurück, während der Motor noch läuft. Mit IsBusy() kann man testen, wann die Bewegung abgeschlossen ist, oder das Programm kann mit Wait() direkt auf das Ende warten.

ports

Name des/der Motor-Ports

speed

Geschwindigkeit von -100 (maximal rückwärts) bis 100 (maximal vorwärts).

degrees1

Der Teil der Rotation für die Beschleunigung

degrees2

Der Teil der Rotation in gleichmäßiger Bewegung

degrees3

Der Teil der Rotation für das Abbremsen

brake

"True", wenn der Motor die elektrische Bremse benutzen soll.

Motor.SchedulePower (ports, power, degrees1, degrees2, degrees3, brake)

Bewegt einen oder mehrere Motoren entsprechend mehrerer Leistungs-Parameter. Die Leistung kann positionsabhängig gesteigert oder verringert werden, um einen sanften Anlauf oder Stopp zu erreichen. 

Der Gesamtwinkel den der Motor drehen soll, ist degrees1+degrees2+degrees3. Am Ende der Bewegung stoppt der Motor automatisch (mit oder ohne Bremsen). 

Dieses Kommand kehrt sofort zurück, während der Motor noch läuft. Mit IsBusy() kann man testen, wann die Bewegung abgeschlossen ist, oder das Programm kann mit Wait() direkt auf das Ende warten.

ports

Name des/der Motor-Ports

power

Leistung von -100 (maximal rückwärts) bis 100 (maximal vorwärts).

degrees1

Der Teil der Rotation für die Beschleunigung

degrees2

Der Teil der Rotation in gleichmäßiger Bewegung

degrees3

Der Teil der Rotation für das Abbremsen

brake

"True", wenn der Motor die elektrische Bremse benutzen soll.

Motor.ScheduleSteer (ports, speed, turn, degrees, brake)

Dieser Befehl ist nur in Version 1.2 und später der EV3-Erweiterung verfügbar. Dreht 2 Motoren synchronisiert einen gewünschten Winkel weit. Synchronisiert bedeutet, dass die Regelung immer versucht, das Geschwindigkeitsverhältnis beizubehalten, auch wenn ein Motor gebremst wird. In diesem Fall wird der zweite Motor automatisch auch langsamer. Das ist besonders nützlich für Fahrzeuge mit unabhängig angetriebenen Rädern, die aber trotzdem gerade oder eine definierte Kurve fahren sollen. Der Winkel für die Gesamtrotation wird immer beim Motor mit der höheren Geschwindigkeit gemessen.

ports

Name der beiden Motor-Ports

speed

Geschwindigkeit von -100 (maximal rückwärts) bis 100 (maximal vorwärts) des schnelleren Motors.

turn

Kurvenform von -100 (im Stehen links drehen) bis 100 (im Stehen rechts drehen).

degrees

Der Winkel, den der schnellere Motor zurücklegen soll

brake

"True", wenn die Motoren die elektrische Bremse benutzen sollen.

Motor.ScheduleSync (ports, speed1, speed2, degrees, brake)

Dreht 2 Motoren synchronisiert einen gewünschten Winkel weit. 

Synchronisiert bedeutet, dass die Regelung immer versucht, das Geschwindigkeitsverhältnis beizubehalten, auch wenn ein Motor gebremst wird. In diesem Fall wird der zweite Motor automatisch auch langsamer. Das ist besonders nützlich für Fahrzeuge mit unabhängig angetriebenen Rädern, die aber trotzdem gerade oder eine definierte Kurve fahren sollen. 

Der Winkel für die Gesamtrotation wird immer beim Motor mit der höheren Geschwindigkeit gemessen.

ports

Name der beiden Motor-Ports

speed1

Geschwindigkeit von -100 (maximal rückwärts) bis 100 (maximal vorwärts) des Motors mit dem niedrigeren Port-Namen (A vor B, etc.).

speed2

Geschwindigkeit von -100 (maximal rückwärts) bis 100 (maximal vorwärts) des Motors mit dem höheren Port-Namen (A vor B, etc.).

degrees

Der Winkel, den der schnellere Motor zurücklegen soll

brake

"True", wenn die Motoren die elektrische Bremse benutzen sollen.

Motor.Start (ports, speed)

Startet einen oder mehrere Motoren mit der gewählten Geschwindigkeit oder setzt die Geschwindigkeit neu fest.

ports

Name des/der Motor-Ports

speed

Geschwindigkeit von -100 (maximal rückwärts) bis 100 (maximal vorwärts).

Motor.StartPower (ports, power)

Startet einen oder mehrere Motoren mit der angegebenen Leistung.

ports

Name des/der Motor-Ports

power

Leistung von -100 (maximal rückwärts) bis 100 (maximal vorwärts).

Motor.StartSteer (ports, speed, turn)

Dieser Befehl ist nur in Version 1.2 und später der EV3-Erweiterung verfügbar. Startet zwei Motoren, die synchronisiert mit fixem Geschwindigkeitsverhältnis laufen. Synchronisiert bedeutet, dass die Regelung immer versucht, das Geschwindigkeitsverhältnis beizubehalten, auch wenn ein Motor gebremst wird. In diesem Fall wird der zweite Motor automatisch auch langsamer. Das ist besonders nützlich für Fahrzeuge mit mit unabhängig angetriebenen Rädern, das aber trotzdem gerade oder eine definierte Kurve fahren soll.

ports

Name der beiden Motor-Ports

speed

Geschwindigkeit von -100 (maximal rückwärts) bis 100 (maximal vorwärts) des schnelleren Motors.

turn

Kurvenform von -100 (im Stehen links drehen) bis 100 (im Stehen rechts drehen).

Motor.StartSync (ports, speed1, speed2)

Startet zwei Motoren, die synchronisiert mit jeweils einstellbaren Geschwindigkeiten laufen. Synchronisiert bedeutet, dass die Regelung immer versucht, das Geschwindigkeitsverhältnis beizubehalten, auch wenn ein Motor gebremst wird. In diesem Fall wird der zweite Motor automatisch auch langsamer. Das ist besonders nützlich für Fahrzeuge mit mit unabhängig angetriebenen Rädern, das aber trotzdem gerade oder eine definierte Kurve fahren soll.

ports

Name der beiden Motor-Ports

speed1

Geschwindigkeit von -100 (maximal rückwärts) bis 100 (maximal vorwärts) des Motors mit dem niedrigeren Port-Namen (A vor B, etc.).

speed2

Geschwindigkeit von -100 (maximal rückwärts) bis 100 (maximal vorwärts) des Motors mit dem höheren Port-Namen (A vor B, etc.).

Motor.Stop (ports, brake)

Stoppt einen oder mehrere Motoren.

ports

Name des/der Motor-Ports

brake

"True", wenn der Motor die elektrische Bremse benutzen soll.

Motor.Wait (ports)

Wartet bis ein oder mehrere Motoren ihre Bewegung abgeschlossen habe.

Dieses Kommando zu benutzen ist normalerweise besser als IsBusy() in einer Schleife abzufragen.

ports

Name des/der Motor-Ports

Program

Die Klasse 'Program' enthält Hilfsfunktionen, um die Ausführung von Programmen zu kontrollieren.

Program.ArgumentCount - Eigenschaft

Ruft die Anzahl der Befehlszeilenargumente ab, die an das Programm übergeben wurden.

Program.Directory - Eigenschaft

Liefert das Verzeichnis des laufenden Programms.

Program.Delay (milliSeconds)

Verzögert die Ausführung eines Programms um die angegebene Anzahl Millisekunden (MilliSeconds).

milliSeconds

Die Verzögerung.

Program.End ()

Beendet das Programm.

Program.GetArgument (index)

Gibt das Argument zurück, das an das Programm übergeben wurde.

index

Der Index des Arguments.

Rückgabewert

Das Befehlszeilenargument am angegebenen Index.

Sensor

Steuert die angeschlossenen Sensoren. 

Um einen Sensor-Port zu adressieren, verwendet man die Portnummer, die unterhalb des Ports aufgedruckt ist (z.B. 1). Um Ports anderer EV3-Bricks, die mit dem Haupt-Brick verbunden sind, anzusprechen, verwendet man die nächst höheren Nummern (5 - 8 für die Sensor-Ports des ersten angeschlossenen Bricks, 9-12 für die des nächsten, und so weiter).

Sensor.CommunicateI2C (port, address, writebytes, readbytes, writedata)

Kommuniziert mit Geräten (nicht unbedingt nur Sensoren), die an einem Sensor-Port angeschlossen sind und das I2C-Protokoll verwenden. 

Dieser Befehl adressiert ein Gerät am I2C-bus und kann mehrere Bytes senden und empfangen. 

Achtung: Dieser Befehl funktioniert nicht bei EV3-Bricks, die an einem Haupt-Brick angeschlossen und von diesem gesteuert werden.

port

Nummer des Sensor-Ports

address

Adresse (0 - 127) des I2C-Slaves am I2C-Bus

writebytes

Anzahl der Bytes, die gesendet werden sollen (maximal 31).

readbytes

Anzahl der Bytes, die empfangen werden sollen (maximal 32, minimal 1).

writedata

Array mit den zu sendenden Bytes.

Rückgabewert

Ein Array mit den empfangenen Bytes.

Sensor.GetMode (port)

Liest den aktuellen Modus des Sensors. 

Viele Sensoren können in sehr verschiedenen Modi arbeiten und sehr unterschiedliche Werte liefern. Zum Beispiel kann der Farbsensor entweder das Umgebungslicht oder reflektiertes Licht, oder die Farbe einer Oberfläche messen. Sobald ein Sensor eingesteckt ist, startet er normalerweise mit Modus 0, kann aber später vom Programm in einen anderen Modus versetzt werden.

port

Nummer des Sensor-Ports

Rückgabewert

Aktuelle Modus (0 ist immer der Anfangs-Modus)

Sensor.GetName (port)

Liest den Namen und den Modus eines gerade angeschlossenen Sensors. 

Dieser Befehl ist hauptsächlich für Diagnosen nützlich, weil das Programm normalerweise implizit weiß, welche Sensorsen angeschlossen sind.

port

Nummer des Sensor-Ports

Rückgabewert

Lesbarer Text mit Port und Modus(z.B. "TOUCH")

Sensor.GetType (port)

Liest die Identificationsnummer des Sensors.

port

Nummer des Sensor-Ports

Rückgabewert

Identificationsnummer (z.B. für einen Tastsensor)

Sensor.IsBusy (port)

Prüft, ob ein Sensor gerade mit einem Moduswechsel beschäftigt ist. Nach Umschaltung kann es einige Zeit dauern, bevor neue Messergebnisse vorliegen.

port

Nummer des Sensor-Ports

Rückgabewert

"True", wenn der Sensor gerade noch beschäftigt ist

Sensor.ReadI2CRegister (port, address, registernumber)

Dieser Befehl ist nur in Version 1.2 und später der EV3-Erweiterung verfügbar. Kommuniziert mit Geräten (nicht unbedingt nur Sensoren), die an einem Sensor-Port angeschlossen sind und das I2C-Protokoll verwenden. Dieser Befehl liest den Wert eines einzelnen Geräte-Registers aus (sofern das Gerät die Kommunikation über Register unterstützt). 

Achtung: Dieser Befehl funktioniert nicht bei EV3-Bricks, die an einem Haupt-Brick angeschlossen und von diesem gesteuert werden.

port

Nummer des Sensor-Ports

address

Adresse (0 - 127) des I2C-Slaves am I2C-Bus

registernumber

Die Nummer (0 - 255) des zu lesenden Registers.

Rückgabewert

Den gelesen Registerwert (0-255).

Sensor.ReadI2CRegisters (port, address, registernumber, readbytes)

Dieser Befehl ist nur in Version 1.2 und später der EV3-Erweiterung verfügbar. Kommuniziert mit Geräten (nicht unbedingt nur Sensoren), die an einem Sensor-Port angeschlossen sind und das I2C-Protokoll verwenden. Dieser Befehl liest den Wert mehrerer Geräte-Registers aus (sofern das Gerät die Kommunikation über Register unterstützt). Achtung: Dieser Befehl funktioniert nicht bei EV3-Bricks, die an einem Haupt-Brick angeschlossen und von diesem gesteuert werden.

port

Nummer des Sensor-Ports

address

Adresse (0 - 127) des I2C-Slaves am I2C-Bus

registernumber

Die Nummer (0 - 255) des zu lesenden Registers.

readbytes

Die Anzahl der zu lesenden Register (maximal 32)

Rückgabewert

Ein Array mit den empfangenen Bytes.

Sensor.ReadPercent (port)

Liest einen einzelnen Wert und rechnet ihn in eine sinnvolle Prozentangabe um. 

Viele Sensoren können ihre gelesenen Werte in einen einzelnen Wert umrechnen, wie z.B. Lichtintenität oder den Zustand eines Tastknopfes.

port

Nummer des Sensor-Ports

Rückgabewert

Der Prozentwert des gemessenen Werts (z.B.: Ein Tastsensor liefert immer 100 wenn gedrückt, und 0 wenn nicht gedrückt)

Sensor.ReadRaw (port, values)

Liest einen Sensorwert wenn das Ergebnis von ReadPercent() nicht ausreichend ist. 

Manche Sensoren liefern Werte, die nicht in Prozent ausgedrückt werden können (z.B. ein Farb-Index) oder die aus mehreren Werten auf einmal bestehen (z.B. Entfernung und Richtung des Infrarot-Peilsenders).

port

Nummer des Sensor-Ports

values

Anzahl der Werte-Komponenten

Rückgabewert

Ein Array mit der geforderten Anzahl an Komponenten. Der Index beginnt bei 0. Komponenten, für die der Sensor keinen Wert liefert, werden auf 0 gesetzt.

Sensor.ReadRawValue (port, index)

Ähnlich wie ReadRaw, aber anstatt eines ganzen Arrays von Komponenten liest dieser Befehl nur eine einzige Komponente.

port

Nummer des Sensor-Ports

index

Index der zu lesenden Komponente

Rückgabewert

Eine Komponente des Sensor-Wertes.

Sensor.SendUARTData (port, writebytes, writedata)

Sendet Daten an Geräte, die über den UART an einen Sensor-Port angeschlossen sind. 

Das kann nützlich sein, um verschiedene Spezialkommandos zu einem Sensor/Aktor zu schicken.

port

Nummer des Sensor-Ports

writebytes

Anzahl der zu sendenden Bytes (maximum 32).

writedata

Array mit den Bytes.

Sensor.SetMode (port, mode)

Schaltet einen Sensor in einen anderen Modus. 

Viele Sensoren können in unterschiedlichen Modi arbeiten und sehr verschiedene Messergebnisse liefern. Die Bedeuting der Modus-Nummer hängt vom Sensor-Typ ab. Weitere Informationen dazu sind im Anhang zu finden.

port

Nummer des Sensor-Ports

mode

Der Modus, in den umgeschaltet werden soll. Das funktioniert nur, wenn der Sensor diesen Modus auch unterstützt.

Sensor.Wait (port)

Wartet, bis ein Sensor seinen Moduswechsel abgeschlossen hat. Wenn kein Sensor am angegebenen Port angeschlossen ist, kehrt der Befehl sofort zurück.

port

Nummer des Sensor-Ports

Sensor.WriteI2CRegister (port, address, registernumber, value)

Dieser Befehl ist nur in Version 1.2 und später der EV3-Erweiterung verfügbar. Kommuniziert mit Geräten (nicht unbedingt nur Sensoren), die an einem Sensor-Port angeschlossen sind und das I2C-Protokoll verwenden. 

Dieser Befehl schreibt den Wert eines einzelnen Geräte-Registers (sofern das Gerät die Kommunikation über Register unterstützt). 

Achtung: Dieser Befehl funktioniert nicht bei EV3-Bricks, die an einem Haupt-Brick angeschlossen und von diesem gesteuert werden.

port

Nummer des Sensor-Ports

address

Adresse (0 - 127) des I2C-Slaves am I2C-Bus

registernumber

Die Nummer (0 - 255) des zu beschreibenden Registers.

value

Der Wert (0 - 255), der in das Register geschrieben werden soll.

Sensor.WriteI2CRegisters (port, address, registernumber, writebytes, writedata)

Dieser Befehl ist nur in Version 1.2 und später der EV3-Erweiterung verfügbar. Kommuniziert mit Geräten (nicht unbedingt nur Sensoren), die an einem Sensor-Port angeschlossen sind und das I2C-Protokoll verwenden. Dieser Befehl beschreibt schreibt den Wert mehrerer Geräte-Register (sofern das Gerät die Kommunikation über Register unterstützt). 

Achtung: Dieser Befehl funktioniert nicht bei EV3-Bricks, die an einem Haupt-Brick angeschlossen und von diesem gesteuert werden.

port

Nummer des Sensor-Ports

address

Adresse (0 - 127) des I2C-Slaves am I2C-Bus

registernumber

Die Nummer (0 - 255) des ersten zu beschreibenden Registers.

writebytes

Wie Anzahl der zu beschreibenden Register (maximal 30).

writedata

Ein Array mit den zu schreibenden Werten.

Speaker

Der eingebaute Lautsprecher des Bricks kann einfache Töne oder Geräuscheffekte abspielen.

Speaker.IsBusy ()

Prüft, ob der Lautsprecher noch einen Ton oder einen Geräuscheffekt abspielt.

Rückgabewert

"True", wenn noch etwas gespielt wird, sonst "False".

Speaker.Note (volume, note, duration)

Beginnt einen Ton zu spielen, der durch eine Text-Beschreibung definiert ist.

volume

Lautstärke im Bereich 0 - 100

note

Text-Beschreibung einer Note "C4" "B7" oder eines Halbtones wie "C#5"

duration

Dauer des Tones in Millisekunden

Speaker.Play (volume, filename)

Spielt einen Geräuscheffekt aus einer am Brick gespeicherten Datei. Derzeit werden nur Dateien im .rsf - Format unterstützt.

volume

Lautstärke im Bereich 0 - 100

filename

Name der Datei ohne die .rsf - Erweiterung. Dieser Dateiname kann relativ zum 'prjs'-Verzeichnis oder ein absoluter Pfadname sein (mit führendem '/').

Speaker.Stop ()

Stoppt jeden gerade laufenden Ton oder Geräuscheffekt..

Speaker.Tone (volume, frequency, duration)

Beginnt einen Ton der angegebenen Frequenz zu spielen.

volume

Lautstärke im Bereich 0 - 100

frequency

Frequenz in Hz im Bereich 250 - 10000

duration

Dauer des Tones in Millisekunden

Speaker.Wait ()

Wartet bis der gerade gespielte Ton/Geräuscheffekt fertig ist.

Text

Das Text-Objekt bietet nützliche Vorgänge für das Arbeiten mit Text.

Text.Append (text1, text2)

Fügt zwei Texteingaben zusammen und gibt das Resultat als einen neuen Text zurück. Dieser Vorgang ist besonders dann nützlich, wenn man unbekannten Text in Variablen verarbeitet, der versehentlich als Zahl behandelt und addiert werden könnte, anstelle zusammengefügt zu werden.

text1

Der erste Teil des zu verknüpfenden Textes.

text2

Der zweite Teil des zu verknüpfenden Textes.

Rückgabewert

Der verknüpfte Text mit beiden Bestandteilen.

Text.ConvertToLowerCase (text)

Konvertiert den Textteil in kleine Buchstaben.

text

Der Text, der in Kleinbuchstaben umgewandelt werden soll.

Rückgabewert

Der angegebene Text in Kleinbuchstaben.

Text.ConvertToUpperCase (text)

Konvertiert den Textteil in Großbuchstaben.

text

Der Text, der in Großbuchstaben umgewandelt werden soll.

Rückgabewert

Der angegebene Text in Großbuchstaben.

Text.EndsWith (text, subText)

Ruft ab, ob ein bestimmter Textabschnitt mit dem angegebenen Textteil endet.

text

Der Textabschnitt, in dem gesucht werden soll.

subText

Die gesuchte Zeichenfolge.

Rückgabewert

True, wenn die Zeichenfolge am Ende des Textes gefunden wurde.

Text.GetCharacter (characterCode)

Je nach Unicode-Zeichencode wird das entsprechende Zeichen abgerufen, das dann als normaler Text verwendet werden kann.

characterCode

Der Unicode-Zeichencode für ein bestimmtes Zeichen.

Rückgabewert

Das Unicode-Zeichen, das dem Unicode-Zeichencode entspricht.

Text.GetCharacterCode (character)

Wird ein Unicode-Zeichen eingegeben, wird der entsprechende Unicode-Zeichencode abgerufen.

character

Das Zeichen, für das der Zeichencode abgerufen werden soll.

Rückgabewert

Der Unicode-Zeichencode, der dem angegebenen Zeichen entspricht.

Text.GetIndexOf (text, subText)

Sucht die Position einer Zeichenfolge innerhalb eines angegebenen Textes.

text

Der Text, in dem gesucht werden soll.

subText

Der zu suchende Text.

Rückgabewert

Die Position, an der das Textsegment im angegebenen Text erscheint. Wenn der Text nicht erscheint, wird 0 zurückgegeben.

Text.GetLength (text)

Ruft die Länge des Textes ab.

text

Der Text, dessen Länge benötigt wird.

Rückgabewert

Die Länge eines angegebenen Textes.

Text.GetSubText (text, start, length)

Ruft einen Textteil aus einem größeren Textabschnitt ab.

text

Der Text, dem die Zeichenfolge entnommen werden soll.

start

Bestimmt, wo angefangen werden soll.

length

Bestimmt die Länge einer Zeichenfolge.

Rückgabewert

Der angeforderte Textteil

Text.GetSubTextToEnd (text, start)

Ruft eine Zeichenfolge innerhalb eines Textes ab, angefangen bei einer bestimmten Position bis zum Ende.

text

Der Text, dem die Zeichenfolge entnommen werden soll.

start

Bestimmt, wo angefangen werden soll.

Rückgabewert

Die angeforderte Zeichenfolge.

Text.IsSubText (text, subText)

Ruft ab, ob ein Textteil ein Bestandteil eines größeren Textabschnittes ist.

text

Der Textabschnitt, in dem die Zeichenfolge gesucht werden soll.

subText

Die gesuchte Zeichenfolge.

Rückgabewert

True, wenn die Zeichenfolge im angegebenen Text gefunden wurde.

Text.StartsWith (text, subText)

Ruft ab, ob ein bestimmter Textabschnitt mit dem angegebenen Textteil beginnt.

text

Der Textabschnitt, in dem gesucht werden soll.

subText

Die gesuchte Zeichenfolge.

Rückgabewert

True, wenn die Zeichenfolge zu Beginn des Textes gefunden wurde.

Thread

Dieses Objekt unterstützt die Verwendung von Nebenläufigkeiten (Threads) in einem Programm. 

Ein Thread ist ein Programmstück, das unabhängig von und gleichzeitig mit anderen Teilen des Programmes ablaufen kann. Zum Beispiel könnte ein Thread die Motoren einer Maschine steuern, während ein anderer Thread Tasteneingaben verarbeitet. 

Allgemein gesagt ist Multithreading ein sehr komplexes Thema. Um es wirklich zu verstehen, empfehle ich die Verwendung weiterführender Literatur.

Thread.Run - Eigenschaft

Mit dieser Objekt-Eigenschaft werden neue Threads erzeugt. Sobald dieser Eigenschaft ein Unterprogram zugewiesen wird, startet dieses Unterprogramm als unabhängiger Thread (zum Beispiel: Thread.Run = MYSUB). 

Jedes Unterprogramm kann so als unabhängiger Thread gestartet werden, aber jedes Unterprogramm kann nur einmal zur gleichen Zeit ablaufen. Eine neuerliche Zuweisung zu Thread.Run(), während das Unterprogram noch als Thread läuft, fügt es nur in eine Warteschlange hinzu. 

Sobald sich der vorige Thread beendet (Unterprogram läuft zu seinem Ende), wird es automatisch ein weiteres Mal gestartet. Es gehen keine Aufrufe verloren, aber sie werden eventuell erst später abgearbeitet, als gedacht. 

Achtung: Auch wenn noch weitere Threads aktiv sind, wird das ganze Programm terminiert, sobald das Hauptprogramm zu seinem Ende läuft.

Thread.CreateMutex ()

Erzeugt einen Mutex (kurz für "Mutual Exclusion" = "gegenseiter Ausschluss") der dann für die Synchronisierung von Threads benutzt werden kann. 

Nur die Erzeugung von Mutexes wird unterstützt aber kein Löschen. Idealerweise legt ein Programm alle nötigen Mutexe gleich beim Programmstart an und speichert die Identifikationsnummern in globalen Variablen.

Rückgabewert

Die Identifikationsnummer des neue erzeugten Mutex.

Thread.Lock (mutex)

Versucht, den Mutex exklusiv für diesen Thread zu sperren, sodass kein anderer Thread darauf zugreifen kann. 

Falls ein anderer Thread bereits den Mutex gesperrt hat, dann wartet dieser Befehl darauf, dass die Sperre aufgehoben wird und sperrt den Mutex dann seinerseits. (Sobald dieser Befehl zurückkehrt, ist garantiert, dass der Mutex erfolgreich durch diesen Thread gesperrt wurde). 

Dieser Sperr-Mechanismus wird normalerweise benutzt, um den Zugriff auf gemeinsame Datenstrukturen oder Resourcen zu koordinieren. 

Jeder Aufruf von Lock() muss mit einem nachfolgenden Aufruf von Unlock() aufgelöst werden.

mutex

Die Identifikationsnummer des Mutex (wie von CreateMutex() zurückgeliefert)

Thread.Unlock (mutex)

Gibt einen Mutex wieder frei. Dieser Befehl darf nur nach einem vorangegangen Lock() benutzt werden.

mutex

Die Identifikationsnummer des Mutex

Thread.Yield ()

Gibt die Kontrolle über die CPU explizit an dieser Stelle frei. 

Threads laufen oft nicht wirklich parallel, weil es nicht genug CPUs für alle Threads gibt. Statt dessen macht eine CPU ein wenig Arbeit für einen Thread und schaltet dann schnell zu einem anderen Thread weiter. Dadurch entsteht der Eindruck, dass alles parallel abläuft. 

Falls ein Thread gerade nichts zu tun hat, weil er gerade darauf wartet, dass irgendeine Bedingung eintritt, kann er die Kontrolle mit Yield() vorzeitig an andere Threads abgeben, die dann die Chance haben, ihre Arbeit durchzuführen.

Vector

Dieses Objekt bietet verschiedene Operationen zur Manipulation größerer Zahlenmengen. 

Sie werden Vektoren genannt und werden in normalen Arrays mit fortlaufendem Index, beginnend bei 0, abgelegt. 

Wenn Operationen mit Arrays mit einer abweichenden Struktur aufgerufen werden, wird jedes fehlende Array-Element als 0 angenommen.

Vector.Add (size, A, B)

Addiert zwei Vektoren elementweise (C[0]=A[0]+B[0], C[1]=A[1]+B[1]...)

size

Anzahl der Elemente von jedem Vektor für die Berechnung

A

Erster Vektor

B

Zweiter Vektor

Rückgabewert

A Vektor der angegebenen Größe, der alle Summen enhält.

Vector.Init (size, value)

Initialisiert einen Vektor mit angegebener Länge und Startwert für alle Elemente.

size

Länge des Vektors

value

Der Wert für alle Elemente

Rückgabewert

Den neu erzeugten Vektor

Vector.Multiply (rows, columns, k, A, B)

Matrizenmultiplikation. 

Die Eingabevektoren werden jeweils als zweidimensioinale Matrix von gegebener Höhe und Breite interpretiert. Die einzelnen Zeilen der Matrix sind in den Vektor direkt nacheinander abgelegt. 

Mehr zur Definition von Matrizenmultiplikation gibt es auf: https://de.wikipedia.org/wiki/Matrizenmultiplikation .

rows

Anzahl der Zeilen der Ergebnis-Matrix

columns

Anzahl der Spalten der Ergebnis-Matrix

k

Anzahl der Spalten in Matrix A und gleichzeitig der Zeilen in Matrix B

A

Ein Matrix der Größe rows * k

B

Eine Matrix der Größe k * columns

Rückgabewert

Eine neue Matrix mit dem Multiplikationsergebnis

Vector.Sort (size, A)

Sortiert die Element eines Vektors in aufsteigender Reihenfolge.

size

Anzahl der Elements

A

Der zu sortierende Vektor

Rückgabewert

Ein neuer Vektor mit den sortierten Elementen

A