PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mC-Steuerung über iPhone



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 ;)

Kampi
09.12.2009, 16:49
Muss man da Erfahrung in anderen Programmiersprachen außer Basic haben oder kann man das auch als "Laie" gut bewerkstelligen?

fat tony
09.12.2009, 17:07
Naja ich würde sagen mit etwas Verständnis für Programmiersprachen kann man sich auch ganz gut die passenden Codeschnipsel aus einigen Beispielen zusammen stellen.
Aber einen leichten schimmer davon sollte man denke ich schon haben.

Kampi
09.12.2009, 17:17
Naja zur Not muss ich mich mal da durchwühlen :D . Zumindest hab ich das iPhone dafür schon :D

theborg
09.12.2009, 21:17
Hm, hab so was Ähnliches gemacht den BTstack und am µC nen BTM-222 damit bist wesentlich flexibler weils halt Seriel ist., nur ne kleine Anwendung muss man sich denn schreiben aber des ist nicht so wild hab mir eine gemacht die shelscrips ausfürt so kann man sich die scrips selber anpassen.

http://code.google.com/p/btstack/ (oder Rock/cydra/ice)

Kampi
09.12.2009, 23:19
Wie schreibe ich den diese Zeile:

Config Com4 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Open "com4:" For Binary As #4

für nen Mega32 um?

fat tony
10.12.2009, 08:50
Ich bin mir nicht sicher, aber ich glaube du lässt es einfach ganz weg und schreibst anstelle von "Input #4 , "" , X Noecho" einfach nur "Input , "" , X Noecho".

m.a.r.v.i.n
10.12.2009, 11:21
Hallo,

für eine iPhone Steuerung für Roboter interessiere ich mich auch schon eine Weile. Cool, das war mir neu, das auch der Beschleunigungs Sensor zur Steuerung verwendet werden kann.

Allerdings möchte ich das ganze ohne PC als 'man in the middle' mit einem WiFi Modul direkt am µC machen. Dafür habe ich mir ein WiShield (http://asynclabs.com/wiki/index.php?title=WiShield_1.0) vom AsyncLabs (http://asynclabs.com/home) besorgt, das auf einem Arduino Mega Board (http://arduino.cc/en/Main/ArduinoBoardMega) sitzt. Leider hatte bisher noch keine Zeit um irgend etwas auszuprobieren.

Kampi
10.12.2009, 17:58
Hab das Programm mal kopiert und beim kompilieren schreibt Bascom mir dann:

UART not available for the selected Micro

Was bedeutet das?

fat tony
10.12.2009, 19:25
Hm , kenne mich mit dem mega32 leider nicht aus.
Hast du das weggelassen was ich dir gesagt habe ?
Lass mal auch "Print #4 , X " weg und versuch es dann nochmal.

Kampi
10.12.2009, 19:50
Hab ich beides weggelassen und da steht immernoch dasselbe

fat tony
10.12.2009, 20:19
Hm da bin ich echt überfragt, musst du mal einwenig Googlen.

Kampi
10.12.2009, 23:02
Ich hab mal rumgegooglet und wenn ich das richtig verstanden habe wird diese Zeile

Config Com3 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Open "com4:" For Binary As #4

wohl für den USB Port am Mega2560 da sein. So und das Problem ist das ein Mega32 so ein USB Port nicht hat. Was ich jetzt nur nicht weiß ist ob ich diese fehlende USB Verbindung beim Mega32 eventuell ersetzen kann. Weil auf deinem Board ist dieser Port ja da um die Daten die vom Handy kommen ans Board weiterzuleiten.
D.h. ich muss evtl eine andere PC zu Board Verbindung basteln. Da ich aber relativ neu in dem Gebiet bin muss ich mich da mal bischen durchwühlen.

Sind diese Gedankengänge soweit richtig?

fat tony
11.12.2009, 10:23
Ver such es mal damit:


$regfile = "m32def.dat" 'Die Anweisung bestimmt Controllertyp, hier AVR Mega 32
$framesize = 32 'Stackanweisungen, die eigentlich nur bei größeren Programmen
$swstack = 32 'wirklich nötig werden
$hwstack = 32
$crystal = 16000000 'Die Frequenz des verwendeten Quarzes

$baud = 9600 'Die Baudrate für RS232 Ausgabe.



Config Servos = 1 , Servo1 = Portd.4 , Reload = 10
Config Portd = Output


Wait 2


Dim X As Integer


Do
'Darauf warten dass irgendwas gesendet wird
Input , "" , X Noecho

If X > 29 Then
If X < 161 Then
Servo(1) = X
X = 0
End If
End If
Loop

Kampi
11.12.2009, 10:31
Ich hab den PC (also nicht meinen sondern einen von meinem Dad) über den normalen RS232 Anschluss des Boardes mit nem Seriellen Port verbunden. Da mein eigener PC kein Seriell mehr hat muss ich da denk ich mal enteder ne Karte für kaufen oder auf USB umsteigen. Aber theoretisch könnt ich den USB Port aus deinem Programm ja auch durch einen COM Port für meinen PC ersetzen oder?

fat tony
11.12.2009, 10:37
Das schauen wir uns später einmal an, jetzt müssen wir erst mal das Basicprogramm zum Kompilieren bekommen.

Kampi
11.12.2009, 10:43
Ok dein Programm funktioniert. Der kompiliert das ohne Probleme. Ich werd das mal heute Mittag nach der Arbeit austesten.

fat tony
11.12.2009, 10:55
Ja mach das, hab jetzt allerdings auch erst mal die LED-Funktion rausgenommen.
Aber da kümmern wir uns dann mal drumm wenn der Servo läuft.

Kampi
11.12.2009, 11:15
Naja nen Servo hab ich grad keinen zur Hand. Geht evtl auch nen normaler Motor aus nem CD-Rom Laufwerk?

fat tony
11.12.2009, 13:03
Ansich schon wenn er 5V hat, jedoch musst du dann ein anderes Programmschreiben das den Analogausgang anspricht.
Mein Programm nutzt die Servofunktion von Bascom.

Kampi
11.12.2009, 14:06
Ok ich schau einfach mal

Zardest
04.10.2012, 20:45
ok ich hab es genauso wie kampi nur nen atmega 16 und programm is drauf uns servo is auch drann was muss ich nun machen ?

Zardest
04.10.2012, 20:59
aslo eigentlich musst du mir das nur mit dem anderem programm erklären :D das in bascom hab ich soweit