Arduino controlling Lego 4×4 (Powerfunctions IR)

Lego 4x4 OffroaderFor the evenings at late summer holidays on a small island in the German north sea I bought a Lego 4×4 Offroader to build with the kids. The truck has 4×4 driving and steering, and is controlled by an ir remote. Coming home with the built truck  I was curious whether I could use an arduino to control the car.

So let’s share what I found out: The truck uses the Lego power functions (info). One could use wiring to control it, but since I got some experience with ir control, I tried it this way, so no physical connection is needed. I found three libraries out there to control Lego power functions with the arduino and ended with this one: LEGOPowerFunctions. To get it to run I had to insert the line “#include <Arduino.h> in the legopowerfunctions.h file. After that everything worked fine. Spending a lot of time with soldering in the last projects I also wanted to try a system without soldering, so I gave the grove system from seeed a try. For a small prove of concept I used an IR Emitter, a LCD Display (for debugging),  a LED-Bar and an ultrasonic range sensor. And here is the (simple) code which you can use as start. It simply drives the truck forward and backs up and turn if it is approaching  a wall. It also gives some simple debugging info on LCD and the LED-Bar.

 

define TRIGGER_PIN  2  //12  // Arduino pin tied to trigger pin on ping sensor.
#define ECHO_PIN     3  //11  // Arduino pin tied to echo pin on ping sensor.



#include <legopowerfunctions.h>

#include <SerialLCD.h>
#include <SoftwareSerial.h> //this is a must
#include "LED_Bar.h"

LED_Bar myLED;

// IR led on port 13
//LEGOPowerFunctions lego(13);
LEGOPowerFunctions lego(5);

int timeout, count;
unsigned long int distance;

SerialLCD slcd(6,7);//this is a must, assign soft serial pins

void setup()
{           

  myLED.set_LED_Index(0b000001101010101);
  //Ping
  pinMode(TRIGGER_PIN, OUTPUT);     
  pinMode(ECHO_PIN, INPUT);

  slcd.begin();
  // Print a message to the LCD.
  slcd.print("hello, world!");
  delay(3000);
}

void loop()
{
  while(1){

    distance = pingIt();  

    if (distance <= 40) {
      slcd.setCursor(0, 1);
      slcd.print("Rueckwaerts  ");
      lego.ComboPWM(PWM_FWD7, PWM_REV6, CH2); //
      delay(700);
    } 
    else
    {
      slcd.setCursor(0, 1);
      slcd.print("Forward  ");
      lego.ComboPWM(PWM_FLT, PWM_FWD6, CH2); //Forward 4WD
      delay(700);
    }  

  }

  slcd.setCursor(0, 1);
  slcd.print("PWM_FWD3  ");
  lego.ComboPWM(PWM_FLT, PWM_FWD3, CH2); //Forward 4WD
  pingIt();
  delay(3000);

  slcd.setCursor(0, 1);
  slcd.print("PWM_FWD4  ");
  lego.ComboPWM(PWM_FWD7, PWM_FWD4, CH2); //Forward 4WD
  pingIt();
  delay(1000);

  slcd.setCursor(0, 1);
  slcd.print("PWM_FWD5  ");
  lego.ComboPWM(PWM_REV7, PWM_FWD5, CH2); //Forward 4WD
  pingIt();
  delay(3000);

  slcd.setCursor(0, 1);
  slcd.print("PWM_FWD6  ");
  lego.ComboPWM(PWM_FLT, PWM_FWD6, CH2); //Forward 4WD
  pingIt();
  delay(3000);

  slcd.setCursor(0, 1);
  slcd.print("PWM_FWD7  ");
  lego.ComboPWM(PWM_FLT, PWM_FWD7, CH2); //Forward 4WD
  pingIt();
  delay(3000);

  slcd.setCursor(0, 1);
  slcd.print("ComboMode  ");
  lego.ComboMode(RED_FWD, BLUE_FWD, CH2);
  pingIt();
  delay(3000);

  // }

  slcd.setCursor(0, 1);
  slcd.print("zwei  ");  
  lego.ComboMode(PWM_FLT, PWM_FWD4, CH2); //Left Backward
  delay(3000);

  slcd.setCursor(0, 1);
  slcd.print("drei  ");
  lego.ComboMode(PWM_FLT, PWM_FWD7, CH2); //Left Forward
  delay(3000);

  slcd.setCursor(0, 1);
  slcd.print("vier   ");
  lego.ComboMode(PWM_FLT, PWM_BRK, CH2); //Right Forward
  delay(3000);

  slcd.setCursor(0, 1);
  slcd.print("fuenf  ");
  lego.ComboMode(PWM_FLT, PWM_REV4, CH2); // Right Backward Not Working
  delay(3000);

  slcd.setCursor(0, 1);
  slcd.print("sechs   ");

  lego.ComboMode(PWM_FLT, PWM_REV1, CH2); //Forward 4WD
  delay(3000);

  slcd.setCursor(0, 1);
  slcd.print("sieben   ");  
  lego.ComboMode(PWM_FLT, PWM_REV7, CH2); //Left Backward
  delay(3000);

  slcd.setCursor(0, 1);
  slcd.print("acht   ");
  lego.ComboMode(PWM_FWD2, PWM_FLT, CH2); //Left Forward
  delay(3000);

  slcd.setCursor(0, 1);
  slcd.print("neun   ");
  lego.ComboMode(PWM_REV4, PWM_FLT, CH2); //Right Forward
  delay(3000);

  slcd.setCursor(0, 1);
  slcd.print("zehn   ");
  lego.ComboMode(PWM_FWD3, PWM_FWD3, CH2); // Right Backward Not Working
  delay(3000);

  slcd.setCursor(0, 1);
  slcd.print("zehn   ");
  lego.ComboMode(PWM_FWD3, PWM_FWD3, CH2); // Right Backward Not Working
  delay(3000);

  /*

   timeout = 5; // 5 secs
   count = 0;
   while(timeout > 0)
   {
   //lego.ComboPWM(PWM_REV4, PWM_FWD4, CH2); // 50% speed
   lego.ComboPWM(PWM_FLT, PWM_FWD4, CH2); // 50% speed
   delay(100);

   if (count++ == 1)
   {
   timeout--;
   count = 0;
   }

   }
   lego.ComboPWM(PWM_FLT, PWM_FLT, CH2); // stop
   delay(1000);
   timeout = 3; // 5 secs
   count = 0;
   */
  /*
  while(timeout > 0)
   {
   lego.ComboMode(RED_FWD, BLUE_FWD, CH2);  // turn
   delay(100);
   if (count++ == 10)
   {
   timeout--;
   count = 0;
   }
   }
   */
}

long unsigned int pingIt(){
  // Start Ranging
  long unsigned int distance;
  int ii;

  digitalWrite(TRIGGER_PIN, LOW);
  delayMicroseconds(2);  //4 2
  digitalWrite(TRIGGER_PIN, HIGH);
  delayMicroseconds(10); //20 10  5
  digitalWrite(TRIGGER_PIN, LOW);
  // Compute distance
  distance = pulseIn(ECHO_PIN, HIGH);
  distance= distance/58;

  myLED.set_LED_Range(ledBarRange(distance));

  slcd.setCursor(0, 0);
  slcd.print("         ");

  slcd.setCursor(0, 0);
  slcd.print(distance, DEC);
  //lcd_print(0, "Ping");
  //lcd_print_special(turn, distance);
  //distanceLeds(distance);
  return distance;
}

int ledBarRange(long unsigned int aD){
  if (aD <= 5) return 10;
  if (aD <= 10) return 9;
  if (aD <= 15) return 8;
  if (aD <= 20) return 7;
  if (aD <= 30) return 6;
  if (aD <= 40) return 5;
  if (aD <= 50) return 4;
  if (aD <= 70) return 3;
  if (aD <= 90) return 2;
  return 1; 
}

 

Apple TV 3 – watchever.de

Durch ein günstiges Angebot habe ich jetzt mein Apple TV 2 durch ein Apple TV 3 ersetzt. Was ein Unterschied. Ich bin mir nicht ganz sicher an woran es liegt: Die 1080er Auflösung, das WLan mit 5 GHz oder eben der neuen Hardware und dem besseren Zusammenspiel mit dem TV. Vorher vorhandene Ruckler bei Schwenks sind weg. HD und Fotos kommen super rüber. Und zufällig wurde das Angebot jetzt um ein deutsches “Netflix” ergänzt. Wie praktisch, und unten mehr dazu.

Wie meistens im Apple Universum, war die Einrichtung ein Klacks: Einfacher geht’s fast nicht. Wlan Passwort und Freigabe, fertig. Das Streamen von iTunes oder dem iPad: Einwandfrei.

Kosten: Eigentlich wolte ich mir ja ein Raspberry Board zulegen, auch um etwas damit zu experimentieren. In diesem Usecase, jedoch, schafft es Apple (fast) günstiger zu sein als ein Selberbau. Für den raspberry wären ca. 70,00 € fällig gewesen (40,00 + 10,00 Gehäuse + 10,00 Netzteil + 10,00 WLAN-Adapter). Das Apple TV im Angebot für 88,00 €, und 10 min nach dem Auspacken schon im Betrieb. Schauen wir uns mal den Stromverbrauch an: Für den Raspberry wird empfohlen auf jeden Fall ein Netzteil mit Strom > USB (= 0,5 A) zu besorgen. Das Apple TV kommt laut diverser Messungen im Betrieb mit 1W aus. Im Standby mit handelsüblichen Messgeräten nicht mehr zu messen. Fazit: Wer mit dem Apple-Universum zufrieden ist, findet derzeit keine günstigere oder bessere Hardware als Heimmediencenter. Sammler umfangreicher Mediensammler in allen verbreiteten Formaten müssen konvertieren oder greifen besser zu anderen Lösungen, oder dem Jailbreak (siehe PS).

Watchever.de: Ganz neu in Deutschland auf dem Markt.Für eine Flatrate von knapp 9€/Monat darf man mit bis zu 5 Geräten auf ihr Angebot zugreifen. Das Angebot ist noch etwas bescheiden, gleichwohl für uns, vor allem mit Kindern, ausreichend (Haben bisher viel aus der Bücherei geholt). Einige schöne alte Sachen, ohne Werbung und viel zusätzlich mit Originalton. Trotzdem noch mit der Hoffnung auf Verbesserung. Technisch, bisher: Läuft gut auf ATV und iPad. Macht geräteunabhängig weiter wo es aufgehört hat: Klappt. Offline schauen (d.h. sich Filme für Urlaub oder Ferien) runterladen teste ich noch. Der erste Monat ist kostenlos, die nächsten zwei mit Code “bildmovie” zum halben Preis (Nachteil: Registrierung bei Bild notwendig). Fazit bisher: Vor allem für iOS Besitzer lohnend, die keine Lust haben sich Filme von irgendwoher zu ziehen. Wenn sie jetzt noch aktuelle Filme hätten, wegen mir auch mit Aufschlag, wäre das jetzt perfekt und könnte die leidige Copyright-Klau-Diskussion aus meiner Sicht beenden.

Ein paar Beispiele aus dem Angebot: “Es war einmal …”, “Wickie”, “Heidi”, “The Big Bang …”

Update 1.4.2013: Durch den gestiegenen Bekanntheitsgrad treten jetzt vermehrt Unterbrechungen bei der Übertragung auf. Ich hoffe die watchever Macher lösen die Probleme alsbald. Offline schauen habe ich auch getestet, hatte einige merkwürdige Effekte. Im Prinzip ging es aber. Einen Raspberry Pi habe ich jetzt auch, wirklich schön. Allerdings nutzen wir immer noch verstärkt das Apple TV, es ist einfach noch einfacher in der Bedienung.

Update 15.12,2013: Watchever hat sein Angebot inzwischen merklich ausgebaut. Insbesondere was Kinderfilme angeht. Auch etliche Disneyfilme sind jetzt in der Auswahl. Übertragungsunterbrechungen sind selten geworden. Alles in allem bin ich mit dem Angebot und Preis-/ Leistungsverhältnis zufrieden.

PS: Witzig übrigens, dass das ATV 2 nur noch gebraucht erhältlich, erheblich teurer ist als das 3er. Grund: Kann man jailbreaken und gibt dann zusätzliche gute Software für. Werden dann fast alle Film-Formate unterstützt. Die genannten Vorteilen bleiben: Klein, leicht, Stromverbrauch usw.

 

Android für Kinder – Schulwegüberwachung mit GPS

Da meine Tochter schon mit 5 eingeschult wurde und auch alleine von der Schule zum Hort gehen muss überlegte ich wie man dies mit Technik etwas sicherer machen kann.
Ich möchte hier nicht die Ethik des Einsatzes eines GPS-Trackers diskutieren, weise aber daraufhin, dass der Einsatz bei Erwachsenen ohne deren Wissen illegal ist.
Eine einfache Lösung wäre es das Kind mit einem iPhone und der Software “Freunde” auszustatten. Allerdings befürchte ich, trägt ein iPhone im Schulranzen einer 5 jährigem nicht zur erhöhten Sicherheit derselben bei. Zudem ist das technisch nicht die beste und außerdem noch eine extrem teure Lösung.
Hier kann Android seine Vorzüge a) billig und b) bastelbar voll ausspielen.
Zuerst aber die 2 Ansätze die m.E. nicht oder nicht gut genug funktionieren: Google Latitude oder eine fertige Lösung kaufen. Google Latitude war zu ungenau und hatte einen viel zu hohen Akkuverbrauch. Fertige Lösungen fand ich nur für den amerikanischen Markt (keine Eingabe europäischer Nummern möglich) und zudem mit m.E. viel zu hohen monatliche Gebühren. (Beispiele).
Hier jetzt aber die fertige ausgeklügelte Lösung:

Was braucht man:

  1. Ein Android Phone (z.B. bei Tchibo, Huawei branded, 50€)
  2. Eine SIM-Karte mit Datentarif(4€/Monat)
  3. Tasker (Android App, 5€, 1 Woche kostenloser Test)
  4. 2 Google Accounts (1 x Kind, 1 oder 2 x mal für die Eltern)

Schritt 1 Notfallrufnummern einrichten: Alles vom Starbildschirm entfernen. Dort ein Schnellwahlwidget mit Bildern einrichten (Touch2Dial). Telefonnummern und Bilder einrichten. Mit Kind anrufen üben. Weiterhin Kind belehren, das Smartphone in der Tasche zu lassen und nicht damit herumzuspielen (Schwierig, geht wahrscheinlich nicht mit jedem Kind).

How it looks in iOS Calendar.

Schritt 2: Google Kalender auf dem Smartphone für das Kind einrichten und den Eltern freigeben: Dies ist der Trick um einfach und kostenlos Push Nachrichten mit der Position des Kindes zu versenden. Ausprobieren: Einen Termin auf dem Kind-Android anlegen. Dieser sollte nach kurzer Zeit im Kalender der Eltern erscheinen (egal ob Browser oder Smartphone).

Schritt 3: Taskerinstallieren. Was ist Tasker? Tasker ist eine Android App die im Hintergrund läuft und selbstständig nach bestimmten Ereignissen sogenannte Tasks (Aktionen) ausführt. Wir benötigen die App für zwei Fälle: 1.) Auf Anfrage die Position des Kindes setzen und 2. automatische Positionsmeldungen (entweder Zeit- oder Ortsgesteuert in den Kalender einfügen).

Tasker

How Tasker looks like.

Schritt 3: Tasker Aktionen “Find my phone” einrichten. Wozu: Damit kann man mit einer SMS das Smartphone um eine Positionsmeldung anfragen. Unter diesem Begriff findet man auch einige Beispiele wie das geht. Trotzdem in Kürze wie man es machen muss: In Tasker: Neues Profil -> Ereignis Telefon -> Empfangene Nachricht -> Inhalt: “pos” [D.h. wenn das smartphone eine sms mit dem Inhalt “pos” erhält, soll es etwas tun.

Was soll es tun? Neuer Task -> App -> Neuer Termin: Kalender: den richtigen auswählen; In Titel auswählen Ortung und Ortung(Netz) [Es erscheint %LOC und %LOCN]. Speichern und fertig. Jetzt geht es ans Testen. Dem Smartphone eine sms mit dem Inhalt “pos” schicken. Kurze Zeit später sollte man auf seinem PC oder Smartphone im freigegegeben Googlekalender 2 Positionen (Koordinaten) sehen. Die eine ist die Position aufgrund des Telefonnetzes, die andere versucht mittels GPS und WLAN Ortung genauer zu sein. Welche davon genauer ist, lässt sich aus der Entfernung aber nicht sagen. Deshalb ist es gut beide zu haben. Je nach Empfänger kann man den Kalendereintrag noch verfeinern: Mittels dem Eintrag “http://maps.google.com/maps?q=%LOC” kann man einen Direktlink zu Google-Maps mit der Position erzeugen. Auf dem iPhone z.B. bekommt man die Position direkt auf der Karte angezeigt.

Defining Position Trigger in Tasker

How to define a position trigger in tasker.

Jetzt bieten sich noch 2 weitere Auslöser für die Positionsbestimmung und Eintrag im Kalender an: Zeit und/oder Ortsgesteuert. Dazu noch einige Hinweise: Zeitgesteuert: Es bietet sich an zuerst einen Zeitraum (z.B. zwischen 7:00 und 18:00 Uhr) zu definieren und dann ein Intervall (z.B. alle 2h). – Auslöser über Position: Positionsbestimmungen vor allem über GPS kosten Strom (Akku). Da das Smartphone sowieso in der Tasche sein soll, bringt GPS auch meistens nichts. Für den Anfang reicht es den einfachen Tasker Auslöser über die Karte zu benutzen (aber ohne GPS). Hat man damit etwas Erfahrung gesammelt, kann man verfeinern: Tasker bietet die Möglichkeit die Art der Ortsbestimmung festzulegen: Es empfiehlt sich den Schulweg einmal mit WLANs auszumessen und die Aktionen anhand von “gesehenen”  WLANs auszulösen. (Es reicht wenn ein WLAN vom Smartphone “gesehen” wird). Notfalls, da wird es aber dann langsam etwas kompliziert (und ungenau), geht das auch mit ausmessen der Mobilfunkmasten. Natürlich geht die WLAN-Methode nur in relativ dicht bebautem Gebiet. Prinzip klar oder noch Fragen? Einfach im Kommentar stellen.

PS: Die genannten Methoden lassen sich auch gut zum Auffinden von Autos oder anderen Mobilien (Laptoptaschen etc.) verwenden.

 

KinderUhr

Gestern kam die Nachricht vom AppStore, dass die KinderUhr freigegeben wurde. Wartezeit war fast exakt eine Woche. Die App ist frei (und enthält nur ein wenig Werbung für‘s Kinderquiz). Jetzt sind wir gespannt auf Downloadzahlen und Bewertungen. In der Kategorie Education, in Deutschland standen wir heute auf Platz 51.