WR02 geführt vom Lichtsuchersensor
von
am 27.04.2016 um 19:32 (3513 Hits)
Als Vorbereitung der Lichtsucherfunktion habe ich meinen Roboter um eine Analogführung ergänzt. Zunächst gebe ich die X/Y Werte mit Analogjoystick vor, um die Auswertung und Antriebsfunktion zu testen.
Die Auswertung und Umrechnung der Analogwerte erfolgt so, dass bei Ausschlag Vor/Zurück die Räder mitläufig angesteuert werden - klassische Lenkung mit Abbremsen des inneren Antriebs. Bei Ausschlag Links/Rechts dreht der Roboter bei gegenläufiger Ansteuerung der Antriebsräder, um die Vorderseite zur Lichtquelle zu drehen.
Ich möchte den Roboter sowohl vorwärts als auch rückwärts mit der Taschanlampe lenken können, ohne dass sich der Roboter in Rückwärtsgang dreht. Damit er rückwärts mit der Rückseite der Lichtquelle folgt, ist beim Rückwärtsfahren die Lenkung spiegelverkehrt. Dazu habe ich mir folgende Auswertung überlegt, die im Test sehr gut funktioniert hat:
Jetzt kommt der Lichtsuchersensor an die selbe 5-polige Joystick-Schnittstelle dran. Der Lichtsensor erzeugt die gleichen Analogsignale, wie das Joystick. An der getesteten Auswertefunktion ändert sich also nichts und der Roboter reagiert auf den Lichtsstrahl genau so wie auf den Steuerknüppel. Mit zwei Potis kann die Empfindlichkeit an die Lichtverhältnisse angepasst werden.Code:// Umrechnen der Potiwerte von 0..255 mit Mittelstellung bei 127 zu -255..255 // 0 255 // ^Y ^Y // | X | X // 0+---->255 +--> -255+---->255 // | | // + + // 255 -255 iPotX = 2 * ((int16_t)analogX - 127); iPotY = 2 * (127 - (int16_t)analogY); // Init Motorwerte setSpeedL = setSpeedR = 0; // Rechne Motorwerte if(iPotY < 0){ // Rückwärts if( abs(iPotY) > abs(iPotX)){ // rückwärts - Achsen mitläufig setSpeedL = iPotY - iPotX; setSpeedR = iPotY + iPotX; } else if( iPotX > 0) { // Übergang von rechts drehen gegenläufig zu rückwärts rechts mitläufig setSpeedL = 2 * iPotY + iPotX; setSpeedR = - iPotY - iPotX; } else { // Übergang von links drehen gegenläufig zu rückwärts links mitläufig setSpeedL = - iPotY + iPotX; setSpeedR = 2 * iPotY - iPotX; } } else { // Vorwärts // Ausschlag vorn: Achsen mitläufig // Ausschlag rechts oder links: Drehung, Achsen gegenläufig setSpeedL = iPotY + iPotX; setSpeedR = iPotY - iPotX; } // Motor Links ansteuern if (setSpeedL < 0){ // Links Rückwärts setSpeedL = -setSpeedL; if(setSpeedL > 255) setSpeedL = 255; MotorL_zurueck((uint8_t)setSpeedL); } else { // Links Vorwärts if(setSpeedL > 255) setSpeedL = 255; MotorL_vor((uint8_t)setSpeedL); } // Motor Rechts ansteuern if (setSpeedR < 0){ // Rechts Rückwärts setSpeedR = -setSpeedR; if(setSpeedR > 255) setSpeedR = 255; MotorR_zurueck((uint8_t)setSpeedR); } else { // Links Vorwärts if(setSpeedR > 255) setSpeedR = 255; MotorR_vor((uint8_t)setSpeedR); }
Und fertig ist die Lichtsucherfunktion des Roboters. WR02 fährt brav der Taschenlampe hinterher, lässt sich mit Licht vorwärts/rückwärts lenken und im Kreis drehen genauso wie mit Analogjoystick.