PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : MD23, I2C und PHP ;-)



tobiokanobi
09.06.2009, 22:27
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...

tobiokanobi
09.06.2009, 22:35
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]

tobiokanobi
10.06.2009, 10:01
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

tobiokanobi
11.06.2009, 00:23
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

mki
11.06.2009, 06:20
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"....

tobiokanobi
11.06.2009, 08:39
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

tobiokanobi
15.06.2009, 01:49
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

mki
15.06.2009, 09:04
Hi,
mit I2C-Sniffer meinte ich eigentlich so ein Hardware Ding z.B. von Elektor.

tobiokanobi
16.06.2009, 05:49
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