banner left Boxtec Banner
Platzhalter BoxtecProdukteForumShopKontaktPlaygroundn/aJobs
 

Hier möchte ich verschiedene Möglichkeiten zur Steuerung der Lego Technics Bauteile (Motoren / Sensoren) aufzeigen. Und einige konkrete Projekte vorstellen.

Technische Lego Komponenten und deren Möglichkeiten

  • Lego Mindstorms NXT und EV3

Eigens System mit eigener Programmierumgebung, das System hat einen eigenen Mikrokontroller welcher unabhängig läuft.

  • Lego WeDo 1.0 und 2.0

Lernsystem für Schulen mit Motoren/Sensoren und mit eigener Software zur Programmierung für viele Endgeräte

  • Lego Power Functions

Kein eigener Mikrocontroller, nur Motoren, Servos, Infrarot Controller. Kann mit Arduino und IR Sender gesteuert werden oder über Kabel mit dem Arduino verbunden werden. IR Library: https://github.com/jurriaan/Arduino-PowerFunctions

  • Lego Boost

Eigenes System mit grafischer Programmier Oberfläche nur für Tablets

Bluetooth Baustein für den Anschluss der Lego Power Functions und zur Fernsteuerung über Tablets oder Laptop mit Scratch

Analog Sbrick jedoch können hier noch die Sensoren vom WeDo System angeschlossen werden.

Projekte

Autonomer Racer

Dazu habe ich das Lego Modell Tracked Racer (42065) mit einem Arduino erweitert. Die Steuerung der Motoren ist sehr einfach über Infrarot möglich. Der Arduino braucht nur eine IR Led und kann mit der Library (PowerFunctions) https://github.com/jurriaan/Arduino-PowerFunctions einfach die Fernsteuerung vom Racer simulieren. Damit das Fahrzeug den Hindernissen ausweichen kann habe ich 2 Ultraschallsensoren eingebaut.

Hier einige Bilder:

Video:

https://youtu.be/3VWKoln7OAY

Android APP Steuerung vom Lego Racer

Dazu habe ich wieder das gleiche Lego Model (Tracked Racer / 42065) verwendet. Der ganze Hardware aufbau ist genau Analog zum vorherigen Beispiel. Einzig ist hier der Arduino nicht das Herz der Steuerung. Der Arduino empfängt die Befehle von einer Android APP via Bluetooth auch über die Serielle Schnittstelle und setzt die Befehle dann in Infrarot Signale um, damit steuer er dann die Lego Motoren.

Damit das Autonome Fahren trotzdem noch möglich ist kann die Android App zwischen den folgenden Modi entscheiden:

    Modes: m: manual & gyro
           n: normal
           r: reverse 
           s: slalom
           h: halt (stop)
           r: reset (reprogramm with ide)

Der Modus m ist für die richtige Fernsteuerung via APP gemacht. In dem Modus erwartet der Arduino via Bluetooth in der Seriellen Schnittstelle Werte für den Motor Links und Rechts.

Das war jetzt der erste Teil, das lässt sich auch ganz gut via Serial Monitor testen.

Jetzt aber noch zur Android APP. Da gibt es das Hervorragende MIT App Inventor Projekt: http://appinventor.mit.edu/explore/. Damit lassen sich im Browser Android Apps zusammenklicken.

Die Element sind genau festgelegt und Coding ist nur über eine grafische Oberfläche möglich aber man kommt sehr schnell zum Ziel.

Hier die Oberfläche meiner App im Editor.

Und hier die Prgramm Logik als Blocks.

Hier seht Ihr dann das ganze in Action:

Video: https://youtu.be/PSZvjFcfhW0

Video Ausschnitt:

Bluetooth Programmierer

Damit der Lego Racer auch ohne Kabel neu programmiert werden kann habe ich das Bluetooth Modul HC-05 mit dem Arduino verbunden und versucht Ihn direkt in der Arduino IDE via Bluetooth zu programmieren.

Da gab es einige Hindernisse, unter Windows kann man das genau nach den vielen Anleitungen im Internet umsetzen. Hier ein gutes Beispiel einer Antleitung: http://blog.iteadstudio.com/upload-program-to-arduino-with-bt-shield/

Das funktioniert bei Windows gut weil bei jedem programmieren der State Pin vom HC-05 getriggert wird. Das sieht man hier schön:

Unter Linux ist es anders, da wird der State Pin nur einmalig getriggert. Nämlich dann wenn das Modul mit dem Computer verbunden und eine Serielle Schnittstelle zugewiesen wird. Es gibt aber einen Workaround, im Arduino Sketch habe ich eine Zusatz-Logik eingebaut welche auf das Zeichen “r” per Serieller Verbindung wartet und dann einen Pin runterzieht, der Pin ist dann über einen Kondensator mit dem Reset Pin verbunden. Das funktioniert ganz gut, ich muss nur ca. eine Sekunde warten und dann kann ich mit dem Hochladen vom Sketch beginnen. Somit nicht ganz so einfach wie beim Windows aber gut machbar.

Hier die wichtigen Stellen um so ein Reset umzusetzen:

Pin 7 wird für das Reset genutzt. Er wird mit einem kleinen Kondensator verbunden. Der 2. Anschluss vom Kondensator wird mit dem Reset Pin vom Arduino verbunden.

Direkt als erstes im Setup muss der Pin 7 auf HIGH gesetzt werden ansonsten wird der Arduino direkt nach dem Start in den Reset versetzt, das ist ja nicht das Ziel.

const int triggerReset = 7;
String inputString = "";
String inputString2 = "";
boolean newInput = false;

void setup() {
  digitalWrite(triggerReset, HIGH);
  pinMode(triggerReset, OUTPUT);
  digitalWrite(triggerReset, HIGH);

Das reset Zeichen wird ja per Serieller Schnittstelle an den Arduino übergeben

also brauchen wir noch ein Serial.begin(57600); welcher auch im Setup() eingebaut wird.

Sobald etwas per Serieller Schnittstelle an den Arduino übertragen wird läuft diese Routine hier durch. Sie schreibt den Dateninhalt in die Variable inputString und setzt die Variable newInput auf true.

void serialEvent() {
  while (Serial.available()) {
    inputString = Serial.readStringUntil('\n');
    newInput = true;
  }
}

Jetzt fehlt nur noch der eigentliche Reset, wir wollen das aber nicht im Serial Event tun, sondern wir reagieren auf die unterschiedlichen Aktivitäten im Loop.

Jedoch nur wenn newInput auf true steht suchen wir uns das 1. Zeichen vom InputString raus. Wenn das ein r ist dann machen wir ein reset. Dazu gehen wir zuerst noch die Info an die Serielle Schnittstelle zurück dass ein Reset gemacht wird. Wenn da ein h kommt machen wir ein halt/stop. So unterscheiden wir zwischen den unterschiedlichen Betriebsmodi. Bei mir hat sich ein Reset in 1.8 Sekunden bewährt. Das ist genau die Zeit die ich brauche bis ich vom Serial Monitor wo ich ein “r” eingebe in die Arduino IDE gesprungen bin. Das kann jeder auf seine Bedürfnisse Anpassen. Beim Testen habe ich gemerkt dass die Arduino IDE mit dem Upload etwas flexibel ist und eine Zeit lang wartet. Im Idealfall soll genau dann der Reset durchgeführt werden.

void loop() {

  // Get Mode from serial
  if (newInput) {
    inputString2 = inputString.substring(0, 1);
    // reset
    if ( inputString2 == "r" ) {
      mode = 'r';
      Serial.println("Reset in 1.8 Second");
      delay(1800);      
      digitalWrite(triggerReset,LOW);
      delay(100);
      digitalWrite(triggerReset,HIGH);
    }
    // halt/stop
    if ( inputString2 == "h" ) {
      Serial.print("got mode:");
      Serial.println("Halt/stopped");
      mode = 'h';
    }
    newInput = false;
    }
    
 
projekte/dinoi/lego_technics.txt · Last modified: 2018/01/17 23:58 by dinoi
 
 

zum Seitenanfang

Letzte Aktualisierung: © boxtec internet appliances · the better security products