PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : unterschiedliche zustände direkt nach Flashen und anschließendem Aus / Einschalten?



inka
12.10.2014, 13:39
hallo,

folgender code (abgespeckte version der RP6Control_MultiIO_03.c)


/************************************************** ***************************/
// Includes:

#include "RP6ControlLib.h" // The RP6 Control Library.
// Always needs to be included!
#include "RP6I2CmasterTWI.h" // Include the I2C-Bus Master Library

/************************************************** ***************************/
/************************************************** ***************************/
// Include our new "RP6Control LFS Bumper library":
// (This is the library for accessing the LFS and Bumper Board!)

#include "RP6Control_LFSBumperLib.h"

/************************************************** ***************************/
void writeDouble(double number, uint8_t width, uint8_t prec)
{char buffer[width + 1];
dtostrf(number, width, prec, &buffer[0]);
writeString(&buffer[0]);
}

/************************************************** ***************************/
// I2C Error handler

void I2C_transmissionError(uint8_t errorState)
{
writeString_P("\nI2C ERROR --> TWI STATE IS: 0x");
writeInteger(errorState, HEX);
writeChar('\n');
}

/************************************************** ***************************/
// Main function - The program starts here:

int main(void)
{
initRP6Control(); // Always call this first! The Processor will not
// work correctly otherwise.

initLCD(); // Initialize the LC-Display (LCD)
// Always call this before using the LCD!

writeString_P("\n\nRP6Control Multi IO Selftest 3!\n");

// IMPORTANT:
I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation
// with 100kHz SCL Frequency


// Register the event handler:
I2CTWI_setTransmissionErrorHandler(I2C_transmissio nError);



uint16_t distsrf_1;

startStopwatch1();

// IMPORTANT:
lfsbumper_init(); // LFS & Bumper init!!!
//setServoPower(1); // Servo power ON!


while(true)
{
if(getStopwatch1() > 1000) // 1s
{


// SRF02 sensors test:

distsrf_1 = SRF02_measure(CH_SRF02_1, MODE_CM);
writeString("\nSRF02 SENSOR_1 ->");
writeString("\nDistance: ");
writeInteger(distsrf_1, DEC);
mSleep(500);

setStopwatch1(0);
}

task_I2CTWI();
}

return 0;
}

- der SRF02 hängt direkt an der multiIO, steckplatz 1, der code ist entsprechend angepasst, die zeilen für radar und sharps in der "RP6Control_LFSBumperLib.h" sind auskommentiert

- der RP6 steht ca. 50 cm von der wand entfernt, der SRF ist auf einem servo montiert, so dass ich ihn drehen kann ohne den roby bewegen zu müssen

- der code wird ohne fehlermeldungen kompiliert

- flashe und starte ich ihn, werden als abstand 34cm angezeigt ( es sind gemessen 50cm)

- verändere ich den code von: "distsrf_1 = SRF02_measure(CH_SRF02_1, MODE_CM);" in: "............._INCH" wird nach kompilieren, flashen und starten 18 inch angezeit, (18x2,5=ca.45)

- ändere ich den code wieder zurück in "........_CM", werden nach kompilieren, flaschen und starten 51cm angezeigt. Damit wäre ich sehr zufrieden, es bleibt aber nur bis zum AUS- und Einschalten, dann sind es wieder 34cm.

das gleiche passiert mit der original "RP6Control_MultiIO_03.c"....

ich verstehe es nicht, kann mir da bitte jemand helfen was da schiefläuft?

inka
13.10.2014, 02:26
eine mögliche ursache ist mir eingefallen:

hängt das problem irgendwie damit zusammen, dass ich die m32 verwende und die jumper auf der multi-IO anders als in der standardstellung angebracht werden müssen?
Ich kann mich daran erinnern dass da sowas in der richtung war, allerdings ging es meine ich nur um die SFR20 die auf dem bumper-board angeschlossen sind...

gilt es auch für die vier anschlüsse auf dem board direkt?

inka
16.10.2014, 14:40
Es geht hier um den SRF02, leider habe ich das thema etwas unglücklich bezeichnet...

Habe nun weitere tests gemacht, weil ich den sensor ja brauche...

Die erste messung nach dem einschalten bzw. wiedereinschalten (32cm) stimmt nicht, die darauffolgenden werte sind richtig.

Mit den weiter unten erreichten ergebnisen kann ich den sensor einsetzen, muss allerdings wohl immer die abfrage der messung in inch mit durchführen. Als workaround machbar. Kennt jemand mit SFR02 und der multiIO das problem, oder bin ich allein mit dieser konstellation?

Ist es evtl. ein problem in der lib?

Hier noch einmal ein teil des testcodes (nur die whie-schleife)


while(true)
{
if(getStopwatch1() > 1000) // 1s
{

// SRF02 sensors test:

distsrf_1 = SRF02_measure(CH_SRF02_1, MODE_CM);
writeString("\nSRF02 SENSOR_1 ->");
writeString("\nDistance: ");
writeInteger(distsrf_1, DEC);
writeString(" cm");

mSleep(500);

distsrf_2 = SRF02_measure(CH_SRF02_1, MODE_INCH);
writeString("\nSRF02 SENSOR_1 ->");
writeString("\nDistance: ");
writeInteger(distsrf_2, DEC);
writeString(" inch");
setStopwatch1(0);
}

task_I2CTWI();
}

die ergebnise (mit beschreibung wann gemessen wurde):


# nach dem neueinschalten:


RP6Control Multi IO Selftest 3!

SRF02 SENSOR_1 ->
Distance: 32 cm
SRF02 SENSOR_1 ->
Distance: 22 inch
SRF02 SENSOR_1 ->
Distance: 56 cm
SRF02 SENSOR_1 ->
Distance: 22 inch
SRF02 SENSOR_1 ->
Distance: 56 cm
SRF02 SENSOR_1 ->
Distance: 22 inch
[RP6BOOT]

[READY]

# nach dem drücken des startbuttons:

RP6Control Multi IO Selftest 3!

SRF02 SENSOR_1 ->
Distance: 56 cm
SRF02 SENSOR_1 ->
Distance: 22 inch
SRF02 SENSOR_1 ->
Distance: 55 cm
SRF02 SENSOR_1 ->
Distance: 22 inch
SRF02 SENSOR_1 ->
Distance: 56 cm
SRF02 SENSOR_1 ->
Distance: 22 inch
[RP6BOOT]

[READY]

# nach dem aus- und einschalten:


RP6Control Multi IO Selftest 3!

SRF02 SENSOR_1 ->
Distance: 32 cm
SRF02 SENSOR_1 ->
Distance: 22 inch
SRF02 SENSOR_1 ->
Distance: 56 cm
SRF02 SENSOR_1 ->
Distance: 22 inch
SRF02 SENSOR_1 ->
Distance: 56 cm
SRF02 SENSOR_1 ->
Distance: 22 inch
[RP6BOOT]

[READY]

Dirk
16.10.2014, 17:03
Hi inka,

ich habe die MultiIO mit M32 z.Zt. nicht so aufgebaut und gejumpert, kann also nicht testen.

Wenn ich dazu komme, teste ich das auch mal.

inka
17.10.2014, 14:58
hi Dirk,

ich habe die MultiIO mit M32 z.Zt. nicht so aufgebaut und gejumpert, kann also nicht testen.
Wenn ich dazu komme, teste ich das auch mal.

super, danke...

ich hab in der "RP6Control_LFSBumperLib.c" noch diese beiden variablen gefunden, die masseinheit in [ ] - hat die was zu bedeuten?

double distsrf02_l; // Left SRF02 distance [mm]
double distsrf02_r; // Right SRF02 distance [mm]

werden die überhaupt irgendwo verwendet?

Dirk
17.10.2014, 17:15
Hi,

ich hab in der "RP6Control_LFSBumperLib.c" noch diese beiden variablen gefunden, die masseinheit in [ ] - hat die was zu bedeuten?
double distsrf02_l; // Left SRF02 distance [mm]
double distsrf02_r; // Right SRF02 distance [mm]
werden die überhaupt irgendwo verwendet?
Die Variablen sind für dich bzw. für dein Hauptprogramm reserviert:
Wenn du SRF02_measure() im Modus MODE_US (also Mikrosekunden-Messung) aufrufst, kannst du den Ausgabewert danach mit SRF02_calculate() in einen Millimeterabstand umrechnen. Das Ergebnis ist dann eine Fließkomma-Variable, die man z.B. in distsrf02_l packen kann:
Beispiel: distsrf02_l = SRF02_calculate(SRF02_measure(CH_SRF02_L, MODE_US));

inka
18.10.2014, 09:25
hallo Dirk,

danke für die erklärung...

habe es ausprobiert, und zwar diese zwei varianten:


1)
us_distanz = SRF02_measure(CH_SRF02_1, MODE_US);
distsrf02_1 = SRF02_calculate(us_distanz);

2)
distsrf02_1 = SRF02_calculate(SRF02_measure(CH_SRF02_1, MODE_US));

beide liefern die entfernung in mm, allerdings nur in sprüngen von 343,40 (sonic speed konstante) wie hier zu sehen:


SRF02 SENSOR_1 ->
Distance: 49.00 cm
SRF02 SENSOR_1 ->
Distance: 19.00 inch
SRF02 SENSOR_1 ->
Distance: 343.40 mm

SRF02 SENSOR_1 ->
Distance: 69.00 cm
SRF02 SENSOR_1 ->
Distance: 27.00 inch
SRF02 SENSOR_1 ->
Distance: 686.80 mm

SRF02 SENSOR_1 ->
Distance: 105.00 cm
SRF02 SENSOR_1 ->
Distance: 41.00 inch
SRF02 SENSOR_1 ->
Distance: 1030.20 mm

es sieht mir so aus, als würde sich die "time_ms", bzw. die "us" variable in der "SRF_02_calculate" funktion nur in den jeweiligen (1x /2x /3x) sprüngen ändern?

Dirk
18.10.2014, 11:13
Hi inka,

da bist du wohl bei der mm-Ausgabe auf einen Bug in der RP6Control LFS Bumper Library gestoßen!
(Wie gesagt: Ich kann z.Zt. nicht testen!)

Probier mal, die Funktion SRF02_calculate() in der Datei RP6Control_LFCBumperLib.c so zu ändern:

double SRF02_calculate(uint16_t us)
{
double time_ms = us / 2000.0f; // One way [ms]
return (SONIC_SPEED * time_ms); // Distance [mm]
}

Klappt das so besser?

P.S.:
Dieses Problem hat aber nichts mit deinem anfänglichen Problem zu tun, dass der jeweils 1. Meßwert nicht zuverlässig ist.

inka
18.10.2014, 12:23
Hi Dirk,

danke für die schnelle hilfe...


Probier mal, die Funktion SRF02_calculate() in der Datei RP6Control_LFCBumperLib.c so zu ändern:

double SRF02_calculate(uint16_t us)
{
double time_ms = us / 2000.0f; // One way [ms]
return (SONIC_SPEED * time_ms); // Distance [mm]
}

Klappt das so besser?

ja. die schwankungen sind denke ich normal...

was bedeutet eigentlich dieses ".0f"?



SRF02 SENSOR_1 ->
Distance: 32.00 cm
SRF02 SENSOR_1 ->
Distance: 13.00 inch
SRF02 SENSOR_1 ->
Distance: 324.00 mm

SRF02 SENSOR_1 ->
Distance: 33.00 cm
SRF02 SENSOR_1 ->
Distance: 12.00 inch
SRF02 SENSOR_1 ->
Distance: 330.35 mm

SRF02 SENSOR_1 ->
Distance: 57.00 cm
SRF02 SENSOR_1 ->
Distance: 22.00 inch
SRF02 SENSOR_1 ->
Distance: 575.37 mm

SRF02 SENSOR_1 ->
Distance: 57.00 cm
SRF02 SENSOR_1 ->
Distance: 22.00 inch
SRF02 SENSOR_1 ->
Distance: 574.51 mm

SRF02 SENSOR_1 ->
Distance: 77.00 cm
SRF02 SENSOR_1 ->
Distance: 30.00 inch
SRF02 SENSOR_1 ->
Distance: 771.28 mm

auch wenn ich nur die messung in mm durchführe, ohne die vorher laufenden messungen in inch oder cm (die evtl. etwas an der initialisierung beeinflussen könnten)


SRF02 SENSOR_1 ->
Distance: 495.87 mm

SRF02 SENSOR_1 ->
Distance: 495.87 mm

SRF02 SENSOR_1 ->
Distance: 502.74 mm

SRF02 SENSOR_1 ->
Distance: 495.01 mm

SRF02 SENSOR_1 ->
Distance: 498.45 mm

SRF02 SENSOR_1 ->
Distance: 495.01 mm

SRF02 SENSOR_1 ->
Distance: 502.74 mm




Dieses Problem hat aber nichts mit deinem anfänglichen Problem zu tun, dass der jeweils 1. Meßwert nicht zuverlässig ist.

mit der nun funktionierenden messung in mm hat dieses problem etwas an seiner dringlichkeit verloren - ich kann ja nun messen :-)