NRF24l01 Atmega 32U4

Hallo an alle,

ich versuche jetzt schon einige Zeit ein bisschen mit dem NRF24L01 BOB rumzuspielen.
Wenn ich zwei dieser 2,4GHz module an zwei Arduino Uno anschließe und den Beispiel Code "Getting Started"

/*
 Copyright (C) 2011 J. Coliz <maniacbug@ymail.com>

 This program is free software; you can redistribute it and/or
 modify it under the terms of the GNU General Public License
 version 2 as published by the Free Software Foundation.
 */

/**
 * Example for Getting Started with nRF24L01+ radios. 
 *
 * This is an example of how to use the RF24 class.  Write this sketch to two 
 * different nodes.  Put one of the nodes into 'transmit' mode by connecting 
 * with the serial monitor and sending a 'T'.  The ping node sends the current 
 * time to the pong node, which responds by sending the value back.  The ping 
 * node can then see how long the whole cycle took.
 */

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

//
// Hardware configuration
//

// Set up nRF24L01 radio on SPI bus plus pins 9 & 10 

RF24 radio(9,10);

//
// Topology
//

// Radio pipe addresses for the 2 nodes to communicate.
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };

//
// Role management
//
// Set up role.  This sketch uses the same software for all the nodes
// in this system.  Doing so greatly simplifies testing.  
//

// The various roles supported by this sketch
typedef enum { role_ping_out = 1, role_pong_back } role_e;

// The debug-friendly names of those roles
const char* role_friendly_name[] = { "invalid", "Ping out", "Pong back"};

// The role of the current running sketch
role_e role = role_pong_back;

void setup(void)
{
  //
  // Print preamble
  //

  Serial.begin(57600);
  printf_begin();
  printf("\n\rRF24/examples/GettingStarted/\n\r");
  printf("ROLE: %s\n\r",role_friendly_name[role]);
  printf("*** PRESS 'T' to begin transmitting to the other node\n\r");

  //
  // Setup and configure rf radio
  //

  radio.begin();

  // optionally, increase the delay between retries & # of retries
  radio.setRetries(15,15);

  // optionally, reduce the payload size.  seems to
  // improve reliability
  //radio.setPayloadSize(8);

  //
  // Open pipes to other nodes for communication
  //

  // This simple sketch opens two pipes for these two nodes to communicate
  // back and forth.
  // Open 'our' pipe for writing
  // Open the 'other' pipe for reading, in position #1 (we can have up to 5 pipes open for reading)

  //if ( role == role_ping_out )
  {
    //radio.openWritingPipe(pipes[0]);
    radio.openReadingPipe(1,pipes[1]);
  }
  //else
  {
    //radio.openWritingPipe(pipes[1]);
    //radio.openReadingPipe(1,pipes[0]);
  }

  //
  // Start listening
  //

  radio.startListening();

  //
  // Dump the configuration of the rf unit for debugging
  //

  radio.printDetails();
}

void loop(void)
{
  //
  // Ping out role.  Repeatedly send the current time
  //

  if (role == role_ping_out)
  {
    // First, stop listening so we can talk.
    radio.stopListening();

    // Take the time, and send it.  This will block until complete
    unsigned long time = millis();
    printf("Now sending %lu...",time);
    bool ok = radio.write( &time, sizeof(unsigned long) );
    
    if (ok)
      printf("ok...");
    else
      printf("failed.\n\r");

    // Now, continue listening
    radio.startListening();

    // Wait here until we get a response, or timeout (250ms)
    unsigned long started_waiting_at = millis();
    bool timeout = false;
    while ( ! radio.available() && ! timeout )
      if (millis() - started_waiting_at > 200 )
        timeout = true;

    // Describe the results
    if ( timeout )
    {
      printf("Failed, response timed out.\n\r");
    }
    else
    {
      // Grab the response, compare, and send to debugging spew
      unsigned long got_time;
      radio.read( &got_time, sizeof(unsigned long) );

      // Spew it
      printf("Got response %lu, round-trip delay: %lu\n\r",got_time,millis()-got_time);
    }

    // Try again 1s later
    delay(1000);
  }

  //
  // Pong back role.  Receive each packet, dump it out, and send it back
  //

  if ( role == role_pong_back )
  {
    // if there is data ready
    if ( radio.available() )
    {
      // Dump the payloads until we've gotten everything
      unsigned long got_time;
      bool done = false;
      while (!done)
      {
        // Fetch the payload, and see if this was the last one.
        done = radio.read( &got_time, sizeof(unsigned long) );

        // Spew it
        printf("Got payload %lu...",got_time);

	// Delay just a little bit to let the other unit
	// make the transition to receiver
	delay(20);
      }

      // First, stop listening so we can talk
      radio.stopListening();

      // Send the final one back.
      radio.write( &got_time, sizeof(unsigned long) );
      printf("Sent response.\n\r");

      // Now, resume listening so we catch the next packets.
      radio.startListening();
    }
  }

  //
  // Change roles
  //

  if ( Serial.available() )
  {
    char c = toupper(Serial.read());
    if ( c == 'T' && role == role_pong_back )
    {
      printf("*** CHANGING TO TRANSMIT ROLE -- PRESS 'R' TO SWITCH BACK\n\r");

      // Become the primary transmitter (ping out)
      role = role_ping_out;
      radio.openWritingPipe(pipes[0]);
      radio.openReadingPipe(1,pipes[1]);
    }
    else if ( c == 'R' && role == role_ping_out )
    {
      printf("*** CHANGING TO RECEIVE ROLE -- PRESS 'T' TO SWITCH BACK\n\r");
      
      // Become the primary receiver (pong back)
      role = role_pong_back;
      radio.openWritingPipe(pipes[1]);
      radio.openReadingPipe(1,pipes[0]);
    }
  }
}
// vim:cin:ai:sts=2 sw=2 ft=cpp

laufen lasse dann funktioniert alles so wie es soll.
Jetzt zu meinem Problem, ich habe folgendes Board (http://www.hobbytronics.co.uk/atmega32u4-arduino-breakout) darauf ist ein Atmega32U4 mit dem Bootloader vom Arduino Leonardo.
Wenn ich den obengenannten code auf diesem Board laufen lasse und als zweites Board einen Uno, dann funktioniert der Uno wie gewollt und der Leonardo verschnitt macht gar nichts.
Also beim Uno kommt auf dem Serial Monitor eine Ausgabe mit allen Werten des NRF24l01 und auf dem Serial Monitor vom Leonardo verschnitt erscheint gar nichts.
Hat jemand eine Ahnung was ich falsch mache?

PS: Das NRF Modul habe nach dem Pinout (https://www.arduino.cc/en/Hacking/PinMapping32u4) angeschlossen. Also SCK, MISO und MOSI auf die Pins 9 - 11 und CSN und CE auf die Pins 29 -30.

Ich hoffe ich habe alle informationen reingepackt und jemand kennt evtl. das Problem.

Vielen Dank im Vorraus,

MfG Hans Beder

Hallo,

beim Leonardo im setup() nach
Serial.begin(57600);

while (!Serial);

einfügen. Hängt mit der internen USB-Serial des 32U4 zusammen.
Wenn die serielle nicht benutzt, wird die Zeile auskommentieren.

Gruß aus Berlin
Michael

Hey,
nach dem einfügen von dem while(!Serial); habe ich zumindest eine ausgabe beim 32U4.
Jedoch passt es noch immer nicht wirklich.
Die Ausgabe vom UNO sieht so aus wie auf dem Bild "Ausgabe_UNO".
Dann wartet der UNO ob er Daten bekommt oder wenn man ein 'T' eingibt, dann sendet er selbst.

Beim 32U4 sieht die Ausgabe aus wie auf dem Bild "Ausgabe_32U4"
dieser wartet nicht, sondern schreibt sofort "Got payload 4294967295...Sent response."
Für mich sieht es aus als würde das nrf modul ga nicht erkannt werden.

Kennt das wer oder weiß jemand was ich evtl. falsch mache.

Vielen Dank im Vorraus,

Mfg Hans Beder

Für mich sieht es aus als würde das nrf modul ga nicht erkannt werden.

Sehe ich auch so!

Offensichtlich nutzt du gar nicht den Hardware SS pin PB0.
Dann dürfte der noch ein Input sein, und sich im Schwebezustand befinden.
So könnte dein SPI in den Slave Mode fallen.

Also:
Wenigstens in setup() noch den SS zum Ausgang machen.
pinMode(SS,OUTPUT);

Oder allerwenigstes den Pullup aktivieren, so dass dauerhaft ein HIGH Pegel anliegt.
pinMode(SS,INPUT_PULLUP);

Also der SS Ausgang und der Pullup haben leider nichts bewirkt :frowning:

Hansbeder:
Also der SS Ausgang und der Pullup haben leider nichts bewirkt :frowning:

Und ein austauschen der Module auch nicht... nehme ich mal an.

Dann tippe ich auf einen Verkabelungsfehler.
Sehe keine Alternative.

So sieht meine Verkabelung aus, (die kondies beim quarz hab ich für die Übersichtlichkeit weggelassen und auch den reset knopf) der blink sketch funktioniert auch soweit also am atmega 32U4 kanns ned liegen.

MfG Hans Beder

Da du offensichtlich die Leonardo Boarddefinition verwendest...
Muss der 32U4 mit 5V laufen.
Der NRF stirbt daran.

Pin 42 sollte frei bleiben oder einen kleinen Kondensator bekommen
Des weiteren fehlen da noch einige Abblockkondensatoren
Ansonsten scheint mir der "Plan" ok zu sein.

Ich betreibe den atmega über usb (also5V) und den nrf über einen zweiten uno für die 3.3v.
Natürlich sind die GND verbunden

Hansbeder:
Ich betreibe den atmega über usb (also5V) und den nrf über einen zweiten uno für die 3.3v.
Natürlich sind die GND verbunden

Welcher UNO läuft mit 3,3V?

Gruß Tommy

Ich verwende eines der NRF BOB's an einem UNO das zweite NRF an dem 32U4.
Da der 32U4 aber keine 3.3V zur verfügung stellt, verwende ich einen zweiten Arduino UNO als "Spannungsquelle" für das NRF BOB, dass an dem 32U4 angeschlossen ist.
Die GND's von der "Spannungsquelle" und dem 32U4 sind verbunden.

Also es war der pin 42 wie es combie schon gesagt hatte. Vielen Dank an alle die geantwortet haben.

MfG Hans Beder