c't

c't-Projekte - Mailinglisten


[Voriger (Datum)] [Nächster (Datum)] [Voriger (Thread)] [Nächster (Thread)]
[Nach Datum][Nach Thread]

Re: [ct-bot] Motorregelung fehlerhaft?

Absender: Timo Sandmann
Datum: Sa, 24.01.2009 18:15:47
In-reply-to: <000801c97d8a$3aa12d10$0200a8c0@mexpnew>
References: <000801c97d8a$3aa12d10$0200a8c0@mexpnew>


Hi Frank,

Am 23.01.2009 um 19:41 schrieb Frank Menzel:
Vielleicht kennst Du ja auch bei dem anderen Problem so schnell die
Lösung :-) Ist mir schon lange aufgefallen und möchte ich jetzt mal
ansprechen. Es geht um die Klappe, di sich ja wunderbar via FB steuern
lässt, auf und nieder (bei mir + und -). Bei mir ist der
Klappen-Optokoppler ohne Funktion,

wenn der Klappensensor bei dir außer Funktion ist, dann würde ich in bot-logic/behaviour_servo.c Zeile 56ff:
	if (pos == DOOR_CLOSE && sensDoor == 0) {
		return;	// Klappe ist bereits geschlossen
	}
einfach auskommentieren. Der Sensor wird vom Servo-Verhalten nur dazu genutzt, den Servo gar nicht erst einzuschalten, wenn die Klappe geschlossen werden soll, aber bereits zu ist. Wenn die genannten Zeilen auskommentiert sind, ist das Servo-Verhalten völlig unabhängig vom Klappensensor.

weil meine Klappe eben nicht
seitwärts weggeht sondern hoch und runter. Wenn jeweils die Klappe die
Endposition erreicht hat, dann summt der Servo noch kurz nach und
schweigt dann, läuft wohl auf den Servotimeout.

Das ist auch bei der Standard-Klappe der Fall. Das ist hier kein Timeout im Sinne eines Abbruchs, weil etwas nicht rechtzeitig reagiert hat, sondern das Verhalten schaltet den Servo einfach nur für 1 Sekunde ein und dann wieder aus. Daher sollte das Prinzip auch bei deiner Konstruktion funktionieren.

Bis hierher alles prima.
Wenn aber dann in einem Verhalten mal das Klappe-ZU-Verhalten aufgerufen
wird, wie bei CATCH_PILLAR, und die Klappe dann in dem Verhalten
zugegangen ist (eingefangen) so kommt auch dieses Nachsummen des Servos.
Doch in dem Fall kommt er nie zu Ende und summt endlos weiter. Es ist
dann auch nicht mehr möglich, mit + oder - via FB die Klappe zum
Aufmachen zu bewegen. Erst nach Reset ist alles wieder ok. Wird das
Klappe-zu-Verhalten in einem anderen Verhalten eingebaut, so endet dann jenes Verhalten bei Klappe zu und kommt nicht mehr zum Aufrufer zurück.

Also haben wir folgenden Situation: Wenn bot_servo() mit caller == NULL aufgerufen wird (wie von der Fernbedienung), funktioniert alles, wenn aber caller != NULL (wie beim Aufruf aus einem Verhalten heraus), dann wird der Servo nie wieder ausgeschaltet und der Caller ist ewig blockiert?

Wo kann da das Problem sein ?

Ich sehe da so gerade auch kein Problem, weil dein Klappenumbau hier eigentlich keinen Einfluss haben dürfte. sensDoor müsste ja bei dir immer 1 sein. Und wenn nicht, dürfte der Servo gar nicht erst anlaufen. Trotzdem würde ich einfach die drei o.g. Zeilen auskommentieren, weil sie in deiner Konstellation eh keinen Sinn machen. Was du auch noch mal ausprobieren kannst: Im Verhalten wie bot_catch_pillar() einfach den bot_servo(data, ...)-Aufruf auf bot_servor(NULL, ...) ändern, dann müsste es ja wie bei der Fernbedienung sein. Falls das hilft, müsste es aber irgendwo noch einen Bug geben.

Vielleicht ist hier mein Spezialfall mit
unbenutztem Klappe-Zu-Optokoppler und Timeout Schuld?

Nein, das denke ich nicht.

Grüße,
Timo