Ich habe mein altes iPhone rausgekramt, damit ich von meinem Projekt ein Video machen kann. Seht selbst!
Schönes Wochenende!
Ich habe mein altes iPhone rausgekramt, damit ich von meinem Projekt ein Video machen kann. Seht selbst!
Schönes Wochenende!
Ich habe nun mein Projekt “iPhone controlled R/C Car” abgeschlossen. Nach ein paar Stunden basteln und programmieren kann ich nun das Projekt auch dem grossen Publikum zeigen.

Die Fernbedienung von meinem Auto mit den Steuerkabeln an den entsprechenden Stellen angelötet.

Steckverbindungen auf dem Breadboard.

Da das ganze auf den Bildern nicht wirklich überschaubar ist, habe ich hier ein ganz einfaches Schema gezeichnet.

Bitte an dieser Stelle nicht erschrecken. Ich habe auf meiner Schaltung noch ein paar LED’s dazwischen gehängt, damit ich sehe was gerade alles angesteuert wird. Die Artikelnummer von Conrad für die Transistoren lautet 151034 – 62. So gehts leichter zum bestellen.
Nun aber zum Highlight des Ganzen! Die iPhone App um das Auto zu steuern.

Die Kommunikation zwischen iPhone und Arduino µC funktioniert über Ethernet. Damit ich nicht ans iPhone als Fernbedienung gebunden bin, habe ich einen Middlelayer eingebunden. Dieser ist mittels PHP Programmiert. Das PHP Script öffnet eine Socketverbindung zum Arduino und sendet ein String welcher das Programm auf dem µC auswertet und den entsprechenden Ausgang schaltet.
Die iPhone App ruft bei einem Touch-Event einfach das PHP-Script mit dem entsprechenden Parameter auf. Das PHP-Script leitet diesen Parameter and den µC weiter. So einfach funktioniert das.
Hier das PHP-Script:
<?php
function sendCommand($command) {
$c = fsockopen('1.1.1.2', 80, $errno, $errstr, 1);
if(!$c) {
echo $errstr.' ('.$errno.")<br />\n";
}
else {
fwrite($c, $command);
echo 'sent data: '.$data;
fclose($c);
}
}
sendCommand($_GET['q']);
?>Und hier das Programm auf dem µC:
#include <SPI.h>
#include <Ethernet.h>
#define Bwd 8
#define Fwd 7
#define Left 6
#define Right 5
String command; //W=119;A=97;S=115;D=100
int stateBwd = false;
int stateFwd = false;
int stateLeft = false;
int stateRight = false;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 1,1,1,2 };
Server server(80);
void setup() {
Ethernet.begin(mac, ip);
server.begin();
Serial.begin(9600);
pinMode(Bwd, OUTPUT);
pinMode(Fwd, OUTPUT);
pinMode(Left, OUTPUT);
pinMode(Right, OUTPUT);
}
void loop() {
Client client = server.available();
if(client) {
command = "";
while(client.connected()) {
if(client.available()) {
char c = client.read();
command += c;
}
//client.stop();
}
if(command=="F") { //Forward
if(stateFwd) {
stateFwd = false;
digitalWrite(Fwd, LOW);
}
else {
stateFwd = true;
stateBwd = false;
digitalWrite(Bwd, LOW);
digitalWrite(Fwd, HIGH);
}
} //command 119
if(command=="B") { //Back
if(stateBwd) {
stateBwd = false;
digitalWrite(Bwd, LOW);
}
else {
stateFwd = false;
stateBwd = true;
digitalWrite(Fwd, LOW);
digitalWrite(Bwd, HIGH);
}
}
if(command == "L") { //Left
if(stateLeft) {
stateLeft = false;
digitalWrite(Left,LOW);
}
else {
stateRight = false;
digitalWrite(Right, LOW);
stateLeft = true;
digitalWrite(Left, HIGH);
}
}
if(command == "R") { //Right
if(stateRight) {
stateRight = false;
digitalWrite(Right, LOW);
}
else {
stateLeft = false;
digitalWrite(Left, LOW);
stateRight = true;
digitalWrite(Right, HIGH);
}
}
delay(1);
client.stop();
}
}Für die Xcode-User habe ich hier noch mein kleines Xcode Projekt zum Download. Hier muss in der Source nur noch die URL des obigen PHP-Scripts angepasst werden.
Download rccar Xcode Project
Mangels einer zweiten Kamera (die einzige ist im iPhone) kann ich leider noch kein Video machen. Ich schau mal ob ich meine alte Digicam noch finde.
Bis dahin viel Spass beim Basteln!
Da ich demnächst umziehen werde, habe ich mich in letzter Zeit ein Bisschen mit Heimautomatisation beschäftigt. Meine Kriterien dafür sind:
Bei meiner Suche bin ich dann auf den Loxone Miniserver gestossen, welcher mich sehr überzeugt hat. Eine Preisanfrage bei einem schweizer Vertreter von Loxone wurde leider abgeschmettert, da dieser Vertreter nicht an Privatkunden liefert. Also ist das für mich vorerst gegessen.
Wie es der Zufall so wollte bin ich dann über einen Artikel im iPhoneBlog gestossen. Darin wird gezeigt wie ein Briefkasten Push Notifications über einen Mikrocontroller sendet und diese auch auf dem iPhone ankommen. Dazu ist die iOS-App Prowl nötig. Da ich Prowl sowieso schon für andere Dinge im Einsatz habe, kommt mir das gerade recht.
Bei dem Mikrocontroller handelt es sich um ein Arduino UNO Board (mehr über Arduino auf Wikipedia). Nach einer kurzen Recherche nach einem Anbieter von Adruino Produkten, bin ich dann im dshop.ch fündig geworden. Da der Preis für den Mikrocontroller unter meinen Vorstellungen lag, habe ich das Arduino UNO Board und ein Ethernet Shield bestellt. Paar Tage später hatte ich meine Bestellung auch schon im Briefkasten.
Nun aber zum eigentlichen Thema: Die Türklingel soll Push Notifications via Prowl auf mein iPhone senden.
Um das zu realisieren habe ich einen Prototypen gebaut. Dieser Prototyp sendet auf Knopfdruck eine Push Notification auf mein iPhone. Um den Prototypen zu bauen sind folgende Dinge nötig:
Wie bereits erwähnt ist die LED optional. Diese habe ich zusätzlich als optisches Signal in die Schaltung eingebaut, muss aber nicht zwingend sein.
Ich habe ein Schaltplan gezeichnet. Dieser ist nicht nach den allgemein bekannten Normen für Schaltpläne gestaltet, sondern soll für jeden klar verständlich sein.
Eine weitere Vorraussetzung für das versenden von Push Notifications ist ein Webserver auf dem ein PHP-Script vom µC aufgerufen werden kann. Dies ist nötig, weil die Prowl API eine SSL Verschlüsselung erfordert. Die Ethernet Library für den Controller unterstützt aber kein SSL.
Auf dem Webserver habe ich also die ProwlPHP Library am laufen. Für die Testzwecke habe ich einfach die example.php aus dem Package auf mich angepasst. Diese example.php wird dann vom µC aufgerufen und somit eine Notification an mein iPhone bzw. mein iPad gesendet.
Ist das PHP-Script auf dem Webserver eingerichtet kann nun der µC programmiert werden. Es ist zu beachten, dass die Ethernet Library kein DHCP kann. Wer die erforderlichen Skills hat, darf eine DHCP Funktionalität gerne implementieren. Da DHCP ausfällt, muss die IP-Adresse sowie die MAC-Adresse direkt im Coding gesetzt werden. Mein Programm für den µC sieht wie folgt aus:
#include <SPI.h>
#include <Ethernet.h>
#define switchPin 7 // Snap action switch which closes when the mailbox door is opened.
#define ledPin 9
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,1,2 }; // local Arduino IP
byte server[] = { 192,168,1,1 }; // IP of your web server
Client client(server, 80);
void setup() {
Ethernet.begin(mac, ip);
Serial.begin(9600);
delay(1000);
pinMode(switchPin, INPUT);
pinMode(ledPin, OUTPUT);
//delay(20000);
}
void loop()
{
if (digitalRead(switchPin) == HIGH) // if button is pressed:
{
digitalWrite(ledPin, HIGH);
Serial.println("Button pressed");
if (client.connect()) { //connect to server
Serial.println("connected to server");
// Make a HTTP request:
client.println("GET /~silas/example.php"); //location of ProwlPHP script
client.println();
}
else {
Serial.println("connection failed");
}
delay(1000);
Serial.print("Response from server: ");
while (client.available()) {
char c = client.read();
Serial.print(c);
}
Serial.println();
// if the server's disconnected, stop the client:
if (!client.connected()) {
Serial.println("disconnecting from server");
client.stop();
}
while (digitalRead(switchPin) == HIGH)
{
// hold here while button is pressed
}
Serial.println("Button released");
digitalWrite(ledPin, LOW);
delay(500);
}
}Die Source ist abgeleitet von dem WebClient Example in der Arduino IDE.
Da ich als Webserver den internen Apache von Mac OS X verwende habe ich zusätzlich noch ein Shell-Command aufgerufen, welches mir eine Growl Notification am Display anzeigt.
$out = shell_exec('/usr/local/bin/growlnotify -m "Open the door dude!" -t "My Home"');Wie das ganze in etwa aussieht habe ich hier mal in einem kurzen Video festgehalten.
Viel Spass beim Herumprobieren!
Vor langer Zeit habe ich bei vmware.com mal die Virtual Appliances durchstöbert. Dabei bin ich auf das Zarafa Projekt gestossen.
Auf den ersten Blick sieht das Projekt sehr interessant aus. Zarafa bietet eine Weboberfläche analog zur Outlook Webaccess oberfläche von Microsofts Exchange Server. Die Weboberfläche sieht praktisch identisch aus. Kalender, Kontakte, Notizen, Todo’s, etc. ist auch alles vorhanden. Das beste kommt aber noch: Mit dem der Software Z-Push wird das ganze noch iPhone bzw. ActiveSync fähig. Sprich, es werden die selben Funktionen untestützt wie wenn du dein iPhone mit dem Exchangeserver verbindest. Push-Mail, Push-Contacts und Push-Calendar. Ebenfalls kann Microsoft Outlook als Desktopclient verwendet werden.
In der Communityversion mit Outlooksupport können 3 Benutzer das System benutzen.
Ich habe das ganze bei mir zu hause mal auf eine Virtuele Maschine auf meinem ESX-Server installiert. Von da an läuft das Ding einwandfrei und die E-Mails werden schön auf mein iPhone gepusht.
Aufwand um das Ganze nach Anleitung zu installieren: 1 Tag
Zarafa ist also eine richtige Alternativlösung zu Microsoft’s Exchange Server.
Schon interessant wie eine Meldung im Internet umhergeht… Die Pedition für die Abschaltbarkeit der Autokorrektur im iPhone habe ich scho relativ früh, in irgend einem RSS-Feed, gesehen und auch “unterzeichnet”. Ich bin auf Position 167. Heute erscheinte auch auf 20minuten.ch ein Bericht über die Online-Pedition. Nun sind schon über 1800 “Unterschriften” gesammelt.
Unter http://please-let-us-disable-autocorrection-steve.com/ könnt auch ihr eine “Unterschrift” hinterlegen.
Aber eigentlich will ich ja gar keine Werbung dafür machen. Sondern wollte mit diesem Post nur ausdrücken wie schnell eine Meldung im Internet umher geht.