WarChild
03.02.2008, 12:31
Hi,
ich wollte meinen RP6 etwas erweitern und in das Beispielpogramm Move_05 meine funktionen implementieren.
Er soll eigentlich nur während er "cruised" mit dem SRF02 Messungen durchführen und dann auf den LEDs SL1 bis 6 darstellen. Das funktioniert auch genau so wie ich mir das gewünscht habe. Allerdings ragiert dann das ACS nicht mehr auf Gegenstände. ](*,)
Ich habe auch schon versucht nur Teilfunktionen auszuführen. Also ohne zu messen eine Zahl auf den LEDs ausgeben, aber dennoch funzt das ACS nicht. Und auch wenn ich nur messe ohne es darzustellen geht es nicht. GRGR ich habe keine Ahnung woran es liegt.
hier der Code, allerdings nur mein modifizierten Teil, den Rest hat wohl jeder.
#define SRF02 0xE0
#define attachdistance 8
/************************************************** *************************************\
| Diese FUnktion stellt einen Messwert der Distanz vor dem Roboter bereit. |
| Bitter nicht vergessen vorher die I2C Master Library einzufügen. |
| Und außerdem noch die Definitionen. |
| |
| #include "RP6I2CmasterTWI.h" |
| #define SRF02 0xE0 // dies ist die Standardadresse des SRF02 |
| #define attachdistance 8 // hiermit lässt sich die Montagedistanz korregieren |
\************************************************* **************************************/
uint16_t distanceSRF02(void)
{
static uint8_t measureactive = false; //Messungsstatus
uint8_t srfbuffer[2]; //Speicher für die übertragenen Bytes
uint16_t distance = 0; //Gemessene Strecke
if (measureactive == false)
{
I2CTWI_transmit2Bytes(SRF02, 0, 81); // SRF02 bekommt im Register 0 den Befehl in cm zu messen
measureactive = true;
startStopwatch6();
}
if (getStopwatch6() >= 65 && measureactive == true)
{
I2CTWI_transmitByte(SRF02, 2); // Ab dem zweiten Reigster Daten anfordern
I2CTWI_readBytes(SRF02, srfbuffer, 2); // und in dem Array speichern
distance = (srfbuffer[0] * 256) + srfbuffer[1]-attachdistance;
stopStopwatch6();
measureactive = false;
}
// hiermit werden Messfehler korregiert, da negative Werte sonst bei anderen funktionen zu Problemen führen
if (distance == -attachdistance)
distance = 0;
return distance;
}
/* stellt die gemessene Strecke auf den Status LEDs dar*/
void LEDmeter(uint16_t distance)
{
statusLEDs.LED1=0;
statusLEDs.LED2=0;
statusLEDs.LED3=0;
statusLEDs.LED4=0;
statusLEDs.LED5=0;
statusLEDs.LED6=0;
if ((distance % 100)/25 >= 1) // cm werden auf der einen Seite dargestellt. Jede LED=25cm
statusLEDs.LED1=1;
if ((distance % 100)/25 >= 2)
statusLEDs.LED2=1;
if ((distance % 100)/25 >= 3)
statusLEDs.LED3=1; // m auf der anderen. Jede LED=1m
if (distance / 100 >= 1)
statusLEDs.LED4=1;
if (distance / 100 >= 2)
statusLEDs.LED5=1;
if (distance / 100 >= 3)
statusLEDs.LED6=1;
updateStatusLEDs();
}
/**
* We don't have anything to do here - this behaviour has only
* a constant value for moving forwards - s. above!
* Of course you can change this and add some random or timed movements
* in here...
*/
void behaviour_cruise(void)
{
uint16_t distance = distanceSRF02();
if (distance != 0)
{
LEDmeter(distance); // Anzeige der Distanz auf SL1 bis SL6
writeString_P("\n Dist.= ");
writeInteger(distance,DEC);
writeString_P("cm");
writeString_P("\t");
writeInteger(distance / 100,DEC);
writeString_P("\t");
writeInteger((distance % 100)/25,DEC);
}
}
mfg WarChild
ich wollte meinen RP6 etwas erweitern und in das Beispielpogramm Move_05 meine funktionen implementieren.
Er soll eigentlich nur während er "cruised" mit dem SRF02 Messungen durchführen und dann auf den LEDs SL1 bis 6 darstellen. Das funktioniert auch genau so wie ich mir das gewünscht habe. Allerdings ragiert dann das ACS nicht mehr auf Gegenstände. ](*,)
Ich habe auch schon versucht nur Teilfunktionen auszuführen. Also ohne zu messen eine Zahl auf den LEDs ausgeben, aber dennoch funzt das ACS nicht. Und auch wenn ich nur messe ohne es darzustellen geht es nicht. GRGR ich habe keine Ahnung woran es liegt.
hier der Code, allerdings nur mein modifizierten Teil, den Rest hat wohl jeder.
#define SRF02 0xE0
#define attachdistance 8
/************************************************** *************************************\
| Diese FUnktion stellt einen Messwert der Distanz vor dem Roboter bereit. |
| Bitter nicht vergessen vorher die I2C Master Library einzufügen. |
| Und außerdem noch die Definitionen. |
| |
| #include "RP6I2CmasterTWI.h" |
| #define SRF02 0xE0 // dies ist die Standardadresse des SRF02 |
| #define attachdistance 8 // hiermit lässt sich die Montagedistanz korregieren |
\************************************************* **************************************/
uint16_t distanceSRF02(void)
{
static uint8_t measureactive = false; //Messungsstatus
uint8_t srfbuffer[2]; //Speicher für die übertragenen Bytes
uint16_t distance = 0; //Gemessene Strecke
if (measureactive == false)
{
I2CTWI_transmit2Bytes(SRF02, 0, 81); // SRF02 bekommt im Register 0 den Befehl in cm zu messen
measureactive = true;
startStopwatch6();
}
if (getStopwatch6() >= 65 && measureactive == true)
{
I2CTWI_transmitByte(SRF02, 2); // Ab dem zweiten Reigster Daten anfordern
I2CTWI_readBytes(SRF02, srfbuffer, 2); // und in dem Array speichern
distance = (srfbuffer[0] * 256) + srfbuffer[1]-attachdistance;
stopStopwatch6();
measureactive = false;
}
// hiermit werden Messfehler korregiert, da negative Werte sonst bei anderen funktionen zu Problemen führen
if (distance == -attachdistance)
distance = 0;
return distance;
}
/* stellt die gemessene Strecke auf den Status LEDs dar*/
void LEDmeter(uint16_t distance)
{
statusLEDs.LED1=0;
statusLEDs.LED2=0;
statusLEDs.LED3=0;
statusLEDs.LED4=0;
statusLEDs.LED5=0;
statusLEDs.LED6=0;
if ((distance % 100)/25 >= 1) // cm werden auf der einen Seite dargestellt. Jede LED=25cm
statusLEDs.LED1=1;
if ((distance % 100)/25 >= 2)
statusLEDs.LED2=1;
if ((distance % 100)/25 >= 3)
statusLEDs.LED3=1; // m auf der anderen. Jede LED=1m
if (distance / 100 >= 1)
statusLEDs.LED4=1;
if (distance / 100 >= 2)
statusLEDs.LED5=1;
if (distance / 100 >= 3)
statusLEDs.LED6=1;
updateStatusLEDs();
}
/**
* We don't have anything to do here - this behaviour has only
* a constant value for moving forwards - s. above!
* Of course you can change this and add some random or timed movements
* in here...
*/
void behaviour_cruise(void)
{
uint16_t distance = distanceSRF02();
if (distance != 0)
{
LEDmeter(distance); // Anzeige der Distanz auf SL1 bis SL6
writeString_P("\n Dist.= ");
writeInteger(distance,DEC);
writeString_P("cm");
writeString_P("\t");
writeInteger(distance / 100,DEC);
writeString_P("\t");
writeInteger((distance % 100)/25,DEC);
}
}
mfg WarChild