Es hat sogar bei mir im Bett geklappt. Ich hab nur eine dünne schwarze Schnur auf die unebene Bettdecke gelegt und los gings mit der Linienverfolgung.
Ihr seit echt zum Loben!
DANKE
Druckbare Version
Es hat sogar bei mir im Bett geklappt. Ich hab nur eine dünne schwarze Schnur auf die unebene Bettdecke gelegt und los gings mit der Linienverfolgung.
Ihr seit echt zum Loben!
DANKE
Moin,
ich hab mich auch mal mit einem Linienfolger befasst und 2 CNY70 an meine M32 angeschlossen bekommen. So weit funktioniert alles, nur leider sind die mitgelieferten Fahrfunktionen des RP6 viel zu träge, um einigermaßen vernünftig zu reagieren.
Nun würde ich gerne wissen, ob es schon ein paar ausgereifte und erprobte Modifizierungen der Libraries gibt, mit denen der RP6 ein bisschen schneller wieselt. Ich habe das Beispielprog von radbruch weiter oben schon gesehen, aber ich steurere den RP6 ja von meiner M32 aus und somit funktioniert dieser Ansatz leider nicht.
Würde mich über Antworten freuen :-)
Hallo
Auch wenn das M32 den RP6 lenkt, die Motorfunktionen werden doch weiterhin von der Base gesteuert. Dann müßte meine setMotorPWM()-Funktion auch funktionieren. Sie ergänzt die Lib mit der Möglichkeit die PWM-Werte für die Motoren direkt zu setzen. Natürlich mit dem Risiko eines Getriebeschadens bei falscher Anwendung!
Gruß
mic
Moin,
du hast Recht, hab ganz vergessen, dass die Ansteuerung über die Base gehen muss. Ich hab jetzt einfach die beiden IIC-Programme um deine Funktion ergänzt und kann diese somit auch von der M32 aus aufrufen =)
Das mit dem Getriebeschaden ist das, was mir nicht so behagt. Ich lasse mit setMotorPWM die Motoren maximal um eine Geschwindigkeit von 30 "springen", wäre mir aber trotzdem lieber, wenn das mindestens linear geregelt wäre. Ich habe glaube ich auch irgendwo im Quelltext gelesen, dass der implementierte Regler nur integral ist. Hat hier vielleicht schon jemand probiert einen PID-Regler zu realisieren, der besser und vor allem schneller regelt?
Immerhin funktioniert jetzt alles so, wie ich es mir gedacht habe. Danke ^^
Ich bin auch daran um mit der RP6 einen Linienfolger zu schaffen. Bei mir geht das mit die LDR. Beleuchtet wird mit 4 rote LEDS. Wen da nicht zufiel Fremdlicht ist, geht das einigermasse. Die PWM Steurung von Motor ist relatif "Soft". In der RP6baselib.c konnen sie das verscharfen.Momentan warte ich auf andere Sensoren (IR) um das ganse nach zu bessern. Allerdings ist die Geheimnis auch in die Regelparameter von Info Sensoren bis Soll Speed motoren. Er scheint mir auch wichtig das die Sensor info plausibel bleibt in eine grosse Fenster, wen moglich die ganse Breite von RP6. Wird verfolgt...Code:// Soft PWM adjustment and automatic PWM shutdown if motor power is 0:
if(speed_adjust_timer++ > 2) {//Waarde verhoogd van 2 naar 8 voor softere PWM
if(mright_ptmp != mright_power) {
if(mright_ptmp < mright_power)
mright_ptmp++;
else
mright_ptmp--;
OCR1AL = mright_ptmp;
}
if(mleft_ptmp != mleft_power) {
if(mleft_ptmp < mleft_power)
mleft_ptmp++;
else
mleft_ptmp--;
OCR1BL = mleft_ptmp;
}
if(mleft_ptmp || mright_ptmp)
TCCR1A = (1 << WGM11) | (1 << COM1A1) | (1 << COM1B1);
else
TCCR1A = 0;
speed_adjust_timer = 0;
}
So wird wenigstens noch eine kleine Rampe beachtet, meine Lösung war da radikaler:
PWM wird direkt gesetzt (und die nötigen Lib-Variablen werden angepasst), ohne Rücksicht auf Verluste. Mit allen Vor- und Nachteilen die diese Ansteuerung mit sich bringt.Code:// Achtung! Die PWM-Werte werden hier OHNE Rampe verändert!
void setMotorPWM(uint8_t power_links, uint8_t power_rechts)
{
extern uint8_t mleft_ptmp, mright_ptmp;
if(power_links > 210) power_links = 210;
if(power_rechts > 210) power_rechts = 210;
mleft_power=mleft_ptmp=power_links;
mright_power=mright_ptmp=power_rechts;
OCR1BL = power_links;
OCR1AL = power_rechts;
if(power_links || power_rechts)
TCCR1A = (1 << WGM11) | (1 << COM1A1) | (1 << COM1B1);
else
TCCR1A = 0;
}
Gruß
mic
hi Leute, tut mitr leid dass ich den thread ausgrabe aber ich hätte da eine Frage.
Ich habe es so gelöst wie radbruch es beschrieben hat, also auch eine Lichtquelle vorne angebracht und ein blatt Papier als reflektor im richtigen Winkel angeklebt. Funktioniert ziemlich gut, hängt eben stark von der Position des Reflektors ab.
Ich habe dafür den zweiten Quelltext benutzt den radbruch gepostet hat, allerdings versteh ich den Quelltext nicht wirklich. könnte jemand den Quelltext von radbruch kommentieren, damit die befehle und zeilen etwas verständlicher sind. Also so Kommentare zu den Absätzen hinzufügen damit es verständlicher ist was die Befehle nun genau machen.
Auserdem frage ich mich was der Unterschied nun zwichen den 3 Quelltexten von radbruch ist.
Gruß
keine angst, ich versteh sie auch nicht ;)
Hi!
Ich habe hier drei CNY70 rumliegen und darf kommende Woche ne Platine meiner Wahl fräsen :D oder auch zwei
Daher wollte ich dafür natürlich was mitnehmen und habe eine Frage an euch:
Wie nah sollten die CNY's nebeneinander angebracht werden? Habe momentan 2mm von CNY zu CNY eingeplant... reicht das?
Mehr? Weniger?
Gibts da Erfahrungswerte?
Danke Euch!
Fabian
Was ist an dem Programm von radbruch denn so schwierig zu verstehen?
if (readADC(ADC_LS_L) > readADC(ADC_LS_R))
da liest er die LDR Sensoren ein und entscheidet je nach Lichteinfall ob er mehr nach links oder mehr nach rechts steuert.. mit Hilfe von
setMotorPWM(100,50); und
setMotorPWM(50,100);
was 25% und 50% PWM Puls entweder links oder rechts gibt. Und das ganze als Schleife...
Also einfacher gehts wirklich kaum.
@fabqu
Zu den CNY's
Aus http://www.rn-wissen.de/index.php/CNY70
Da es dort aber um einen Encoder, und bei einem Linienfolger weniger um die Absolutwerte als eher die relativen Differenzen der Sensoren geht, ist es relativ egal wie weit sie auseinander stehen... nur muss dann ggf. eben die Linienbreite angepasst werden.
Ich würde mal grob schätzen.. Abstand der CNY=Linienbreite und min. 5mm bis max 15mm. Schwarzes oder weißes Isolierband eignet sich gut für Linien auf glatten Böden, man kann aber auch seine Musterteppiche abfahren...
LG Rolf