-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 23

Thema: mC-Steuerung über iPhone

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied Avatar von fat tony
    Registriert seit
    01.08.2007
    Ort
    Herford
    Alter
    34
    Beiträge
    147

    mC-Steuerung über iPhone

    Anzeige

    Hallo
    Gesten bin ich auf diese 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 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:


    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

    Nun geht es an die Signalverarbeitung am PC.
    Wie eben schon erwähnt benutze ich Processing das man hier kostenlos laden kann.
    Zusätzlich braucht man noch die „oscP5- Library“ die es hier gibt.
    Anschließend kann man mit dem Programmieren loslegen.
    Der Programmcode ist denke ich ganz gut verständlich:

    Code:
    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:

    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

    Ich hoffe ich habe damit eine Anregung geschaffen.
    Bin auf andere Programme und Ideen gespant

  2. #2
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    28
    Beiträge
    3.517
    Blog-Einträge
    9
    Muss man da Erfahrung in anderen Programmiersprachen außer Basic haben oder kann man das auch als "Laie" gut bewerkstelligen?

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied Avatar von fat tony
    Registriert seit
    01.08.2007
    Ort
    Herford
    Alter
    34
    Beiträge
    147
    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.

  4. #4
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    28
    Beiträge
    3.517
    Blog-Einträge
    9
    Naja zur Not muss ich mich mal da durchwühlen . Zumindest hab ich das iPhone dafür schon

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    30.09.2006
    Ort
    Hamburg
    Alter
    35
    Beiträge
    995
    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)
    Legastheniker on Bord !

    http://www.Grautier.com - Projektseite
    http://www.grautier.com/wiki/doku.php?id=bt-index - BT-BUS

  6. #6
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    28
    Beiträge
    3.517
    Blog-Einträge
    9
    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?

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied Avatar von fat tony
    Registriert seit
    01.08.2007
    Ort
    Herford
    Alter
    34
    Beiträge
    147
    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".

  8. #8
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    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 vom AsyncLabs besorgt, das auf einem Arduino Mega Board sitzt. Leider hatte bisher noch keine Zeit um irgend etwas auszuprobieren.

  9. #9
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    28
    Beiträge
    3.517
    Blog-Einträge
    9
    Hab das Programm mal kopiert und beim kompilieren schreibt Bascom mir dann:

    UART not available for the selected Micro

    Was bedeutet das?

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied Avatar von fat tony
    Registriert seit
    01.08.2007
    Ort
    Herford
    Alter
    34
    Beiträge
    147
    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.

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •