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.
mfg WarChildCode:#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); } }








Zitieren

Lesezeichen