Go Down

Topic: Drehscheibe Modellbahn mit RF24 (Read 4666 times) previous topic - next topic

Acki1985

Stimmt werde ich gleich alles ändern. Danke dir übrigens für deine Geduld.

Jetzt weis ich wieder warum ich mit Array`s gearbeitet habe. Wenn ich mit Int arbeite bekomme ich immer den Fehler beim Kompilieren : no matching function for call to 'RF24::read(int*)'

Kannst du mir sagen woran das liegt und wie ich das beheben kann?
Hab es rausgefunden.

Der Code sieht jetzt so aus:

Code: [Select]

#include <SPI.h>
#include "RF24.h"

#define button 4
#define confirmLed 2
#define led 3

RF24 NRF24L01 (8, 9);

byte address[] [6] = {"pipe1", "pipe2"};
boolean buttonState = false;                  // Status Taster
int schritte;
int rest_schritte = 0;
void setup() {
  Serial.begin(9600);
  pinMode(button, INPUT_PULLUP);
  NRF24L01.begin();
  NRF24L01.openWritingPipe(address[0]);
  NRF24L01.openReadingPipe(1, address[1]);
  NRF24L01.setPALevel(RF24_PA_MAX);
  NRF24L01.setDataRate(RF24_250KBPS);
  NRF24L01.setChannel(110);
  NRF24L01.startListening();
}

void loop() {
  schritte = 120;

  buttonState = digitalRead(button);
  if (buttonState == LOW)
  {
    NRF24L01.stopListening();
    NRF24L01.write(&schritte, sizeof(int));// Sende zu fahrende Schritte zur Bühne
    NRF24L01.startListening();
    Serial.println("1");
    Serial.println(schritte);
  }

  buttonState = HIGH;//reset the button state variable


  if (NRF24L01.available())// wenn Daten von Bühne empfangen werden
  {
    NRF24L01.read(&rest_schritte, sizeof (int));//restliche Schritte die von Bühne gesendet wurden
    Serial.println("2");
    Serial.println(rest_schritte);
  }
}


Whandall

#151
Feb 13, 2019, 12:04 am Last Edit: Feb 13, 2019, 12:22 am by Whandall Reason: buttonPin, in attach ergänzt, zweite struct Version hinzugefügt
Ich bau dir mal die eine Taste ein.  ;) Die Library gibts in der IDE.

Code: [Select]
#include <RF24.h>
#include <Bounce2.h>

const byte buttonPin = 4;
const byte nrfCE = 8;
const byte nrfCSN = 9;
const byte address[] = "pipe1" "pipe2";

RF24 nrf(nrfCE, nrfCSN);
Bounce button;

int schritte;
int restSchritte;

void setup() {
  Serial.begin(250000);
  button.attach(buttonPin, INPUT_PULLUP);
  nrf.begin();
  nrf.openWritingPipe(address);
  nrf.openReadingPipe(1, address + 5);
  nrf.setPALevel(RF24_PA_MAX);
  nrf.setDataRate(RF24_250KBPS);
  nrf.setChannel(110);
  nrf.startListening();
}

void loop() {
  schritte = 120;
  if (button.update()) {
    if (button.fell()) {
      nrf.stopListening();
      nrf.write(&schritte, sizeof(schritte));
      nrf.startListening();
      Serial.print(F("> mach "));
      Serial.print(schritte);
      Serial.println(F(" Schritte"));
    }
  }
  if (nrf.available()) {
    nrf.read(&restSchritte, sizeof(restSchritte));
    Serial.print(F("< noch "));
    Serial.print(restSchritte);
    Serial.println(F(" Schritte"));
  }
}

Der einzelne int ist noch unglücklich, oder was soll der Wert für STOP sein?

Vielleicht in der Art?

Code: [Select]
#include <RF24.h>
#include <Bounce2.h>

const byte buttonPin = 4;
const byte stopPin = 5;
const byte nrfCE = 8;
const byte nrfCSN = 9;
const byte address[] = "pipe1" "pipe2";

enum Typen {
  machSchritte,
  stop,
};

struct Packet {
  byte type;
  int daten;
  Packet() : type(stop), daten(0) {}
  Packet* befehl(byte welchen, int info = 0) {
    type = welchen;
    daten = info;
    return this;
  }
} data;

RF24 nrf(nrfCE, nrfCSN);
Bounce button, stopButton;

int schritte = 120;
int restSchritte;

void setup() {
  Serial.begin(250000);
  button.attach(buttonPin, INPUT_PULLUP);
  stopButton.attach(stopPin, INPUT_PULLUP);
  nrf.begin();
  nrf.openWritingPipe(address);
  nrf.openReadingPipe(1, address + 5);
  nrf.setPALevel(RF24_PA_MAX);
  nrf.setDataRate(RF24_250KBPS);
  nrf.setChannel(110);
  nrf.startListening();
}

void loop() {
  if (button.update()) {
    if (button.fell()) {
      nrf.stopListening();
      nrf.write(data.befehl(machSchritte, schritte), sizeof(data));
      nrf.startListening();
      Serial.print(F("> mach "));
      Serial.print(schritte);
      Serial.println(F(" Schritte"));
    }
  }
  if (stopButton.update()) {
    if (stopButton.fell()) {
      nrf.stopListening();
      nrf.write(data.befehl(stop), sizeof(data));
      nrf.startListening();
      Serial.println(F("> STOP"));
    }
  }
  if (nrf.available()) {
    nrf.read(&restSchritte, sizeof(restSchritte));
    Serial.print(F("< noch "));
    Serial.print(restSchritte);
    Serial.println(F(" Schritte"));
  }
}
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

Acki1985

Guten Abend,

so jetzt sitze ich wieder am Projekt. Die Bounce libery kenn ich noch nicht. Die ansteuerung der Drehscheibe wird Später mittels eines Drehencoder`s zum einstellen des jeweiligen Abganges (die benötigten Schritte und die Richtung wird in der Bühne errechnet).

Ich stelle mir das so vor, dass über den Encoder und ein LCD-Display das Zielgleis eingestellt wird. Beim drücken des Encoders soll die Zielposition an die Bühne gesendet werden, in welcher dann die Richtung und die benötigten Schritte berechnet und ausgeführt werden. Bei erneutem drücken des Encoders während die Bühne läuft, soll die Bühne sofort anhalten (das könnte man bestimmt mit der Bounce.h machen). Während der drehung sollen die restlichen Schritte af dem LCD der Bedienung angezeigt werden. Wenn das Ziel erreicht ist soll die Aktuelle Position auf das Display übertragen werden. Die aktuelle Position ist dann Ausgangspunkt für die nächste Drehung. Den Sendecode habe ich hauptsächlich hergenommen um zu verstehen wie die Funkübertragung arbeitet. Ich hatte ja am Anfang den Code so geschrieben das, dass Ganze über einen Ardino läuft (bis auf die Ansteuerung Motor und die Stopfunktion). Ich muss aber auf Grund von Mangel an Schleifringen, zwischen Grube und Bühne, die Befehle per Funk übertragen.

Ich hoffe es ist einigermaßen verständlich.

Gruß Acki

agmue

Die Bounce libery kenn ich noch nicht.
Die dient zum Entprellen mechanischer Kontakte.
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

Acki1985

Danke dir agmue.


Übrigens:

Bei der Zahl für Stop dachte ich an 0. Oder ist das ungünstig?

Gruß Acki

Acki1985

Hallo Whandall,

Was bedeudet diese Zeile:

nrf.openReadingPipe(1, address + 5);

Gruß Daniel

Whandall

#156
Feb 13, 2019, 09:58 pm Last Edit: Feb 13, 2019, 10:02 pm by Whandall
Nimm die zweiten 5 Bytes aus dem Addressarray als Addresse für die Pipe 1.

Die Pipeaddressen sind keine Strings, es ist nur bequem die als solche anzugeben.

Code: [Select]
const byte address[] = "pipe1" "pipe2";

Ich stehe nicht so auf die mehrdimensionale Notation für diese Konstanten, die nur sehr selten benutzt werden.

Ansonsten ist das Zeiger-Arithmetik. address zeigt auf den ersten Character, address + 5 auf den sechsten.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

Acki1985

Ich werde mal den tatsächlichen Sendercode versuchen zu schreiben. Alles andere hat glaube ich wenig Sinn. Sonst fangen wir ja nochmal von vorne an.

Gruß Acki

Whandall

Ein Beispiel für einen nicht blockierenden Sender hast du ja,
da brauchst du 'nur noch' die nicht-blockierende  Encoder und Anzeige Funktionalität einbauen,
Oder den Sendekode in das Programm, wie auch immer.

Keine Delays, kein for/while zur Ablaufsteuerung.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

Acki1985

Whandall verstehe die Zeilen nur nicht wirklich.


enum Typen {
  machSchritte,
  stop,
};

struct Packet {
  byte type;
  int daten;
  Packet() : type(stop), daten(0) {}
  Packet* befehl(byte welchen, int info = 0) {
    type = welchen;
    daten = info;
    return this;
  }
} data;

Whandall

#160
Feb 13, 2019, 10:19 pm Last Edit: Feb 13, 2019, 10:21 pm by Whandall
Das Beispiel benutzt ein Paket aus Befehl und Wert.

Es gibt bisher zwei Befehle, machSchritte (könnte auch fahre Position an sein) und stop.

Das Paket hat einen Konstruktor der type und daten sinnvolle Startwerte verpasst,
sowie eine Funktion befehl die einen typ/Befehl und (optional) einen Wert in das Paket einträgt
und die Adresse des Pakets zurückgibt.

Ein Objekt Paket mit dem Namen data wird definiert.

Ich glaube du bist flexibler wenn du nicht nur einen einzelnen int überträgst.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

Whandall

Der Rückkanal benutzt in dem Beispiel das alte Format,
eine Erweiterung der Typen um z.B. restSchritte könnte auch das abdecken.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

Acki1985

#162
Feb 13, 2019, 10:28 pm Last Edit: Feb 13, 2019, 10:30 pm by Acki1985
Whandall was meinst du mit flexiebler, kann nicht wirklich folgen. Die Bühne reagiert ja auf Zahlen die an sie gesendet werden. Na gut man könnte vielleicht die Anzahl der Schritte und die Richtung mit einmal übertragen. Dadurch würde man sich die zusäzliche Berechung in der Bühne sparen. Meinst du das so in der Art?

Whandall

Du musst keine Werte mit magischen Nebenwirkungen versehen.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

Acki1985

Was meins du mit "magischen Nebenwirkungen"?

Go Up