Hilfe bei Robomow RL500 Begrenzungsgeber

Hallo Alexander,
Du hattest recht, mein stille Signal war 1,7Volt nicht 2,5Volt.
Werde es morgen noch genauer Versuchen. Kann morgen
weiter testet, bis jetzt habe ich nur +-2cm ein Signal (Leuchtdiode)
über der Schleife. Es soll doch nur außerhalb der Schleife anzeigen.
Werde morgen wieder berichten, oder hast Du noch einige Tipps für mich.
Grüße
Heinz
 
Wie groß ist denn ADCMax/ADCMin bei Dir weiter oberhalb der Schleife (knapp innen bzw. außen)? Wenn das nahe Null ist, ist eine Auswertung über eine einzelne Flanke nicht besonders robust. Den Mindestwert zur Entscheidung (pos/neg Flanke) könnte man (in "detectMagAndPolarity") noch etwas weiter (Richtung Null) heruntersetzen, z.B. so:


Code:
int posThres = 1;
  int negThres = -1;


Oder evtl. auch beides auf Null setzen (sehr empfindlich).
 
Anbei noch eine Version mit Hochpass-Filter. Vielleicht läuft die besser.

perimeter_robomow_rl500_2015-01-09.zip


Für eine einfache Auswertung (so wie beim Ardumower) ist das Robomow RL500 Signal vermutl. nicht geeignet. Einfach zu symmetrisch und daher müsste man wohl sehr zeitgenau eine Phasenauswertung vornehmen. Sowas ist dann wohl mehr was für die Elektronikabteilung :)
Attachment: https://forum.ardumower.de/data/media/kunena/attachments/905/perimeter_robomow_rl500_2015-01-09.zip/
 
Zuletzt bearbeitet von einem Moderator:
Hallo Alexander,
vor lauter ausprobieren habe ich jetzt erst Deine neue Datei im Forum gesehen.
Ich hoffe Du hast mich nicht verkehrt verstanden, denn meine Änderungen im Programm sind nur Hilfsvariablen, diese lösche ich wieder, wenn ich den Teil verstanden habe.
Habe wieder so ein Teil eingebunden und nun mein Problem?
Beim Testen ist mir aufgefallen, dass die Leuchtdiode erst lange nach einer Wegänderung anspricht.
Bei einem normalen überfahren der Schleife kommt kein Signal, nur wenn ich ganz langsam darüber fahre.
Anbei meine Hilfsabfrage und Bilder:

void detectMagAndPolarity(int8_t *buffer, int bufferLength, int &mag, int &polarity){
ADCmin = 9999;
ADCmax = -9999;
for (int i=0; i < CAPTURE_SIZE; i++){
ADCmin = min(ADCmin, capture);
ADCmax = max(ADCmax, capture);
}
mag = abs(ADCmax);
int lastPeak = 0;
int posThres = 10;
int negThres = -10;

for (int i=0; i < bufferLength; i++){
int v = buffer;
----------------------------------------------------------------------
if (v > posThres) Serial.print("n >10");{}
if (v < negThres) Serial.print("n
 
Hallo,

Oliver Nash hat das Perimeter-Signal des RL500 sowohl analog als auch digital sehr sorgfältig aufgeschlüsselt.

Ich hoffe, dass hilft euch bei der Auswertung des Signals.

Gruß
Roger
 
@heiner: ich glaube dass man eine vernünftige Auswertung nur hinbekommt wenn man alle (768) Peaks und deren Phasenlage (also zeitliches Auftreten zu einer absoluten Zeit) auswertet. Nur dann wird es robust und empfindlich genug. Wie man das macht müssen wir herausfinden :)

Stichwort: Phase-Locked Loop (PLL oder software-basiert: SPLL), z.B. wie hier: http://liquidsdr.org/blog/pll-howto/
Hier ist noch eine Erklärung warum das mit der phasenauswertung beim Matched Filter nicht funktioniert hat: es ergibt sich in beiden Fällen (innen/außen) eine gleich gute Korrelation:


robomowrl500_phase_problem.png

Attachment: https://forum.ardumower.de/data/media/kunena/attachments/905/robomowrl500_phase_problem.png/
 
Zuletzt bearbeitet von einem Moderator:
Hallo Alexander,
hab mal eine Frage, gibt es eigentlich zwei Befehle, die nur bei einer positiven Änderung eine 1 sind und die nur bei einer negativen Änderung eine 1 sind.
Kann man das mit einem Interrupt( falling, rising ) lösen.
Vielleicht kannst Du mir die Frage beantworten, ich habe versucht nachzulesen, aber ich kann kein englisch und bin gescheitert.
Grüße
Heinz
 
Hallo Heinz,

ja es gibt die Möglichkeit die Pins so zu konfigurieren, dass bei einer pos/neg Flanke ein Interrupt ausgelöst wird. Man kann's aber auch anders herum machen - einen Timer mit der richtigen Frequenz laufen lassen und dann bei jedem Timer-Interrupt den Pin einlesen. Letzteres ist hier umgesetzt worden, um die Phase des Signals zu erkennen: http://ditrwsld13125710.blogspot.de/2013/10/very-simple-phase-detector-using-arduino.html
Prinzip läuft so: der Timer läuft mit 4fach der Signalfrequenz (8 Khz * 4). Es gibt 4 "Bins" wo man das Signal hineinsampelt und für jeden Bin aufaddiert:


Code:
Bin-Nr.    1234123412341234
Signal     1100110011001100
Bin-Summe  1100220033004400


Nun wird der Timer aber nicht 100% genau sein und so verschiebt sich die Phase irgendwann um 90 Grad:


Code:
Bin    12341234123412341
Signal 01100110011001100
Summe  01100220033004400


Wenn das passiert, führt man einne Korrekturverschiebung ein.

Beim Überfahren des Schleife verschiebt sich die Phase dann genau um 180 Grad:

Code:
Bin    123412341234123412
Signal 001100110011001100
Summe  001100220033004400


Auch das würde man erkennen, aber keine Korrektur durchführen.

So ähnliche könnte das funktionieren. So jedenfalls macht das Beispiel oben das.

Gruss,
Alexander
 
Hallo Alexander,
heißt das, es werden alle positiven Signale ein "1Signal" und alle negativen Signale ein "1Signal" liefern und genau über dem Schleifendraht ein "0Signal".
Wenn dem so ist, hätte ich eine Schaltung, die vielleicht funktionieren könnte.
Würde Dir meine Schaltung (Skizze) zusenden und Du könntest prüfen, ob Sie für Dich logisch und richtig ist.
Gib mir bitte Bescheid.
Grüße
Heinz
 
Hallo Heinz,

oben hatte ich vereinfachend für die pos. Peaks eine 1 verwendet und für die neg. eine 0. Wie man die Signal bezeichnet ist eigentlich egal für die Phasenerkennung. Wenn man z.B. beim Vorverstärker den Ausgangskondensator "aktiviert", bekommt man z.B. für die pos. Peaks etwas positives und für die neg. Peaks etwas negatives. Dieses Signal z.B. am Arduino Digital-Pin angeschlossen würde nur die pos. Peaks erkennen (da die Arduino-Pins für neg. Spannung "blind" sind).

Nochmal zum Ausgangsproblem zurück: allein das Überfahren der Schleife zu detektieren wird nicht besonders robust sein (man könnte diesen Moment zufällig übersehen). Daher wird man detektieren müssen, wie stark zeitversetzt jeder 8 Khz Puls kommt. Allein das wäre z.B. mit einem PLL möglich. Erschwerend kommt aber hinzu, dass der Robomow RL500 nach genau 128 Pulsen nochmal 128 Pulse um eine halbe Pulsbreite zeitversetzt sendet. Genau das passiert aber auch wenn innen zu außen wird (bzw. umgekehrt): alle Pulse verschieben sich um eine halbe Pulsbreite.

Was man m.E. braucht ist ein sehr genaues Taktsignal. Mit diesem Taktsignal vergleicht man die Startzeiten der Pulse. Allerdings wird der Takt von selber driften (nicht synchron sein mit dem Taktsignal des Senders). Daher muss man den Takt ständig mit dem Sender synchronisieren. Aber mit was synchronisiert man jetzt? Mal sind es die ersten 128 Pulse, mal die letzten 128 Pulse des Signals. Je nachdem wo man gerade ist (innen/außen).

Mir leuchtet einfach nicht ein warum Robomow das Signal in diese drei Teile aufteilt:

innen:
128 Pulse Stille
128 Pulse
128 Pulse versetzt um eine halbe Pulsbreite

außen:
128 Pulse Stille
128 Pulse versetzt um eine halbe Pulsbreite
128 Pulse

zum synchronisieren des Taktes sind sie eigentlich kontraproduktiv. Mir fällt leider keine richtige Lösung ein.

Vielleicht gibt es Experten der Digital-Technik (PLL etc.) die uns hier weiterhelfen könnten? :)

Gruss,
Alexander
 
Ich versuche mal einen anderen Ansatz

Bin zwar nicht DER Experte, versuche aber mal querdenken...
Könnte eventuell folgender Ansatz funktionieren?

1. Triggern aller positiven Flanken
2. Ermitteln der Intervalle der Flanken (sollte bei 125uS liegen)
3. Genau im Bereich des Phasenwechsels gibt es eine Änderung des Intervalls. Also bei 50% Phaseverschiebung
sind das 100%+50% (187,5uS) oder 100%-50% (62,5uS)
4. Die beiden Werte 187,5uS oder 62,5uS bedeuten Innen oder Aussen



Code:
Signal innen   0  0  0  0  0  0, -1  1 -1  1 -1  1,  1 -1  1 -1  1 -1 
Signal außen   0  0  0  0  0  0,  1 -1  1 -1  1 -1, -1  1 -1  1 -1  1


Ich weiß ja nicht, wie exakt die Zyklen sind. Wenn man die Anzahl der Flanken mitzählen kann, und diese wahrscheinlich gleich der Anzahl der phasenverschobenen Flanken sind, könnte der Erkennung verifiziert werden (Checksumme). Das passiert ja etliche Male pro Sekunde.

Gruß
Aiko
 
Hallo Alexander,
anbei mein Versuch.
Ich habe vor, das Signal direkt über dem Schleifendraht zu erfassen und zu speichern. Da das Signal
schwankt, möchte ich es mit einem min/max. Band zu einer „0“ machen.
Es sind ja immer zwischen den 8kHz Signalen, eine 16mS lange Pause, in dieser Zeit ist dann die Schaltung bereit, das erste empfangene min. oder max. Signal zu speichern.
Schau Dir mal die Schaltung an, ist nur eine Skizze und Vorschlag.
Grüße
Heinz
Attachment: https://forum.ardumower.de/data/media/kunena/attachments/1218/Schleife_1.zip/
 
Zuletzt bearbeitet von einem Moderator:
@Heinz: wenn ich das richtig verstanden habe, willst Du pos. und neg. Flanken zählen. Muss man schauen wie robust das funktioniert (wenn man denn ggf. vorhandene Störungen vorher herausfiltert).

Übrings: Wenn Du es ganz einfach haben willst, könntest Du 2 Spulen nehmen und einfach die Signalstärke auswerten. Das haben wir ja beim ersten Schleifenempfänger (v1) auch so gemacht (http://www.ardumower.de/index.php/de/anleitungen/2013-11-23-19-50-19/induktion). Ein (Software-)Filter würde einfach die 8 Khz herausfiltern und davon die Signalstärke auswerten
(http://www.ardumower.de/index.php/de/downloads/viewdownload/7-archive-old-versions/4-arduino-sound-sensor-perimeter-receiver). Bei Erreichen einer eingestellten Signalstärke kehrt Dein Roboter einfach um.

@Aiko: in dem Patent sehe ich aber ein ganz anderes Sender-Signal - das ist glaube ich nicht das Robomow RL500 Signal...
 
@Heinz: hier ist das Programm welches die pos. Flanken zählt (könnte man auch auf neg. erweitern wenn man beim "attachInterrupt" auf "CHANGE" stellt und dann in der Interrupt-Funktion als erstes den Pin abfragt um HIGH/LOW zu erkennen). An Pin 18 (digital) wird der Vorverstärker (mit Ausgangskondensator) angeschlossen.

Die Idee scheint von allen bisherigen Ansätzen noch am Besten zu Laufen :)

(vielleicht nimmt man besser den ADC und dann den Software-Hochpaß und zählt dann im Speicher die pos. Flanken...?)
Attachment: https://forum.ardumower.de/data/media/kunena/attachments/905/perimeter_robomow_rl500_2015-01-12.zip/
 
Zuletzt bearbeitet von einem Moderator:
Hallo Alexander,
habe es verkehrt beschrieben, was ich eigentlich meinte.
Ich muss bis zum 25. Januar unterbrechen, es geht morgen in den Urlaub.
Vielleicht hast Du bis dahin schon eine super Lösung gefunden.
Ich melde mich wieder!
Grüße
Heinz
 
Alex, ja das scheint nicht dieses Signal zu sein, aber ich vermute grade, daß das Prinzip schon dasselbe ist.

Mal zugrunde gelegt, daß das Geber-Signal so aussieht....
digital_summary_thn.png


wie hier beschrieben: https://ocfnash.wordpress.com/2010/06/26/discman-powered-mower/

In der Analogschaltung des Patents wird das Signal verstärkt, gefiltert und in "major positive Peaks" und "major negative Peaks" aufgetrennt. Dann müsste doch die Erfassung trivialer sein, als gedacht.

Stille - Salve Positiv - Salve Negativ (und bei Überfahrt Polaritätswechsel)

Die Anzahl der Intervalle und die Phasenverschiebung der zweiten Salve spielen eventuell gar keine Rolle und sind nur rein zufällig!

Heinz hatte in seinem Eröffnungspost die Screenshots vom Gebersignal eingestellt. Darauf ist mir aufgefallen, daß die Oszi-Eingang auf AC steht. Das heißt Gleichspannungsanteile werden weggebügelt. Vielleicht sähe
das Signal dann besser erkennbar aus....

Ich kann nicht glauben, daß Friendly Robotics da so einen Aufwand betreiben mit PLL und Phaseshifting.
 
Oben