Hallo,
nach Urlaubspause habe ich wieder Zeit, mich um den Rasenmäher zu kümmern. Die letzten Beiträge habe ich mit grossem Interesse gelesen, insbesondere die Hintergrundinformationen zur Funktionsweise usw. sind für mich sehr informativ: Dank insbesondere an MichaelM und ChristianH.
Die Ausführungen zur Schwingneigung kann ich nur bestätigen. Das C parallel zur Empfangsspule habe ich auch schon entfernt.
@MichaelM:
Das mit der Filterung des Ausgangssignals mit Hilfe eines einfachen RC-Gliedes habe ich nicht so richtig verstanden. Ich bin gerade dabei, diese Stufe einmal nachzubauen. Vielleicht dämmert es mir, wenn ich mir die Signale auf dem Osci anschauen kann. So wie ich die Schaltung verstehe, müsste der Schmitt-Trigger-Ausgang doch ein positives und zeitlich versetzt ein negatives Rechtecksignal liefern, wobei die „Null-Linie“ etwa ½ der Speisespannung beträgt. Wäre dankbar, wenn du bei Gelegenheit das mit dem RC-Glied etwas ausführlicher erläutern und auch etwas zur Weiterverarbeitung im Prozessor sagen könntest.
Meine Antriebsmotoren habe ich in Mu-Metall eingewickelt. Die Störungen im Empfänger sind erheblich geringer, aber eben nicht vollständig beseitigt.
Die letzten Tage habe ich mich auch damit beschäftigt, meinen Grundaufbau über eine übliche RC-Fernsteuerung zu betreiben. Auch hier habe ich Probleme mit Störungen durch die Fahrmotore. Durch Änderung der Anordnung der Bauteile zueinander (maximaler Abstand von AKKU und Motor) habe ich allerdings deutliche Fortschritte erzielt.
@ChristianH:
Dein Mähmotor ist ein bürstenloser von Torcman. Deine Ausführungen zu diesem Motor fand ich sehr überzeugend. An diesem Motor hat mich nur die hohe Drehzahl gestört. Alles was über 2000-3000 rpm liegt, ist m.E. überflüssig. Jetzt bietet Torcman die Motoren auch mit Getriebe an. Das könnte die Sache optimieren. Was meinst Du dazu ?
Gruss
jguethe
die Filterung des Ausgangssignals ist notwendig. Wenn sich der Roboter innerhalb der Schleife befindet erhalte ich zuerst ein positives Signal an der Spule, der Schmitt-Trigger schaltet am Ausgang nach Masse, 150µs später (das ist die am Sender eingestellte Impulsbreite) erhalte ich dann ein negatives Signal, der Trigger schaltet wieder nach +4V. Das Ganze wiederholt sich bei jedem Impuls und läuft außerhalb der Schleife genau entgegengesetzt ab. Wenn der Controller jetzt genau während dieser 150µs den Sensor abfragt intepretiert er das Signal "Innen" als "Außen", bzw. umgekehrt. Das RC-Glied glättet das Ausgangssignal, da die Zeitkonstante viel größer als die Impulsbreite des Senders ist. Das mit der Nulllinie würde ich so nicht ausdrücken. Der Schmitttriggerausgang liegt immer fest auf 0V oder auf +4V (rein digitales Signal), je nachdem ob sich der Sensor außerhalb oder innerhalb der Schleife befindet. Das Signal kehrt sich nur für 150µs um, bzw. gibt es beim Überfahren der Schleife einen Signalwechsel. Der Schmitt-Trigger speichert mir also quasi immer die letzte Halbwelle aus der Empfangsspule. Siehe auch das Bild, der Zeitbereich ist allerdings nicht maßstäblich und die 80ms nur ein Beispiel (ich habe glaube ich nur ca. 5Hz Wiederholfrequenz, werden aber später mal mehr).
Generell zur Erfassung der Sensoren und Taster: Ich lese zunächst alle Ports ein und speichere diese im RAM, danach habe ich alle Zeit der Welt um alles auszuwerten. Im Programm die Sensoren und Taster direkt abzufragen kann großen Blödsinn ergeben, wenn sich innerhalb der Bearbeitungszeit ein Zustand ändert. Die neuen Sollwerte werden auch im RAM abgespeichert und dann am Ende des Zyklus aus dem RAM geholt und ausgegeben. So arbeiten übrigens auch die Speicherprogrammierbaren Steuerungen (SPS) in der Industrie und das mit großem Erfolg.
Den direkten Ausgang des Schmitt-Triggers aller 4 Sensoren werde ich mit einem 555 als Monoflop auswerten, solange Signalwechsel anstehen wird vor Ablauf der Zeit immer nachgetriggert. Die Zeit muss nur etwas länger sein als die Periodendauer des Senders.
EDIT: Nochmal zum Problem mit den Störungen. Mu-Metall schirmt zwar das magn. Feld ab, nicht jedoch das elektrische. Dazu sollte man das Motorgehäuse und das Mu-Metall mit einer starken Aderleitung mit dem zentralen Massepunkt der Stromversorgung verbinden. Weiterhin sollte man die Motorleitungen (Hin- u. Rückleitung) möglichst parallel führen oder verdrillen. Ein dicker ELKO direkt an der Leistungsstufe vermindert die Störungen vom Akku und den Zuleitungen. Evtl. mal ein paar Bilder einstellen für konkretere Hinweise.
Hallo MichaelM,
besten Dank für die sehr imformative Erläuterung. Jetzt habe ich es begriffen.
Da ich gerade an der RC-Steuerung arbeite und dort die BASCOM-Funktion "Pulsein" (welche die Impulsdauer zurückgibt) verwende, fiel mir angesichts der Signal-Struktur sofort die Möglichkeit ein, die Impulsdauer als Alternative zum RC-Glied zu verwenden. Dieses Merkmal ist ja für die Unterscheidung innerhalb / außerhalb ebenfalls eindeutig. Ich möchte hier aber keine neue "Baustelle" aufmachen; ich glaube, dass dies sogar schon einmal hier thematisiert worden ist. Ich probiere es mal aus.
Die Hinweise zum Thema Störungen habe ich mir zu Herzen genommen. Hier habe ich noch großen Nachholbedarf in der Umsetzung. Ich werde dies jetzt aber umgehend in Angriff nehmen.
zur Signalverarbeitung:
das blicke ich auch noch nicht durch. Die Ablage im RAM und Ausgabe der Sollwerte am Ende des Zyklus hört sich gut an, ist für mich aber doch noch zu kryptisch (ich bin kein Informatiker!). Über die Problematik habe ich mir auch schon Gedanken gemacht, die ich etwa wie folgt zusammenfassen kann: Mein Robo läuft unter BASCOM. In der Programmschleife bzw. in den ISR muss ich ja irgendwann einmal die Signale der Sensoren/Ports verarbeiten; während dieser Zeit kann der Controller doch keine andere Aufgabe erledigen, gleichgültig wo die Daten gespeichtert sind. Ereignisse, die während einer solchen Phase eintreten,werden entweder gar nicht erkannt oder es kann nur mit entsprechender Verzögerung reagiert werden; handelt es sich um mehrere Ereignisse - was hier wohl die Regel ist - müsste ggf. die Frage der Prioritiät geregelt werden.
Gruss
jguethe
ich habe soeben den RN-Wissen Beitrag abgeändert und viele Deiner Ideen übernommen. Ich war so frei Deine Abbildungen zu verwenden. Vielleicht willst Du ja noch einige Anmerkungen dazuschreiben.
Ich habe jetzt, um den Artikel etwas zu vereinfachen nur noch 2 Varianten, Deine und meine mit der Auswertung über ADC.
In gewisser Weise hänge ich noch an meiner Empfängerschaltung mit der Auswertung über ADC. Einfach weil man nur wenig Bauteile braucht und das ganze bei mir problemlos funktioniert. Wahrscheinlich hängt es von der genauen Wahl der Spule ab. Je nach Induktivität bildet sich ein Schwingkreis oder nicht. Ich habe in dem Artikel deshalb eine entsprechende Anmerkung an meinen Empfänger angefügt.
Schade ist, dass Deine Empfängerschaltung mit Spule und Widerstand, aber ohne Kondensator und Schmitt-Trigger nicht über den ADC direkt auswertet werden kann. Auf diese Weise hatte ich keinen Erfolg. Die Spikes sind zu kurz und es dauert einfach zu lange bis mehrere ADC ausgewertet sind. Eine Möglichkeit wäre evtl. noch nach deiner Empfangsschaltung (ohne Schmitt-Trigger) ein RC - Glied anzuhängen. Habe dies noch nicht ausprobiert und derzeit auch keine Zeit.
Ich denke auch, dass eine vernünftige Sache zustande gekommen ist, wenn ich überlege welche Spekulationen über die Funktionsweise von Begrenzungsschleifen in früheren Threads angestellt wurden.
Eigentlich alles sehr einfach und trotzdem haben wir lange dazu gebraucht. Da erblasse ich vor Neid vor denen, die demnächst einen Roboter zum Mond schicken können \/
habe erst jetzt gesehen, dass Du einen Beitrag geschrieben hast, wären ich mit meinem beschäftigt war.
Der Torcman mit Getriebe denke ich, wäre eine gute Wahl für den Rasenmähermotor. Auf alle Fälle empfiehlt es sich, sich von den Tormännern direkt beraten zu lassen. Man gibt die etwa erforderliche Leistung und die Drehzahl vor. Danach gibt´s eine Empfehlung zur Grösse, Anzahl der Pole, Windungszahl etc.. Man kann den Motor dann selbst wickel und zusammenbauen oder komplett bestellen. Letzteres leider nicht ganz billig.
Ich nehme an, dass sich deine Frage mit der Programmschleife nicht auf mein Programm bezieht. Oder doch ? Bei mir wartet tasächlich das Programm einen kurzen Moment, bis die Signale von den Sensoren, bzw. ADC kommen. Aber das ist ja nur sehr kurz. Interrupts werden trotzdem während dieser Zeit erfasst (z.B. von den Drehgeber. Es wird dabei nur eine Variable hochgesetzt, kostet also praktisch keine Zeit).
Ich glaube vor kurzem gab´s noch eine Frage wegen den Drehencoder an den Rädern. Ich habe mit etwa 16 Magenten nur eine geringe Auflösung. Dies hat den Vorteil, dass Interrupts nicht allzu oft ausgelöst werden und damit mein Sensorenauswertungsprogramm nicht stört. Mir gehts bei dein Drehencoder auch nicht um Odometrie. Die Fahrtrichtung wird ja durch den Kompass gesteuert. Mir gehts nur darum zu sehen, ob die Räder aus irgendeinem Grund blockieren, um dann erst in eine andere Richtung zu steuern und, falls das nichts hilft, den Robo abzuschalten. Ganz glücklich bin ich damit nicht. Am liebsten würde ich mit einem Drehgeber an den nicht angetriebenen Rädern messen, um auch ein Durchdrehen der Räder zu erfassen. Die Scheiben mit den Magneten an den Rädern stören mich auch beim Bau der Abdeckung. Wäre eleganter ohne. Bin bis jetzt aber bzg. "feststellen ob Räder blockieren oder durchdrehen" noch nicht auf eine befriedigende Lösung gestossen. Vorschläge diesbzgl. sind immer gern gesehen. Deshalb stockt auch mein Rasnroboumbau.
danke für die Infos, auch die Anmerkung zur Signalverarbeitung in der Programschleife waren willkommen.
Welche konkreten Erfahrungen hast Du mit deinem Torcman-Motor. Ist dieser nicht überdimensioniert ?. Ich werde auch die Messer-Scheibe vom Automover verwenden, ist inzwischen bestellt.
Bezüglich der unterschiedlichen Funktionsweisen der Sensorschaltungen bin ich nach dem Lesen Deines Beitrags an MichaelM und der neuen Fassung in RN-Wissen nun doch etwas verwirrt.
Du schreibst in Deinem an Michael M gerichteten Beitrag:
„Schade ist, dass Deine Empfängerschaltung mit Spule und Widerstand, aber ohne Kondensator und Schmitt-Trigger nicht über den ADC direkt auswertet werden kann usw.“
Ich nehme an, dass sich diese Bemerkung nur auf das Problem „innerhalb“ oder „außerhalb“ bezieht. Wenn auch die Erkennung der Annäherung an die Schleife gemeint ist, wäre ich vollends verwirrt und müsste gedanklich wieder von vorne anfangen.
Ich war bisher der Meinung, dass auch Michael M in seiner Empfängerschaltung für diesen Zweck die Signalamplitude auswerten muss. Wie soll man denn sonst erkennen, ob man 10 oder 20 cm entfernt ist ?
@Michael M: Darüber hast du dich überhaupt nicht ausgelassen. Oder ist das so selbstverständlich, dass meine diesebezüglich Frage und augenblickliche Verwirrung „unter „Niveau“ ist.
Ich meine auch, dass in RN-Wissen, die unterschiedlichen Funktionsweisen nicht deutlich genug werden; insbesondere bleibt bei der 1. Schaltung (von Michael M) offen, wo welches Signal für die Annäherungs-Erkennung abgegriffen wird und wie es weiterverarbeitet wird. Vielleicht könntes Du (noch besser Michael M als Urheber) das noch etwas deutlicher herausarbeiten.
auweia, hoffentlich hab ich jetzt nicht unnötig Verwirrung gestiftet.
Sender sollte kein Problem sein.
Die Empfänger von Michael und mir unterscheiden sich nur gering. Das wesentliche ist aus meiner Sicht, dass ich parallel zur Spule einen Kondensator habe, MichaelM aber nicht.
Verwendet man keinen Kondensator ist die induzierte Spannung (Spike) nur sehr sehr kurz. Wenn man das Signal über einen Schmitt-Trigger auswertet, wie bei MichaelM, dann ist das egal, der Schmitt-Trigger wird einfach umgeschaltet. In diesem Fall empfiehlt es sich auf den Kondensator zu verzichten, damit man nicht aus Versehen einen Schwingkreis bastelt.
Will man das Signal über einen Microcontroler und ADC auswerten, muss der Spike aber etwas länger anhalten, insbesondere wenn man, wie bei meinem Robo, 4 Sensoren verwendet. Man sieht ja in dem Programmbeispiel, dass es ettliche Programmschritte dauert, bis der Vergleich aller 4 ADC - Werte mit den Grenzwerten erfolgt ist und die Werte abgespeichert sind. Ohne Kondensator hab ich das eben nicht geschafft. Mit Kondensator und Widerstand funktioniert´s halt, weil der Spike "in die Länge gezogen wird". Leider hab ich keinen Oszi, ansonsten hätte ich das ja genauer abstimmen können. Wie ich zu Beginn des theads mal gesagt habe, habe ich die Werte für C und R durch Versuch und Irrtum.
Um nur die Annäherung an die Schleife festzustellen ,könnte man wohl auch auch ohne Kondensator aber mit ADC -Auswertung arbeiten. Müsste man halt ausprobieren. Allerdings denke ich, sollte man schon einen Aufbau wählen, bei dem man immer sagen kann ob man innerhalb oder ausserhalb der Schleife ist.
Prinzipiell möchte ich noch anmerken, dass es nicht darum geht die Annäherung an die Schleife auf 10 oder 20 cm durch einen Anstieg der Signalstärke zu bestimmen. Das wesentliche ist die Stelle zu erkennen, bei der sich der Sensor über die Schleife bewegt. Dies erkennt man daran dass der Spike die Richtung ändert (nachdem er kurzzeitig durch 0 geht). Die Stärke des Signals ist eigentlich egal. Es geht primär um die Richtung. Die Stärke spielt nur insofern eine Rolle, als Grenzwerte über- oder unterschritten werden müssen, damit man nicht auf falsche Signale reagiert.
Ich denke, dass MichaelM´s Schaltung weniger kritisch im Aufbau und der Abstimmung ist als meine, da er ja nicht das Problem mit einem möglichen Schwingkreis hat. Aus diesem Grund habe ich MichaelM´s Schaltung übernommen. Ich habe nie Schwierigkeiten mit meinem Sensor gehabt. Deshalb hat es mich etwas überrascht, dass er sagt es, würde sich mit meiner Schaltung ein Schwingkreis ergeben. Ich kann das nicht nachzuvollziehen, wird aber wohl so sein, je nach verwendeter Spule. In dem Wiki-Beitrag habe ich deshalb ja geschrieben, dass man die Schaltung mal ausprobieren kann. Klappt´s nicht, muss man halt den etwas aufwendigeren Weg von MichaelM gehen.
Zum Motor: Ich hab ihn so stark gewählt, da der Motor eigentlich für deutlich höhere Drehzahlen ausgelegt ist, als man sie für Rasenmäher braucht. Der Motor läuft somit untertourig. Deshalb war die Empfehlung von Torcman einen starken Motor zu wählen, um genug Drehmoment zu haben. Auf ein Getriebe wollte ich wegen der Lautstärke verzichten. Mit Getriebe geht auch ein schwächerer Motor.
Hallo,
die Signalverarbeitung bei mir läuft nach dem weit verbreiteten EVA (Eingabe - Verarbeitung - Ausgabe) Prinzip ab. Ich teste also nicht der Reihe nach den ersten Eingang, verarbeite das Signal, teste den zweiten Eingang, verarbeite das Signal, teste den dritten Eingang usw., sondern ich lese zunächst alle Eingänge ein (bei mir derzeit etwa 15). Die Zustände der Eingänge muss ich natürlich irgendwo zwischenspeichern, also im RAM des Controllers. Diesen Schritt nennt man in der Steuerungstechnik "Prozessabbild der Eingänge". Jetzt kommt die eigentliche Rechenarbeit, aus den eingelesenen Werten müssen neue Sollwerte (z. B. Geschwindigkeit, Richtung usw.) bestimmt werden. Alle neuen Werte werden nicht direkt ausgegeben sondern wieder im RAM gespeichert. Dies ist die "Verarbeitung". Wenn alles neu berechnet ist kommt die "Ausgabe", in der Steuerungstechnik nennt man das "Prozessabbild der Ausgänge". Hierzu werden die neuen Sollwerte aus dem RAM geholt und ausgegeben (z. B. den Geschwindigkeitssollwert an den PWM-Generator, irgendwelche Schltbefehle an normale Ausgänge, usw.).
Der Vorteil des ganzen ist recht einfach erklärt: Wenn die Eingän direkt abgefragt und neue Werte sofort ausgegeben werden könnten sich innerhalb der Laufzeit des Rechenprogramms die Eingangszustände ändern. Dies kann bei gewissen Konstellationen ein Chaos verursachen. Außerdem müssen die neuen Sollwerte "gleichzeitig" ausgegeben werden. Berechnet man erst den Sollwert für den linken Motor, gibt diesen aus, berechent dann den Wert für den rechten Motor, gibt diesen aus fährt man eine Kurve obwohl man doch nur beschleunigen wollte (wenn das Programm langsam genug ist). In modernen Maschinensteuerungen wird das gleiche Verfahren angewandt denn dort kann ein Zyklus (Programmlaufzeit) durchaus bis zu 100ms betragen. In dieser Zeit kann sich viel ändern.
Übrigens, ich programmiere nur in Assembler und kenne mich in Hochsprachen leider nicht aus. Ich kann also leider keine Codebeispiele hier einstellen.
Zur Entfernungsmessung: Ich bestimme nicht den Abstand zur Schleife, noch nichtmal ob sich der Sensor genau darüber befindet. Ich bestimme nur Innerhalb / Außerhalb bzw. über einen 555 (Monoflop) in kürze ob die Schleife funktioniert. Es kommt auch nicht auf einen Zentimeter an. Ich werde wahrscheinlich gelegentlich die Schleife einmal komplett abfahren um die Ränder zu mähen (Christian macht das nebenbei mit wenn er die Ladestation anfährt).
Gruß,
Michael
PS: "unter Niveau" ist hier garnichts, man ist schließlich nicht überall Experte
Lesezeichen