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.") \n";
}
else {
fwrite($c, $command);
echo 'sent data: '.$data;
fclose($c);
}
}
sendCommand($_GET['q']);
?>Und hier das Programm auf dem µC:
#include
#include
#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!
There is a library missing in the rccar.xcodeproj. What Library was used?
Es gibt eine Bibliothek fehlt in der rccar.xcodeproj. Welche Bibliothek wurde verwendet?
hi michael
use libz.dylib instead of libz.1.2.3.dylib
cheerio
silas