-
        

Ergebnis 1 bis 9 von 9

Thema: MD23, I2C und PHP ;-)

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    18.12.2008
    Beiträge
    13

    MD23, I2C und PHP ;-)

    Anzeige

    Hallo,

    habe folgende Konfiguration und 2/3 kleine Problemchen:

    MD23 (0xB0)
    und PHP

    Grundsätzlich funktioniert das ansprechen des MD23 via PHP

    fopen i2Cbus,
    fseek(i2Cbus, adr)
    fwrite/fread....

    da immer schön das grüne Lämpchen am MD23 aufleuchtet wenn ich das Programm aufrufe.

    Jedoch:

    *) Beim Lesen bekomme ich immer nur 0xff zurück
    *) Bis gestern hat auch die Motoren reagiert wenn ich auf die entsprechenden Register geschrieben habe, z.B Motor 1:

    Ox5600, 0xff

    hat kurz zu einem anlaufen des Motors geführt, nach 1-2 sec wieder stop.

    Deshalb habe ich in folge probiert diesen automatischen Stop zu deaktivieren (0x580f, 0x32), seitdem reagieren die Motoren nicht mehr?

    Frage1): Gibt es ein "Reset?" für den MD23
    Frage2): Kennt sich jemand mit I2C und PHP aus?

    Danke!

    Tobias

    PS: Nein ich habe kein Bascom,VB...

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    18.12.2008
    Beiträge
    13
    Ach ja codes:

    [php:1:2f3facc36e]function i2c_send($width,$bus,$a,$d,$raw=0) { //$a<0 - use raw read/write
    $w=($width==16)?2:1;
    $i2c_fn='/dev/xi2c'.($raw?'raw'($w==2)?'16':'8')).(($bus==0)?'':'_aux');
    $i2c = fopen($i2c_fn, 'w');
    fseek ($i2c, $w*$a) ;
    if ($w==1) $res=fwrite($i2c, chr ($d));
    else $res=fwrite($i2c, chr (floor($d/256)).chr ($d-256*floor($d/256)));
    fclose($i2c);
    return $res;
    } // end of i2c_send()
    [/php:1:2f3facc36e]

    Die Smiley gehören nicht hinein, sondern; "doppelpunkt klammerauf"

    und

    [php:1:2f3facc36e]
    function i2c_receive($width,$bus,$a,$raw=0) {
    $w=($width==16)?2:1;
    $i2c_fn='/dev/xi2c'.($raw?'raw'($w==2)?'16':'8')).(($bus==0)?'':'_aux');
    $i2c = fopen($i2c_fn, 'r');
    fseek ($i2c, $w*$a) ;
    $data = fread($i2c, $w);
    fclose($i2c);
    if (strlen($data)<$w) return -1;
    $v=unpack(($w==1)?'C':'n1',$data);
    return $v[1];
    } // end of i2c_receive()
    [/php:1:2f3facc36e]

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    18.12.2008
    Beiträge
    13
    Was ich eigentlich wissen will:

    Schreiben sollte eigentlich so gehen (angenommen Speed Mode (Reg:13) auf 2 setzen:

    i2c_send

    Width=8 (=1Byte)
    Bus=1 (ist der Bus an dem mein MD23 hängt)
    Adr=0x580D
    Data=0x02

    Bzw. Motor 1 antreiben:

    Width=8
    Bus=1
    Adr=0x5800
    Data=0xff (full speed)

    Aber lesen (z.B Batteriespannung, Reg=10)

    zuerst schreiben (i2c_send)

    Width=8
    Bus=1
    Adr=0x580A
    Data=(leer)

    dann empfangen mit i2c_recieve entweder so:

    Möglichkeit 1)

    Width=8 (=1Byte wird gelesen)
    Bus=1
    Adr=0x580A (standardadr,register)

    oder Möglichkeit 2)

    Width=8
    Bus=1
    Adr=0x590A (standardadr.+1, register)

    Liege ich gänzlich falsch?

    -tobias

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    18.12.2008
    Beiträge
    13
    Okay, ich kann nun die Motoren drehen lassen:

    (vereinfachter code

    [php:1:8dab25cfde]
    function i2c_speed2() {
    $i2c = fopen('/dev/xi2c8_aux', 'r+');
    fseek ($i2c, 0x5801) ;
    for ($i=0;$i<=10000;$i++) {
    $wdata = fwrite($i2c, 0xff);
    for ($j=0;$j<=100;$j++) {}
    }
    fclose ($i2c);
    return $wdata;
    } //end of i2c_speed2 ()
    [/php:1:8dab25cfde]

    Somit dreht sich der/die Motoren wahlweise je nachdem ob ich
    0x5800 (Motor1) oder
    0x5801 (Motor2) anspreche

    (Die Schleifen sind nur da um die Laufdauer zu erhöhen (ansonsten automatischer Stop)

    Jedoch kann ich die Geschwindigkeit nicht varieren - sie bleibt immer konstant! (0x00,...,0xff)

    Hat jemand eine Idee?

    -tobias

    P.S: Lesen geht noch gar nicht

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    10.10.2007
    Ort
    Potsdam
    Beiträge
    27
    Hi,
    hast du nen I2C-Sniffer? Nur mal um zu schauen ob die PHP-IO-Funktionen nur das machen was du willst und nicht noch was "dran basteln"....

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    18.12.2008
    Beiträge
    13
    Nein, hab' keinen! - Das ganze hängt auch nur sehr indirekt an meinen Computer, da ich das MD23 Board an den I2C Bus einer Netzwerkkamera (http://www.elphel.com) gehängt habe (und die hat einen Webserver mit PHP laufen). -> D.h. z.B ein C-Programm kompilieren ist ein wenig aufwending, da ein Axis ETRAX Prozessor lauft und ich auf meinen iMac nicht den Crosscompiler installieren kann.

    (Dafür müßte ich mir zuerst Linux installieren, dann den Crosscompiler,...)

    Ein mögliche Fehlerquelle ist wahrscheinlich, daß fwrite (bus, $data) die Daten als Character sendet. D.h ich werde mal ein chr($data) versuchen, mit $data=0xXX

    tobias

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    18.12.2008
    Beiträge
    13
    also

    char(0xXX) (mit XX = 00 - FF

    ist genausowenig erfolgreich. Lustig ist, wenn ich drei verschiedene Kommandos hintereinander sende, kommt es manchmal vor, dass unterschiedliche Reaktionen auftreten. (langsam, schneller, vor, zurück), aber jedoch niemals zweimal das selbe hintereinander.

    Habe es auch mit decbin(int x) versucht, aber zwecklos.

    (Ebenso habe ich bei fopen den mode auf (wb) gesetzt, ohne Erfolg.

    Mir gehen hier ein wenig die Ideen aus....Anregungen?

    -tobias

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    10.10.2007
    Ort
    Potsdam
    Beiträge
    27
    Hi,
    mit I2C-Sniffer meinte ich eigentlich so ein Hardware Ding z.B. von Elektor.

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    18.12.2008
    Beiträge
    13
    Nein, ebensowenig

    Also bleibt mir zur Zeit nur "try and error"

    Okay, ich weiß nun durch "ftell" dass ich immer in den selben Register schreibe. Immerhin etwas

    Da sich der Motor ja dreht, weiß ich auch, daß ich irgendwelche Daten in diesen Register schreibe. Auch etwas

    Anscheinend schreibe ich jedoch das Falsche in den Register, da:

    *) sich der Motor nur dreht wenn ich die Daten in einer Schleife hineinsende

    (eigentlich sollte ja bereits ein einmaliger Eintrag von 0xff in Register 00 reichen um den Motor für 2 sec. drehen zu lassen, ich muß aber ein paar hundert mal reinschreiben)

    *) der Eintrag in das Register keine "gesteuerte" Wirkung auf Drehzahl oder Drehrichtung hat.

    (meistens rennt er max speed, manchmal jedoch langsamer, manchmal links dann rechts, alles beim gleichen Wert)

    Da ich mit

    fwrite ($fd, $data, 1)

    nur einen Byte übertrage, muß dieser falsch sein.

    -tobi

Berechtigungen

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