Arduino Uno (als Empfänger) reagiert nicht

Guten Tag Leute. Ich brauche Hilfe, denn ich bin langsam gezweifelt.

Ich habe das folgende Projekt:

realisiert. Es hat einwandfrei funktioniert. Ich habe dazu noch ein Servomotor addiert hat auch nach paar versuchen funktioniert.

Seit paar Tagen (Ich glaube oder ich bin mir sicher, ich habe nichts geändert), funktioniert die Übertragung nicht mehr oder manchmal nur durch Zufall…Das RX LED auf Arduino (Empfänger) blinkt nicht mehr, wie es mal war. Bei dem Arduino Sender blinkt das TX LED wie es sein soll.

Auch die Ausgabe Fenster zeigt nichts. Ich habe sogar eine neue Arduino gekauft und ausprobiert…leider ohne Erfolg.

Alle Bauteile sind voll funktionsfähig.

Was läuft schief bei mir oder was habe ich unbewusst falsch gemacht? Danke für jede Hilfe.

sketch_Receiver_jun16b.ino (2.97 KB)

sketch_Transmitter_jun16a.ino (4.96 KB)

Maoukil:
Was läuft schief bei mir oder was habe ich unbewusst falsch gemacht? Danke für jede Hilfe.

Gibt es ein neues Gerät in der Umgebung? Funktioniert es, wenn Du es anderswo probierst?

Gruß

Gregor

Ja ich habe es auch woanders (wo kein Elektronik liegt) ausprobiert, leider ohne Erfolg

Leider können viele deinen Sketch nicht lesen. Z.B. mit mobilen Geräten ist das sehr schwer bis unmöglich.

Setze bitte deinen Sketch in Code-Tags. Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Oder setze [ code] davor und [/ code] dahinter, aber ohne die Leerzeichen.
Dann wird dieser für alle besser lesbar.

Sender:

#include <RHReliableDatagram.h>
#include <RH_NRF24.h>

// Include dependant SPI Library 
#include <SPI.h>

// Define Joystick Connections
#define joyVert    A0 
#define joyHorz    A1

// Define Taster für Servo

int taster=6;
int tasterstatus=0;


// Define Joystick Values - Start at 512 (middle position)
int joyposVert = 505; //512
int joyposHorz = 511; //512

// Define addresses for radio channels
#define CLIENT_ADDRESS 1   
#define SERVER_ADDRESS 2

// Create an instance of the radio driver
RH_NRF24 RadioDriver;

// Sets the radio driver to NRF24 and the client address to 1
RHReliableDatagram RadioManager(RadioDriver, CLIENT_ADDRESS);

// Declare unsigned 8-bit motorcontrol array
// 2 Bytes for motor speeds plus 1 byte for direction control
uint8_t motorcontrol[4]; // Alte Wert 3 ohne Servo fkt

// Define the Message Buffer
uint8_t buf[RH_NRF24_MAX_MESSAGE_LEN];

void setup()
{
  // Setup Serial Monitor
  Serial.begin(9600);

  pinMode(taster, INPUT);
 
  // Initialize RadioManager with defaults - 2.402 GHz (channel 2), 2Mbps, 0dBm
  if (!RadioManager.init())
    Serial.println("init failed");
  
  // Set initial motor direction as forward
  motorcontrol[2] = 0;


}

void loop()
{

  tasterstatus=digitalRead(taster);
  Serial.println(tasterstatus);
  motorcontrol[3] = tasterstatus;
  //Serial.println(motorcontrol[3]);

  // Print to Serial Monitor
  Serial.println("Reading motorcontrol values ");

  
  // Read the Joystick X and Y positions
  joyposVert = analogRead(joyVert); 
  joyposHorz = analogRead(joyHorz);

  // Determine if this is a forward or backward motion
  // Do this by reading the Verticle Value
  // Apply results to MotorSpeed and to Direction

  if (joyposVert < 460)
  {
    // This is Backward
    // Set Motors backward
    motorcontrol[2] = 1;

    //Determine Motor Speeds
    // As we are going backwards we need to reverse readings
    motorcontrol[0] = map(joyposVert, 460, 0, 0, 255);
    motorcontrol[1] = map(joyposVert, 460, 0, 0, 255);

  }
  else if (joyposVert > 564)
  {
    // This is Forward
    // Set Motors forward
    motorcontrol[2] = 0;

    //Determine Motor Speeds
    motorcontrol[0] = map(joyposVert, 564, 1023, 0, 255);
    motorcontrol[1] = map(joyposVert, 564, 1023, 0, 255); 

  }
  else
  {
    // This is Stopped
    motorcontrol[0] = 0;
    motorcontrol[1] = 0;
    motorcontrol[2] = 0; 
    motorcontrol[3] = 0; // für Servo
   

  }
  
  // Now do the steering
  // The Horizontal position will "weigh" the motor speed
  // Values for each motor

  if (joyposHorz < 460)
  {
    // Move Left
    // As we are going left we need to reverse readings
    // Map the number to a value of 255 maximum
    joyposHorz = map(joyposHorz, 460, 0, 0, 255);

    motorcontrol[0] = motorcontrol[0] - joyposHorz;
    motorcontrol[1] = motorcontrol[1] + joyposHorz;

    // Don't exceed range of 0-255 for motor speeds
    if (motorcontrol[0] < 0)motorcontrol[0] = 0;
    if (motorcontrol[1] > 255)motorcontrol[1] = 255;

  }
  else if (joyposHorz > 564)
  {
    // Move Right
    // Map the number to a value of 255 maximum
    joyposHorz = map(joyposHorz, 564, 1023, 0, 255);
  
    motorcontrol[0] = motorcontrol[0] + joyposHorz;
    motorcontrol[1] = motorcontrol[1] - joyposHorz;

    // Don't exceed range of 0-255 for motor speeds
    if (motorcontrol[0] > 255)motorcontrol[0] = 255;
    if (motorcontrol[1] < 0)motorcontrol[1] = 0;      

  }

  // Adjust to prevent "buzzing" at very low speed
  if (motorcontrol[0] < 8)motorcontrol[0] = 0;
  if (motorcontrol[1] < 8)motorcontrol[1] = 0;

  //Display the Motor Control values in the serial monitor.

 Serial.print("X: ");
 Serial.print(joyposHorz);
 Serial.print("Y: ");
 Serial.print(joyposVert);

  
  //Serial.print("Motor A: ");
  //Serial.print(motorcontrol[0]);
  //Serial.print(" - Motor B: ");
  //Serial.print(motorcontrol[1]);
  //Serial.print(" - Direction: ");
  //Serial.println(motorcontrol[2]);
  
  //Send a message containing Motor Control data to manager_server
  if (RadioManager.sendtoWait(motorcontrol, sizeof(motorcontrol), SERVER_ADDRESS))
  {
    // Now wait for a reply from the server
    uint8_t len = sizeof(buf);
    uint8_t from;
    if (RadioManager.recvfromAckTimeout(buf, &len, 2000, &from))
    {
      Serial.print("got reply from : 0x");
      Serial.print(from, HEX);
      Serial.print(": ");
      Serial.println((char*)buf);
    }
    else
    {
      Serial.println("No reply, is nrf24_reliable_datagram_server running?");
    }
  }
  else
    Serial.println("sendtoWait failed");

  delay(100);  // Wait a bit before next transmission
}

Empfänger:

#include <RHReliableDatagram.h>
#include <RH_NRF24.h>

// Include dependant SPI Library 
#include <SPI.h>

// Include Servo Lib
#include"ServoTimer2.h"



// Define addresses for radio channels
#define CLIENT_ADDRESS 1   
#define SERVER_ADDRESS 2

// Motor A Connections
int enA = 9;
int in1 = 14;
int in2 = 4;

// Motor B Connections
int enB = 5;
int in3 = 7;
int in4 = 6;

// Servo

ServoTimer2 servoblau;


// Create an instance of the radio driver
RH_NRF24 RadioDriver;

// Sets the radio driver to NRF24 and the server address to 2
RHReliableDatagram RadioManager(RadioDriver, SERVER_ADDRESS);

// Define a message to return if values received
uint8_t ReturnMessage[] = "JoyStick Data Received"; 

// Define the Message Buffer
uint8_t buf[RH_NRF24_MAX_MESSAGE_LEN];

void setup()
{
  // Setup Serial Monitor
  Serial.begin(9600);
  
  // Set all the motor control pins to outputs
  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);

  // Servo

 servoblau.attach(3);
  
  // Initialize RadioManager with defaults - 2.402 GHz (channel 2), 2Mbps, 0dBm
  if (!RadioManager.init())
    Serial.println("init failed");
} 

void loop()
{
  if (RadioManager.available())
  {
 // Wait for a message addressed to us from the client
    uint8_t len = sizeof(buf);
    uint8_t from;
    if (RadioManager.recvfromAck(buf, &len, &from))

    {

      //Serial Print the values of joystick
      Serial.print("got request from : 0x");
      Serial.print(from, HEX);
      Serial.print(": MotorA = ");
      Serial.print(buf[0]);
      Serial.print(" MotorB = ");
      Serial.print(buf[1]);
      Serial.print(" Dir = ");
      Serial.println(buf[2]);

      // Set Motor Direction
      if (buf[2] == 1)
      {
    // Motors are backwards
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
    }else{
    // Motors are forwards
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    digitalWrite(in3, HIGH);
    digitalWrite(in4, LOW);
     }



// Drive Servo
Serial.print(buf[3]);
      if (buf[3] == 1)
        
      {
   servoblau.write(2250);
   delay(5000);
   }else{
    servoblau.write(0);
    
     }

 
      
      // Drive Motors
      analogWrite(enA, buf[1]);
      analogWrite(enB, buf[0]);
     
      // Send a reply back to the originator client, check for error
      if (!RadioManager.sendtoWait(ReturnMessage, sizeof(ReturnMessage), from))
        Serial.println("sendtoWait failed");
    }
  }              
}

Maoukil:
Ja ich habe es auch woanders (wo kein Elektronik liegt) ausprobiert, leider ohne Erfolg

Wie ist die Schaltung aufgebaut? Auf Steckbrettern hatte ich schon mit Kontaktproblemen zu tun - kannst Du Kontaktprobleme ausschließen?

Gruß

Gregor

Und wie versorgst (Spannung) du die beiden Controller mit Zusatz ?
Wie hast du den Motor angeschlossen ?

Am besten ein Schaltbild posten.

gregorss:
Wie ist die Schaltung aufgebaut? Auf Steckbrettern hatte ich schon mit Kontaktproblemen zu tun - kannst Du Kontaktprobleme ausschließen?

Gruß

Gregor

Die Schaltung ist mit direkten Drähten (ohne Steckbrettern) aufgebaut. Eine Skitze habe ich am Anfang (Unbekannt.JPN) eingefügt.

HotSystems:
Und wie versorgst (Spannung) du die beiden Controller mit Zusatz ?
Wie hast du den Motor angeschlossen ?

Am besten ein Schaltbild posten.

Die Spannung ist erfolgt durch ca. 12 V (3 x 18650. Die Motoren sind mit einem Motor Controller (L298N) angeschlossen. Ein Schaltbild habe ich am Anfang "Unbennant.png" eingefügt.

Maoukil:
Die Spannung ist erfolgt durch ca. 12 V (3 x 18650. Die Motoren sind mit einem Motor Controller (L298N) angeschlossen. Ein Schaltbild habe ich am Anfang "Unbennant.png" eingefügt.

Ok....sorry, das habe ich übersehen.

Allerdings ist da ein Fehler.

Du gibst 5Volt vom Motortreiber in den Vin. Da ist die Spannung zu gering. Der Vin benötigt mindestens 7Volt, da sich hier noch der Onboard-Regler drin befindet. Der Uno bekommt so zu wenig Spannung und läuft nicht mehr stabil.

HotSystems:
Ok....sorry, das habe ich übersehen.

Allerdings ist da ein Fehler.

Du gibst 5Volt vom Motortreiber in den Vin. Da ist die Spannung zu gering. Der Vin benötigt mindestens 7Volt, da sich hier noch der Onboard-Regler drin befindet. Der Uno bekommt so zu wenig Spannung und läuft nicht mehr stabil.

Danke erstmal für die Antwort. Das werde ich auf jeden Fall versuchen (mehr Spannung auf Vin).

Es ist nur seltsam, denn es hat mal auch mit 5V funktioniert. Was seltsamer ist der Serieller Monitor zeigt überhaupt nichts...

Ich probiere es gleich und melde mich wieder. Danke

Maoukil:
Danke erstmal für die Antwort. Das werde ich auf jeden Fall versuchen (mehr Spannung auf Vin).

Es ist nur seltsam, denn es hat mal auch mit 5V funktioniert. Was seltsamer ist der Serieller Monitor zeigt überhaupt nichts...

Ich probiere es gleich und melde mich wieder. Danke

Gleich ausprobiert, leider hat sich nichts geändert.

Ich habe gleich etwas anderes ausprobiert un den Fehler zu begrenzen:

Ich habe eine Uno Platine ohne nichts genommen und erstens den Sender Sketch drauf geladen--> Funktioniert und die RX LED blingt wie es sein soll.

Habe dann den Empfänger Sketch drauf geladen und die TX LED bleibt aus. Wie solle ich das interpretieren? Code Fehler, Lib Fehler...

Das es mal mit 5V am Vin-Pin funktioniert hat, ist reiner Zufall und durch die Bauteiltoleranzen bedingt.
Aber es ist immer sehr unstabil.

Was genau das Problem ist, kann ich so nicht sagen. Da es nach deiner Info schon funktioniert hat, liegt es vermutlich nicht am Sketch. Eher ist die Hardware das Problem.

Baue doch erst mal eine sichere Funkverbindung zwischen dem Sender und Empfänger auf. Also nur die Funksketche onhe weitere Har- und Soiftware-Module.

Wenn das funktioniert, langsam erweitern.

Für solch einen Fall habe ich mir einen "Funk-Empfänger mit Arduino, Funkmodul und Display" gebaut, der ständig die Signale empfängt und anzeigt.
Da weiß ich immer was gesendet wird.

Maoukil:
Es ist nur seltsam, denn es hat mal auch mit 5V funktioniert. Was seltsamer ist der Serieller Monitor zeigt überhaupt nichts...

Grad noch gesehen.

Du solltest nicht USB und Vin extern gleichzeitig anschließen.
Das kann zu Problemen führen.

HotSystems:
Grad noch gesehen.

Du solltest nicht USB und Vin extern gleichzeitig anschließen.
Das kann zu Problemen führen.

Klar. Das mache ich auch nicht. Entweder USB Versorgung oder Batterie Versorgung.

Maoukil:
Klar. Das mache ich auch nicht. Entweder USB Versorgung oder Batterie Versorgung.

Ok....dann einen üblichen Tipp:

Fertige dir ein spezielles USB-Kabel an, bei dem du die 5Volt-Leitung durchtrennst. Dann kannst du mit dem Kabel immer USB angeschlossen lassen und darüber flashen und den seriellen Monitor auslesen. Die externe Spannung bleibt dann immer am Uno dran.

HotSystems:
Baue doch erst mal eine sichere Funkverbindung zwischen dem Sender und Empfänger auf. Also nur die Funksketche onhe weitere Har- und Soiftware-Module.

Wenn das funktioniert, langsam erweitern.

Besten Dank erstmal für deine Unterstützung.

Ich glaube ich fange mal wieder vom Anfang an und achte auf meine Schritte.

Viele Grüße.

Maoukil:
Besten Dank erstmal für deine Unterstützung.

Ich glaube ich fange mal wieder vom Anfang an und achte auf meine Schritte.

Viele Grüße.

Alles klar und viel Erfolg.

Das die NRFs nur 3.3V verknusen ist dir klar ? Könnte sein das dir sonst der Baustein "hops" gegangen ist.

Ulli

Lt. seinerZeichnung (bzw. der Beschriftung) benutzt er eine Adapterplatine, da ist ein Powerregler drauf.