Forum: Mikrocontroller und Digitale Elektronik Problem Diplomarbeit


von gertrud h. (falron1994)


Lesenswert?

Hi,
ich arbeite zurzeit an einem Schulprojekt. Hierfür versuche ich einen 
9DOF-Sensor von Sparkfun auszuwerten. Beim Beschleunigungssensor hatte 
ich kaum Probleme, jedoch treten diese nun beim Gyrosensor ITG3200 auf.
Das Problem ist, dass ich immer nur 0 als Werte zurückgeliefert bekomme. 
Ich habe auch das von Sparkfun zur Verfügung gestellte Testprogramm 
1-zu-1 auf meinen Microcontroller (Arduino Leonardo, VCC an 3,3 V 
ausgang verbunden) gespielt, aber auch dies liefert mir nur 0en. Deshalb 
wollte ich euch bitten mir weiterzuhelfen, wenn ihr mein Problem lösen 
könnt.

Freundliche Grüße
1
// Mein Quellcode
2
3
#include <Wire.h>
4
5
#define SMPLRT_DIV (0x15)
6
#define DLPF_FS (0x16)
7
#define INT_CFG (0x17)
8
#define PWR_MGM (0x3E)
9
#define ITG (0x69)
10
#define TO_READ_GYRO (6)
11
12
byte gyroValues[TO_READ_GYRO];
13
14
 //In the setup section of the sketch the serial port will be configured, the i2c communication will be initialized, and the itg-3200 will be configured.
15
void setup()
16
{
17
  //Create a serial connection using a 9600bps baud rate.
18
  Serial.begin(9600);
19
  
20
  //Initialize the I2C communication. This will set the Arduino up as the 'Master' device.
21
  Wire.begin();
22
  
23
  writeTo(ITG, PWR_MGM, 80);    // reset
24
  writeTo(ITG, SMPLRT_DIV, 00);    
25
  writeTo(ITG, DLPF_FS, 18);
26
  writeTo(ITG, INT_CFG, 00);    // no interrupts
27
  writeTo(ITG, PWR_MGM, 00);    // normal operation
28
  
29
  delay(10);
30
}
31
32
void loop()
33
{
34
  //Create variables to hold the output rates.
35
  int gyroAddress = 0x1D;
36
  double gyroX, gyroY, gyroZ;
37
  
38
  gyroX = (((int)gyroValues[2])<< 8) | gyroValues[3];    
39
  gyroY = (((int)gyroValues[4])<< 8) | gyroValues[5]; 
40
  gyroZ = (((int)gyroValues[6])<< 8) | gyroValues[7]; 
41
42
  Serial.print(gyroValues[1]);
43
  Serial.print("X: ");
44
  Serial.println(gyroX);
45
  Serial.print("Y: ");
46
  Serial.println(gyroY);
47
  Serial.print("Z: ");
48
  Serial.println(gyroZ); 
49
  Serial.println(" "); 
50
51
  //Wait 10ms before reading the values again. (Remember, the output rate was set to 100hz and 1reading per 10ms = 100hz.)
52
  delay(1000);
53
}
54
55
//Writes val to address register on device 
56
void writeTo(int device, byte address, byte val) { 
57
  Wire.beginTransmission(device); //start transmission to device  
58
  Wire.write(address);        // send register address 
59
  Wire.write(val);        // send value to write 
60
  Wire.endTransmission(); //end transmission 
61
} 
62
  
63
//reads num bytes starting from address register on device in to buff array 
64
void readFrom(int device, byte address, int num, byte buff[]) { 
65
  Wire.beginTransmission(device); //start transmission to device  
66
  Wire.write(address);        //sends address to read from 
67
  Wire.endTransmission(); //end transmission 
68
  
69
  Wire.beginTransmission(device); //start transmission to device 
70
  Wire.requestFrom(device, num);    // request 6 bytes from device 
71
  
72
  int i = 0; 
73
  while(Wire.available())    //device may send less than requested (abnormal) 
74
  {  
75
    buff[i] = Wire.read(); // receive a byte 
76
    i++; 
77
  } 
78
  Wire.endTransmission(); //end transmission 
79
}

von Karl H. (kbuchegg)


Lesenswert?

Hmm. Wenn das Testprogramm vom Hersteller (das war für deinen Arduino 
gedacht?) schon nicht funktioniert, dann würde ich mal ins Auge fassen, 
dass du ein Hardware-Problem hast.

PS: In deinem Code wird die Funktion 'readFrom' nirgendwo aufgerufen. 
D.h. zumindest in deinem Code kann da schon mal gar nichts anderes als 0 
rauskommen. Die Messwerte wandern ja nicht irgendwie magisch von selber 
ins Array gyroValues.

Ausserdem wärs wahrscheinlich ganz gut, wenn du dir bei den Funktionen, 
die die eigentliche I2C Kommunikation machen, auch wenig die Returnwerte 
ansehen würdest um dort Fehler mitzubekommen.
Alles in allem sind in deinem Code einige Problemstellen enthalten, so 
dass ich erst mal mit dem Herstellercode weitermachen würde, da von dem 
auszugehen ist, dass er im Prinzip eigentlich laufen sollte.

von gertrud h. (falron1994)


Lesenswert?

oh danke für diesen Hinweis. Hab ich komplett vergessen haha.
und auch die parameter bei gyroValues in der loop-Funktion habe ich 
jeweils um 2 verringert (da ich nur ein array mit 6 einträgen habe)

aber leider wird auch jetzt noch nur 0 zurückgeliefert.
Was für ein Problem könnte es denn sein? wie gesagt verwende ich einen 
Stick, auf welchem ein beschleunigungssensor sowie der gyrosensor 
enthalten sind (es ist auch noch ein dritter sensor enthalten...und alle 
sind über die selben vcc, gnd, scl, sda pins verbunden) und die 
auswertung des beschleunigungssensors funktionierte einwandfrei mittels 
i2c.

hier der link zum testprogramm: https://www.sparkfun.com/tutorials/265

könnte es sein, dass ich die verbindung mittels i2c in readFrom bzw. 
writeTo falsch habe? ich bin mir nicht sicher ob ich das, was im 
datenblatt darüber steht richtig interpretiert habe (Seite 20).

hier der Link zum Datenblatt: 
https://www.sparkfun.com/datasheets/Sensors/Gyro/PS-ITG-3200-00-01.4.pdf

von Decius (Gast)


Lesenswert?

Wenn das eine I2C-Schnittstelle ist, an die Pull-Up Widerstände in der 
Clock- und Datenleitung gedacht? Sind notwendig, da eine bidirektnionale 
Kommunikation verwendet wird. Deshalb sind die Datenleitung und die 
Clk-Leitung als Open-Collector ausgeführt. Ergo, Pull-widerstände sind 
notwendig.

von gertrud h. (falron1994)


Lesenswert?

kann das das problem sein, denn bei der auswertung des 
beschleunigungssensors  (ebenfalls via i2c) funktioniert es ohne 
pull-widerstände auch (wenn sensor auf dem tisch liegt und auf m/s^2 
umgerechnet -> x und y = 0 und z ~ 9)

und ich weiß nicht ob das eine bedeutung hat, aber vcc wird an die 
notwendigen 3,3V angeschlossen und der arduino leonardo hat bereits 
vordefinierte sda und scl-pins welche ich hierfür verwendet habe

von Eumel (Gast)


Lesenswert?

gertrud hiller schrieb:
> funktioniert es ohne
> pull-widerstände auch

Hast du nun die entsprechenden Widerstände oder nicht? Wenn nein, bau 
sie ein.

von gertrud h. (falron1994)


Lesenswert?

ok und wie bzw wo soll ich die einbauen und welche größe?

von Eumel (Gast)


Lesenswert?

gertrud hiller schrieb:
> ok und wie bzw wo soll ich die einbauen und welche größe?

http://www.nxp.com/documents/user_manual/UM10204.pdf

von gertrud h. (falron1994)


Lesenswert?

ich habe mir diese seite angeschaut, aber ich bin leider immer noch 
nicht in der lage mein problem zu lösen ://

von Eumel (Gast)


Lesenswert?

gertrud hiller schrieb:
> ich habe mir diese seite angeschaut, aber ich bin leider immer noch
> nicht in der lage mein problem zu lösen ://

Seite 55.

von gertrud h. (falron1994)


Lesenswert?

d.h. ich sollte ca. 1 kOhm Widerstand verwenden?

und wie baue ich die ein? einfach zwischen den beiden sda bzw. scl?

von Karl H. (kbuchegg)


Lesenswert?

gertrud hiller schrieb:
> d.h. ich sollte ca. 1,2 kOhm Widerstand verwenden?
>
> und wie baue ich die ein? einfach zwischen den beiden sda bzw. scl?

Nein.
Pullup Widerstände gehen immer von der Signalleitung weg und sind an der 
anderen Seite an der Versorungsspannung angeschlossen.

Die Umkehrung, ein Pulldown, würde von der Signalleitung nach Masse 
führen.

Up   -> in Richtung des 'hohen' Spannungspotentials
Down -> in Richtung des 'niedrigen' Spannungspotentials

von wieOskar (Gast)


Lesenswert?

Servus,

wie machst du die Pointer Arithmetik für deinen Buffer? Also wie sieht 
der Aufruf von readFrom aus?
Wenn ich das aus dem Sketch richtig verstanden habe dann musst du 
readFrom 6 mal aufrufen.
Aktueller Source Code?

von gertrud h. (falron1994)


Lesenswert?

erstmal danke für die super pull-widerstands-erklärung :D

ich habe gelesen dass 4,7k oder 10k ohm verwendet werden können. also 
diese nun zwischen den beiden sda und 3.3v und den beiden scl und 3.3v 
einbauen?

nein da ich ein Array mit größe 6 erstelle und bei readFrom in dieses 
gespeichert wird
1
//Quellcode
2
3
#include <Wire.h>
4
5
#define SMPLRT_DIV (0x15)
6
#define DLPF_FS (0x16)
7
#define INT_CFG (0x17)
8
#define PWR_MGM (0x3E)
9
#define ITG (0x69)
10
#define TO_READ_GYRO (6)
11
12
byte gyroValues[TO_READ_GYRO];
13
14
 //In the setup section of the sketch the serial port will be configured, the i2c communication will be initialized, and the itg-3200 will be configured.
15
void setup()
16
{
17
  //Create a serial connection using a 9600bps baud rate.
18
  Serial.begin(9600);
19
  
20
  //Initialize the I2C communication. This will set the Arduino up as the 'Master' device.
21
  Wire.begin();
22
  
23
  writeTo(ITG, PWR_MGM, 80);    // reset
24
  writeTo(ITG, SMPLRT_DIV, 00);    
25
  writeTo(ITG, DLPF_FS, 18);
26
  writeTo(ITG, INT_CFG, 00);    // no interrupts
27
  writeTo(ITG, PWR_MGM, 00);    // normal operation
28
  
29
  delay(10);
30
}
31
32
void loop()
33
{
34
  //Create variables to hold the output rates.
35
  int gyroAddress = 0x1D;
36
  double gyroX, gyroY, gyroZ;
37
  
38
  readFrom(ITG, gyroAddress, TO_READ_GYRO, gyroValues);
39
  gyroX = (((int)gyroValues[0])<< 8) | gyroValues[1];    
40
  gyroY = (((int)gyroValues[2])<< 8) | gyroValues[3]; 
41
  gyroZ = (((int)gyroValues[4])<< 8) | gyroValues[5]; 
42
43
  Serial.print("X: ");
44
  Serial.println(gyroX);
45
  Serial.print("Y: ");
46
  Serial.println(gyroY);
47
  Serial.print("Z: ");
48
  Serial.println(gyroZ); 
49
  Serial.println(" "); 
50
51
  //Wait 10ms before reading the values again. (Remember, the output rate was set to 100hz and 1reading per 10ms = 100hz.)
52
  delay(1000);
53
}
54
55
//Writes val to address register on device 
56
void writeTo(int device, byte address, byte val) { 
57
  Wire.beginTransmission(device); //start transmission to device  
58
  Wire.write(address);        // send register address 
59
  Wire.write(val);        // send value to write 
60
  Wire.endTransmission(); //end transmission 
61
} 
62
  
63
//reads num bytes starting from address register on device in to buff array 
64
void readFrom(int device, byte address, int num, byte buff[]) { 
65
  Wire.beginTransmission(device); //start transmission to device  
66
  Wire.write(address);        //sends address to read from 
67
  Wire.endTransmission(); //end transmission 
68
  
69
  Wire.beginTransmission(device); //start transmission to device 
70
  Wire.requestFrom(device, num);    // request 6 bytes from device 
71
  
72
  int i = 0; 
73
  while(Wire.available())    //device may send less than requested (abnormal) 
74
  {  
75
    buff[i] = Wire.read(); // receive a byte 
76
    i++; 
77
  } 
78
  Wire.endTransmission(); //end transmission 
79
}

von wieOskar (Gast)


Lesenswert?

gertrud hiller schrieb:
> nein da ich ein Array mit größe 6 erstelle und bei readFrom in dieses
> gespeichert wird

Wie gesagt wird im Sketch halt so gemacht. Habe das DB jetzt noch nicht 
gelesen ob es da noch andere Möglichkeiten zum auslesen gibt. Du bist 
sicher das er dir die 6byte auch liefert?

Warum hast du nicht vom Hersteller kopiert sondern aus dem Arduino 
Forum? Der Code ist doch für einen anderen Sensor.

von wieOskar (Gast)


Lesenswert?

Wo im DB steht das mit dem Burst Read für alle Werte?

von gertrud h. (falron1994)


Lesenswert?

ja das ist der code für den beschleunigungssensor. ich habe mir die 
stelle im DB des gyros angesehen, jedoch habe ich dies nicht genau 
verstanden, da ich eigentlich noch nie mit soetwas zu tun gehabt habe 
und dachte mir deshalb, dass dieser codeteil beim gyro schon auch 
funktionieren sollte. aber kann natürlich gut sein, dass das nicht der 
fall ist.

DB: 
https://www.sparkfun.com/datasheets/Sensors/Gyro/PS-ITG-3200-00-01.4.pdf

auf seite 20 sollte der entsprechende teil zu finden sein. kann mir 
jemand wenn möglich sagen, wie ich die sache angehen muss, damit ich 
daten lesen kann? wäre sehr hilfreich :D

von Mr. X (Gast)


Lesenswert?

wieOskar schrieb:
> Wenn ich das aus dem Sketch richtig verstanden habe dann musst du
> readFrom 6 mal aufrufen.

Zitat:
"Ein Sketch ist eine kurze komödiantische Szene, die einer reduzierten 
Handlung folgt und mit einer prägnanten Schlusspointe abschließt."
(Wikipedia)

Mit letzterem ist wohl das finale "Es läuft" gemein ;-)

von gertrud h. (falron1994)


Lesenswert?

danke für die aufklärung, aber als sketch kann glaub ich auch ein 
codesnippet  bezeichnet werden. aber das spielt ja nichts zur sache.
lieber wäre mir wenn mir jemand bei meinem problem helfen könnte :D

von Konrad S. (maybee)


Lesenswert?

gertrud hiller schrieb:
> 9DOF-Sensor von Sparkfun

Wie lautet denn die Bezeichnung des Sensors (SEN-?????, Link)?

> Ich habe auch das von Sparkfun zur Verfügung gestellte Testprogramm
> 1-zu-1 auf meinen Microcontroller (Arduino Leonardo, VCC an 3,3 V
> ausgang verbunden) gespielt

Welches Testprogramm (Link)?

von Sebastian W. (sebastian_w29)


Lesenswert?

Hallo Gertrud,

  writeTo(ITG, PWR_MGM, 80);    // reset
  writeTo(ITG, DLPF_FS, 18);

Du setzt also das PWR_MGM-Register auf 0x50 (Gyro X und Z in 
Standby-Modus) und das DLPF_FS-Register auf 0x12 (FS_SEL auf einer 
reservierten Wert, Low-Pass filter auf 98Hz und die Internal Sample Rate 
auf 1kHz).

Entweder dein Kommentar (// reset) ist falsch, oder du hast das fehlende 
0x-Präfix deiner Zahlenliterale hier übersehen.

LG, Sebastian

von gertrud h. (falron1994)


Lesenswert?

hi,
also der sensor hat die bezeichnung SEN-10724.

Sernor: https://www.sparkfun.com/products/10724

Testprgramm: https://www.sparkfun.com/tutorials/265



nein ich wollte schon ein reset machen. also was ich schreibe wenn ich 
0x vor der zahl habe, weiß ich. aber was genau passiert wenn ich das 0x 
nicht habe?
ein beispiel:
0x35 -> 0011 0101 oder?
35 -> 0010 0011 stimmt das?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:
> Pullup Widerstände gehen immer von der Signalleitung weg und sind an der
> anderen Seite an der Versorungsspannung angeschlossen.
Ich finde es echt bedenklich, wenn man das einem Diplomanden erklären 
muss...

gertrud hiller schrieb:
> nein ich wollte schon ein reset machen. also was ich schreibe wenn ich
> 0x vor der zahl habe, weiß ich. aber was genau passiert wenn ich das 0x
> nicht habe?
Ist das Ernst gemeint? Seis drum:
> ein beispiel: 0x35 -> 0011 0101 oder?
Richtig.
> 35 -> 0010 0011 stimmt das?
Richtig.
35 dez = 0x23...

gertrud hiller schrieb:
> kann mir jemand wenn möglich sagen, wie ich die sache angehen muss,
> damit ich daten lesen kann?
Machs ingenieurmäßig: lies das Datenblatt und versuche es zu verstehen. 
Nimm ein Oszilloskop oder einen LA und vergleiche das, was sich auf dem 
Bus tut, mit dem, was im Datenblatt steht. Suche die Ursache der 
Differenzen und behebe den Fehler...

von Justus S. (jussa)


Lesenswert?

Lothar Miller schrieb:
> Ich finde es echt bedenklich, wenn man das einem Diplomanden erklären
> muss...

da von Schulprojekt die Rede ist, würde ich mal davon ausgehen, dass es 
sich nicht um eine normale DA an einer Uni/FH handelt, in Ö gibt es da 
doch auch was an irgendeiner Schulart, was sich sinnigerweise 
Diplomarbeit nennt, obwohl es was ganz anderes ist...

mal abgesehen davon, dass sich Pull-up/down ja sogar bei Wikipedia 
findet...

von Dave C. (dave_chappelle)


Lesenswert?

@TE

Wer in seinem Thread-Titel "Diplomarbeit" stehen hat, der sollte nicht 
solche Fragen stellen.

von A. B. (funky)


Lesenswert?

Zu ihrer Verteidigung: nicht überall wird unter einer Diplomarbeit das 
verstanden, was wir in Deutschland darunter verstehen

von gertrud h. (falron1994)


Lesenswert?

ich gehe in eine HTL (Höhere technische Schule). das problem ist nur, 
dass ich den schwerpunkt wirtschaftsingenieurwesen gewählt habe und da 
der elektronische anteil nur grundlegend und sehr wenig vorhanden ist.

von Udo S. (urschmitt)


Lesenswert?

A. B. schrieb:
> Zu ihrer Verteidigung: nicht überall wird unter einer Diplomarbeit das
> verstanden, was wir in Deutschland darunter verstehen

Jepp, das ist wohl Österreich. Da kann man wohl sogar ein Diplom im 
Schuhe binden machen.

von gertrud h. (falron1994)


Lesenswert?

wie gesagt das problem ist dass ich elektro-technik nicht als 
schwerpunkt habe und somit fast nichts darüber in der schule gelernt 
habe.

von Karl H. (kbuchegg)


Lesenswert?

Warum machst du dann so ein Projekt.
Ausserdem: Die Maturazeit ist doch schon lange vorbei

von gertrud h. (falron1994)


Lesenswert?

ja ich bin nächstes jahr im maturajahr, aber wir beginnen jetzt schon 
mit der diplomarbeit, damit wir nicht so einen stress bekommen.
ja eigentlich besteht der elektronische teil daraus, diesen sensor 
auszuwerten und dementsprechend 3 schrittmotoren anzusteuern (wir 
dachten uns, dass das nicht soo das große problem sein kann).

nochmals zurück zu den pull-ups. ich muss einen pull-up jeweils von sda 
und scl des masters (also arduino) zu spannungsversorung einbauen. wie 
kann man das machen, wenn die stromversorgung über den usb-port am pc 
läuft? kann man hier den pin 5V nehmen?

von A. B. (funky)


Lesenswert?

Ich verstehe den Code so, das er immer nur GYRO_XOUT_H liest.

Im Datenblatt auf Seite 22 steht, das GYRO_XOUT_H = 0x1D ist.

Und readFrom wird immer nur mit der Adresse  "gyroAddress = 0x1D" 
aufgerufen(wenn ich nix übersehen habe).

Hab mit I2C aber auch noch nix gemacht. Kann also sein das ich da etwas 
nicht kapiert habe

von wieOskar (Gast)


Lesenswert?

gertrud hiller schrieb:
> somit fast nichts darüber in der schule gelernt
> habe

Dann macht man entweder so ein Projekt nicht oder man muss es halt 
selber lernen. Aber vermutlich wird keiner kommen und dir dein Problem 
lösen, du wirst eher Hilfestellung zum selber Lösen bekommen.

Mein Vorschlag wäre erstmal das Beispiel umzusetzen 1:1. Wenn das nicht 
klappt die Hardware checken. Alle PINs richtig angeschlossen? 
Stromversorgung usw.

Ich habe noch eine Frage zur I2C Library und zwar ob das ACK nach jedem 
Empfang der Daten geschrieben wird. Laut Datenblatt sollte es gehen wie 
du richtig festgestellt hast. Wie gesegt jetzt muss sich die Software 
eben richtig verhalten.

von Karl H. (kbuchegg)


Lesenswert?

> Mein Vorschlag wäre erstmal das Beispiel umzusetzen 1:1.

Das hätte ich auch gesagt und auch schon vorgeschlagen.
> https://www.sparkfun.com/tutorials/265

Denn dann fallen erst mal die eigenen kleinen Fehler, die einem das 
Leben schwer machen können raus.
Das ist eigentlich eine übliche Vorgehensweise, wenn man an was neues 
rangeht: erst mal die Herstellerbeispiele möglichst unverändert 
übernehmen und so wie sie sind zum Laufen kriegen. Wobei man beim Code 
übernehmen schon auch etwas mitdenken muss, speziell im Bereich Benutzer 
Ein/Ausgabe kann das schon mal Abweichungen geben, weil eben nicht exakt 
genau die gleiche Hardware zur Verfügung steht.

von gertrud h. (falron1994)


Lesenswert?

ja, aber bei requestFrom habe ich die zahl 6 angegeben, somit werden die 
nächsten 6 bytes geliefert (so mein plan). ich bin mir nur nicht sicher 
ob das bei diesem sensor auch so funktioniert wie beim 
beschleunigungssensor, dass man 6 bytes auf einmal transferieren kann 
oder man jedes einzeln holen muss.
aber auch wenn immer nur das selbe byte geliefert wird, dann sollte 
eigentlich nicht 0 ausgegeben werden oder nicht?

ja hardware sollten noch pull-ups eingebaut werden.
muss hierbei sowohl die sda und scl des arduinos (versorgungsspannung 5V 
durch PC) als auch die sda und scl des sensors (versorgungsspannung 
3.3V) mit einem pull-up versehen werden?
und bei sda und scl des arduinos: wie kann ich pull-ups einbauen wenn 
die versorgung durch den usb-port des PC geschieht? kann ich den 5V-Pin 
verwenden?

von gertrud h. (falron1994)


Lesenswert?

aber auch bei dem testprogramm von sparkfun werden nur 0en geliefert -> 
es muss an der hardware liegen oder?

von Karl H. (kbuchegg)


Lesenswert?

gertrud hiller schrieb:
> aber auch bei dem testprogramm von sparkfun werden nur 0en geliefert ->
> es muss an der hardware liegen oder?

Kommt drauf an.
Das Testprogramm liest ja als allererstes das 'Who_am_I' Register aus. 
Kriegst du da was? Sieht das plausibel aus? Wenn dieser Wert schon nicht 
plausibel ist, dann brauchst du mit den Messwerten erst gar nicht 
weitertun.

Diese Id auszulesen ist so ziemlich der einfachst mögliche Fall. Dazu 
muss im Sensor nicht konfiguriert sein, keine Messbereiche oder Modi 
eingestellt werden. D.h. damit testest du nur und ausschliesslich die 
Übertragung selber. Daher ist dieser Test auch so wichtig, weil er dir 
eine gute Aussage darüber gibt, ob die SPI-Kommunikation an sich 
funktioniert.

von gertrud h. (falron1994)


Lesenswert?

ich bekomme als ID ebenfalls eine 0 geliefert :/

von Karl H. (kbuchegg)


Lesenswert?

gertrud hiller schrieb:
> ja, aber bei requestFrom habe ich die zahl 6 angegeben, somit werden die
> nächsten 6 bytes geliefert (so mein plan). ich bin mir nur nicht sicher
> ob das bei diesem sensor auch so funktioniert wie beim
> beschleunigungssensor, dass man 6 bytes auf einmal transferieren kann
> oder man jedes einzeln holen muss.

Ich sach mal so.
Die Leute von Sparkfun machen das nicht so. Die holen jedes Register 
einzeln ab.
Und ich denke mir, die werden schon wissen was sie tun.

von Karl H. (kbuchegg)


Lesenswert?

gertrud hiller schrieb:
> ich bekomme als ID ebenfalls eine 0 geliefert :/

Dann sollte man sich wahrscheinlich mal die Hardware näher ansehen.
Verkabelung prüfen. Sind auf deinem spezifischen Arduino Leonardo die 
SPI Signale auch wirklich auf genau diesen Pins (kann mich dunkel 
erinnern, dass manche Pinbelegungen bei manchen Arduino Typen etwas 
abweichend sind - ist aber nur dunkle Erinnerung. Daher: prüfen!)

von Karl H. (kbuchegg)


Lesenswert?

Blup schrieb im Beitrag #3237791:

> Und sowas arbeitet an einer Diplomarbeit...

Vergiss den Titel 'Diplomarbeit'.
Und das gilt auch für Gertrud. Egal was sie dir in der HTL sagen, benutz 
ausserhalb der Schule und schon gar nicht in einem technischen Forum 
diesen Titel. Denn das ist wirklich ein Witz. Wer sich den Blödsinn hat 
einfallen lassen, den sollte man mit dem nassen Fetzen erschlagen. Oder 
kriegst du ein 'Diplom' wenn du fertig bist? Nein. Kriegst du nicht. Du 
kriegst einen Maturaabschluss. Daher ist das eine Maturaarbeit. Und 
genau so hat das seit Anbeginn der HTL-Ära auch geheissen. Der Begriff 
'Diplom' ist schon anderweitig besetzt und bezeichnet einen Abschluss 
einer Hochschule. Das was früher der gute alte Dipl.-Ing. war und was 
jetzt durch dieses bescheuerte Bachelor/Master System ersetzt wurde.

Jeder Techniker, mit dem du es in Zukunft zu tun hast, dem du 
reinreibst, dass du eine Diplomarbeit gemacht hast, kriegt einen 
Lachkrampf, wenn er drauf kommt, dass du eine HTL-Maturarbeit damit 
meinst.

Nichts gegen HTL. Ich finde den Schultyp super und bin selbst auch HTL 
Absolvent. Aber hier haben sie euch ein Ei gelegt.

von gertrud h. (falron1994)


Lesenswert?

ich arbeite mit i2c.
auf dem arduino gibt es extra pins welche mit sda und scl beschriftet 
sind und diese habe ich mit den sda und scl des sensors verbunden.
mit der selben verkabelung habe ich die werte des beschleunigungssensors 
ausgelesen und da auch passende werte geliefert bekommen.

wie kann ich einen pull-up zwischen versorungsspannung durch usb-port 
und den kommunikationsleitungen einbauen?
und wenn ich nun auf der arduino seite pull-ups auf 5v habe und auf der 
sensor-seite pull-ups auf 3.3V, dann arbeitet eine seite mit 5V und die 
andere kommunikationshälfte mit 3.3V. funktioniert das? oder soll auch 
bei der arduino seite ein pull-up auf 3.3V eingebaut werden?

ok tut mir leid. dann habe ich ein problem bei meiner maturaarbeit :D

von Karl H. (kbuchegg)


Lesenswert?

gertrud hiller schrieb:
> ich arbeite mit i2c.

Tschuldigung.
Ja, hatte ich auch gemeint als ich SPI tippte :-)

> wie kann ich einen pull-up zwischen versorungsspannung durch usb-port
> und den kommunikationsleitungen einbauen?

Erst mal kannst du ihn zb provisorisch einbauen.
Widerstand nehmen. 2 Kabel mit Krokoklemmen an beiden einden. Das eine 
Ende vom Widerstand ans Krokoklemmen Kabel, das andere Ende vom 
Krokoklemmenkabel an +3.3V
Am Widerstand ist dann noch das andere Ende frei. Da kommt auch wieder 
ein Krokoklemmenkabel drann und damit gehst du auf die SDA Leitung.

> und wenn ich nun auf der arduino seite pull-ups auf 5v habe und auf der
> sensor-seite pull-ups auf 3.3V, dann arbeitet eine seite mit 5V und die
> andere kommunikationshälfte mit 3.3V. funktioniert das? oder soll auch
> bei der arduino seite ein pull-up auf 3.3V eingebaut werden?

http://forum.arduino.cc/index.php?topic=46963.0

von wieOskar (Gast)


Lesenswert?

gertrud hiller schrieb:
> ja, aber bei requestFrom habe ich die zahl 6 angegeben, somit werden die
> nächsten 6 bytes geliefert (so mein plan).

Schon klar was dein Plan ist. Aber ob die Hardware sich das auch so 
denkt wie du das Planst ist eine andere Sache. Wie gesagt es sollte 
prinzipiell möglich sein aber ich kann nicht sagen ob die Lib das 
richtig verarbeitet das musst du Prüfen.

Pull-Ups oben links: 
http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Sensors/IMU/9DoF-Stick-v13.pdf 
die für 3.3V sind drin

Nochmal zum sketch. Bitte mal ein bisschen mitdenken und nach der 
Üersetzung ins deutsche suchen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

gertrud hiller schrieb:

> wie kann ich einen pull-up zwischen versorungsspannung durch usb-port
> und den kommunikationsleitungen einbauen?

Irgendwo wirst Du doch an die 5V des Boards herankommen, gibts da keinen 
Stiftkontakt?

> und wenn ich nun auf der arduino seite pull-ups auf 5v habe und auf der
> sensor-seite pull-ups auf 3.3V, dann arbeitet eine seite mit 5V und die
> andere kommunikationshälfte mit 3.3V. funktioniert das? oder soll auch
> bei der arduino seite ein pull-up auf 3.3V eingebaut werden?

Wenn Du SDA des Boards mit SDA des Sensors verbindest, gibt es keine 
ausgezeichnete "Sensor-Seite" oder "Arduino-Seite". Sie sind ja 
elektrisch miteinander verbunden. Dasselbe gilt für SCL. Ebenso muss GND 
verbunden werden.

Der Arduino arbeitet also mit 5V, der Sensor mit 3,3V. Steht denn im 
Datenblatt, dass der Sensor mit 5V auf den i2C-Leitungen zurechtkommt? 
Wenn ja, dann schließe die Pullups an 5V an. Wenn nein, dann nimm 
stattdessen die 3,3V. Das sollte der ATmega im Arduino auch noch als 
High-Pegel erkennen. Wenn Du es nicht herausfindest, nimm die 3,3V. Dann 
geht erstmal nichts kaputt.

Gruß,

Frank

von gertrud h. (falron1994)


Lesenswert?

ok danke für die hilfe :D

also nehme ich einfach 4,7k widerstände und verbinde die 2 
kommunikationsleitungen des arduinos mit 3.3V? oder brauche ich gar 
keine pull-ups mehr wenn diese im sensor integriert sind?

es gibt einen pin welcher mit 5V beschriftet ist. wenn ich messe werden 
auch 5V angezeigt, aber kann ich diesen hierfür verwenden? schon oder?

von wieOskar (Gast)


Lesenswert?

Nur um mal das DB zu zitieren

"Absolute Maximum Ratings
VLOGIC Input Voltage Level -0.5V to VDD + 0.5V"

Dementsprechend max 3.8V bei VDD 3.3V am Sensor. Wenn die SDA/SCL 
Leitung jetzt 5V hat beim messen könnte es sein das der Sensor schon hin 
ist.

von Sebastian W. (sebastian_w29)


Lesenswert?

Die Wire-Bibliothek des Arduino aktiviert schon die internen Pullups des 
uC zu VCC, I2C sollte also meist schon ohne zusätzliche Pullups 
funktionieren.

Gertrud, hast du inzwischen die 0x vor die Werte eingefügt?

LG, Sebastian

von gertrud h. (falron1994)


Lesenswert?

also beim sparkfun testprogramm hat der autor geschrieben, dass er es 
immer rikiert hat mit 5V signalen zu arbeiten und dass er damit nie ein 
problem gehabt hat

ja habe ich. danke für den hinweis :D aber leider funktioniert es immer 
noch nicht

und wenn die pull-ups nicht nötig sind, wegen den integrierten pull-ups. 
was könnte denn dann der fehler sein?

von Sebastian W. (sebastian_w29)


Lesenswert?

Es sollte mit 5V funktionieren. Das Board hat lt. Schema 4k7-Pullups zu 
3.3V 
(http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Sensors/IMU/9DoF-Stick-v13.pdf), 
der Arduino die internen Pullups zu 5V, das mittelt sich schon irgendwie 
hin ...

Bitte, Gertrud, sonst bringt das hier alles nichts: Zeig uns ein Foto, 
und die letzte Version des Quellcodes.

LG, Sebastian

von wieOskar (Gast)


Lesenswert?

gertrud hiller schrieb:
> also beim sparkfun testprogramm hat der autor geschrieben, dass er es
> immer rikiert hat mit 5V signalen zu arbeiten und dass er damit nie ein
> problem gehabt hat

Hat der Autor oder du ein Problem? Warum hat der Autor vom Testprogramm 
dann nicht im Datenblatt vermekt das es auch mit 5V geht?

gertrud hiller schrieb:
> und wenn die pull-ups nicht nötig sind, wegen den integrierten pull-ups.
> was könnte denn dann der fehler sein?

Meistens sitzt das Problem direkt zwischen den Ohren;-) Hast du die Lib 
schon geprüft? Erkläre bitte wie! Testprogramm läuft also schon? Mit 
welchen Einstellungen?

von :)) (Gast)


Lesenswert?

gertrud hiller schrieb:
> ich bekomme als ID ebenfalls eine 0 geliefert :/

jeder kriegt im leben was er verdient!

von Sebastian W. (sebastian_w29)


Lesenswert?

wieOskar schrieb:
> Hat der Autor oder du ein Problem? Warum hat der Autor vom Testprogramm
> dann nicht im Datenblatt vermekt das es auch mit 5V geht?

Das sollte nicht das Problem sein, siehe mein Beitrag oben: 3.3V - 4k7 - 
20-50k - 5V, das zieht zu 3.4-3.6V, das geht schon.

wieOskar schrieb:
> Hast du die Lib schon geprüft? Erkläre bitte wie!

Welche Lib? Wire.h ist Teil der Arduino-Umgebung, die funktioniert.

Gertrud, lass auch bitte mal den I2C-Scanner-Sketch laufen 
(http://playground.arduino.cc/Main/I2cScanner), und liefere uns dessen 
Ausgabe.

LG, Sebastian

von Sebastian W. (sebastian_w29)


Lesenswert?

Hallo Gertrud,

hast du den I2C-Scanner schon laufen gelassen? Findet der ein I2C-Gerät 
an Adresse 0x68? Laut Board-Schema 
(http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Sensors/IMU/9DoF-Stick-v13.pdf) 
ist bein ITG-3200 AD0 mit GND verbunden, und also sollte laut Datenblatt 
§6.1.1 die I2C-Adresse des ITG-3200 0x68 sein.

Ich hatte zu Anfang auch ähnliche Probleme mit einem MPU6050.

LG, Sebastian

von gertrud h. (falron1994)


Lesenswert?

ok danke!!!! an alle welche mir geholfen und mich nicht nur schlecht 
gemacht haben!!
ich bekomme jetzt werte, welche sich auch entsprechend verändern.
das problem war, dass ich als device-adresse 0x69 anstatt 0x68 verwendet 
habe.
kann mir jemand vl noch sagen, wieso 68 richtig und nicht 69 richtig 
ist?
denn auch im example code von sparkfun wird 69 verwendet?

der i2c scanner funktioniert tadellos, welcher mir auch mitgeteilt hat, 
dass die nummer 0x68 sein muss ;D dankeschön!!!

von phischu (Gast)


Lesenswert?

Im Datenblatt zum IGT3200 steht unter Punkt 6.1.1, dass die Adresse 
abhängig vom logischen Zustand an Pin 9 ist. Logische 0 führt zu Adresse 
0x68, logische 1 zu 0x69.

Auf dem Board ist anscheinend Pin 9 auf Low gelegt, während der Code für 
einen Aufbau mit Pin 9 High geschrieben wurde.

von Sebastian W. (sebastian_w29)


Lesenswert?

Hallo Gertrud,

gertrud hiller schrieb:
> das problem war, dass ich als device-adresse 0x69 anstatt 0x68 verwendet
> habe.
> kann mir jemand vl noch sagen, wieso 68 richtig und nicht 69 richtig
> ist?
> denn auch im example code von sparkfun wird 69 verwendet?

Schön dass es jetzt funktioniert.

Mich wundert aber etwas deine Frage, insbesonders nach meinem Hinweis 
auf das Schema deines Boards und den Verweise auf 6.1.1 im Datenblatt.

Dein Beispielcode kommt von https://www.sparkfun.com/tutorials/265. Dort 
wird aber ein anderes Breakout-Board angesprochen. In dessen Anleitung 
heisst es doch ganz klar: "A jumper on the top of the board allows you 
to easily select the I2C address, by pulling the AD0 pin to either VCC 
or GND; the board is shipped with this jumper tied to VCC." Darum ist 
die I2C-Adresse für dieses Board 0x69. Im Schema deines Boards ist AD0 
aber mit GND verbunden.

Hast du denn den Paragraphen 6.1.1 im Datenblatt nicht verstanden?

LG, Sebastian

von gertrud h. (falron1994)


Lesenswert?

ja ich habe das so verstanden, dass wenn ich die kommunikation mittels 
i2c führe der pin 9 HIGH ist und somit 0x69 und wenn nicht ist er hald 
LOW.
aber die erklärung von euch gefällt mir auch viel besser und leuchtet 
mir auch besser ein. danke an alle!! :D

von Sebastian W. (sebastian_w29)


Lesenswert?

Hallo Gertrud,

ja, 6.1.1 allein ist wirklich nicht absolut klar, und wird nur im 
Zusammenhang mit 5.4 (The LSB of the of the I2C slave address is set 
by pin 9 AD0) verständlich. Bei Datenblättern kommt es oft auf ganz 
genaues Lesen an.

Aber nun viel Spass bei der Auswertung der Daten, Kalman-Filterei und 
ähnlichem!

LG, Sebastian

PS: Der Preis des SEN-10724 ist ja recht happig. MPU-9150 (unter 30 Euro 
mit Versand, z.B. Bucht 271135830629) hätte es wohl auch getan.

von gertrud h. (falron1994)


Lesenswert?

ja da hast du wohl recht haha. das mit dem genauen lesen der 
datenblätter muss ich noch besser machen :D

danke sebastian. ich hoffe den werde ich auch haben ;)

danke für die super hilfe!!!

von A. B. (funky)


Lesenswert?

Was macht ein 9-Achsen Sensor aus?

Ich habe einen MPU-6050 und der hat 6 Achsen. Werden da einfach die 
Achsen von jedem integrierten Sensor zusammengezählt?  Der MPU6050 hat 
einen Gyro und ein Beschleunigungssensor integriert.

Der hier verwendete hat ja anscheinend noch einen Kompass.

Oder was ist da mit den 9 Achsen gemeint?

von A. B. (funky)


Lesenswert?

Ok, war die Frage so dämlich? %-)

von Karl H. (kbuchegg)


Lesenswert?

google
"9 DOF"
und ein wenig schmökern

 3 Achsen Rotation
 3 Achsen Beschleunigung
 3 Achsen Winkel zum Erdmagnetfeld
---
 9

von A. B. (funky)


Lesenswert?

ah, DOF fehlte mir als Stichwort.

thx

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.