Perimeter Sender / Empfänger. Empfänger detektiert falsches Signal mit Erfolg

paddy

Active member
Hallo,
für meinen Mower basierend auf ROS habe ich mich am Perimeter Code von Azurit bedient. Als Sender kommt der normale Sender Code zum Einsatz. Als Empfänger dient ein Arduino Nano, der mit zwei Spulen ausgestattet ist. Dabei verwende ich die Perimeter Klasse von Azurit und den ADCManager.

Der Sender ist eingestellt auf SIGCODE_1. Wenn ich dies am Empfänger einstelle, werden gute Werte für MAG und SMAG gelesen. Aber es wird nicht erkannt, ob der Mower innerhalb oder außerhalb der Schleife ist. Man kann den Perimeter kreuzen wie man will, es ändern sich nur die MAG/SMAG Werte, aber nicht das Vorzeichen.

Bei den Test Skripten gibt es einen Perimeter Test, der ein anderes Signal verwendet (useDifferentialSignal). Wenn ich dieses Signal in den Empfänger als Protokoll einstelle, wird das Signal vom Typ SIGCODE_1 im Empfänger korrekt erkannt. Werte für MAG und SMAG erscheinen stimmig, der Wechsel zwischen innen / außen wird ebenfalls korrekt erkannt.

Der Sendercode ist so eingestellt

Code:
#define SIGCODE_1
...
...
#if defined (SIGCODE_1)
  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 };
#elif defined (SIGCODE_2)
  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 };
#elif defined (SIGCODE_3)
  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 };
#endif

Warum erkennt der Mower dies als SIGCODE_4 (differentialSignal, aber nicht als SIGCODE_1?
Code:
#define SIGCODE_4
...
...
...

#if defined (SIGCODE_1)
  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 };
#elif defined (SIGCODE_2)
  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 };
#elif defined (SIGCODE_3)
  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 };
#elif defined (SIGCODE_4)
  int8_t sigcode[] = { 1,0,-1, 0,1,-1,1,-1, 0,1,-1,1,0,-1, 0,1,-1, 0,1,-1, 0,1,0,-1 };
#endif

Die erste Zeile zeigt das erzeugte Signal vom Sender, die zweite Zeile stellt das Signal dar, mit dem das Signal erfolgreich empfangen wird
Code:
 { 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, 0,-1, 0, 1,-1, 1,-1, 0,1, -1, 1, 0,-1, 0, 1,-1, 0, 1,-1, 0, 1, 0,-1 }

Sample Rate vom ADC Manager ist eingestellt auf SRATE_38462.
Wie kann es sein, dass der Mower bei eingestelltem SIGCODE_1 das Signal nicht korrekt empängt, bei dem völlig anderem SIGCODE_4 als Pattern hingegen schon?

Der komplette Code ist hier zu finden https://github.com/HoverMower/ros_hovermower_base_controller

Ich würde mich sehr freuen, wenn jemand mit Kenntnisse zum Perimeter mir dies erklären könnte.

Gruß Patrick
 
@roland have publish many useful video on Youtube to explain this.
Only a diffrential signal is read by the coil, so you need to use the differential sigcode when read the signal and send the normal sidcode with the sender.
In your case Sigcode4 is the exact differential signal of Sigcode1
See near 7.30 in the video
 
Zuletzt bearbeitet:
Hello,
thank you I didn't know this before. So it acts as it should.
Because I tooked everything from Azurit Code, I wonder what I've missed here. At Azurit, you also define which perimeter signal you want to use. But they're defined the same way as in sender so therw must be some Code which Transfers it to diff signal which I haven't found so far.
 
Hello,
thank you I didn't know this before. So it acts as it should.
Because I tooked everything from Azurit Code, I wonder what I've missed here. At Azurit, you also define which perimeter signal you want to use. But they're defined the same way as in sender so therw must be some Code which Transfers it to diff signal which I haven't found so far.
Exactly
 
Oben