Lego faszinierte mich schon immer und es ist eines der Dinge aus meiner Kindheit, die diese Faszination nie verloren haben. Vor ca. einem Jahr spielte ich mit einem Mindstorm NXT 2.0 und Python. Das funktionierte richtig gut und vor Kurzem bekam ich einen der neuen EV3 in die Hände.

Wie Weihnachten fühlte sich das an.

Der so genannte EV3 ist viel mehr als nur ein Spielzeug für erwachsene Nerds, sondern ein ernstzunehmender Controller für Roboter jeglicher Art. Dank der offenen Schnittstellen ist es auch möglich den Controller mit anderen Mitteln als dem “Point-And-Click” Studio von Lego zu programmieren.

Erste Schritte

Meine bessere Hälfte Martina und ich begannen damit erstmal den auf der Packung abgebildeten Roboter zu bauen und diesen dann mittels der Android App durch die Wohnung zu navigieren. Das war schon ein Spaß, aber damit gaben wir uns natürlich nicht zufrieden.

Zwar gibt es noch nicht diese Vielzahl an Libraries für den EV3 wie es sie für den NXT 2.0 gibt, aber mittels Tante Google fand ich ein Projekt welches sich MonoBrick nennt.

LEGO Mindstorms is all about sharing…

Der dänische Entwickler Andre schreibt dort über sein Mono Library für Lego Mindstorm und letzte Woche hat er eine neue Version veröffentlicht welche den EV3 unterstützt. Wenn man bedenkt, dass es den neuen Brick erst seit 1.September am freien Markt gibt ist das extrem schnell.

Autonom

Also lösen wir uns von allem was Lego an IDE und Steuerungen mitbringt und verbinden den EV3 direkt mit unserem Linux Rechner.

Build

Wir haben uns einen einfachen Roboter mit Kettenantrieb gebaut. An der Front ist der Infrarotsensor (Sensor Port 2), mit Ausrichtung nach vorne und der Farbsensor (Sensor Port 1) mit Ausrichtung nach Unten verbaut. Oben haben wir noch den Touchsensor (Sensor Port 3) verbaut, als Not-Aus. Die beiden Motoren hängen an den Motorports B und C. Wie das Ding dann aussieht seht ihr in der zweiten Hälfte des Videos am Ende des Artikels.

Install

Nun installiert man sich MonoDevelop und lädt sich von der MonoBrick Seite das TestProjekt herunter. Dort findet ihr auch eine detaillierte Beschreibung des Libraries und Beispiele.

Connect

Nun muss der Brick mittels Bluetooth ganz normal mit dem PC gepaired werden und danach an /dev/rfcomm0 gebunden werden. Dazu sucht man zuerst mittels des hcitools den Brick und bindet dann die gefundene Adresse.

Select Code
salendron@XPS:~$ hcitool scan
Scanning ...
00:16:77:40:CF:74 EV3
salendron@XPS:~$ sudo rfcomm bind /dev/rfcomm0 00:16:77:40:CF:74

Programm

Bevor wir den Roboter aber nun Starten können müssen wir ihm noch sagen was er tun soll. Für diesen Roboter legten wir folgendes Verhalten Fest:

  1. Motor B & C synchron
  2. Roboter läuft für 2 Minuten
  3. Wenn der Button gedrückt wird, wird alles gestoppt.
  4. Wenn der Farbsensor “Rot” sieht, also über eine Rote Linie fährt, umdrehen.
  5. Wenn der IRSensor eine Distanz kleiner als 6 erkennt wird auch umgedreht.
  6. Nach den 2 Minuten Stopp.

Als Programm sieht das Ganze dann wie folgt aus:

Select Code
using System;
using MonoBrick.EV3;

namespace Application
{
public static class Program{

static void Main(string[] args)
{
//Initialize Brick on BLuetooth
var ev3 = new Brick<Sensor,Sensor,Sensor,Sensor>("/dev/rfcomm0");

try{
//open connection
ev3.Connection.Open();

//initialize sensors
ev3.Sensor1 = new ColorSensor();
ev3.Sensor2 = new IRSensor();
ev3.Sensor3 = new TouchSensor();

//synchronize motors
ev3.MotorSync.BitField = OutputBitfield.OutB | OutputBitfield.OutC;

//initially turn them off
ev3.MotorB.Off();
ev3.MotorC.Off();

//save start time and initialize a loop to make the robot run for 2 minutes
DateTime start = DateTime.Now;
while(DateTime.Now < start.AddSeconds(120))
{
//read sensor values
String color = ev3.Sensor1.ReadAsString();
int distance = Int32.Parse(ev3.Sensor2.ReadAsString());
String touch = ev3.Sensor3.ReadAsString();
Console.WriteLine(String.Format("COLOR:{0} - DISTANCE:{1} - TOUCH:{2}",color,distance,touch));

//drive
ev3.MotorSync.On(50, 0);

//if the button is pressed, end the loop
if(touch == "On")
{
break;
}

//if the robot gets too close to something or find the red line, turn
if(distance < 6 || color == "Red")
{
ev3.MotorSync.Off();
ev3.MotorB.On(50);
ev3.MotorC.On(-50);
System.Threading.Thread.Sleep(1000);
ev3.MotorSync.Off();
}
}

//turn motors off
ev3.MotorSync.Off();

//end connection to brick
ev3.Connection.Close();
}
catch(Exception e){
Console.WriteLine(e.StackTrace);
Console.WriteLine("Error: " + e.Message);
Console.WriteLine("Press any key to end...");
Console.ReadKey();
}
finally{
ev3.Connection.Close();
}
}
}
}

Demo

Jetzt aber genug mit Theorie. Im folgenden Video seht ihr den Roboter von der Packung, den wir mittels der Android App gesteuert haben und anschließend unseren eigenen der mittels des hier beschriebenen Programms ganz alleine durch die Wohnung fährt, Wänden ausweicht und die rote Linie nicht überfährt.