Im Download-Bereich gibts jetzt noch ein Jumper.png mit einer Beschriftung aller Jumper und Pins.
Ich hoffe, das hilft euch!
Anhang 25102
Grüße
Druckbare Version
Im Download-Bereich gibts jetzt noch ein Jumper.png mit einer Beschriftung aller Jumper und Pins.
Ich hoffe, das hilft euch!
Anhang 25102
Grüße
hi fabqu,
vielen dank für die grafik, an sowas habe ich schon gedacht, wäre es nur ein bisschen größer (an bytes)...
auf dem monitor super, wenn ich versuche die grafik abzuspeichern, sind es knapp 100kb, wenn ich dann versuche es DINA4-füllend auszudrucken, kann ich nix mehr lesen :-((
Erledigt ;)
@ fabqu: Wie viele PWM Ports sind wirklich ungenutzt abgesehen von den Servosteckern?
Wenn ich einen 2. PWM contoller anschließe muss ich nur in der Bibliothek die Adresse ändern und die Adressjumper anders Stecken.
Thorben
Unbelegt sind nur drei: in der einzelnen Pinreihe links vom PCA9685 ist der oberste für den BUZ11-Transistor und die unteren vier für die LEDs. Der rest ist frei.
Zum anderen PWM-Treiber: Kommt natürlich darauf an, welcher Art der ist. Wenns auch ein PCA9685 ist, dann ist die Lib, die Dirk gemacht hat, sicherlich die gleiche (andere Adresse natürlich).
Aber PWM-Treiber anderer Hersteller oder einfach andere als der PCA9685 werden unter Umständen anders angesprochen.
hi fabqu, Dirk,
ich habe bei www.exp-tech.de diesen gyro bestellt:
http://www.exp-tech.de/Sensoren/MinI...C-Carrier.html
MinIMU-9 v2 Gyro,Beschleunigungssensor, Kompass (L3GD20 and LSM303DLHC Carrier)der sieht als hardware so aus:
Anhang 25666
jetzt habe ich in den dropbox unterlagen gesehen, dass die minimu so aussieht:
Anhang 25667
wird die, die ich geliefert bekommen habe mit dem IO board auch funktionieren, oder soll ich sie zurückschicken?
Den sensor den ich von fabqu habe siet aus wie auf deinem ersten Bild.
Thorben W
Und funktionier er? Wie hast du ihn angeschlossen? Einzellitzen oder flachbandkabel? Ein foto evtl? Viele fragen :-)
Gruss inka
Nein ausprobiert habe ich ihn noch nicht.
Mache ich wenn ich Zeit habe.
Thorben W
Hi Inka,
das passt!!! Den Sensor kannst du eigentlich anschließen, wie du willst. Ich habe auf meinem Board vier Buchsen und am Gyro vier 90-grad-Pins. Dann stecke ich den Gyro einfach senkrecht aufs Board, hat ganz gut geklappt.
Aber du kannst auch ein Flachband verwenden und ihn irgendwo anders anbringen. Er sollte einfach nicht zu nah an den Motoren sein, das ist alles.
Die Ausrichtung ist dann aber egal (wenn ich mich recht erinnere), da du ihn ohnehin kalibrieren musst.
Er kann Gyro, Beschleunigung und Kompass in allen drei Raumrichtungen und ist daher von seiner Ausgangslage unabhängig.
Dirk: Bitte korrigiere mich, wenn ich hier Quatsch erzähle.
Von der Softwareseite sieht das so aus:Zitat:
Er kann Gyro, Beschleunigung und Kompass in allen drei Raumrichtungen und ist daher von seiner Ausgangslage unabhängig.
1. Man kann zwar das Sensorboard in beliebiger Lage anbringen, allerdings geht die Software von einer BESTIMMTEN Lage der Sensor-Achsen aus.
Wenn man das Board anders anbringt, muss man wahrscheinlich die Lib ändern.
2. Das Board von exp-tech hat zwar dieselben Sensor-Chips (ist also kompatibel zur MinIMU), scheint aber etwas anders im Layout zu sein. Das bedeutet: Nur wenn die Chips auf dem exp-tech Board genauso angeordnet sind, wie auf dem MinIMU-Board, klappt das 1:1 mit der Lib, sonst müßte man auch anpassen.
ich würde sagen: X in fahrtrichtung, bauteile (und damit Z) nach oben, stimmts?
Anhang 25685
EXP-TECH verkauft es nur, auf dem chip steht pololu, sollte als 1:1 einsetzbar sein, oder?
Hi inka:
Gute Nachricht: Das Modul, was du gekauft hast, ist die MinIMU-9 v2!
Für die Lib ist sie so angebracht:
1. Bedruckte Seite nach OBEN (Chips nach unten)
2. Y-Achse nach VORN (Aufdruck ist in Fahrtrichtung lesbar)
hi Dirk:
wie beschrieben aufgebaut, angeschlossen, in der orientation.h den HDMM auskomentiert, bei der minIMU die "// entfernt...
folgende anzeigen laufen beim start durch:
RP6 CONTROL 1.4b
>READY TO GO!
----------------------------
#############
#############
--------------------------
RP6 Control M32
Example program
---------------------------
RP6 Multi IO
Selftest 5
--------------------------
X-3625 Y-363
Z-1074 T-18
-------------------------
X5 Y-31 Z-1025
P 0.0 R -1.8
-----------------------------
jetzt scheint sich das programm (RP6Control_MultiIO_05.c) zu beenden...
RP6 CONTROL 1.4b
>READY TO GO
------------------------------
startbutton 1x gedrückt:
RP6 CONTROL 1.4b
>BOOTLOAD
------------------------------
RP6 CONTROL 1.4b
>READY TO GO!
------------------------------
erst hier ist ein neustart durch ein erneutes drücken des startbuttons möglich
Nur zur Vollständigkeit...
Fragen:
1. "GPS" ist auch auskommentiert?
2. Vor dem Neu-Kompilieren: Make clean (.lst und .o der OrientationLib entfernt?)
3. Hardwaretechnischer Anschluß ok, wie von fabqu beschrieben?
1) ja, habe es noch einmal mit nicht auskommentiertem GPS probiert - die LCD bleibt nach den ersten textmeldungen leer
2) ja
3) ja
Ok, dann kannst du nur testen, welche Teile funktionieren:
1. Die Definitionen "GET_TEMP" und "GET_TEMP_M" auskommentieren (und auskommentiert lassen).
2. In der Demo den Teil unter "// L3GD20 gyroscope:" probeweise auskommentieren.
3. ALTERNATIV in der Demo den Teil unter "// LSM303DLHC magnetometer:" ...
UND den Teil unter "// LSM303DLHC accelerometer:" probeweise auskommentieren.
Nach den Änderungen das Ergebnis hier posten.
habe auch die "#define OFFSET_TEMP" auskommentiert, die anzeige der temperatur erscheint nun nicht
auskommentiert:
programm zeigt die werte des Accelerometers und des magnetometers und beendet sichCode:/* // L3GD20 gyroscope:
task_I2CTWI();
readL3GD20(); // Get sensor values
normalizeL3GD20();
task_I2CTWI();
setCursorPosLCD(0, 0); // line 1
writeStringLCD_P("X");
writeIntegerLCD(x_axisg, DEC);
writeStringLCD_P(" ");
setCursorPosLCD(0, 8); // line 1 pos 9
writeStringLCD_P("Y");
writeIntegerLCD(y_axisg, DEC);
writeStringLCD_P(" ");
setCursorPosLCD(1, 0); // line 2
writeStringLCD_P("Z");
writeIntegerLCD(z_axisg, DEC);
writeStringLCD_P(" ");*/
auskommentiert:
programm zeigt die werte des gyros und beendet sichCode:/* // LSM303DLHC accelerometer:
task_I2CTWI();
readLSM303DLHC_A(); // Get sensor values
task_I2CTWI();
setCursorPosLCD(0, 0); // line 1
writeStringLCD_P("X");
writeIntegerLCD(x_axisa, DEC);
writeStringLCD_P(" ");
setCursorPosLCD(0, 5); // line 1 pos 6
writeStringLCD_P("Y");
writeIntegerLCD(y_axisa, DEC);
writeStringLCD_P(" ");
setCursorPosLCD(0, 10); // line 1 pos 11
writeStringLCD_P("Z");
writeIntegerLCD(z_axisa, DEC);
writeStringLCD_P(" ");
normalizeLSM303DLHC_A(); // Normalize data
positionLSM303DLHC_A(); // Calculate position
setCursorPosLCD(1, 0); // line 2
writeStringLCD_P("P");
writeDoubleLCD(pitch, 6, 1);
writeStringLCD_P(" ");
setCursorPosLCD(1, 8); // line 2 pos 9
writeStringLCD_P("R");
writeDoubleLCD(roll, 6, 1);
writeStringLCD_P(" ");
task_I2CTWI();
mSleep(3000);
// LSM303DLHC magnetometer:
task_I2CTWI();
readLSM303DLHC_M(); // Get sensor values
task_I2CTWI();
setCursorPosLCD(0, 0); // line 1
writeStringLCD_P("X");
writeIntegerLCD(x_axism, DEC);
writeStringLCD_P(" ");
setCursorPosLCD(0, 5); // line 1 pos 6
writeStringLCD_P("Y");
writeIntegerLCD(y_axism, DEC);
writeStringLCD_P(" ");
setCursorPosLCD(0, 10); // line 1 pos 11*/
@Dirk: Wenn der Kompass bei mir nach Osten zeigt wird Süden angezeigt und wenn ich dann den RP6 um 180° drehe er also nach Westen guckt dann wird Osten angezeigt. Richtung Norden angezeigt: NE und Richtung Süden angezeigt SE
Thorben W
@inka:
Ich muss demnächst mal wieder die M32 an die MultiIO anschliessen. Dann probiere ich das mal durch.
@Thorben W:
Was hast du nochmal für einen Sensor an der MultiIO am Laufen?
Kalibrierung richtig durchgeführt?
Den MinIMU-9 v2, welche Kalibrierung denn?
Thorben W
hi Thorben,
hast du die M32 oder M256?
Ich habe die M256
Thorben W
Also dir Beschriftung zeigt nach oben die y Achse nach Vorne. Die Multi IO ist bei mir hinten montiert.
Thorben W
Anhang 25692
@Thorben W:
Genau dafür ist die Lib geschrieben. Also alles im grünen Bereich.Zitat:
Beschriftung zeigt nach oben die y Achse nach Vorne
Fürs Magnetometer wäre es gut, wenn die Flachkabel und die schwarz-roten Stromkabel nicht direkt in der Nähe entlang laufen würden.
Danke für den Hinweis (sind doch "nur" 6,5 cm :) ) Werde ich höher bauen und am besten nicht neben den GPS und die WLAN Antenne?
Thorben W
Besser isses ...Zitat:
höher bauen und am besten nicht neben den GPS und die WLAN Antenne
könntest du bitte bei der gelegenhet auch an die HDMM denken? Ich habe zwar jetzt auch die minIMU, möchte aber die HDMM nicht ganz außer acht lassen...
noch eine frage zu den X/Y min/max werten: Sollten die werte währen der drehung um 360° einen kontinuierlichen verlauf haben (sinus?) Gilt das für HDMM wie auch für dier minIMU?
@inka:
Ja! Ja!Zitat:
frage zu den X/Y min/max werten: Sollten die werte währen der drehung um 360° einen kontinuierlichen verlauf haben (sinus?) Gilt das für HDMM wie auch für dier minIMU?
@Dirk: ich komme nicht drauf woran es liegt dass der HDMM immer um ca. 90° cw mehr/falsch anzeigt als er sollte. Habe schon alle möglichen störquellen wie servos abgebaut, es ändert sich nicht...
Der verlauf der anzeige beim drehen des RP6 ist aber kontinuierlich, ohne außreisser, bzw. eine plötzliche anzeige die zu der vorherigen nicht passt. von 0 bis 359...
Gibt es in der lib irgendwo eine möglichkeit den angezeigten wert durch das hinzufügen eines korrekturfaktors um diese 90° zu verändern?
@inka:
Einen "Korrekturfaktor" könnte man zur Richtungsanzeige hinzufügen, das ist aber nur die zweitbeste Lösung.
Die beste ist:
HDMM01 so anbringen:
- Sensorchip nach OBEN (U1 von oben lesbar)
- SDA/SCL Pins in Fahrtrichtung VORN
Wenn du den Sensor anders angebracht hast, ist das auch kein Drama:
- Nimm dir die Funktion readHDMM01() vor. Darin gibt's die Zeilen:
Durch y_axis2dm *= -1; wird hier z.B. die Y-Achse umgekehrt. Du kannst das probeweise auskommentieren.Code:// xb = y:
x_axis2dm = ((readBuf[MSB_X_AXIS] & 0x0f) << 8) + readBuf[LSB_X_AXIS];
// yb = -x:
y_axis2dm = ((readBuf[MSB_Y_AXIS] & 0x0f) << 8) + readBuf[LSB_Y_AXIS];
y_axis2dm *= -1;
Genauso kannst du für die X-Achse eine neue Zeile x_axis2dm *= -1; einfügen, um die X-Achse umzukehren.
Damit probierst du alle 4 Kombinationen durch bis die Richtungsangaben passen.
ist so aufgebaut...
das wars noch nicht, aber vielleicht hilft es bei der fehlersuche:
RP6 steht in fahrtrichtung NORD.
1) y_axis2dm *= -1; auskommentiert, anzeige heading: 90, die sich nur im bereich 88-91 bei 360° drehung verändert
2) x_axis2dm *= -1; hinzugefügt bei auskommentierter umkehrung der y achse: anzeige heading:135, die anzeige verändert sich bei 360° drehung im bereich 135-136
3) beide achsen umgekehrt: anzeige heading 181, verändert sich bei drehung 360° im bereich 179-181
4) ursprünglicher zustand(x auskommentiert, y-achse umgekehrt): heading anzeige 251, verändert sich kontinuierlich bei einer drehung um 360° im bereich 0-360
Wenn der HDMM01 so angebracht ist, wie beschrieben, bringt auch ein Tauschen der Achsen nichts.
Die Anzeige müßte dann mit der Orientierungslib stimmen.
Wenn nicht: Metalleinflüsse von außen reduzieren und neu kalibrieren.
Wenn das auch nicht hilft: ???
und da ist nix an metalleinfluss was ich beseitigen könnte. Also doch die zweitbeste lösung mit dem korrekturfaktor. Wie mache ich das?
gruss u. dank
Inka
Hi inka:
In der Funktion headingHDMM01() könnte man 90° addieren oder subtrahieren.
wo ran kann es liegen das der Bumper handler der Multiio (MULTIIO_BUMPERS_setStateChangedHandler(bumpersSta teChanged);) nicht funktioniert aber der Handler der Front bumper.
lfsbumper_init(); habe ich aufgerufen.
Übersetzt wird das Programm fehlerfrei.
Thorben W
@inka:
Die Zeit (Urlaub!) hätte schon gereicht, aber ich habe nur meine Progs auf dem Laptop, komme aber nicht an die Hardware dran.
Vielleicht kann ich ja (via PN) zur MinIMU was sagen, wenn du Lust hast, das Problem damit nochmal zu beschreiben bzw. mit mir einzugrenzen.
Wenn nicht: In der 2. Julihälfte bin ich wohl wieder an Bord.
Hi Thorben,
hast Du auch nichts vergessen ? hättest mal Deinen Code Posten sollen.
in der Main habe ich:
MULTIIO_BUMPERS_init();
MULTIIO_BUMPERS_setStateChangedHandler(MULTIIO_BUM PERS_stateChanged);
und in der While:
task_MULTIIO_BUMPERS();
im Programm noch die Funktion:
void MULTIIO_BUMPERS_stateChanged(void)
wo eben steht was gemacht werden soll.