fat tony
09.12.2009, 14:26
Hallo
Gesten bin ich auf diese (http://www.projectallusion.com/1/post/2009/11/iphone-controlled-solar-powered-arduino-tank.html) Seite gestoßen und fand die Idee einen Bot über mein iPhone zu steuern ziemlich genial.
Leider ist seine Steuerung recht simpel und kann lediglich die Motoren ein oder aus schalten.
Also habe ich mich selber mal einwenig mit der Thematik auseinandergesetzt und möchte euch nun einmal meine Ergebnisse vorstellen und eine kleines „how to“ schreiben...
Das ganze basiert auf dem App TouchOSC (http://hexler.net/software/touchosc) welches Daten auf Basis des OSC-Protokolls (Open Sound Control) sendet.
Leider gibt es meines Wissens keine Library für VB.
Also habe ich mich, wie auf der Page, für Processing entschieden da es Java sehr ähnelt und es auf der Herstellerhomepage von TouchOSC einige Beispiele gibt.
Um das Ganze nun zum Laufen zu bringen muss man sich zunächst einmal TochOSC auf sein iPhone laden.
Außerdem kann man sich noch den „TouchOSCEditor“ auf den Rechner laden, mit dem sich eigene Layouts der Steuerung erstellen lassen.
Ich habe mir zu Beginn erst einmal folgendes Layout erstellt:
http://image-upload.de/image/UR1MYa/e715f62486.jpg
Unter Network muss nun noch bei Host die IP des PCs eingetragen werden und für die Ports 8000 für outgoing und 9000 für incoming.
Damit ist das iPhone Bereit :D
Nun geht es an die Signalverarbeitung am PC.
Wie eben schon erwähnt benutze ich Processing das man hier (http://processing.org/) kostenlos laden kann.
Zusätzlich braucht man noch die „oscP5- Library“ die es hier (http://www.sojamo.de/libraries/oscP5/) gibt.
Anschließend kann man mit dem Programmieren loslegen.
Der Programmcode ist denke ich ganz gut verständlich:
import oscP5.*;
import netP5.*;
import processing.serial.*;
Serial myPort;
OscP5 oscP5;
float v_rotary1 = 0.0f;
int X;
float Y;
int Z;
int t1;
int t2;
float xrot = 0;
float zrot = 0;
float yrot = 0;
void setup() {
/* starte oscP5, listening port 8000 */
oscP5 = new OscP5(this,8000);
myPort = new Serial(this, Serial.list()[3], 9600); //COM4 (4Position in der Liste aller verfügbaren COMs)
}
void oscEvent(OscMessage theOscMessage) {
String addr = theOscMessage.addrPattern(); //Eingabeobjekt
float val = theOscMessage.get(0).floatValue(); //Objektzustand
if(addr.equals("/1/rotary1")) { v_rotary1 = val; } //rotary1
if(addr.equals("/1/toggle1")){ // toggle1
t1=int(theOscMessage.get(0).floatValue()); //aktueller Zusatnd des toggle1
}
if(addr.equals("/1/toggle2")){ // toggle2
t2=int(theOscMessage.get(0).floatValue()); //aktueller Zusatnd des toggle2
}
if(theOscMessage.checkAddrPattern("/accxyz")==true) { //Accelerometer
xrot = (theOscMessage.get(0).floatValue()*90); //Neigung in ° X-Achse
zrot = (theOscMessage.get(1).floatValue()*90); //Neigung in ° Z-Achse
yrot = (theOscMessage.get(1).floatValue()*90); //Neigung in ° Y-Achse
}
}
void draw() {
background(0);
if(t2 == 0){
X = (int)(v_rotary1*100); //normierung der Werte auf die Servofunktion
Y = (1.3 * X);
Z = (int)(30 + Y);
myPort.write(Integer.toString(Z));
myPort.write(13); //<CR> zum beenden der Input-Funktion in Bascom
}
if(t2 == 1){
X = (int)(xrot + 90); //normierung der Werte auf die Servofunktion
Y = (0.722222222222 * X);
Z = (int)(30 + Y);
myPort.write(Integer.toString(Z));
myPort.write(13);
}
if(t1 == 1) {
myPort.write("255"); //255 = Led ein
myPort.write(13);
}
if(t1 == 0){
myPort.write("256"); //256 = Led aus
myPort.write(13);
}
}
Alle empfangen Werte werden nach der Verarbeitung über einen Serial Port an meinem mC gesandt.
Der Bascom-Code:
$prog , 255 , &B11011001 , 'Quarz an / Teiler aus / Jtag aus
$regfile = "m2560def.dat"
$hwstack = 82 '80
$framesize = 68 ' 64
$swstack = 68 '44
$crystal = 16000000 'Quarzfrequenz
Config Pind.5 = Output
Led Alias Portd.5
Config Com4 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Open "com4:" For Binary As #4 'USB Buchse
Config Servos = 1 , Servo1 = Portd.4 , Reload = 10
Config Portd = Output
Enable Interrupts
Wait 2
Dim X As Integer
Do
'Darauf warten dass irgendwas gesendet wird
Input #4 , "" , X Noecho
If X > 29 Then
If X < 161 Then
Servo(1) = X
X = 0
End If
End If
If X = 255 Then
Led = 0
End If
If X = 256 Then
Led = 1
End If
Print #4 , X
Loop
Dieser Code ist für einen RNmega2560 geschrieben und muss bei Bedarf auf den jeweils verwendeten mC umgeschrieben werden.
Mit meinem Programm lässt sich entweder über das große grüne „Poti“ oder, nach betätigen das blauen Knopfes, über die Neigung ein Servo Steuern.
Der rote Knopf schaltet eine LED an und aus.
Das Programm lässt sich auch nach Belieben erweitern wenn man erst einmal die Grundfunktion verständen hat.
Auf der Homepage des Herstellers finden sich auch einige Beispiele die ganz gut zeigen wie man die einzelnen Schalter und Steller des Programms ausliest.
YouTube (http://www.youtube.com/watch?v=VUBh2Hp9BT4&feature=youtube_gdata)
Ich hoffe ich habe damit eine Anregung geschaffen.
Bin auf andere Programme und Ideen gespant ;)
Gesten bin ich auf diese (http://www.projectallusion.com/1/post/2009/11/iphone-controlled-solar-powered-arduino-tank.html) Seite gestoßen und fand die Idee einen Bot über mein iPhone zu steuern ziemlich genial.
Leider ist seine Steuerung recht simpel und kann lediglich die Motoren ein oder aus schalten.
Also habe ich mich selber mal einwenig mit der Thematik auseinandergesetzt und möchte euch nun einmal meine Ergebnisse vorstellen und eine kleines „how to“ schreiben...
Das ganze basiert auf dem App TouchOSC (http://hexler.net/software/touchosc) welches Daten auf Basis des OSC-Protokolls (Open Sound Control) sendet.
Leider gibt es meines Wissens keine Library für VB.
Also habe ich mich, wie auf der Page, für Processing entschieden da es Java sehr ähnelt und es auf der Herstellerhomepage von TouchOSC einige Beispiele gibt.
Um das Ganze nun zum Laufen zu bringen muss man sich zunächst einmal TochOSC auf sein iPhone laden.
Außerdem kann man sich noch den „TouchOSCEditor“ auf den Rechner laden, mit dem sich eigene Layouts der Steuerung erstellen lassen.
Ich habe mir zu Beginn erst einmal folgendes Layout erstellt:
http://image-upload.de/image/UR1MYa/e715f62486.jpg
Unter Network muss nun noch bei Host die IP des PCs eingetragen werden und für die Ports 8000 für outgoing und 9000 für incoming.
Damit ist das iPhone Bereit :D
Nun geht es an die Signalverarbeitung am PC.
Wie eben schon erwähnt benutze ich Processing das man hier (http://processing.org/) kostenlos laden kann.
Zusätzlich braucht man noch die „oscP5- Library“ die es hier (http://www.sojamo.de/libraries/oscP5/) gibt.
Anschließend kann man mit dem Programmieren loslegen.
Der Programmcode ist denke ich ganz gut verständlich:
import oscP5.*;
import netP5.*;
import processing.serial.*;
Serial myPort;
OscP5 oscP5;
float v_rotary1 = 0.0f;
int X;
float Y;
int Z;
int t1;
int t2;
float xrot = 0;
float zrot = 0;
float yrot = 0;
void setup() {
/* starte oscP5, listening port 8000 */
oscP5 = new OscP5(this,8000);
myPort = new Serial(this, Serial.list()[3], 9600); //COM4 (4Position in der Liste aller verfügbaren COMs)
}
void oscEvent(OscMessage theOscMessage) {
String addr = theOscMessage.addrPattern(); //Eingabeobjekt
float val = theOscMessage.get(0).floatValue(); //Objektzustand
if(addr.equals("/1/rotary1")) { v_rotary1 = val; } //rotary1
if(addr.equals("/1/toggle1")){ // toggle1
t1=int(theOscMessage.get(0).floatValue()); //aktueller Zusatnd des toggle1
}
if(addr.equals("/1/toggle2")){ // toggle2
t2=int(theOscMessage.get(0).floatValue()); //aktueller Zusatnd des toggle2
}
if(theOscMessage.checkAddrPattern("/accxyz")==true) { //Accelerometer
xrot = (theOscMessage.get(0).floatValue()*90); //Neigung in ° X-Achse
zrot = (theOscMessage.get(1).floatValue()*90); //Neigung in ° Z-Achse
yrot = (theOscMessage.get(1).floatValue()*90); //Neigung in ° Y-Achse
}
}
void draw() {
background(0);
if(t2 == 0){
X = (int)(v_rotary1*100); //normierung der Werte auf die Servofunktion
Y = (1.3 * X);
Z = (int)(30 + Y);
myPort.write(Integer.toString(Z));
myPort.write(13); //<CR> zum beenden der Input-Funktion in Bascom
}
if(t2 == 1){
X = (int)(xrot + 90); //normierung der Werte auf die Servofunktion
Y = (0.722222222222 * X);
Z = (int)(30 + Y);
myPort.write(Integer.toString(Z));
myPort.write(13);
}
if(t1 == 1) {
myPort.write("255"); //255 = Led ein
myPort.write(13);
}
if(t1 == 0){
myPort.write("256"); //256 = Led aus
myPort.write(13);
}
}
Alle empfangen Werte werden nach der Verarbeitung über einen Serial Port an meinem mC gesandt.
Der Bascom-Code:
$prog , 255 , &B11011001 , 'Quarz an / Teiler aus / Jtag aus
$regfile = "m2560def.dat"
$hwstack = 82 '80
$framesize = 68 ' 64
$swstack = 68 '44
$crystal = 16000000 'Quarzfrequenz
Config Pind.5 = Output
Led Alias Portd.5
Config Com4 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Open "com4:" For Binary As #4 'USB Buchse
Config Servos = 1 , Servo1 = Portd.4 , Reload = 10
Config Portd = Output
Enable Interrupts
Wait 2
Dim X As Integer
Do
'Darauf warten dass irgendwas gesendet wird
Input #4 , "" , X Noecho
If X > 29 Then
If X < 161 Then
Servo(1) = X
X = 0
End If
End If
If X = 255 Then
Led = 0
End If
If X = 256 Then
Led = 1
End If
Print #4 , X
Loop
Dieser Code ist für einen RNmega2560 geschrieben und muss bei Bedarf auf den jeweils verwendeten mC umgeschrieben werden.
Mit meinem Programm lässt sich entweder über das große grüne „Poti“ oder, nach betätigen das blauen Knopfes, über die Neigung ein Servo Steuern.
Der rote Knopf schaltet eine LED an und aus.
Das Programm lässt sich auch nach Belieben erweitern wenn man erst einmal die Grundfunktion verständen hat.
Auf der Homepage des Herstellers finden sich auch einige Beispiele die ganz gut zeigen wie man die einzelnen Schalter und Steller des Programms ausliest.
YouTube (http://www.youtube.com/watch?v=VUBh2Hp9BT4&feature=youtube_gdata)
Ich hoffe ich habe damit eine Anregung geschaffen.
Bin auf andere Programme und Ideen gespant ;)