Ein DUE zur Auswertung des Schleifensignals

roland

Active member
Hallo, für meinen Roboter habe ich entschieden, einen eigenen DUE für die Schleifensignalerkennung einzusetzen.
Was mir als erstes mit dem von Ardumower verwendeten Code aufgefallen ist, ist die Erkennung das der Roboter innerhalb der Schleife ist, obwohl das Schleifensignal nicht vorhanden ist (zumindest mit den Codefragmenten die ich herauskopiert habe). Die Qualität ist nicht immer ausreichend um zu erkennen, ob ein Signal vorhanden ist. Daher habe ich zwei Änderungen vorgenommen.

1.) Erkennung ob Signal vorhanden
Zum einen habe ich das Empfangsarry (was der ADC füllt) auf 3x die Größe des Senderarray * Oversampling gestellt. Damit habe ich immer zwei Mal einen Ausschlag des Matched Filters in einer Sampleperiode. Nun suche ich wie bisher das Maximum und danach das zweite Maximum des zweiten Peaks. Diese beiden Maxima sind bei mir immer entweder 96 oder 240 Arrayzellen auseinander - je nachdem welchen Code ich verwende. Allein durch diese Maßnahme kann ich 99.9% aller falschen Signale herausfiltern. Falls doch nochmal ein Störsignal dieses Ergebnis erzeugt, so prüfe ich ob die Qualität > 1.5 ist. Und selbst wenn das einmal falsch ist, wird die nächste Abtastrate des Störsignals eine andere Peakdistanz aufweisen.

2.) Verbesserung der Filterqualität
Als zweites verwende ich den pseudonoise4_dbpsk code anstatt den pseudonoise4_pw. Die beiden Vergleiche könnt ihr im Anhang sehen. Mit dem pseudonoise4_dbpsk erreiche ich eine Filterqualität ohne Störungen von ca. 2.4. Mit pseudonoise4_pw habe ich es nur auf 1.8 geschafft.

Wenn das Signal nun nicht erkannt wurde setze ich die Amplitude auf 0.

Die Amplituden vom linken und rechten Sensor werden dann über die Serielle Schnittstelle an den anderen DUE geschickt, der den Roboter steuer und die weitere Auswertung vornimmt.

Bei zwei Sensoren benötige der DUE ca. 130ms um beide Sensoren auszuwerten. Damit komme ich auf ca. 7 Messwerte pro Sekunden.

Aktuell bin ich noch nicht im richtigen Betrieb. Aber die Ergebnisse und das Störverhalten sind zum jetzigen Zeitpunkt OK.

int8_t pseudonoise4_pw[] = { 1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1 }; // 24 Zahlen
int8_t pseudonoise4_dbpsk[] = {-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1}; // 60 Zahlen

Was mir allerdings auffällt ist, das von Sample zu Sample die Amplitude sich verändert obwohl ich mit sampleRate = SRATE_38462 sample. Vermutlich ist dies auf die Frequenzverschiebung zwischen Sender und Abtaster zurückzuführen. Hat da jemand eine Idee um dieses zu optimieren?
 
Alexander hat vorgeschlagen das Sampling mit DMA zu realisieren. Dies habe ich nun umgesetzt. Während der ADC für eine Spule das Signal empfängt, werte ich das Signal der anderen Spule aus.

Das Sampling des Signals für eine Spule dauert 19ms. Diese Zeit verstreicht parallel zum berechnen der Korrelation welche ca. 42ms für eine Spule dauert.

Korrelationsfilter + Offsetberechnung + Senden zum anderen DUE für beide Spulen benötigen zusammen 87ms.

Damit kann ich nun beide Spulen innerhalb von 87ms auswerten und zum Steuerungs DUE schicken. Da dort die Prozesse im 100ms Takt laufen, bekomme ich die Messwerte "just in time":)

Weiterhin verwende ich nun die 12 Bit Auflösung des ADC. Hat nicht wirklich Vorteile, aber wenn man die Möglichkeit schon hat... :woohoo:
Der Offest wird jedesmal neu über den Mittelwert des empfangenen Signals berechnet, so das die Offsetkalibrierung entfällt.
 
Danke. Anbei der Quelltext. Empfängerklasse perimeterSensor für die Seriellen Daten habe ich dazugepackt. Müsst ihr aber etwas bearbeiten, da ich hier die Thread Library verwende.
Bezüglich Kopf wusste ich es nicht besser. Habe da euren Copyright Kopf eingetragen

Wer es ausprobieren möchte, nicht den Spannungsteiler vom Sensor zum analogen Port vergessen. Ich verwende:
GND--20k--10k-SensorOut
|
Ax

Mein Schleifensignal:
int8_t sigcode[] = {-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1}; // 60 Zahlen
Attachment: https://forum.ardumower.de/data/media/kunena/attachments/2936/SchleifenSensorDueDMA2.zip/
 
Zuletzt bearbeitet von einem Moderator:
Habe gerade noch einen Fehler gefunden:
// -------------------------------------------------
// Calculate matched filter left while sampling right
// -------------------------------------------------
offsetL.calculate();
MatchedFilterL.calculate();
//sendLToMaster();

if (flagShowSignalL) {
MatchedFilterL.printSignal(40000); //Empfangssignal und Korrelatiossignal auf Konsole ausgeben
}
if (flagShowADCSignalL) {
MatchedFilterR.printADCSignal(40000); //Empfangssignal auf Konsole ausgeben :evil:
}

Hier muss MatchedFilterL.printADCSignal(40000); stehen.

Weiterhin zu berücksichtigen: ich verwende andere Empfangsspulen als das Ardumower Projekt. Daher kann euer const int8_t TMatchedFilter::sendersignal[SENDER_ARRAY_SIZE] anders aussehen. Ggf. weniger 1/-1 haben.
 
Hallo Roland,

eine kleine Optimierung für den Matched Filter hätte ich da noch ;-) - Du benutzt zum Zugriff auf Arrays vermutl. den Array-Operator [] - leider ist dieser langsam, da er für jeden Zugriff die Multiplikation des Array-Index erneut durchführt.

Wenn Du stattdessen Pointer verwendest, brauchst Du den Array-Index nur erhöhen.

Hier ganz unten auf der Seite findest Du die optimierte Version: http://www.grauonline.de/alexwww/ardumower/filter/filter.html
Gruss,
Alexander
 
Erstaunlich. Meine Ergebnisse vor 2 Jahren sahen wirklich anders aus. Aber Compiler werden ja immer besser. Also hat der Compiler das bereits erkannt und optimierten Code ohne Multiplikation gebaut.

Es kommt also ganz auf den verwendeten Compiler an. Mit Pointer ist generell auf jedem Compiler schnell.

Wenn Du mit 'short' (16 Bit) Zahlen auskommst, könnte Umstellung von long auf short vielleicht noch etwas bringen.
 
Frage ist ob du dies mit dem DUE getestet hast oder dem Mega.
Aus Datenblatt: The Cortex-M3 processor is built on a high-performance processor core, with a 3-stage pipeline Harvard architecture, ...

Ggf. verwendet er kein pipelining wenn Zeiger verwendet werden.
Habe hier zumindest so eine Antwort gefunden: http://stackoverflow.com/a/2305831
Nach dem Ergebnis habe ich die for Schleifen durch do...while Schleifen ersetzt (wie bei Offset Berechnung). Das Ergebnis war, dass ich im Bereich von 170ms lag. Also noch schlechter.
 
Ja, dann muss das der Mega gewesen sein. Und ich habe wieder was gelernt :) (Optimierung sieht für jeden Mikrocontroller anders aus :))
 
Hallo
Habe ein Problem mit dem Perimeter!
Software 1.0a5Azurit ist Hochgeladen, auf dem Mega sowie auch auf dem Nano des Schleifen Senders. In der Software sind von mir keine Änderungen vorgenommen worden.
Betreibe das PCB Board 1.2, das Sender Board V2.0 PCB V1.0, Protector Bord und das Bumper Duino aus dem Shop.
Nun zu meinem Problem. Sobald ich in den Auto Modus gehe ertönt sofort der Buzzer. Unter Error Counters erscheint dann Perimeter Time out. Habe eine 100 Meter lange Schleife (1mm²), dazwischen einen 12 Ohm / 50 Watt Wiederstand. Am Sender ist die 5 AMP Brücke des INA von Marotronics auch gesetzt. Am Empfänger ist eine 100 Ohm Spule direkt am Sound Modul Verlötet. Den Kondensator 4,7n habe ich hier weggelassen.
Ich weiß einfach nicht mehr weiter, und hoffe dass mir jemand weiterhelfen kann.
Gruß
S.R.
 
Hallo Sigfried,
Wie leuchtet denn die gelbe LED des Schleifensenders?

Code:
// ---- sender status LED ----
#define  pinLED 13  // ON: perimeter closed, OFF: perimeter open, BLINK: robot is charging

Evtl ist die Polarität der Spule falsch herum. Schau doch mal in der App unter Settings und Perimeter wie es dort aussieht.
Kannst dort auch mal testweise Perimeter abschalten und prüfe dann mal ob er ohne Störung startet.
Gruß
Stephan
 
Hallo Roland
1. Hast du auch am LM386 Verstärkermodul den auf der Platine verlötenden Kondensator entfernt bzw überbrückt? http://wiki.ardumower.de/index.php?title=Perimeter-Schleife Das Poti auf Linksanschlag drehen = maximale Verstärkung

2. Spannung des DC Wandler kontrollieren am Schleifensender sollten so ca 12v sein

3. Das LM386 Verstärkermodul muss auf den Linken Perimeter Anschluß angeschlossen werden auf der Platine. Der rechte hat keine Funktion.

4. in der Software 1.0a5Azurit ist soviel ich weiß der Perimeter ausgeschaltet.
Zum einschalten in der Mower.cpp Datei folgendes Ändern. Oder über die Handy App unter Settings

Code:
// ------ perimeter ---------------------------------
  perimeterUse       = 1;      // use perimeter?

5 in der Handy App unter Setting kontrollieren ob Perimeter an ist.

Wichtig zu wissen ist dazu folgendes. Trifft auch auf den Perimeter und alle anderen Einstellungen zu. http://wiki.ardumower.de/index.php?...n_der_Mower.cpp_Datei_werden_nicht_übernommen
6 Ist die ADC Kalibrierung gemacht ? Entweder über die serielle Konsole bzw Handy App. Dazu muss der Perimeter aus sein und keine Ladespannung anliegen. Damit werden die "0 Werte " ermittelt. Speichern nicht vergessen.

7 Schleife durch messen - Wie groß der Widerstand ist. In der Regel 2-3 Ohm ist okay. Kommt auch darauf an wie genau dein Messgeräte diesen kleinen Widerstand messen kann

8. In der Handy App in der Perimeter Plot Ausgabe gehen und nachsehen ob ein Signal erkannt wird. Dauert ein Moment

9 Ist Signal vorhanden aber der Mower trotzdem außerhalb, dann ist die Spule verkehrt herum an gelötet.
Entweder um löten oder in der Handy APP unter Perimeter Settings "umpolen" und das speichern nicht vergessen.

Sollte das alles nicht helfen nochmal melden

Gruß
Uwe
 
Hallo Stephan,
danke für die schnelle Antwort.
Die gelbe Led leuchtet dauerhaft sobald ich die Schleife an M1out1 und M1out2 anschliesse.
An der Spule habe ich die Polarität auch um gelötet. Habe es auch mit der Handy App probiert, ohne Erfolg. Schalte ich den Perimeter in der Handy App aus, starte den Auto Modus,fängt der Mowrob zum Mähen an!
Habe alle Einstellungen des Perimeter so übernommen wie es im Wiki beschrieben wird.
Beim Plotten des Perimeter ist deutlich ein Signal zu sehen. Halte ich die Schleife direkt an die Spule steigt der SMAG wert bis zu 1300, (bild 1) gehe ich mit der Schleife ca. einen Meter weg sinkt der Wert auf ca. 95 (bild 2).

Wäre schön wenn Du hier weiterhelfen könntest.

MfG
S.R.
Attachment: https://forum.ardumower.de/data/media/kunena/attachments/1684/bild1.jpg/
 
Zuletzt bearbeitet von einem Moderator:
Hallo Sigfried,
95 ist zu wenig!
Ich glaube default ist ein min Wert von 300 eingestellt.
Werde nachher mal wenn ich zu Hause bin nachschauen wie die Werte bei mir sind.
Mit welcher Spannung betreibst du denn deine Schleife? Und hast du da die automatische Regelung von Jürgen dran? wenn nicht würde ich es mal mit 7 - 12 Volt versuchen und ohne den Widerstand.
Ich selber nutze normales 0,75 Lautsprecherkabel (1 Litze) zZ. ca. 200 Meter direkt am Ausgang ohne Regelung bei 7,6V was perfekt funktioniert.
Schleife benötigt im Betrieb ca. 14 Watt Leistung und der Treiber wird so auch nicht warm.
Wie ist denn deine Spule im Mower ausgerichtet?
Sollte nach unten zeigen und evtl leicht ca. 5 Grad nach vorne geneigt sein. So habe ich die besten Erfahrungen gemacht.
Gruß
Stephan
 
Nicht ohne Widerstand und ohne vorher zu rechnen. :woohoo:
Messe mal den Widerstand deiner Schleife mit und ohne den Zusatzwiderstand und poste ihn ihr.
Beispiel 12V und 2Ohm Gesamtwiderstand wäre ein Strom von 6A. Das wäre zu viel. Der Strom für den Motortreiber sollte bei max 1A liegen.
Nicht das ihr den Motortreiber grillt.

Gruß
Uwe
 
evl mal ein Bild von den Schleifensender machen und hier einstellen.
Wenn du den INA169 aus dem Shop verwendest darauf achten das dort der5A Messbereich verwendet wird. Dazu muss auf den INA 169 die kleine Lötbrücke geschlossen werden.


INA169.jpg

http://www.ardumower.de/index.php/d...-sender/920-perimeter-sender-not-working#9136
Gruß
Uwe
Attachment: https://forum.ardumower.de/data/media/kunena/attachments/1259/INA169.jpg/
 
Zuletzt bearbeitet von einem Moderator:
Hallo Uwe,
habe gerade die Schleife gemessen. Folgende Daten:
Eingestellt ist der Sender auf 10,74 Volt
Die Schleife ohne Wiederstand liegt bei 2 Ohm.Schleife mit einem 12 Ohm, 50 Watt Hochlastwiederstand hat 14,1 Ohm.
Ohne Wiederstand hat es jetzt auch endlich funktioniert. Der Mowrob bleibt an der Schleife stehen. Starte ich den Track abfahren fährt er sauber an der Schleife entlang! Ich werde wohl noch einige Kleinigkeiten einstellen müssen das alles tadellos funktioniert. Bin aber froh das es mittlerweile überhaupt geht.
Da ich nicht gerade das Elektroniker Genie bin, würde es mich freuen wenn Du mir den passenden Wiederstand berechnen könntest.

Vielen Dank an Dich und an Stefan.
MfG
S.R.

PS.
Brücke am Ina ist vorhanden.
 
Fühle mal mit der Hand/Finger am Treiber. Er darf nicht zu heiß werden.
Bei mir nach 2Stunden Betrieb ist alles ok.
Habe aber auch nur knappe 8v eingestellt.
Ich messe nachher mal meinen Schleifenwiderstand.
Weitere Tests kann ich heute leider vergessen. Es regnet mal wieder.
Gruß Stephan
 
Oben