I made it last week. One can drive my car over the internet on a browser that supports WebRTC. I have no wireless camera right now. Im using a webcam to show driver the car (not wireless, connected to pc).
If you just want to control your car locally, you can use a socket to connect to Spark Core. Im using a socket that is being used in libjingle that is c++ imlementation of WebRTC.
This is a page that show how to use C# socket:
This is Spark firmware I use:
/* Globals -------------------------------------------------------------------*/
int leftMotor = A6;
int rightMotor = A7;
int forwardMotor = D6;
int backwardMotor = D7;
TCPServer server = TCPServer(80);
char myIpString[24];
void setup()
{
server.begin();
Serial.begin(9600);
delay(1000);
//I expose Ip Address of the core so I can learn it from cloud and connect it with socket on my pc.
IPAddress myIp = Network.localIP();
sprintf(myIpString, "%d.%d.%d.%d", myIp[0], myIp[1], myIp[2], myIp[3]);
Spark.variable("ipAddress", myIpString, STRING);
pinMode(forwardMotor, OUTPUT);
pinMode(backwardMotor, OUTPUT);
pinMode(leftMotor, OUTPUT);
pinMode(rightMotor, OUTPUT);
}
const byte LEFT = 1;
const byte RIGHT = 2;
const byte FORWARD = 4;
const byte BACKWARD = 8;
void rcCarControl(byte cmd)
{
if(cmd == 0){
digitalWrite(forwardMotor,LOW);
digitalWrite(backwardMotor,LOW);
digitalWrite(leftMotor,LOW);
digitalWrite(rightMotor,LOW);
return;
}
if((cmd & FORWARD) == FORWARD)
{
digitalWrite(backwardMotor,LOW);
digitalWrite(forwardMotor,HIGH);
}
else if((cmd & BACKWARD) == BACKWARD)
{
digitalWrite(forwardMotor,LOW);
digitalWrite(backwardMotor,HIGH);
}
else{
digitalWrite(forwardMotor,LOW);
digitalWrite(backwardMotor,LOW);
}
if((cmd & LEFT) == LEFT)
{
digitalWrite(rightMotor,LOW);
digitalWrite(leftMotor,HIGH);
}
else if((cmd & RIGHT) == RIGHT)
{
digitalWrite(leftMotor,LOW);
digitalWrite(rightMotor,HIGH);
}
else
{
digitalWrite(leftMotor,LOW);
digitalWrite(rightMotor,LOW);
}
}
TCPClient client;
char stopByte = 255;
void loop()
{
if (client.connected()) {
// echo all available bytes back to the client
while (client.available()) {
delay(50);
for (unsigned int i = 0; i < sizeof(buffer); i++) {
byte c = client.read();
if (c == stopByte) {
break;
}
Serial.print(c);
rcCarControl(c);
}
delay(50);
}
} else {
// if no client is yet connected, check for a new connection
client = server.available();
}
}
You will not be able to reconnect core after closing a socket connection with this code. You may want to change it.
You can also check my earlier post about my project old version.