EV3-Basic - erste Schritte: Fragen und Antworten

NXC, C/C++, Lejos, pbLua, RobotC...

Moderator: Moderatoren

Benutzeravatar
c0pperdragon
Schreibt viel
Schreibt viel
Beiträge: 231
Registriert: 9. Feb 2015 00:29

EV3-Basic - erste Schritte: Fragen und Antworten

Beitragvon c0pperdragon » 13. Feb 2015 14:55

Hallo!

Weil es jetzt schon den ersten willigen User für mein EV3-Basic (ich schreib es doch lieber mit Bindestrich) gibt, werde ich mich bemühen, ihm beim Einstieg in dieses ganz neue Ding zu helfen so gut ich kann. Damit andere Benutzer auch davon profitieren können, machen wir die Kommunikation gleich hier öffentlich.

Also Peter, mit der Installation von Microsoft Small Basic ist die erste Hürde schon mal geschafft.
http://www.microsoft.com/en-us/download ... x?id=22961

Als nächstes schlage ich vor, mit dem Fernsteuer-Modus zu beginnen. Dazu brauchst du von der aktuellen Version (derzeit V0.3) von der EV3-Basic-Seite (https://github.com/c0pperdragon/EV3Basic/releases) die Datei ev3extension.zip .
Dieses ZIP entpackst du in das Installationsverzeichnis von Small Basic (normalerweise in /Programme (x86)/Microsoft/SmallBasic) damit dort drin ein "lib"-Verzeichnis mit drei Dateien entsteht.

Wenn du dann Small Basic startest, sollte es sofort die Befehle aus dieser Erweiterung kennen. Tippe einfach mal "EV3." (ohne Anführungszeichen) ins Editor-Fenster und der Editor müsste gleich mal ein paar Befehle vorschlagen.
Ganze Beispielprogramme für die verschiedenen Teile vom EV3 gibt es auf der EV3-Basic-Seite zum laden (examples_and_doc.zip).

Zum Ausführen eines Programmes, einfach den EV3-Brick über USB anschließen und im Small Basic auf den großen Start-Knopf drücken. Dabei darf der EV3-Brick aber nicht gerade von einem anderen Programm blockiert werden, wie z.B. von der grafischen Lego Programmieroberfläche.

Wenn du ein paar der Beispiele in dieser Umgebung zum Laufen gebracht hast (und vielleicht selbst schon was ausprobiert hast), dann schreib bitte eine Antwort und wir können mit dem echten EV3-Basic-Compiler weitermachen.

Peter28
Schreibt viel
Schreibt viel
Beiträge: 187
Registriert: 2. Nov 2013 21:44
Wohnort: Schmallenberg

Re: EV3-Basic - erste Schritte

Beitragvon Peter28 » 13. Feb 2015 17:05

Juhuuuuuuuuuu !! und alle Achtung! :yeah:
Es funktionippelt. Das ist doch schon mal ein guter Einstand. Habe erst mal nach Sensorbezeichnungen geschaut, dann aber doch geschnallt, dass es nur noch um Port 1-4 geht. Was dran hängt ist wohl erst mal Nebensache. Was mir jetzt noch fehlt ist, was steckt hinter MODE, PERCENT usw. Und gibt es da evtl. eine Befehlsliste? :rule:
LCD.Text(1, 0,0, 1, Sensor.GetName(1))
LCD.Text(1, 0,16, 1, "MODE: "+Sensor.GetType(1)+":"+Sensor.GetMode(1)+" ("+selectmode+")")
LCD.Text(1, 0,32, 1, "PERCENT: "+ Sensor.ReadPercent(1))
LCD.Text(1, 0,48, 1, " RAW: "+ Sensor.ReadRaw(1))

Und wie spricht man Motoren an. Fragen über Fragen. Ja, wenn man erst mal den Korken aus der Flasche gezogen hat, dann ist der Teufel los. Aber die Aussage steht ja: "Hier werden Sie geholfen."
Ich bin gespannt auf weitere Enthüllungen und Entdeckungen.
Danke Peter
PS: Mit den blinkenden Steuertasten klappt schon mal. Und dass gleich noch eine exe erzeugt wird finde ich toll (cool).

Benutzeravatar
c0pperdragon
Schreibt viel
Schreibt viel
Beiträge: 231
Registriert: 9. Feb 2015 00:29

Re: EV3-Basic - erste Schritte

Beitragvon c0pperdragon » 13. Feb 2015 20:19

Super, das freut mich, dass das gleich so reibungslos geklappt hat. Ich glaube, bevor wir uns auf den echten Compiler stürzen, bleiben wir mal noch ein bisschen hier und schauen, was der Fernsteuerungs-Modus (Programm läuft auf dem PC und kontrolliert den Brick) noch so alles kann.

Als Hilfe für die einzelnen Befehle wäre ja eigentlich das eingebaute Hilfesystem vom Programmeditor gedacht. Das habe ich aber nur in Englisch gemacht. Weiß jetzt auch gar nicht, wie ich das mehrsprachig hinkriegen könnte.
Macht aber nichts, ich erkläre die wichtigsten Funktionen jetzt einfach mal hier (und wenn später andere Leute auch eine deutsche Dokumentation wollen, dann kann man sie ja auf diesen Forum-Eintrag verweisen).

Habe leider vergessen, ein gutes Beispiel für die Motorsteuerung zu machen, aber das ist gar nicht so kompliziert. Generell können die Motorbefehle gleich mehrere Motoren auf einmal ansprechen. Die Befehle kriegen dafür als ports-Parameter einen Text in der Form "A" oder "AB" oder "D" oder "CDA" oder welche Kombination auch immer, einfach entsprechend der Beschriftung auf den Motor-Ports.
Ich schreibe bei der Erklärung jetzt mal alles in der Einzahl, damit der Text nicht zu konfus wird

Motor.Power(ports, power)
Stellt ein, mit wieviel Leistung (in %) der Motor betrieben werden soll. Startet den Motor aber noch nicht.
Ein negativer Wert für power bedeutet rückwärts.
Motor.Start(ports)
Startet den Motor.
Motor.Stop(ports,brake)
Stoppt den Motor. Der "brake" - parameter gibt an, ob der Motor dann die elektrische Bremse einschalten soll ("True") oder nicht ("False").
Für Techniker: Die elektrische Bremse funktioniert so, dass die Statorwicklungen kurzgeschlossen werden und dadurch der Rotor
extrem schnell stehen bleibt.
Motor.Speed(ports, speed)
Wählt eine Geschwindigkeit für den Motor (startet aber noch nicht). Im Unterschied zu Power versucht das Gerät den Motor
lastunabhängig auf dieser Geschwindigkeit zu halten und regelt die Motorleistung dauernd nach (bis zur Maximalleistung halt)
Ein negativer Wert für speed bedeuter rückwärts.
Motor.Move(ports,count,brake)
Bewegt den Motor um "count" Winkelgrade. Dieser Befehl läuft so lange, bis die Drehung ausgeführt wurde und kehrt erst dann zurück.
Mit "brake" wählt man, ob am Ende die Bremse eingeschaltet werden soll.


Die Sensoren sind ein etwas schwierigeres Kapitel, obwohl ich mich bemühe, die Schnittstelle trotzdem halbwegs einfach zu halten.
Generell kann der EV3 die meisten Sensoren (zumindest alle von original-Lego-Sensoren) automatisch erkennen und weiß wie mit denen zu kommunizieren ist.
Einfache Programme wird man so schreiben, dass man die richtige Sensor-Beschaltung voraussetzt und dann schon weiß, welcher Sensor an welchem Port hängt und was dessen Messergebnisse zu bedeuten haben.

Für diesen Fall gibt es im wesentlichen folgende Befehle:

Sensor.ReadPercent(port)
Liest einen einfachen Prozent-Wert vom Sensor (port = 1..4). Das funktioniert nur dann sinnvoll, wenn der Sensorwert auch
wirklich irgendwas in Prozent quantisierbares liest. z.B. Liefern die Tastsensoren 100 wenn gedrückt, und 0 wenn nicht gedrückt.

Sensor.ReadRaw(port)
Liest einen komplexen oder nicht-linearen Sensorwert.
z.B. liefert der Farbsensor im Farberkennungs-modus ganze Zahlen von 0 bis 7, die gleich der Farbe entsprechen.
Den in Prozent zu lesen geht, wäre aber Blödsinn (dann kommen die Werte 0, 12, 24, 37, 50, 62, 87)
Es gibt auch Sensorwerte, die man gar nicht als einzelne Zahl darstellen kann.
z.B. liefert der Farbsensor im RGB-Modus die einzelnen Farbkomponenten separat.

Sensor.Raw(index)
Nachdem man einen komplexen Wert vom Sensor gelesen hat kann man hier die einzelnen Komponenten des Werts auslesen.
index=1 enspricht der ersten Komponente (und diese wurde auch bereits vom ReadRaw zurückgegeben),
index=2 holt die zweite Komponente, usw. Die Werte bleiben bis zum nächsten Aufruf von ReadRaw verfügbar.

Sensor.SetMode(port,mode)
Dieser Befehl versucht den Modus für den Sensor zu setzen. Falls der Sensor den Modus nicht kann, dann passiert nichts.
Viele Sensoren können in verschiedenen Betriebsarten laufen und liefern dann ganz verschiedene Ergebnisse.
z.B. kann der Infrarot-Sensor nicht nur die Entfernung zum Hindernis messen (der Standardmodus mode=0), sondern
auch das Signal der Infrarot-Fernsteuerung empfangen (mode=2).

Eine ganze Liste für die verschiedenen Modi pro Sensor wäre recht recht umfangreich und ich habe sie noch nicht zusammengestellt.
Eine Liste für die Sensoren, die ich zufällig besitze steht (in englisch zwar, aber vielleicht doch verständlich) in der Datei
"runtime_library.txt" im Verzeichnis Documentation.

Wie ein Programm mit einer unbekannten Sensoren-Konfiguration umgehen kann, gibt es im Beispiel "SensorInfo". Das liest sogar
den Namen des Sensors (und des gerade aktiven Modus' aus)

Und eine Info zu den erweiterten Motorsteuerungbefehlen kann ich bei Bedarf noch beim nächsten mal schreiben.

Peter28
Schreibt viel
Schreibt viel
Beiträge: 187
Registriert: 2. Nov 2013 21:44
Wohnort: Schmallenberg

Re: EV3-Basic - erste Schritte

Beitragvon Peter28 » 13. Feb 2015 21:36

Oh, das muß ich erst mal verdauen, ausprobieren, testen. Aber heute nicht mehr, da brauche ich Zeit und Muse. Vielen Dank schon mal (auch für kommende Schulstunden) - gute Nacht.
Peter

Benutzeravatar
c0pperdragon
Schreibt viel
Schreibt viel
Beiträge: 231
Registriert: 9. Feb 2015 00:29

Re: EV3-Basic - erste Schritte

Beitragvon c0pperdragon » 15. Feb 2015 10:51

Upps. Wir haben versehentlich den Thread gewechselt. Ich wollte ja das ganze Erste-Schritte-Tuturial hier machen. Ich kopiere die Sachen einfach hier rüber...

Natürlich geht das schon. Es ist ja genau der springende Punkt bei dem ganzen Projekt, dass der EV3-Brick auch autonom arbeiten kann.

Dazu musst du dir aber bewusst sein, dass das Programm auf dem Brick wesentlich andere Rahmenbedingungen findet, als wenn
es am PC läuft. z.B. gibts da jetzt noch keine Unterstützung für Dateizugriffe (werde ich auch noch bauen, aber erst hat noch anderes Priorität).
Wenn du in dem Programm auch noch keine anderen Sachen von Small Basic benutzt, die der Brick nicht kann (Ausgabe auf TextWindow oder das GrafikWindow oder ähnliches), dann kannst du jetzt den nächsten Schritt wagen:

Lade dir von der EV3-Basic Seite (release 0.3) die Datei ev3explorer.zip (oder vielleicht hast du die ja schon) und entpacke sie in irgendein Verzeichnis. Wenn du da drinnen das Programm ev3explorer.exe startest, bekommst du ein Fenster in dem du links die Dateien vom Brick sehen kannst und rechts die Dateien vom PC. Du kannst jetzt in beiden Hälften herumnavigieren und das ganze jeweilige Dateisystem (soweit freigegeben) anschauen.
In diesem EV3Explorer ist aber auch ein Compiler eingebaut. Wenn du in deinem Ordner eine .SB - Datei (steht für Small Basic) auswählst und den "Compile" - Knopf drückst, dann versucht der Compiler die Source-Datei zu übersetzen und gleich auf den Brick aufzuspielen.
Dadurch müsste im aktuellen Verzeichnis des Bricks (in der linken Fenster-Seite) eine .rbf - Datei entstehen. Das ist das ausführbare Programm.
Damit man dieses Programm in der Auswahlliste am Gerät auch findet und bequem starten kann, muss man aber die nötigen Konventionen einhalten: Du musst ein Unterverzeichnis von "prjs" anlegen (geht auch über den EV3Explorer), idealerweise mit einem sprechenden Namen für dein Projekt und dort gehört die .rbf - Datei hinein.

Möglicherweise klappt das Compilieren jetzt nicht sofort, weil du noch nicht alle Einschränkungen kennst, denen du folgen musst, damit das alles funktioniert. In diesem Fall kommt eine Fehlermeldung. Schicke mir das dann bitte.

Benutzeravatar
c0pperdragon
Schreibt viel
Schreibt viel
Beiträge: 231
Registriert: 9. Feb 2015 00:29

Re: EV3-Basic - erste Schritte

Beitragvon c0pperdragon » 15. Feb 2015 10:53

....

Super, dass das echt sofort geklappt hat.

Das mit den parallelen Vorgängen geht jetzt in Basic nicht so direkt wie das mit der grafischen Obefläche war. Ich denke eh schon ganze Zeit nach, aber das wird irgendwie nichts Gescheites. Ich habe das jetzt aber so geplant, dass man ja alles Sachen ansteuern kann ohne dass das Programm durch irgendwas blockierd wird. Das Motor.Move() - Befehl ist ein Sonderfall und nur für den einfachen Einstieg gedacht.
Normalerweise würde man eine einfache Schleife machen und so alle 10ms mal checken, was das Programm als nächstens zu tun hat.

Dann kann man während das Gerät läuft gleichzeitig immer wieder schauen, ob ein Sensor was wichtiges meldet und entsprechend reagieren.

Das sieht dann in etwa so aus:



' Bespiel - Steuerung für ein Fahrzeug

' Vorwärts
Motor.Power("A",50)
Motor.Start("A")

While "True"

' Infrot-Sensor (Port 1) liest Entfernung zum Hindernis und stoppt Fahrzeug
If Sensor.ReadPercent(1) < 15 then
Motor.Stop("A","True")
endif
' Druck auf Touch-Sensor (Port 2) lässt Fahrzeug wieder fahren
If Sensor.ReadPercent(2)=100 Then
Motor.Start("A")
endif

' Unabhängig davon wird alle 3 Sekunden die LED-Farbe gewechselt
F = Math.Remainder(Math.Floor(EV3.Time/3000), 3)
If f=0 Then
EV3.SetLEDColor("RED", "NORMAL")
ElseIf F=1 then
EV3.SetLEDColor("ORANGE", "NORMAL")
ElseIf F=2 then
EV3.SetLEDColor("GREEN", "NORMAL")
endif

' Kurze Pause vor dem nächsten Durchgang
Program.Delay(10)

EndWhile


Wegen der Sensoren gibt es bei den Beispielen das Programm SensorReading.sb Wenn man das startet, dann fragt es permanent den Port 1 ab und gibt alle Werte aus, die es da zu Lesen gibt. Mit den Rauf/Runter - Steuertasten am Brick kann man den Modus des Sensors umschalten.
Damit kannst du schön mit den verschiedenen Sensoren experimentieren.

Benutzeravatar
c0pperdragon
Schreibt viel
Schreibt viel
Beiträge: 231
Registriert: 9. Feb 2015 00:29

Re: EV3-Basic - erste Schritte: Fragen und Antworten

Beitragvon c0pperdragon » 15. Feb 2015 21:39

Peter's Frage:
Wie sieht das in dem Basic aus wenn ich die Motorumdrehung auf 0 zurücksetzen will, um dann z.B. exakt 3 Umdrehungen machen will. Ist soetwas überhaupt implementiert? Wie auch Gyro zurücksetzen oder Compass kalibrieren.
Wie halt schon gesagt: wenn man erst mal den Korken aus der Flasche gezogen hat, dann ist der Teufel los. Aber die Aussage steht ja: "Hier werden Sie geholfen."


Den Umdrehungszähler für die Motoren kannst du mit Motor.GetCount(ports) auslesen. Das ist immer eine Zahl in Grad (kann (fast) bliebig hohe oder negative werden), wo der Motor gerade steht. Diesen Zähler kannst du mit Motor.ResetCount(ports) auf 0 zurücksetzen.
Bei den Sensoren habe ich sowas nicht vorgesehen und weiß jetzt auch gar nicht, was der Gyro-Sensor so treibt (ich habe ja selbst keinen). Wenn er ähnlich wie der Zähler vom Motor funktioniert, dann würde er wohl irgendwie die Drehungen mitzählen. Aber wenn man den Sensor selbst dann beliebig oft herumdreht, dann müsste der Zähler irgendwann immer höher und höher werden. Kannst du das mit dem SensorReading - Beispiel ausprobieren und mir sagen, was dieser Gyro so macht.

Peter28
Schreibt viel
Schreibt viel
Beiträge: 187
Registriert: 2. Nov 2013 21:44
Wohnort: Schmallenberg

Re: EV3-Basic - erste Schritte: Fragen und Antworten

Beitragvon Peter28 » 15. Feb 2015 22:49

Mach ich. Werde in Zukunft in diesem Tread fragen und antworten, sonst übersieht man noch etwas. Und es sind ja auch erste Schritte. Die Frage mit dem Rücksetzen hätte ich nicht gebraucht. Muß mal wirklich pö a pö alle Unterbefehle durchgehen.

Peter28
Schreibt viel
Schreibt viel
Beiträge: 187
Registriert: 2. Nov 2013 21:44
Wohnort: Schmallenberg

Re: EV3-Basic - erste Schritte: Fragen und Antworten

Beitragvon Peter28 » 16. Feb 2015 11:58

Hallo cOpper,
HT-Compass arbeitet auf Mode 0. N ist im Uhrzeigersinn 0, S = 50, N von links quasi 99,999. Nun zum Gyro. In den Modi 0-2 startet er immer mit 50, bei Bewegung entgegen Uhrz.-sinn (je nach Beschleunigung) 49,99 - 0, im Uhrz.-s. 50,001 - 99,99. Mode 3 ist sehr interessant, da er da immer mit Wert 50 startet, wenn er vorher im Mode 0 war. Ist er im Mode 3 und ich drehe ihn um 90° zeigt er bei Neustart des Programms 25 mehr oder weniger, je nach Drehrichtung. Über 180° hinaus ist man allerdings der Gelackmeierte, entweder 0 oder 100. Das läßt sich aber sicher programmtechnisch abfangen. Ergo -> Gyro kurz im Mode 0 ansprechen und man weiß mit Sicherheit er steht auf 50. Das entspräche also dem Reset. Hast Du Erkenntnisse uber die Kalibrierung des IR-Sensors. In der graf. Prog.-umgebung gibt es den Passus Lichthelligkeit min/max. Wenn nicht, müsste ich die Sache untersuchen. Noch eine gemeine Frage: Kann ich den Ladezustand des Batterie 6-er-Packs außer auf Brick schauen herausbekommen?
Dann könnten Fahrzeuge wie z.B. der Saugroboter beizeiten verkrümeln.
PS. Der Gyro scheint mit dieser Art des Ansprechens wertmäßig absolut stabil zu sein, im Gegensatz zur Grafiksoftware.

Benutzeravatar
c0pperdragon
Schreibt viel
Schreibt viel
Beiträge: 231
Registriert: 9. Feb 2015 00:29

Re: EV3-Basic - erste Schritte: Fragen und Antworten

Beitragvon c0pperdragon » 16. Feb 2015 12:17

Aha, super, dass das mit dem Kompass so logisch funktioniert.
Wenn du den Gyro mit dem Mode-Wechseln zurücksetzen kannst, dann ist das mal OK. Ich glaube zwar nicht, dass das wirklich im Sinne des Erfinders ist, aber ich weiß vorerst auch nichts besseres.

Batteriestand kann das EV3-Basic noch nicht abfragen. Kann ich aber wahrscheinlich leicht einbauen. Wird dann EV3.BatteryLevel oder so werden.
Würde dann in der nächsten Version dabei sein.

Peter28
Schreibt viel
Schreibt viel
Beiträge: 187
Registriert: 2. Nov 2013 21:44
Wohnort: Schmallenberg

Re: EV3-Basic - erste Schritte: Fragen und Antworten

Beitragvon Peter28 » 17. Feb 2015 13:55

Hallo cOpper,
geht schon los. Habe keine Reaktion bei

Motor.Speed("AD",50)
Motor.ResetCount("AD")
Motor.ScheduleSyncForCount("AD",100,200,"D","True")

Fehlen mir doch ein paar Windungen? Habe Befehl so verstanden, dass der 3. Wert dafür sorgt, rechts oder links rum. Aber die Motorenlaufen nicht mal an. Synchronisieren muß man bei Geradeausfahrt wohl immer?

Benutzeravatar
c0pperdragon
Schreibt viel
Schreibt viel
Beiträge: 231
Registriert: 9. Feb 2015 00:29

Re: EV3-Basic - erste Schritte: Fragen und Antworten

Beitragvon c0pperdragon » 17. Feb 2015 15:04

Der 3. Wert währe OK und 200 würde bedeuten, dass das die maximal enge Kurve wird. D.h. der zweite Motor läuft rückwärts. Für eine Geradeausfahrt muss dieser Wert 0 sein (bei -200 gehts dann in die andere Richtung).
Das Problem ist aber das "D" beim 4. Parameter. Dieser Parameter "count" soll nämlich angeben, wie weit der Haupt-Motor laufen soll (in Grad). Dieses "D" interpretiert er jetzt als 0 und tut mal gar nichts.
Der Hauptmotor ist übrigens immer derjenige, der im Alphabet zuerst kommt.

Benutzeravatar
c0pperdragon
Schreibt viel
Schreibt viel
Beiträge: 231
Registriert: 9. Feb 2015 00:29

EV3-Basic Neue Version (0.4)

Beitragvon c0pperdragon » 17. Feb 2015 15:12

Hi!
Habe mal die Sachen, an denen ich in letzer Zeit gearbeitet habe, in eine neue Version verpackt (zu holen auf https://github.com/c0pperdragon/ev3basic/releases).
Die kann jetzt ein paar Sachen mehr (die du jetzt vielleicht mal nicht brauchen wirst), aber auch den Batteriestand auslesen.

Aus verschiedenen Gründen musste ich aber auch eine Funktion ändern, die du vielleicht schon benutzt: Sensor.ReadRaw
Die gibt jetzt nämlich gleich sofort alle Sensordaten auf einmal als ein Array zurück, anstatt dass man das einzeln abfragen muss.
Das ist jetzt erstens eleganter (und geht, weil ich das mit dem Zurückgeben von Arrays frisch programmiert habe) und zweitens brauche ich das jetzt damit mir das später nicht mit dem Multithreading in die Quere kommt.

Außerdem habe ich die Funktion LCD.MemorizeChanges() auf LCD.StopUpdate() umbenannt, weil der vorige Name einfach nicht das richtige ausgesagt hat. Wenn du das noch nicht benutzt, dann wirst du davon nichts merken.

Peter28
Schreibt viel
Schreibt viel
Beiträge: 187
Registriert: 2. Nov 2013 21:44
Wohnort: Schmallenberg

Re: EV3-Basic - erste Schritte: Fragen und Antworten

Beitragvon Peter28 » 18. Feb 2015 09:41

Hallo, nochmal zur Motorsteuerung habe folgende Zeile
Motor.ScheduleSyncForCount("AD",100,200,"A","false")
aber schweigen im Walde ??
Da muß doch sicher nicht vorher noch etwas anderes angegeben werden?
Der Compiler bringt Fehler: Undefined Function Motor.Sc.... at 1:28

Benutzeravatar
c0pperdragon
Schreibt viel
Schreibt viel
Beiträge: 231
Registriert: 9. Feb 2015 00:29

Re: EV3-Basic - erste Schritte: Fragen und Antworten

Beitragvon c0pperdragon » 18. Feb 2015 16:58

Wie oben gesagt, musst du anstatt "A" im 4. Parameter, eine Zahl schreiben, die angibt, wie weit sich die Motoren drehen sollen.
"A" wird an der stelle einfach als 0 unterpretiert.

Warum der Befehl jetzt im Compiler nicht geht, muss ich mir noch anschauen.


Zurück zu „textbasierte Programmiersoftware“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 27 Gäste

Lego Mindstorms EV3, NXT und RCX Forum : Haftungsauschluss