iLOE for iPad, work in progress ….

A pre alpha screenshot

Hard working on iLOE for iPad (OpenStreetMap editor for iPad). A little bit tired, finding out that it just takes time (and energy) to implement one usecase after the other.  Lost a few hours last night, just to find out that sending data with “DELETE” isn’t supported on most REST frameworks. (See here). Found a workaround today.

Pushing hard, cause I’ll visit a nearly (OpenStreetMap) unmapped area this week, so that’ll be perfect to give a test (and map) to the early alpha version. So what is finished by now? Having different (and switching) maps as background. Switching between official and test OSM server. Of cause login for both servers. Downloading nodes and ways. Adding, editing, moving and deleting nodes. Upload nodes to server. Changing markers on map. What’s open? Now it is all about ways: Creating, deleting ways; adding, sorting and deleting nodes. And, …, a lot of fixing. Stay tuned.

[Update: Just found out that there is a bug with core data: If you got ordered “To-many relations”, xcode creates NSOrderedSets for them. Problem is the created methods won’t work. What can one do? Implement all the stuff yourself. So copy the OrderedSet to a MutualOrderedSet. Do whatever. Pack the new Set to the persistance class and save. (see here)

For all of you wondering what I was writing about: I’m working on a tool to help OpenStreetMap to give Google Maps, Apple Maps and Microsoft Bing a little bit competition.

iOS: MKNetworkKit send XML (simple, easy, fast)

Maybe this is what you’re looking for: Easy sending some XML with MKNetworkKit.

This works for me:
MKNetworkOperation *op = [self operationWithPath:@”api/0.6/changeset/create” params: nil httpMethod:@”PUT”];
[op setCustomPostDataEncodingHandler: ^NSString *(NSDictionary *aD){return @”Put your XML here“;} forType:@”text/xml”];

That’s it

Die Pebble, Test und Tipps

Nachdem ich letztens die Pebble vom Zoll in Garching (Münchner, oder zumindest ein Teil der Münchner dürfen dazu ins Umland fahren) abgeholt habe, hier ein kurzes Pebble Review. Getestet mit iOS 6 auf einem iPhone5

Installation: Problemlos, 9/10
Design Gehäuse: Mein Geschmack ist es nicht. Zuviel (alles?) Plastik. Aber ok, 5/10
Viel wichtiger, Funktion(en):
Grundfunktionen: SMS, iMessage, Anrufanzeige (Bug bei Namen mit length > 20 wird nur die Nr angezeigt), auser dem Bug: Einwandfrei 8/10. Musikfernsteuern: Titelanzeige, vor, zurück: Perfekt! Lautstärke wäre noch gut. Aber dafür fehlen schlichtweg weitere Tasten.
Erweiterte Funktionen: Mail funktioniert nur eine Weile. Die App. Lauert im Hintergrund auf Mails’ die sie aus dem Benachrichtigungsbildschirm abgreift. Das funktioniert eine Weile, aber irgendwann, scheinbar, räumt das OS im Hintergrund auf, dann geht die Verbindung verloren und kann nur manuell pro Mail Account wieder hergestellt werden (Notifications ein/aus). Allerdings bei mir auch nicht wirklich reproduzierbar. Schaut derzeit nach Voodoo aus …. warten wir mal auf ein Update. Seit ein paar Tagen steht jetzt endlich das erste Watch-SDK bereit und schon stehen die ersten Apps und vor allem inzwischen Dutzende Uhren/Zifferblätter zum Download bereit. Was noch aussteht ist das SDK auf iPhone (oder Android) Seite um eigene Informationen aus der eigenen App an die Pebble zu senden. Noch 2 Tipps zum Instalieren: Seiten der Watchface hier oder hier im iPhone Browser aufrufen, dort aussuchen. ->Download, damit startet die Pebble App die die neue App installiert. Uhren finden sich beim Durchblättern der Uhren, Apps jedoch im Menu der Pebble.

Achso was möchte ich eigentlich damit noch machen? Ein Mini-Navi, welches mindestens die richtige Richtung und Abstand zum Ziel anzeigt. Natürlich mit OSM (OpenStreetMap).

20130420-230134.jpg

Easy Arduino LED Clock

Arduino Clock in Fischertechnik

How to build an easy arduino clock. Why building a clock, since one can buy all kind of clocks? Two causes, first for the fun of it and second I can build the functions as I like and how they work. I also plan to add more functions from time to time.I wrote easy, that means not doing too much on the hardwork side. One can get an 8 7-segment LED (TM1638 LED Display Modules) with electronics, so there are only 5 wires needed for the display (and there are added 8 buttons).  5 more wires for the real time clock and off we go.

Another clock, with servo.

Wiring is an easy job, it’s explained in the source code. I implemented only settings for hour and minute (changing minutes also resets seconds), as I think it’s easier to set the date once with the arduino IDE. But feel free to add the extra functions.

I plan to add functions for servos and others for alarm and count down timer.

Here are the links which will help you: TM1638, Library DS1302

And here is the code:

/*
 Clock Program 2014
 by Johannes Eiseler eiseler.synology.me/wordpress
 given to public domain

shows time and date on a TM1638

use buttons for brightness, and setting hour and minute
// feel free for using it setting the date
// use the leds too


uses this libraries:
#include <TM1638.h>
#include <DS1302.h>
 
#include "Timer.h" // Use a timer


 */
 
 
#include <TM1638.h>
#include <DS1302.h>

#include "Timer.h" // To do it with a timer

 
// define a module on data pin 8, clock pin 9 and strobe pin 7
// am stecker: rot ist plus; dann in der reihenfolge: Vcc, Gnd, CLK, DIO, STB0
//TM1638 module(8, 9, 7); // data, clk, strobe

TM1638 module(8, 7, 9); // data, clk, strobe -> this is easer for wiring
 
// Init the DS1302
DS1302 rtc(2, 3, 4);
 
// DS1302: CE pin -> Arduino Digital 2 RST
// I/O pin -> Arduino Digital 3 DAT
// SCLK pin -> Arduino Digital 4 CLK
// VCC, GND, CLK, DAT, RST
 
Time time;
unsigned long timenumber;
String mystring = String(8);
int ss, ss1, dir;
int hh, mm;
byte bright = 3;
 
Timer timer;
byte mybyte;
// Status 0=zeit anzeigen
// --- erstmal nichteinstellen 1=Jahr, 2=Mon, 3=Tag, 4=DayOfWeek, 5=hh, 6=min, 
// einstellen 1=HH, 2=Min, 3=Sec 
int status = 0;
 
//Servos
 
void setup() {

// Serial.begin(9600);
 
 // Set the clock to run-mode, and disable the write protection
 rtc.halt(false);
 rtc.writeProtect(false);


 //#################################

 // The following lines can be commented out to use the values already stored in the DS1302
 // but comment in the first run
 /*
 rtc.setDOW(THURSDAY); // Set Day-of-Week to ....
 rtc.setTime(14, 40, 0); // Set the time to 12:00:00 (24hr format)
 rtc.setDate(25, 8, 2016); // Set the date to August 8th, 2016
*/

 //#################################

 
 // display a hexadecimal number and set the left 4 dots
 module.setDisplayToHexNumber(0x1234ABCD, 0xF0); //Test
 module.setupDisplay(true, 1);
 
 //Serial.begin(9600);
 
 timenumber = 123456;
 //Serial.begin(9600); // zum debuggen
 mybyte = 1;
 // Uhrzeit im RTC-Chip setzen nur einmal
 //RTC.setTime(&time);
 
 ss= 0;
 ss1=0;
 dir = 0; // Lauflicht Richtung
 
 
 timer.every(125, doTick);
 
}
 
void loop() {
 
 timer.update();
 
 byte keys = module.getButtons();
 
 switch(keys){
 case 0b0000001: //leftmost button
 bright++; 
 if (bright >8) bright = 0;
 module.setupDisplay(true, bright);
 //module.setLEDs(0b10101010 & 0x00FF);
 module.setLEDs(bright & 0x00FF);
 delay(500);
 
 break;
 case 0b0000010: //leftmost + 1button Start setting
 status ++;
 if (status == 3) status = 0;
 delay(500);
 break;
 case 0b0000100: //leftmost + 2button plus hh oder min
 if (status == 1) {
 hh++;
 if (hh >= 24) hh = 0;
 rtc.setTime(hh, mm, 0);
 }
 if (status == 2) {
 mm++;
 if (mm >= 60) mm = 0;
 rtc.setTime(hh, mm, 0);
 }
 delay(250);
 break;
 case 0b0001000: //leftmost + 3button minus hh oder min
 if (status == 1) {
 hh--;
 if (hh < 0) hh = 23;
 rtc.setTime(hh, mm, 0);
 }
 if (status == 2) {
 mm--;
 if (mm < 0) mm = 59;
 rtc.setTime(hh, mm, 0);
 }
 delay(250);
 break;
 }
 
 delay(10);
 
}
 
void doTick(){
 
 // light the first 4 red LEDs and the last 4 green LEDs as the buttons are pressed
 // module.setLEDs(((keys & 0xF0) << 8) | (keys & 0xF));
 // hin und her lauflicht
 if (status < 1) {
 if (dir == 0) mybyte = mybyte << 1;
 else mybyte = mybyte >> 1;
 module.setLEDs(mybyte & 0x00FF);
 if (mybyte == 1) dir =0;
 if (mybyte ==128) dir = 1;
 } 
 else {
 //module.setLEDs(0b11111111 & 0xFF00); 
 module.setLEDs(0xFF00); //alle rot
 //module.setLEDs(0x00FF); //alle grün 
 }
 // ende lauflicht
 
 //RTC.getTime(&time);
 time = rtc.getTime();
 
 //Serial.println(time.sec);


// my rtc seems to be buggy, so next lines to clean
 if (time.sec == 0 && time.min == 0 && time.hour == 0) { delay(10); time = rtc.getTime(); };
 if (time.sec == 0 && time.min == 0 && time.hour == 0) { delay(10); time = rtc.getTime(); };
 if (time.sec == 0 && time.min == 0 && time.hour == 0) { delay(10); time = rtc.getTime(); };
if (time.sec == 0 && time.min == 0 && time.hour == 0) return;

 
 //ss1 = time.getSecond();
 ss1 = time.sec;
 
 if (status < 1) {
 if (ss1 != ss){ //do nothing if the seconds didn't change since last display 
 word decpoints = 0b00000000;
 
 if ((ss1 >= 20 && ss1 < 24) || (ss1 >= 40 && ss1 < 44)){
 mystring ="";
 int dd = time.date;
 if (dd < 10) mystring = mystring +" ";
 mystring = mystring + String(dd);
 int mo = time.mon;
 if (mo < 10) mystring = mystring +"0";
 mystring = mystring + String(mo);
 int yy = time.year;
 mystring = mystring + String(yy);
 decpoints = 0b01010000;
 //if (ss1 < 26) servo1.write(45);
 //if (ss1 > 39) servo1.write(135);
 
 }
 else {
 
 ss = ss1;
 //timenumber = time.getHour() * 1000;
 timenumber = time.hour * 1000;
 mystring = "";
 hh = time.hour;
 if (hh < 10) mystring = mystring +" ";
 mystring = mystring + String(hh);
 mystring = mystring +" ";
 mm = time.min;
 if (mm < 10) mystring = mystring +"0";
 mystring = mystring + String(mm);
 mystring = mystring +" ";
 //ss = time.getSecond();
 if (ss < 10) mystring = mystring +"0";
 mystring = mystring + String(ss);
 }
 
 module.setDisplayToString(mystring,decpoints);
 }
 }
 else //button to set the time
 {
 hh = time.hour;
 mm = time.min;
 
 switch(status) {
 case 1: 
 mystring = "Hour" + String(hh) + " ";
 module.setDisplayToString(mystring,0);
 break;
 case 2: 
 mystring = "Min " + String(mm) + " ";
 module.setDisplayToString(mystring,0);
 break;
 }
 }
 
}

Raspberry Pi (Auch für Dummies)

Nackter Raspberry

Hat ein wenig gedauert bis ich welche hatte. Aber das Warten hat sich gelohnt (auch weil die Software inzwischen reifte 🙂 ).

Was ist es? Ein Minicomputer, etwas größer als eine Kreditkarte, mit 2 USB Anschlüssen, Audio out, Video out und HDMI (=DVI) Ausgang. Zusammen mit einer SD-Karte und einem Netzteil wird ein Linux Rechner daraus.

Vorab, für die Ungeduldigen, schon mal meine Bewertung: 8/10!

Wow, ich bin begeistert. Ein wirklich schönes Gadget. Kurz, was ich bisher ausgetestet bzw. gebaut habe:

  • XMBC (Eine Art Apple TV für Linux, Videos, Musik abspielen, Internetradio, YouTube, ARD-Mediathek, usw.) (bisschen Einstellungen suchen nach Installation).
  • Wetter Monitor in unserem Flur (läuft jetzt seit ca. 2 Wochen ohne Mucken. Hardware siehe unten) (bisschen Einstellung notwendig).
  • MAME (Emulator für alte Spiele) (Hmm, die Hälfte der getesten ROMs liefen).
  • MPD (MusicPlayerDaemon; Spielt mp3s und Internetradio ab) (bisschen Einstellung notwendig)
  • Zur Ergänzung des Wettermonitors, sonst idelt der ja nur: LAMP installiert und darauf dann noch Joomla (ein CMS) (easy)
  • Und weil es immer noch performt und Google den Reader abschalten will: Noch TinyTinyRSS (heise Anleitung) mit der mobile Erweiterung

Was sollte man haben (KnowHow und Hardware)?

Ein paar UNIX Basics wären schon nicht schlecht, oder man lernt sie dabei. Nein, man muss nicht Löten können. USB-Stecker richtig rum reinstecken reicht. Ich empfehle folgende Hardware:

  • Den Paspberry Pi
  • Ein paar (2 oder mehr) SD Karten (>=4 GB) (Jede Karte ein eigener Rechner 🙂 )
  • Eine Stromversorgung (5V, 1A) bzw. einfacher..
  • … gleich ein aktives USB-Hub mit mindestens 1A (möglichst kein Ramsch). Versorgt gleichzeitig den Raspberry.
  • Ein HDMI auf DVI Adapter (damit man (am Anfang) auch mit dem Monitor testen kann. Oder ein HDMI Kabel wenn man (nur) an den fernseher will. Später reicht übrigens auch ssh, also rein remote.
  • Tastatur und Maus. Später reicht ssh
  • Ein USB WLAN Dongle (wenn man weg vom eingebauten Ethernetanschluss will)
  • Wer möchte auch noch ein Gehäuse dazu.

Wetter Station

Die links ergänze ich Euch noch zusätzlich. Und im nächsten Blog,  Mini HowTos. Stay tuned.

Arduino – Crash Kurs für IT’ler

Es gibt bereits viele Anleitungen für den Arduino, hier ein Crashkurs für Leute aus dem  IT-Umfeld.

Was ist es?

EIn Platine um eigene Hardware bauen zu können. Programmiersprache ist (fast) C; die Hardware ist so abstrahiert, dass (fast) keine Elektronikkenntnisse erforderlich sind. Arduino ist ähnlich Lego NXT oder Fischertechnik Computing, aber offener und günstiger. Programme werden Sketch genannt (warum auch immer), (aufsteckbare) Zusatzhardware nennt sich Shield.

Was kann es?

Anwendungsbeispiele was man machen kann: Von blinkenden Leuchtdioden, Uhren, Messfühler auswerten, Webserver bis Robotern geht alles. Eingänge gibt es digital und analog, Ausgänge digital und pwm (Pulsweiten moduliert). D.h. kleine Verbraucher (LEDs) kann man (mit Vorwiderstand) direkt anschliessen. Besonders cool sind die PWM Ausgänge. damit kann man direkt Modellbauservos ansteuern. Der Arduino ist ziemlich robust, d.h. man kriegt ihn nur mit viel Pech kaputt.

Wie geht es und was brauche ich?

Arduino Uno, ein Steckbrett, Kabel und ein paar LEDs (am besten die mit Vorwiderstand für 5V) kaufen. Alternativ ein Einsteigerset. Arduinosoftware installieren, Arduino mit 1 LED verkabeln.  Und los geht’s. Wenn’s Spaß macht dabei bleiben, ansonsten waren die Kosten bisher überschaubar.

(Von mir ausprobierte) Bezugsquellen:

Watterot (Arduino und Co.), Reichelt (allgemein Elektronik, z.B. die LEDs), Dealextreme (billig, aber 2-6 Wochen Lieferzeit, achtung Zoll wenn > 20€, einzeln bestellen (ohne Versandkosten))

Tipps und Tricks

Für Motoren (für Roboter, Lego, Fischertechnik) benötigt man ein Motor Shield, Entfernungen messen, Suchwort ping, günstig über ebay.

 

Nützliche Siri Fragen (deutsch)

Einige nützliche Siri Anweisungen:

  • Wo ist die nächste Tankstelle (McDonalds, ..)
  • Wann ist Sonnenuntergang
  • Spiel Filmname oder Musik oder Interpret oder App
  • Email an Name
  • Habe ich eine Email von Name (nur neue)
  • Nachricht an Name
  • Habe ich eine Nachricht (nur neue)
  • Habe ich Emails?
  • SMS an Name
  • Suche wikipedia München
  • Erstelle ein Meeting 9 Uhr
  • Wecke mich morgen um 8 Uhr
  • Check Mails
  • Ich muss mal
  • Wann hat Name Geburtstag
  • Wo wohnt Name

Lustiges:

  • Erzähl mir eine Geschichte
  • Wann wird’s mal wieder Sommer?