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
bytegyroValues[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
voidsetup()
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
voidloop()
33
{
34
//Create variables to hold the output rates.
35
intgyroAddress=0x1D;
36
doublegyroX,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
voidwriteTo(intdevice,byteaddress,byteval){
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
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.
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
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.
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
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
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?
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
bytegyroValues[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
voidsetup()
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.
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.
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
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 ;-)
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
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)?
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
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?
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...
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...
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.
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.
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?
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
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.
> 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.
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?
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.
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.
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!)
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.
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
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
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.
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
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?
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.
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
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?
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
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?
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
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
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!!!
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.
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
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
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.
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!!!
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?