NRF24l01 mit Motorbrücke ln298

Hallo, ich versuche gerade ein kleines Auto mit einer Fernbedienung zu bauen. Die Fernbedienung besteht aus vier Button, die die verschiedenen Richtungen Steuern, und einem NRF24l01 Funkmodul, das für die Funkverbindung zuständig ist. Das Auto besteht aus einer ln298 Motorbrücke und dem Empfänger. Jetzt habe ich ein Problem mit dem Code, da ich nicht weiß wie ich es programmieren soll, wenn z.B. man den Button drückt der für das nach vorne Fahren zuständig ist fahrt es zwar nach vorne, aber nur ruckartig, da z.B. der Button nach Links nicht gedrückt wird und dadurch den Pin der Motorbrücke auch ausgeschaltet.
Ich hoffe ihr versteht was ich meine.

Mein Code:
Sender

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

int buttonPin1 = A2;
int buttonPin2 = A3;
int buttonPin3 = A4;
int buttonPin4 = A5;

int buttonState1 = 0;
int buttonState2 = 0;
int buttonState3 = 0;
int buttonState4 = 0;

RF24 radio(8, 10);

const byte address[6] = "00002";

void setup() {
  pinMode(buttonPin1, INPUT_PULLUP);
  pinMode(buttonPin2, INPUT_PULLUP);
  pinMode(buttonPin3, INPUT_PULLUP);
  pinMode(buttonPin4, INPUT_PULLUP);
  Serial.begin(9600);
  radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();
}
void loop() {
  buttonState1 = digitalRead(buttonPin1);
  buttonState2 = digitalRead(buttonPin2);
  buttonState3 = digitalRead(buttonPin3);
  buttonState4 = digitalRead(buttonPin4);

  if (buttonState1 == 1)
  {
    buttonState1 = 1;
  }
  else if (buttonState1 == 0)
  {
    buttonState1 = 0;
  }
  if (buttonState2 == 1)
  {
    buttonState2 = 3;
  }
  else  if (buttonState2 == 0)
  {
    buttonState2 = 2;
  }

if (buttonState3 == 0)
  {
    buttonState3 = 4;
  }
  else  if (buttonState3 == 1)
  {
    buttonState3 = 5;
  }

if (buttonState4 == 0)
  {
    buttonState4 = 6;
  }
  else  if (buttonState4 == 1)
  {
    buttonState4 = 7;
  }



  /*
  Serial.print(buttonState1);
  Serial.print("\t");
  Serial.println(buttonState2);
  Serial.print("\t");
  Serial.println(buttonState3);
  Serial.print("\t");
  Serial.println(buttonState4);
  Serial.print("\t");
  */
  radio.write(&buttonState1, sizeof(buttonState1));
  radio.write(&buttonState2, sizeof(buttonState2));
  radio.write(&buttonState3, sizeof(buttonState3));
 radio.write(&buttonState4, sizeof(buttonState4));
}

Empfänger

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

int autoPin1 = 4;
int autoPin2 = 5;
int autoPin3 = 6;
int autoPin4 = 7;
int enablePin1 = 9;
int enablePin2 = 3;  


  
int buttonState = 0;

RF24 radio(8, 10);
const byte address[6] = "00002";

void setup() {
  Serial.begin(9600);
  pinMode(autoPin1, OUTPUT);
  pinMode(autoPin2, OUTPUT);
  pinMode(autoPin3, OUTPUT);
  pinMode(autoPin4, OUTPUT); 
  pinMode(enablePin1, OUTPUT);
  pinMode(enablePin2, OUTPUT);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);

}

void loop() {
  radio.startListening();
  while (!radio.available());
  radio.read(&buttonState, sizeof(buttonState));
  Serial.println(buttonState);

// 1
  if (buttonState == 0) {
    digitalWrite(autoPin1, HIGH);
   
  }
  else  if (buttonState == 1) {
    digitalWrite(autoPin1, LOW);
    
    
   
  }
  
  // 2
  
  if (buttonState == 2) {
     digitalWrite(autoPin2, HIGH);
         digitalWrite(autoPin1, LOW);
    
  }
  else  if (buttonState == 3) {
    digitalWrite(autoPin2, LOW);
  }
  // 3
  if (buttonState == 4) {
    digitalWrite(autoPin3, HIGH);
    
  }
  else  if (buttonState == 5) {
    digitalWrite(autoPin3, LOW);
  }

  // 4
  if (buttonState == 6) {
    digitalWrite(autoPin4, HIGH);
    
  }
  else  if (buttonState == 7) {
    digitalWrite(autoPin4, LOW);
  }
    
 }

@Peter-CAD-HST
Was genau wolltest du mit dem Post sagen ?

@stonefamer05
Es gib einige Anweisungen in deinem Sketch, die ich nicht so richtig verstehe.
Z.B. diese hier

if (buttonState1 == 1)
  {
    buttonState1 = 1;
  }
  else if (buttonState1 == 0)
  {
    buttonState1 = 0;
  }

Kannst du mir den Sinn erklären ?

Hi

@TO

Vll. wäre Es eine gute Idee, die Pins nicht 'AutoPin35' zu nennen, sondern was dieser Pin am L298 so treiben soll.

Würde auch die Fehlersuche vereinfachen - ggf. auch Mal auf malen, welcher Motor wie rum drehen soll, bei jeder Tasten-Kombination.
Auch würde ich im Empfänger NICHT darauf warten, daß ein neuer Befehl irgend wann empfangen wird - wenn die Antenne ab ist, rast das Fahrzeug bis zum Ende des Akku in die aktuelle Richtung.

Stichwort Failsafe, Abschaltung, wenn x Sekunden Nichts empfangen wurde.

MfG

So habe alles besser beschriftet. Mache morgen eine Zeichnung, schon mal danke für die Hilfe.

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

int linksPin= 4;         //linker Motor Rückwärts
int rueckwaertsPin1 = 5; //linker Motor Rückwärts
int rechtsPin = 6;     // rechter Motor Vorwärts
int rueckwaertsPin2 = 7; //rechter Motor Rückwärts
int enablePin1 = 9;
int enablePin2 = 3;  


  
int buttonState = 0;

RF24 radio(8, 10);
const byte address[6] = "00002";

void setup() {
  Serial.begin(9600);
  pinMode(linksPin, OUTPUT);
  pinMode(rueckwaertsPin1, OUTPUT);
  pinMode(rechtsPin, OUTPUT);
  pinMode(rueckwaertsPin2, OUTPUT); 
  pinMode(enablePin1, OUTPUT);
  pinMode(enablePin2, OUTPUT);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);

}

void loop() {
  radio.startListening();
  while (!radio.available());
  radio.read(&buttonState, sizeof(buttonState));
  Serial.println(buttonState);

// 1
  if (buttonState == 0) {
    digitalWrite(linksPin, HIGH);
   
  }
  else  if (buttonState == 1) {
    digitalWrite(linksPin, LOW);
    
    
   
  }
  
  // 2
  
  if (buttonState == 2) {
     digitalWrite(rueckwaertsPin1, HIGH);
         
    
  }
  else  if (buttonState == 3) {
    digitalWrite(rueckwaertsPin2, LOW);
  }
  // 3
  if (buttonState == 4) {
    digitalWrite(rechtsPin, HIGH);
    
  }
  else  if (buttonState == 5) {
    digitalWrite(rechtsPin, LOW);
  }

  // 4
  if (buttonState == 6) {
    digitalWrite(rueckwaertsPin2, HIGH);
    
  }
  else  if (buttonState == 7) {
    digitalWrite(rueckwaertsPin2, LOW);
  }
    
 }

stonefamer05:
So habe alles besser beschriftet. Mache morgen eine Zeichnung, schon mal danke für die Hilfe.

Sehr schön, aber Fragen darfst du auch beantworten.

So sollte es sein

Unabhängig von Deiner Zeichnung solltest Du unbedingt für Code sorgen, der besser lesbar ist. Das macht uns und vor Allem Dir den Überblick leichter. Ideal ist meiner Erfahrung nach Code, dem man schon durch die Formatierung ansieht, wie er arbeitet. Das ist bei der Fehlersuche Gold wert.

Was Dein eigentliches Problem angeht: Bei der Auswertung der Signale im Empfänger solltest Du eine Statusänderung der Knöpfe beachten, nicht deren aktuelle Zustände. So à la „wenn sich der Zustand vom Vorwärts-Knopf ändert, ändert sich der Zustand der Motore entsprechend“. Erst wenn der Knopf losgelassen wird, ändert sich auch das Verhalten des Antriebs. Und diese Auswertung setzt man IMO am besten in Form eines „endlichen Automaten“ um.

Ich hoffe, ich liege mit dem zweiten Absatz nicht allzu weit daneben.

Gruß

Gregor

Ich weiß leider nicht, wie ich den Code besser lesbar machen soll. Aber mein Code funktioniert so: Die Fernbedienung sendet durchgehend Signale, wie z.B. wenn der erste Button nicht gedrückt wird sendet sie 1, das empfängt der Empfänger und schaltet den Motor aus. Aber wenn der Button gedrückt wird sendet die Fernbedienung 0, der Empfänger empfangt das und schaltet den Motor ein.
So wie du das um zweiten Absatz beschrieben hast würde ich es ja gerne machen, aber dazu kenne ich mich zu wenig und ich finde im Internet auch nichts darüber was für mich passen würde, darum wollte ich fragen ob mir Jemand sagen kann wie das in einem Code ausschauen würde.

stonefamer05:
Ich weiß leider nicht, wie ich den Code besser lesbar machen soll.

z.B indem Du die vielen unnötigen Leerzeilen entfernst.

Gruß Tommy

Achso das kann ich natürlich machen

stonefamer05:
Achso das kann ich natürlich machen

Ich habe das auf die Schnelle mal für Dich übernommen.

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

int linksPin= 4;         //linker Motor Rückwärts
int rueckwaertsPin1 = 5; //linker Motor Rückwärts
int rechtsPin = 6;     // rechter Motor Vorwärts
int rueckwaertsPin2 = 7; //rechter Motor Rückwärts
int enablePin1 = 9;
int enablePin2 = 3; 
 
int buttonState = 0;

RF24 radio(8, 10);
const byte address[6] = "00002";

void setup() {
  Serial.begin(9600);
  pinMode(linksPin, OUTPUT);
  pinMode(rueckwaertsPin1, OUTPUT);
  pinMode(rechtsPin, OUTPUT);
  pinMode(rueckwaertsPin2, OUTPUT);
  pinMode(enablePin1, OUTPUT);
  pinMode(enablePin2, OUTPUT);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
}

void loop() {
  radio.startListening();
  while (!radio.available());
  radio.read(&buttonState, sizeof(buttonState));
  Serial.println(buttonState);

  // 1
  if (buttonState == 0) { digitalWrite(linksPin, HIGH); }
  else if (buttonState == 1) { digitalWrite(linksPin, LOW);
  }
  // 2
  if (buttonState == 2) { digitalWrite(rueckwaertsPin1, HIGH); }
  else if (buttonState == 3) { digitalWrite(rueckwaertsPin2, LOW); }
  // 3
  if (buttonState == 4) { digitalWrite(rechtsPin, HIGH); }
  else if (buttonState == 5) { digitalWrite(rechtsPin, LOW); }
  // 4
  if (buttonState == 6) { digitalWrite(rueckwaertsPin2, HIGH); }
  else if (buttonState == 7) { digitalWrite(rueckwaertsPin2, LOW); }
}

Gruß

Gregor

Danke

Hi

Dann will ich auch Mal - in der Funktion soltle sich nicht viel geändert haben

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

const uint32_t deathtime = 1000UL * 10; // Anzahl Sekunden bis Not-Stop

const int linksPin = 4;        //linker Motor Rückwärts
const int rueckwaertsPin1 = 5; //linker Motor Rückwärts
const int rechtsPin = 6;     // rechter Motor Vorwärts
const int rueckwaertsPin2 = 7; //rechter Motor Rückwärts
const int enablePin1 = 9;
const int enablePin2 = 3;

int buttonState = 0;

RF24 radio(8, 10);
const byte address[6] = "00002";

void setup() {
  Serial.begin(9600);
  pinMode(linksPin, OUTPUT);
  pinMode(rueckwaertsPin1, OUTPUT);
  pinMode(rechtsPin, OUTPUT);
  pinMode(rueckwaertsPin2, OUTPUT);
  pinMode(enablePin1, OUTPUT);
  pinMode(enablePin2, OUTPUT);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
}

void loop() {
  static uint32_t lastmillis = 0;  //Merker des letzten Schalt-Befehl
  static bool no = false;   //Merker, ob ungültiger Befehl bzw. Notstop bereits ausgeführt wurde
  radio.startListening();
  if (radio.available()) {
    radio.read(&buttonState, sizeof(buttonState));
    Serial.println(buttonState);
    no = false; //kein ungültiger Befehl
    switch (buttonState) {
      case 0:
        digitalWrite(linksPin, HIGH);
        break;
      case 1:
        digitalWrite(linksPin, LOW);
        break;
      case 2:
        digitalWrite(rueckwaertsPin1, HIGH);
        break;
      case 3:
        digitalWrite(rueckwaertsPin2, LOW);
        break;
      case 4:
        digitalWrite(rechtsPin, HIGH);
        break;
      case 5:
        digitalWrite(rechtsPin, LOW);
        break;
      case 6:
        digitalWrite(rueckwaertsPin2, HIGH);
        break;
      case 7:
        digitalWrite(rueckwaertsPin2, LOW);
        break;
      default:
        no = true;  //auf ungültigen Befehl umstellen
        break;
    }
    if (!no) {
      lastmillis = millis();  //bei gültigem Befehl die Uhrzeit merken
      no = false; //und Merker zurück setzen
    }
    //hier ist no auf jeden Fall false
  }
  if (!no && (millis() - lastmillis >= deathtime)) {
    //Wenn der Merker false ist (kein NotStop) UND die Zeit seit letztem Befehl vorbei, dann NotStop
    digitalWrite(rueckwaertsPin1, LOW);
    digitalWrite(rueckwaertsPin2, LOW);
    digitalWrite(rechtsPin, LOW);
    digitalWrite(linksPin, LOW);
    digitalWrite(enablePin1, LOW);
    digitalWrite(enablePin2, LOW);
    no = true;  //und merken, daß wir bereits gestoppt haben
  }
}

Der Sketch verwendet 3670 Bytes (11%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
Globale Variablen verwenden 226 Bytes (11%) des dynamischen Speichers, 1822 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.
(Uno/Nano)

MfG