NRF24L01 empfangen und auswerten

Heyho,

Ich bastel an einem 6-beinigen Laufroboter und bekomme ein kleines Problem einfach nicht gelöst...

Zum vorwärts gehen wird eine while-Schleife angeregt, in der ein switch-case die jeweiligen schritte zur Fortbewegung abgearbeitet werden. An einem gewissen Punkt soll dann entschieden werden ob er weiter läuft oder stehen bleibt. Diese Entscheidung funktioniert aber irgendwie nicht...

void loop() {

  CheckRadio();                     //Empfängt Daten der Fernbedienung
  CheckVolts();                      //Akku Spannungsüberwachung
  StandHIGH();                      //Still stehen

  while (buttonState == 101) {      //nach vorne
    UPHIGH();
  }

Im loop werden die Bewegungsabläufe aufgerufen

void CheckRadio() {                       //Befehle empfangen

  if (radio.available()) {
      radio.read( &buttonState, sizeof(buttonState));
  } else {
    buttonState = 0;
  }
}

Im CheckRadio() wird abgefragt welche Taste auf der Fernbedienung gedrückt wird. Falls keine, soll sich der kleine die " 0 " merken damit der buttonState immer eine klare definition hat.
Gesendet und empfangen werden die Daten über ein NRF24L01 Modul mit einer Bibliothek.

Also gut: wir bekommen den buttonState 101 und die "void UPHIGH()" wird durchgeführt.

void UPHIGH() {

  switch (Zustand) {

    case 0:                                      //Bein 2, 4, 6 heben


    case 1:                                      //drehen


    case 2:                                      //Bein 2, 4, 6 senken


    case 3:                                      //Bein 1, 3, 5 heben


    case 4:                                      //drehen


    case 5:

      CheckRadio();

      if (buttonState == 0) {
        Zustand = 6;
      }
      if (buttonState == 101) {
        Zustand = 60;
      }
      break;

case 6:

case 7:

Ende kleiner Schritt

case 60:

weiter mit großen Schritt

case ...

Case 0-4 hab ich geleert damit es nicht so übersichtlich wird.
In case 5 soll nun entschieden werden ob er weiter nach vorne gehen soll oder stehen bleibt indem geguckt wird ob die Taste für nach Vorne gehen weiterhin gedrückt wird oder nicht.

Es wird immer das ausgeführt was bei buttonState 101 steht. In diesem Fall Zustand 60, also der große Schritt. Wenn in der if-Bedingung Zustand 6 anstatt 60 steht, wird der kleine Schritt ausgeführt.

Der buttonState 0 wird also nie ausgeführt. Ich denke in der void CheckRadio() wird der buttonState 0 nicht richtig erkannt sobald keine Taste gedrückt wird.

Durch wildes ausprobieren hab ich leider keine Lösung finden können....
Sollte mehr vom Code benötigt werden, stelle ich ihn natürlich gerne zur Verfügung.

Viele Grüße,
Philipp und schon mal danke für die Mühen :slight_smile:

Probiere mal so rum:

void CheckRadio() {                       //Befehle empfangen
buttonState = 0;
  if (radio.available()) {
      radio.read( &buttonState, sizeof(buttonState));
  }
}

ElEspanol:
Probiere mal so rum:

Vielen dank für deine Antwort!
Hat aber leider nicht funktioniert :frowning:

Ich habe ein bischen mit Serial.println rumgespielt..

Sobald die Taste auf der Fernbedienung gedrückt wird, wird einmalig das Signal "buttonState 101" empfangen. Auch wenn man gedrückt hält. (Weil die while-Schleife gestartet wird und die void "CheckRadio()" nicht mehr ausgeführt wird.) Wenn wir nun im case 5 ankommen, wird wieder "CheckRadio()" überprüft. Obwohl nichts gesendet wird, werden trotzdem nochmal 2 oder 3 mal "buttonState 101" empfangen.

Die Fernbedienung sendet übrigens, sobald ein Taster gedrückt wird, ununterbrochen das dazugehörige Signal. Wenn nichts gedrückt wird, wird auch nichts gesendet.

Noch erwähnen wollte ich, dass ich recht neu bin was Programmieren angeht :slight_smile:

btw.. Ich habe mal den Thread umbenannt zu etwas passenderem.

Edit: Ich benutze übrigens die RF24 Bibliothek von TMRh20 Version 1.3.1

Wenn du die zwei auf die Kommunikation begrenzten, vollständige, kompilierbare Sketche posten würdest,
hätte ein gutmütiger Leser den Hauch einer Chance deine(n) Fehler zu finden.

Whandall:
Wenn du die zwei auf die Kommunikation begrenzten, vollständige, kompilierbare Sketche posten würdest,
hätte ein gutmütiger Leser den Hauch einer Chance deine(n) Fehler zu finden.

Wird gemacht!

Fernbedienung:

#include <nRF24L01.h>
#include <printf.h>
#include <RF24_config.h>
#include <RF24.h>
#include <SPI.h>

const int UP = 4;

int buttonState = 0;

RF24 radio(2, 3); // CE, CSN
const byte address[6] = "2L3P1";

void setup() {

  Serial.begin(9600);

  pinMode(UP, INPUT);

  radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_MAX); // mit 10µF
  radio.stopListening();

}

void loop() {

  if (digitalRead(UP) == HIGH) {
    buttonState = 101;
    radio.write(&buttonState, sizeof(buttonState));
    Serial.println(buttonState);
  }
}

Die Fernbedienung besteht natürlich aus mehr als nur einem Taster. Die anderen wurden entfernt damit es nicht zu viel wird hier.

Der Empfänger:

#include <Servo.h>
#include <nRF24L01.h>
#include <printf.h>
#include <RF24_config.h>
#include <RF24.h>
#include <SPI.h>

int buttonState = 0;
int Zustand = 0;

RF24 radio(40, 44); // CE, CSN
const byte address[6] = "2L3P1";

void setup() {

  Serial.begin(9600);

  radio.begin();
  radio.setPALevel(RF24_PA_MAX); // mit 10µF Elko
  radio.openReadingPipe(0, address);
  radio.startListening();

void loop() {

  CheckRadio();                          //Empfängt Daten der Fernbedienung
  StandHIGH();                           //Still stehen

  while (buttonState == 101) {      //nach vorne
    UPHIGH();
  }

void CheckRadio() {                       //Befehle empfangen

  if (radio.available()) {
      radio.read( &buttonState, sizeof(buttonState));
  } else {
    buttonState = 0;
  }
  Serial.println(buttonState);
}

void UPHIGH() {

  switch (Zustand) {

    case 0:                                      //Bein 2, 4, 6 heben

    case 1:                                      //drehen

    case 2:                                      //Bein 2, 4, 6 senken

    case 3:                                      //Bein 1, 3, 5 heben

    case 4:                                      //drehen

    case 5:                                      //Entscheiden ob weiter oder stehen bleiben

      CheckRadio();

      if (buttonState == 0) {
        Zustand = 6;
      }
      if (buttonState == 101) {
        Zustand = 60;
      }
      break;

    case 6:                                      //Bein 1, 3, 5 senken

    case 7:                                      //Endschritt / while-Schleife unterbrechen  

      CheckRadio();
      break;

    case 60:                                    //weiter drehen

    case 61:

    ....
    }
}

Philter:
Ich benutze übrigens die RF24 Bibliothek von TMRh20 Version 1.3.1

Könntest Du Bibliotheken und Modul mal verlinken sowie Schaltpläne zeigen? Das könnte demnächst interessant für mich sein.

Gruß

Gregor

gregorss:
Könntest Du Bibliotheken und Modul mal verlinken sowie Schaltpläne zeigen? Das könnte demnächst interessant für mich sein.

Gruß

Gregor

Bibliothek

Modul

Für den Anschlussplan empfehle ich dir einfach das Modul zu googlen. Es gibt viele Pläne, am besten suchst du dir das für dich am besten lesbar ist.

Philter:
Bilbiothek
Modul
Für den Anschlussplan empfehle ich dir einfach das Modul zu googlen. Es gibt viele Pläne, am besten suchst du dir das für dich am besten lesbare raus.

Dankesehr!

Gruß

Gregor

Warum sendest du hunderte Pakete pro Sekunde solange du die Taste drückst?
Warum interessiert dich nicht ob davon eines ankam?

Was funktioniert denn überhaupt nicht?

Wenn Module nahe beieinander sind, ist RF24_PA_MAX sehr oft ungünstig. :wink:

Whandall:
Warum sendest du hunderte Pakete pro Sekunde solange du die Taste drückst?

Um sicher zu gehen, dass er Daten bekommt wenn er die braucht.
Ich gebe zu, dass kann man schöner lösen :slight_smile:

Whandall:
Warum interessiert dich nicht ob davon eines ankam?

Weil ich in der Regel 2 Meter vom Empfänger entfernt bin und sehe ob was ankommt.

Whandall:
Was funktioniert denn überhaupt nicht?

Sobald die Taste UP gedrückt wird, wird das Signal 101 gesendet. Das wird auch einmalig erkannt und sofort die while-Schleife UPHIGH gestartet. Lasse ich jetzt los, gehts weiter im Programm. Soweit alles wie es soll.
Kommen wir zum case 5 , soll entschieden werden ob er stehen bleibt ( Wenn keine Taste gedrückt ist. ) oder ob er weiter läuft. ( Wenn immernoch der Befehl 101 gesendet wird. ) Wir überprüfen also mit CheckRadio was er machen soll. Obwohl aber nichts gedrückt wird, wird noch 2 oder 3 mal unser Signal 101 empfangen bzw im Serial.print wiedergegeben. Eigentlich müsste er buttonState auf 0 setzen sobald nichts mehr kommt. Das tut er aber nie.

Etwas anders geschrieben steht das nochmal im Beitrag 1 und 3.

Whandall:
Wenn Module nahe beieinander sind, ist RF24_PA_MAX sehr oft ungünstig. :wink:

Wieso ungünstig?

Whandall:
Wenn Module nahe beieinander sind, ist RF24_PA_MAX sehr oft ungünstig. :wink:

Philter:
Wieso ungünstig?

Der Empfänger wird übersteuert. Die Signale können dann eventuell nicht mehr ausgewertet werden weil sie verzerrt sind.

Gruß, Jürgen

Der NRF kann drei Pakete in seinem Puffer speichern, wenn man also tausende sendet und die zu selten abfragt, bleiben u.U. drei 'alte' Pakete über.

Philter:
Um sicher zu gehen, dass er Daten bekommt wenn er die braucht.
Ich gebe zu, dass kann man schöner lösen :slight_smile:

Was hält dich ab das zu moderieren, oder pro Tastendruck nur ein (oder ein paar) Paket(e) zu senden?

Whandall:
Der NRF kann drei Pakete in seinem Puffer speichern, wenn man also tausende sendet und die zu selten abfragt, bleiben u.U. drei 'alte' Pakete über.

Dann werden das wohl die Pakete sein die am Ende ausgelesen werden! Ich habe mal ein 500er delay nach jedem senden eingefügt um nur ein Paket zu bekommen und siehe da, es funktioniert (fast) so wie es soll.

Whandall:
Was hält dich ab das zu moderieren, oder pro Tastendruck nur ein (oder ein paar) Paket(e) zu senden?

Der Code hatte für den bisherigen Funktionsumfang ausgereicht. Mit neuen Funktionen kommen neue Fehler :stuck_out_tongue:

Wenn der Empfänger seine Pakete anfordert bevor welche gesendet werden, sollte das Problem vielleicht gelöst sein.

Philter:
Wenn der Empfänger seine Pakete anfordert bevor welche gesendet werden, sollte das Problem vielleicht gelöst sein.

Das ist Quatsch.