Serielle Kommunikation zwischen Arduino Nano Every und Radar-Sensor

Hallo Zusammen,

ich habe mir einen 5,8 GHz-Sensor von CQRobot und einen 10 GHz Sensor von DFRobot besorgt.

5 GHz: 5.8GHz Doppler Effect Microwave Motion Sensor SKU: CQRSENWB02 - CQRobot-Wiki

10 GHz:

Mein Projekt soll stumpf folgendes können:

2 LEDs leuchten auf, wenn der jeweils zugewiesene Sensor eine Bewegung erkannt hat.

Das funktioniert soweit auch ohne Probleme. Die Sensoren geben ein GPIO-Signal an die digitalen Pins auf dem Arduino Nano Every raus und der verwertet das auch korrekt gemäß Programmierung.

Jetzt habe ich nur folgendes Problem:
Die Reichweite im 10 GHz Sensor kann ich per Stellschraube anpassen.
Laut CQRobot kann ich die Reichweite des 5 GHz Sensors auch anpassen, jedoch nur über serielle Kommunikation. Ich kenne das grundsätzlich nur so, dass mir dann eine Bibliothek für die Arduino-Software vorliegt o.ä.
Bei dem vorliegenden Sensor jedoch ist nur o.g. Website ("Wiki") hinterlegt, auf welchem die Frames für die UART/serielle Kommunikation (RX/TX) für mich gänzlich unverständlich erklärt wird.

Bevor ich Euch hier behelligt habe, habe ich gemeinsam mit ChatGPT versucht, eine funktionierende Programmierung zustande zu kriegen, in welcher ich die Distanz auf dem Chip programmiere.
Das hat nicht geklappt - es scheiterte bereits am Aufbau der seriellen Kommunikation zum Sensor.

const int radar5Pin = 4;
const int radar10Pin = 5;
const int StatusLedWhitePin = 8;
const int BlueLed5Pin = 10;
const int BlueLed10Pin = 9;
int val;

void setup() {
  Serial.begin(115200);
  pinMode(radar10Pin, INPUT);
  pinMode(radar5Pin, INPUT);
  pinMode(StatusLedWhitePin, OUTPUT);
  pinMode(BlueLed5Pin, OUTPUT);
  pinMode(BlueLed10Pin, OUTPUT);
  digitalWrite(StatusLedWhitePin, HIGH);
}

void loop() {
  int radar10Value = digitalRead(radar10Pin);
  if (radar10Value == LOW) {
    digitalWrite(BlueLed10Pin, HIGH);
    Serial.println("Bewegung erkannt - 10 GHz");
  }
  else {
    digitalWrite(BlueLed10Pin, LOW);
  }

  val = digitalRead (radar5Pin);
  //Serial.println(val);
  if (val == LOW)
  {digitalWrite (BlueLed5Pin, LOW);
    }
  else 
  {
    digitalWrite (BlueLed5Pin, HIGH);
    Serial.println("Bewegung erkannt - 5 GHz");
  }
  delay(200);

}

Auf der Website von CQRobot ist dies quasi alles an Erklärung:

Description:

Head: Control frame header, the value is 0x58;
Control Frame Payload: Control frame payload, divided into command packet, control command, parameter length and parameters:
CMD Group: command grouping, 3 effective bits, supports up to 7 grouped commands;
CMD: Control command, 5 effective bits, that is, a group supports up to 32 control commands;
Parameter Length: the total length of the parameter (bytes);
Para_0 ~ Para_n: Parameters (the length is specified by Parameter Length)
Check Code: check code, the value is the sum of the previous data:
Check Code = Head + Payload_0 + ... + Payload_n

Beispiel zum ändern der Erkennungsdistanz:

2.1 Set motion sensing distance

Command code: 0x2
Parameters: para1: distance level 0 - 31
Send command format (HEX): 58 02 01 xx xx xx
Reply frame: refer to reply frame format
e.g., set distance level to 15

HEX is: 58 02 01 0F 6A 00

Resp: 59 02 01 00 5C 00 (success), Other: fail

Kann mir jemand von Euch helfen, Licht ins Dunkel zu bringen? Wie baue ich diese Informationen in meine Programmierung ein?

Ich hoffe, ich habe erstmal die wichtigsten Informationen zusammengefasst.

Vielen Dank und viele Grüße

Rammnick

Link?

Sorry für die missverständliche Kommunikation.
Mehr Links mit Informationen als die beiden bereits genannten gibt es nicht wirklich.

Ähnlich hilfreich als wenn Du Deinen Geschichtslehrer fragst :frowning:

Verstehst Du die Hex Codes (C: 0xNN)?

Angenommen Du willst einen Frame gemäß 2.1 Set motion sensing distance übermitteln, hex 58 02 01 xx xx xx. Dazu schickst Du mit Serial.write() die Bytes 0x58, 0x02, 0x01, dann ein Byte für die Entfernung (0-31), und dann 2 Bytes (int, LSB first) Prüfsumme. Die Prüfsumme ist angeblich die Summe aller bis dahin übermittelten Bytes.

Die Antwort ist ähnlich aufgebaut, mit Serial.read() einlesen. Der Code für Erfolg ist direkt angegeben.

1 Like

Ja, die KI hat mir bei einfachen Dingen schon helfen können, aber hier kam sie langsam an ihre Grenzen :grimacing:

Ich nutze die digitalen Pins 6 und 7 als zusätzliche Serials. Also würde ich es dann Beispielsweise so einbauen:

#include <SoftwareSerial.h>

SoftwareSerial mySerial(7, 6);

void setup() {
  mySerial.begin(115200);
  mySerial.write(0x58, 0x02, 0x01, 0x0F, 0x6A0F)
}

void loop()
{
mySerial.read();
delay(100);
}

Wie genau müsste denn das Byte mit der Entfernung aussehen (habe jetzt 15 = 0F angenommen)?
Und habe ich die Prüfsumme richtig erschlossen?

Ich hatte vorher eine Art Testprogramm, was checken sollte, ob die Verbindung per Serial zum Sensor aufgebaut wird:

#include <SoftwareSerial.h>

SoftwareSerial mySerial(7, 6);

void setup() {
  Serial.begin(115200);
  Serial.println("Empfangene Werte in Hex:");
  mySerial.begin(115200);
}

void loop() {
  if (mySerial.available() > 0) {
    byte wert = mySerial.read();
    if (wert < 16) {
      Serial.print('0');
    }
    Serial.print(wert, HEX);
    //if (j++ % 10)
    // {
    Serial.print(' ');
    // } else {
    //    Serial.println();
    // }
  }
}

Dabei kam kein Ergebnis rum. Es scheint, als hätte ich es nichtmal geschafft, eine Kommunikation über die Schnittstelle aufzubauen.

LG

Rammnick

Software Serials sollten mit höchstens 9600 Baud betrieben werden.

Laut Wiki vom Sensor läuft der allerdings mit einer Baudrate von 115200

Dann brauchst Du einen Arduino mit mehreren Hardware-UARTs.

Kann es denn sein, dass aus dem Grund die Kommunikation scheitert?

Vorher hatte ich den Sensor an TX1 und RX0 angeschlossen. Da hat es auch nicht geklappt. Lag es dabei daran, dass diese Schnittstelle vom Mikro-USB-Anschluss zum PC genutzt wird?

Das paßt nicht zusammen.

Serial0 wird vom PC benutzt und kann anderweitig nur benutzt werden, wenn vom PC nichts ausgegeben wird.

Inwiefern nicht? Das sind die Pins für den einzigen Hardwareserial am Nano Every

Ich selbst nutze den Nano Every nicht, aber wie ich gelesen habe, hat der eine zusätzliche hardware serielle (UART), die RX1 und TX1.
Die solltest du für dein Projekt verwenden können.

1 Like

Laut diesem Diagramm hier wären das die beiden Pins rechts-unten (PC4 und PC5), korrekt?

Die sind auf dem Board mit TX1 und RX0 beschriftet.

Welches Diagramm ?
Ich sehe nichts.

In diesem Schaltbild ist es PC04 und PC05, aber TX1 und RX1.

Ich vermute mal, du hast da ein falsches Bild.
Spreche die Hardware Serielle mal mir Serial1 an. Das sollte dann funktionieren.

Mein Fehler :man_facepalming:

Pinout Nano Every

Ok, das Schaltbild sagt, es ist RX1 und TX1, also Serial1.
So würde ich es jetzt versuchen.

1 Like

Ok, habe RX vom Sensor an TX am Board angeschlossen und umgekehrt.

Programmierung erstmal zum Testen der Verbindung wie folgt:

const int radar5Pin = 4;
const int radar10Pin = 5;
const int StatusLedWhitePin = 8;
const int BlueLed5Pin = 10;
const int BlueLed10Pin = 9;
int val;

void setup() {
  Serial.begin(9600);
  Serial1.begin(115200);
  pinMode(radar10Pin, INPUT);
  pinMode(radar5Pin, INPUT);
  pinMode(StatusLedWhitePin, OUTPUT);
  pinMode(BlueLed5Pin, OUTPUT);
  pinMode(BlueLed10Pin, OUTPUT);
  digitalWrite(StatusLedWhitePin, HIGH);
  Serial1.read();
}

void loop() {
  int radar10Value = digitalRead(radar10Pin);
  if (radar10Value == LOW) {
    digitalWrite(BlueLed10Pin, HIGH);
    Serial.println("Bewegung erkannt - 10 GHz");
  } else {
    digitalWrite(BlueLed10Pin, LOW);
  }

  val = digitalRead(radar5Pin);
  //Serial.println(val);
  if (val == LOW) {
    digitalWrite(BlueLed5Pin, LOW);
  } else {
    digitalWrite(BlueLed5Pin, HIGH);
    Serial.println("Bewegung erkannt - 5 GHz");
  }
  delay(200);

  if (Serial1.available() > 0)
  {
    Serial1.println(HEX);
  }
  else 
     Serial.println("Keine Kommunikation über RX/TX.");
}

Bekomme gemäß Programmierung die Rückmeldung, dass keine Kommunikation mit dem Board stattfindet.

So, wie ich das oben verstanden habe, musst Du erst eine Anforderung senden, um eine Antwort zu erhalten.

Gruß Tommy

Wer hat denn diesen furchtbaren Code verbrochen?

War das eine richtige Frage? Ich gehe zwar nicht davon aus, aber tun wir mal so, als wäre sie nicht rhetorisch gemeint:

Diesen Code habe ich verbrochen. Ein Typ ohne Vorkenntnisse oder irgendwelche Erfahrungen in dem Bereich, der mit Dr Google versucht, einen Prototypen zum laufen zu kriegen, ohne die ganze Materie auswendig zu lernen.

Wenn du Interesse hast, mir zu helfen, tu dies gerne. Ich weiß aber auch ohne dein Zutun, dass ich kein meisterhafter Programmierer bin, der es auch nur ansatzweise mit dir aufnehmen könnte.