RC bil med nRF24l1 ping/pong problemer (Læst 29095x)

Offline gerd

  • Administrator
  • µProcessoren
  • *****
  • Indlæg: 915
  • Antal brugbare Indlæg: 97
    • Vis profil
    • Hjemmeside med nogle af mine projekter
Sv: RC bil med nRF24l1 ping/pong problemer
« Svar #15 Dato: August 28, 2014, 20:54:01 »
>Nu virker det, vha flg. link:
Perfekt!

>Nu er jeg så 'bare' i tvivl om hvordan jeg skal lave koden til at sende og modtage 'køre info'

1.)
Ændre payload'en fra "time" til "kore_info"

Kode:
/*
 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;

char kore_info = 'X';

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 kore_info, and send it.  This will block until complete
    printf("Now sending %c...",kore_info);
    bool ok = radio.write( &kore_info, sizeof(char) );
   
    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
      char got_kore_info;
      radio.read( &got_kore_info, sizeof(char) );

      // Spew it
      printf("Got response %c\n\r",got_kore_info);
    }

    // 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
      char got_kore_info;
      bool done = false;
      while (!done)
      {
        // Fetch the payload, and see if this was the last one.
        done = radio.read( &got_kore_info, sizeof(char) );

        // Spew it
        printf("Got payload %c...",got_kore_info);

// 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_kore_info, sizeof(char) );
      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

2.)
I stedet for sende en "X", send tegnene fra konsollen:
Kode:
/*
 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;

char kore_info = ' ';

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 kore_info, and send it.  This will block until complete
    printf("Now sending %c...",kore_info);
    bool ok = radio.write( &kore_info, sizeof(char) );
   
    // The "køre info" was sent. So set it back to "nothing"
    kore_info = ' ';   
   
    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
      char got_kore_info;
      radio.read( &got_kore_info, sizeof(char) );

      // Spew it
      printf("Got response %c\n\r",got_kore_info);
    }

    // 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
      char got_kore_info;
      bool done = false;
      while (!done)
      {
        // Fetch the payload, and see if this was the last one.
        done = radio.read( &got_kore_info, sizeof(char) );

        // Spew it
        printf("Got payload %c...",got_kore_info);

// 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_kore_info, sizeof(char) );
      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]);
    } else if (role == role_ping_out){
      // take the sign from the serial port and use it as a command F,B,A or S
      kore_info = c;
    }
  }
}
// vim:cin:ai:sts=2 sw=2 ft=cpp

3.)
Styre motoren

Kode:
/*
 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;

char kore_info = ' ';


int right01 = 4;
int right02 = 5;
int left01 = 6;
int left02 = 7;
 

void setup(void)
{
 
  pinMode(right01, OUTPUT);
  pinMode(right02, OUTPUT);
  pinMode(left01, OUTPUT);
  pinMode(left02, OUTPUT);
 
  //
  // 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 kore_info, and send it.  This will block until complete
    printf("Now sending %c...",kore_info);
    bool ok = radio.write( &kore_info, sizeof(char) );
   
    // The "køre info" was sent. So set it back to "nothing"
    kore_info = ' ';   
   
    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
      char got_kore_info;
      radio.read( &got_kore_info, sizeof(char) );

      // Spew it
      printf("Got response %c\n\r",got_kore_info);
    }

    // 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
      char got_kore_info;
      bool done = false;
      while (!done)
      {
        // Fetch the payload, and see if this was the last one.
        done = radio.read( &got_kore_info, sizeof(char) );

        // Spew it
        printf("Got payload %c...",got_kore_info);

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

        // decode the received "køre info"
        switch (c)
        {
          case 'F':
            forwards();
          break;
         
          case 'B':
            backwards();
          break;

          case 'A':
            around();
          break;

          case 'S':
            stopper();
          break;
         
        }
       

      }

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

      // Send the final one back.
      radio.write( &got_kore_info, sizeof(char) );
      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]);
    } else if (role == role_ping_out){
      // take the sign from the serial port and use it as a command F,B,A or S
      kore_info = c;
    }
  }
}

void forwards(){
  digitalWrite(right02, LOW);
  digitalWrite(right01, HIGH);
  digitalWrite(left02, LOW);
  digitalWrite(left01, HIGH);
}
 
void backwards(){
  digitalWrite(right01, LOW);
  digitalWrite(right02, HIGH);
  digitalWrite(left01, LOW);
  digitalWrite(left02, HIGH);
}
 
void around(){
  digitalWrite(right01, LOW);
  digitalWrite(right02, HIGH);
  digitalWrite(left02, LOW);
  digitalWrite(left01, HIGH);
   
}
 
void stopper(){
  digitalWrite(right01, LOW);
  digitalWrite(right02, LOW);
  digitalWrite(left02, LOW);
  digitalWrite(left01, LOW);
}
// vim:cin:ai:sts=2 sw=2 ft=cpp



 

Offline Danni-Hansen

  • µProcessoren
  • *
  • Indlæg: 544
  • Antal brugbare Indlæg: 17
    • Vis profil
Sv: RC bil med nRF24l1 ping/pong problemer
« Svar #16 Dato: August 28, 2014, 21:22:36 »
Hej Gerd.

Undre mig lidt, har lagt recive koden op.

Men når jeg har lagt transmitter koden op, ja, så ved jeg sgu ikke rigtigt, det vil den ikke sende de tegn jeg giver den.
Mvh. Danni Hansen.

 

Offline gerd

  • Administrator
  • µProcessoren
  • *****
  • Indlæg: 915
  • Antal brugbare Indlæg: 97
    • Vis profil
    • Hjemmeside med nogle af mine projekter
Sv: RC bil med nRF24l1 ping/pong problemer
« Svar #17 Dato: August 28, 2014, 21:29:11 »
Det er en "kombi" kode. Den køre i sender og i modtager. Men hos sender du er nødt til at trykke på "T" først.

 

Offline Danni-Hansen

  • µProcessoren
  • *
  • Indlæg: 544
  • Antal brugbare Indlæg: 17
    • Vis profil
Sv: RC bil med nRF24l1 ping/pong problemer
« Svar #18 Dato: August 28, 2014, 21:38:43 »
Underligt.

Jeg kørte 2) i transmitteren og 3) i reciveren.

For jeg går udfra at 1) ikke er en fungerbar kode? Eller er jeg helt tabt idag? :)
Mvh. Danni Hansen.

 

Offline gerd

  • Administrator
  • µProcessoren
  • *****
  • Indlæg: 915
  • Antal brugbare Indlæg: 97
    • Vis profil
    • Hjemmeside med nogle af mine projekter
Sv: RC bil med nRF24l1 ping/pong problemer
« Svar #19 Dato: August 28, 2014, 21:39:48 »
I kode 3 er en fejl (linie 205)

Kode:
switch (got_kore_info)
er korrekt

 

Offline Danni-Hansen

  • µProcessoren
  • *
  • Indlæg: 544
  • Antal brugbare Indlæg: 17
    • Vis profil
Sv: RC bil med nRF24l1 ping/pong problemer
« Svar #20 Dato: August 28, 2014, 21:47:50 »
Hej Gerd.

Har du et forslag til hvordan vi finder ud af om den ene enhed ikke reagere?

For ændringen
Kode:
switch (got_kore_info)
lader ikke til at gøre nogen forskel.

Først Trykkede jeg T for at transmitte, også:
F og enter
FF og enter
FFF og enter
.. osv
Mvh. Danni Hansen.

 

Offline gerd

  • Administrator
  • µProcessoren
  • *****
  • Indlæg: 915
  • Antal brugbare Indlæg: 97
    • Vis profil
    • Hjemmeside med nogle af mine projekter
Sv: RC bil med nRF24l1 ping/pong problemer
« Svar #21 Dato: August 28, 2014, 22:01:21 »
Virker kode 3 med denne ændring ...
Kode:
    } else if (role == role_ping_out  && ( c=='F' || c=='B'|| c=='A'|| c=='S') ){
      // take the sign from the serial port and use it as a command F,B,A or S
      kore_info = c;

i modtager or sender ?

 

Offline Danni-Hansen

  • µProcessoren
  • *
  • Indlæg: 544
  • Antal brugbare Indlæg: 17
    • Vis profil
Sv: RC bil med nRF24l1 ping/pong problemer
« Svar #22 Dato: August 28, 2014, 22:31:34 »
Virker heller ikke. Sorry.
Mvh. Danni Hansen.

 

Offline gerd

  • Administrator
  • µProcessoren
  • *****
  • Indlæg: 915
  • Antal brugbare Indlæg: 97
    • Vis profil
    • Hjemmeside med nogle af mine projekter
Sv: RC bil med nRF24l1 ping/pong problemer
« Svar #23 Dato: August 30, 2014, 16:49:25 »
Citér
Først Trykkede jeg T for at transmitte, også:
F og enter
FF og enter
FFF og enter
Kan du lave en screenshot?

 

Offline gerd

  • Administrator
  • µProcessoren
  • *****
  • Indlæg: 915
  • Antal brugbare Indlæg: 97
    • Vis profil
    • Hjemmeside med nogle af mine projekter
Sv: RC bil med nRF24l1 ping/pong problemer
« Svar #24 Dato: August 31, 2014, 18:54:07 »
Har nu bestilt to RF24L01 moduler. Så jeg kan prøve det og jeg tror vi finde problemet senest næste weekend ...

 

Offline gerd

  • Administrator
  • µProcessoren
  • *****
  • Indlæg: 915
  • Antal brugbare Indlæg: 97
    • Vis profil
    • Hjemmeside med nogle af mine projekter
Sv: RC bil med nRF24l1 ping/pong problemer
« Svar #25 Dato: September 06, 2014, 18:44:01 »
jeg kæmper ...   >:(  ???  :(

 

Offline gerd

  • Administrator
  • µProcessoren
  • *****
  • Indlæg: 915
  • Antal brugbare Indlæg: 97
    • Vis profil
    • Hjemmeside med nogle af mine projekter
Sv: RC bil med nRF24l1 ping/pong problemer
« Svar #26 Dato: September 07, 2014, 11:26:49 »
Hej Danni,
det virker nu.

1.)
Skitsen her http://elektronik-forum.dk/index.php?topic=756.0 er ikke rigtigt. Stikket "ICSP" er drejet 180 grader.
Jeg har tilsluttet den direkt (som her http://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo):
nRF24L01 pin 5 -> Arduino D13
nRF24L01 pin 6 -> Arduino D11
nRF24L01 pin 7 -> Arduino D12

Svaret fra nRF24L01 skal se sådan ud:
STATUS           = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
RX_ADDR_P0-1     = 0xf0f0f0f0d2 0xf0f0f0f0e1
RX_ADDR_P2-5     = 0xc3 0xc4 0xc5 0xc6
TX_ADDR          = 0xf0f0f0f0d2
RX_PW_P0-6       = 0x20 0x20 0x00 0x00 0x00 0x00
EN_AA            = 0x3f
EN_RXADDR        = 0x03
RF_CH            = 0x4c
RF_SETUP         = 0x07
CONFIG           = 0x0f
DYNPD/FEATURE    = 0x00 0x00
Data Rate        = 1MBPS
Model            = nRF24L01+
CRC Length       = 16 bits
PA Power         = PA_HIGH


Hvis du har kun 0x00 er noget forkert.

2.)
Her har en ekstra 1uF kondensator mellem pin1 og pin2.
Jeg er ikke sikker på, om det er nødvendigt.


3.)
Med koden "GettingStarted" skal du sende en "T" og en "R" på modtager, fordi den starter ikke i "role_pong_back mode"




Jeg har en ny, bedre og enklere kode:

sender:
Kode:
/**
 * Project nRF24L01 transmitter
 *
 * @author Gerd Bartelt - www.sebulli.com
 *
 * @brief Sends commands to a nRF24L01 module
 * @brief Based on the RF24 example "GettingStarted"
 *       
 * @copyright GPL2
 */

#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);

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

void setup(void)
{
  Serial.begin(57600);
  printf_begin();

  // Setup and configure rf radio
  radio.begin();

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

  // Open pipes to other nodes for communication
  radio.openWritingPipe(pipes[0]);
  radio.openReadingPipe(1,pipes[1]);

  // Start listening
  radio.startListening();

  // Dump the configuration of the rf unit for debugging
  radio.printDetails();
}

void loop(void)
{

  if ( Serial.available() )
  {
    char kore_info = toupper(Serial.read());

    if ( (kore_info != '\r') &&  (kore_info != '\n')){

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

      // Take the kore_info, and send it.  This will block until complete
      printf("Now sending '%c' ...",kore_info);
      bool ok = radio.write( &kore_info, sizeof(char) );

      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
        char got_kore_info;
        radio.read( &got_kore_info, sizeof(char) );

        // Spew it
        printf("Got response '%c'\n\r",got_kore_info);
      }


    }

  }
}


modtager med motorer:
Kode:
/**
 * Project nRF24L01 receiver
 *
 * @author Gerd Bartelt - www.sebulli.com
 *
 * @brief Receives commands from a nRF24L01 and controls a motor.
 * @brief Based on the RF24 example "GettingStarted"
 *       
 * @copyright GPL2
 */

#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);

// Set up motor on pin 4,5,6 and 7
int right01 = 4;
int right02 = 5;
int left01 = 6;
int left02 = 7;


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

void setup(void)
{

  // Motor pins as output
  pinMode(right01, OUTPUT);
  pinMode(right02, OUTPUT);
  pinMode(left01, OUTPUT);
  pinMode(left02, OUTPUT);

  Serial.begin(57600);
  printf_begin();

  // Setup and configure rf radio
  radio.begin();

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

  // Open pipes to other nodes for communication
  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)
{

  // Receive each packet, dump it out, and send it back
  // if there is data ready
  if ( radio.available() )
  {
    // Dump the payloads until we've gotten everything
    char got_kore_info;
    bool done = false;
    while (!done)
    {
      // Fetch the payload, and see if this was the last one.
      done = radio.read( &got_kore_info, sizeof(char) );

      // Spew it
      printf("Got command '%c'\n\r",got_kore_info);

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

      // decode the received "køre info"
      switch (got_kore_info)
      {
      case 'F':
        forwards();
        break;

      case 'B':
        backwards();
        break;

      case 'A':
        around();
        break;

      case 'S':
        stopper();
        break;

      }


    }

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

    // Send the final one back.
    radio.write( &got_kore_info, sizeof(char) );

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

void forwards(){
  printf("Forwards\n\r");
  digitalWrite(right02, LOW);
  digitalWrite(right01, HIGH);
  digitalWrite(left02, LOW);
  digitalWrite(left01, HIGH);
}

void backwards(){
  printf("Backwards\n\r");
  digitalWrite(right01, LOW);
  digitalWrite(right02, HIGH);
  digitalWrite(left01, LOW);
  digitalWrite(left02, HIGH);
}

void around(){
  printf("Around\n\r");
  digitalWrite(right01, LOW);
  digitalWrite(right02, HIGH);
  digitalWrite(left02, LOW);
  digitalWrite(left01, HIGH);

}

void stopper(){
  printf("Stop\n\r");
  digitalWrite(right01, LOW);
  digitalWrite(right02, LOW);
  digitalWrite(left02, LOW);
  digitalWrite(left01, LOW);
}


gerd

 

Offline Danni-Hansen

  • µProcessoren
  • *
  • Indlæg: 544
  • Antal brugbare Indlæg: 17
    • Vis profil
Sv: RC bil med nRF24l1 ping/pong problemer
« Svar #27 Dato: September 08, 2014, 07:47:41 »
Hmm, har fulgt din vejledning, men, tror det her 'arduino nano kopi' har nogle fejl eller at der er noget andet galt.
Mvh. Danni Hansen.

 

Offline gerd

  • Administrator
  • µProcessoren
  • *****
  • Indlæg: 915
  • Antal brugbare Indlæg: 97
    • Vis profil
    • Hjemmeside med nogle af mine projekter
Sv: RC bil med nRF24l1 ping/pong problemer
« Svar #28 Dato: September 08, 2014, 20:25:06 »
TX_ADDR          = 0x00000000 betyder, at din arduino kan ikke kommunikere med modulet.
Og Got response 'ÿ' betyder bare at din arduino laeser 0xFF fra modulet. 0xFF = 11111111 = high level.

Citér
tror det her 'arduino nano kopi' har nogle fejl
                                           º <- (har ingen dansk tastatur i dag)
Kan du lave et billede pa, hvor man kan se forbindelsen mellem arduino og nrf24l01?

Citér
'arduino nano kopi'
                             º
Jeg bestillte ogsa  2 arduino "kloner" og har modtaget en klon og en orginal.  :)

 

Offline Danni-Hansen

  • µProcessoren
  • *
  • Indlæg: 544
  • Antal brugbare Indlæg: 17
    • Vis profil
Sv: RC bil med nRF24l1 ping/pong problemer
« Svar #29 Dato: September 08, 2014, 21:19:06 »
Hej Gerd.

Hvilken af library's bruger du?

RF24?
Mvh. Danni Hansen.