SRF02, m32 & multi-IO, seltsames verhalten
hallo,
folgender code (abgespeckte version der RP6Control_MultiIO_03.c)
Code:
/*****************************************************************************/
// 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_transmissionError);
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?
SRF02, m32 & multi-IO, seltsames verhalten
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?
SRF02 messung in cm und inch
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)
Code:
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):
Code:
# 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]