Forum: PC-Programmierung Sensor Auswertung Serieller Port mit Scilab


von Max (Gast)


Lesenswert?

Hallo,

ich habe einen 6D Bewegungssensor (LSM330) den ich mit einem 
USB-I2C-Interface am PC angeschlossen habe.
Die Aufgabe ist die Sensordaten mit Scilab auszuwerten und in einer 
schönen Grafik anzuzeigen. (3D Plot mit allen Achsen, jede Achse 
einzeln, ...)
Mein Problem ist die Kommunikation zwischen Sensor und PC. Ich bekomme 
keine Daten, die ich anzeigen lassen könnte. (Die "Serial Communication 
Toolbox" für Scilab habe ich bereits runtergeladen)

Es müsste irgendwie so funktionieren:

h=openserial(...)
writeserial(h,...)
readserial(h,...)
closeserial(h)

Zur Initialisierung muss ich für den Beschleunigungssensor "S30 20 77 P" 
und für den Drehratensensor "SD4 20 0F P" schicken.
Um Daten zu empfangen frage ich mit "S30 A8 R 06 P" bzw. "SD4 A8 R 06 P" 
ab.

Könnt ihr mir weiterhelfen wie ich es schaffe überhaupt mal Daten zu 
bekommen? Bis jetzt steht unter "h" ein String mit dem Namen 
"file3b50348"

Danke!
Grüße
Max

von Marvol (Gast)


Lesenswert?

Hallo Max,

es ist immer schwierig mit solchen Tools, wenn so wenige Infos in deren 
Beschreibung stehen. Wahrscheinlich müssen noch diverse Pausen eingefügt 
werden, oder auch der Status abgefragt werden:

http://stackoverflow.com/questions/13710539/serial-communication-with-scilab-in-linux

Ich würde es unter Windows mal mit Realterm versuchen, dort müsstest Du 
dann auch sehen, was gemeldet wird:

http://realterm.sourceforge.net/realterm_from_scilab.html

Gruß
Marvol

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Ich würde auch mal erst mit Hterm schauen, was zurückkommt, wenn es 
angesprochen wird, ob überhaupt eine Reaktion erfolgt.

Das Datenblatt
http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/DM00059856.pdf
beschreibt auf Seite 32-34 die I2C-Schnittstelle.

Dazu kommt hier auch noch ein USB/I2C-Wandler, zu dem auch erst mal Info 
gebraucht wird, um etwas dazu zu sagen. Wie heißt der oder wo gibts 
Informationen? Das "S" am Anfang, "R" in der Mitte und "P" am Ende eines 
Strings scheint dazu zu gehören, der Sensor selbst oder I2C hat solche 
Texte nicht.

: Bearbeitet durch User
von Max (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
danke für eure schnelle Antwort!
Mit HTerm funktioniert es schon ganz gut.
Ich Verbinde mich über den Port COM7. Dann aktiviere ich erst den 
Beschleunigungs- und dann den Gyrosensor: S30 20 77 P und SD4 20 0F P.
Um dann die aktuellen Werte der Sensoren abzufragen sende ich für den 
Beschleunigungssensor S30 A8 R 06 P und für den Gyro SD4 A8 R 06.
Als Antwort bekomme ich dann jeweils 6 Byte. Low-X-Achse, High-X-Achse, 
Low-Y-Achse, usw...
Kann mir vielleicht jemand erklären wie man auf die Befehle kommt?
In der Beschreibung steht dass mit S30 20 77 P der Sensor aktiviert wird 
und die gewünschte Datenrate bzw. Achsen ausgewählt werden.
S30 20 77 P bedeutet 0DR=400 Hz alle Achsen aktiv.
Im Anhang ist die Registertabelle. Muss ja irgendwie was damit zu tun 
haben...
"S" initiiert Start-Ereignis auf I2C-Bus
"P" initiiert Stopp-Ereignis auf I2C-Bus
"R" Byteanzahl
Grüße!

von Max (Gast)


Lesenswert?

Hab folgendes rausgefunden:
S30 ist die Adresse vom Beschleunigungssensor
20 ist das Register in das wir
77 schreiben. Binär entspricht das 0111 0111. Das entspricht X, Y und Z 
enable und einer Frequenz von 400 Hz (ODR).

Dann ist jetzt die Frage wie ich das über SciLab schicken bzw. empfangen 
kann.

von Max (Gast)


Lesenswert?

So geht's! Zumindest die einmalige Abfrage der Daten:

clc;clear;
//Serial Port COM7 öffnen
p=openserial(7,"115200");
xpause(5000);

//Aktivierung ACC mit 400Hz, alle 3 Achsen
initacc = 
writeserial(p,ascii(83)+ascii(51)+ascii(48)+ascii(50)+ascii(48)+ascii(55 
)+ascii(55)+ascii(80));
xpause(50000);

//Aktivierung GYRO mit 95Hz, alle 3 Achsen
initgyro = 
writeserial(p,ascii(83)+ascii(68)+ascii(52)+ascii(50)+ascii(48)+ascii(48 
)+ascii(70)+ascii(80));
xpause(50000);

//ACC-Daten anfragen, 6 Byte
askacc = 
writeserial(p,ascii(83)+ascii(51)+ascii(48)+ascii(65)+ascii(56)+ascii(82 
)+ascii(48)+ascii(54)+ascii(80));
xpause(50000);

//ACC-Daten auslesen, Low-X, High-X, Low-Y, High-Y, Low-Z, High-Z
acc = readserial(p);
xpause(50000);

//GYRO-Daten anfragen, 6 Byte
askgyro = 
writeserial(p,ascii(83)+ascii(68)+ascii(52)+ascii(65)+ascii(56)+ascii(82 
)+ascii(48)+ascii(54)+ascii(80));
xpause(50000);

//GYRO-Daten auslesen, Low-X, High-X, Low-Y, High-Y, Low-Z, High-Z
gyro = readserial(p);
xpause(50000);

closeserial(p);

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.