Dansk Elektronik Forum

Generel Elektronik => Arduino & Lign. => Emne startet af: Danni-Hansen efter August 23, 2014, 13:51:40

Titel: RC bil med nRF24l1 ping/pong problemer
Indlæg af: Danni-Hansen efter August 23, 2014, 13:51:40
Hey.

Jeg har et problem med at sende de nederstående F,B,A,S signaler fra min ene nRF24l01 til den anden.

Modtageren har denne kode, og jeg har fået slettet 'sende koden'
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;

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 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() )
  {
    /*
    int analoger = analogRead(1);
    int fremad = 4800/(analoger - 20);
   
    int analogen = analogRead(2);
    int tilbage = 4800/(analogen - 20);
    */
    char c = toupper(Serial.read());
   
   
   
   
    //F = fremad
    if ( c == 'F' && role == role_pong_back )
    {
       forwards();
    }

    //F = fremad
    if ( c == 'B' && role == role_pong_back )
    {
       backwards();
    }
   
    //F = fremad
    if ( c == 'A' && role == role_pong_back )
    {
       around();
    }


    //F = fremad
    if ( c == 'S' && role == role_pong_back )
    {
       stopper();
    }

    /*
    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


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

Nogen der kan hjælpe?
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: Danni-Hansen efter August 23, 2014, 23:36:33
Og forsøgte så med denne kode på begge arduino nano, men jeg har på fornemmelsen af at jeg koder det forkerte sted?

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;

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 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 == 'F' || c == 'B' || c == 'A' || c == 'S' ) && role == role_pong_back )
    {
      if(c == 'F'){
       forwards();
      }
      if(c == 'B'){
       backwards();
      }
      if(c == 'A'){
       around();
      }
      if(c == 'S'){
       stopper();
      }
     
      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 == 'F' || c == 'B' || c == 'A' || c == 'S' ) && role == role_ping_out )
    {
      if(c == 'F'){
       forwards();
      }
      if(c == 'B'){
       backwards();
      }
      if(c == 'A'){
       around();
      }
      if(c == 'S'){
       stopper();
      }

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


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);
}
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: gerd efter August 24, 2014, 14:21:01
Hej Danni,

Kan du reducere det, så det er kun en "F", som bliver sendet?

Arduino nummer 1 som sender:
Kode:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"

// 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)
{
  // Setup and configure the RF24 module
  radio.begin();

  // Open only pipe 0 for writing
  radio.openWritingPipe(pipes[0]);
}


void loop (void)
{
char c = 'F';

// Send the character 'F' via radio to the other arduino module (receiver)
radio.write( &c, sizeof(char) );

// delay 2 seconds
delay(2000);
}

Arduino nummer 2 som modtager. Åbn den serielle forbindelse (Arduino console) :
Kode:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"

// 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();
  printf("\n\rRF24 communication\n\r");
  printf("Wait for the next character ...\n\r");

  // Setup and configure the RF24 module
  radio.begin();

  // Open only pipe 0 for reading
  radio.openReadingPipe(1,pipes[0]);

  // listen to the transmitter
  radio.startListening();
 
}


void loop (void)
{
// Is there a new character available ?
if ( radio.available() )
{
char c;
// Read it from the RF24 module
radio.read( &c, sizeof(char) );
// And send it via the serial port to the PC (Console in the Arduino IDE)
printf("Received character:  %c \n\r",c);
}
}
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: Danni-Hansen efter August 24, 2014, 15:52:19
Hej Gerd.

Har lige prøvet det af, og det virker desværre ikke :/

Den modtager ikke.
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: gerd efter August 24, 2014, 16:35:38
hmmmm  :-\

Havde du en kode, hvor kun kommunikationen fungerede?
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: Danni-Hansen efter August 24, 2014, 20:43:25
Kun standart filen som jeg hentede her:

http://arduino-info.wikispaces.com/nRF24L01-RF24-Examples

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;

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
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: gerd efter August 25, 2014, 17:14:39
Hej Danni,

ok. Start med denne kode. (http://maniacbug.github.io/RF24/GettingStarted_8pde-example.html)
Og ændre så lidt som muligt. Gå altid kun små skridt.

I denne kode er tiden sendt

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

Ændre det og send nu en kommando. Det er nu ikke mere end bare et tegn "X".

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

char command = 'X';

void setup(void)

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

Kode:
// Grab the response, compare, and send to debugging spew
char got_command;
radio.read( &got_command, sizeof(char) );
 
// Spew it
printf("Got response %c \n\r",got_command);

Kan du modtage nu en 'X' ?
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: Danni-Hansen efter August 25, 2014, 22:10:35
Hej Gerd.

Den melder om fejl 'got_time' was not declared in this scope

så tænker på at 'got_time' skal have en declare? ved char command = 'X'; ?

fx
char got_time;

?
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: Danni-Hansen efter August 25, 2014, 22:16:13
Lavede ændringen:

char got_time;
efter
char command = 'X';
og prøvede også med:
char command = 'F';

Fik dog fejlen her:

Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: gerd efter August 26, 2014, 18:38:11
Hej Danni,

Jeg glemte at returnere kommandoen...

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.
 */

#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 command = '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 command, and send it.  This will block until complete
    printf("Now sending %c...",command);
    bool ok = radio.write( &command, 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_command;
      radio.read( &got_command, sizeof(char) );
       
      // Spew it
      printf("Got response %c \n\r",got_command);
    }

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

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

        // 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_command, 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

Der er et andet godt eksempel: Arduino IDE: Fil -> Eksempler -> RF24 ->led_remote

jeg er i denne uge i et hotel og har nu installeret Arduino IDE'en på firmaets notebook  ;)
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: Danni-Hansen efter August 26, 2014, 19:04:16
Hej Gerd.

Det undre mig det ikke rigtig virker, fornemmer jeg har lavet en fejl et sted?
Vil hvertfald lige se om jeg ikke kan få 'standart koden' til at fungere igen, og se om det er en ledning der sidder forkert.... :/
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: Danni-Hansen efter August 26, 2014, 19:16:02

Okay, jeg her er hvad jeg har prøvet som ikke virker:

Reciver:
Kode:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"
 
// 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();
  printf("\n\rRF24 communication\n\r");
  printf("Wait for the next character ...\n\r");
 
  // Setup and configure the RF24 module
  radio.begin();
 
  // Open only pipe 0 for reading
  radio.openReadingPipe(1,pipes[0]);
 
  // listen to the transmitter
  radio.startListening();
   
}
 
 
void loop (void)
{
    // Is there a new character available ?
    if ( radio.available() )
    {
        char c;
        // Read it from the RF24 module
        radio.read( &c, sizeof(char) );
        // And send it via the serial port to the PC (Console in the Arduino IDE)
        printf("Received character:  %c \n\r",c);
    } 
}

Transmitter:
Kode:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"
 
// 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)
{
  // Setup and configure the RF24 module
  radio.begin();
 
  // Open only pipe 0 for writing
  radio.openWritingPipe(pipes[0]);
}
 
 
void loop (void)
{
    char c = 'F';
     
    // Send the character 'F' via radio to the other arduino module (receiver)
    radio.write( &c, sizeof(char) );
     
    // delay 2 seconds
    delay(2000);   
}

Også den nye kode du gav

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.
 */

#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 command = '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 command, and send it.  This will block until complete
    printf("Now sending %c...",command);
    bool ok = radio.write( &command, 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_command;
      radio.read( &got_command, sizeof(char) );
       
      // Spew it
      printf("Got response %c \n\r",got_command);
    }

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

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

        // 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_command, 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

Men den her kode virker uden Transmitter / Reciver, men direkte fra Arduino's IDE 'Serial Monitor'

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;

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 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() )
  {
    /*
    int analoger = analogRead(1);
    int fremad = 4800/(analoger - 20);
   
    int analogen = analogRead(2);
    int tilbage = 4800/(analogen - 20);
    */
    char c = toupper(Serial.read());
   
   
   
   
    //F = fremad
    if ( c == 'F' && role == role_pong_back )
    {
       forwards();
    }

    //F = fremad
    if ( c == 'B' && role == role_pong_back )
    {
       backwards();
    }
   
    //F = fremad
    if ( c == 'A' && role == role_pong_back )
    {
       around();
    }


    //F = fremad
    if ( c == 'S' && role == role_pong_back )
    {
       stopper();
    }

    /*
    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


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

Så jeg er meget forvirret. :/
Jeg har forresten også forsøgt med det led lib du snakkede om :/ Mener jeg heller ikke virkede? Kan prøve det af engang igen.
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: gerd efter August 26, 2014, 19:27:39
Citér
Vil hvertfald lige se om jeg ikke kan få 'standart koden' til at fungere igen, og se om det er en ledning der sidder forkert.... :/

Eller mangler en kondensator?
RF24 transmit problem (http://forum.arduino.cc/index.php/topic,213072.0.html)
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: Danni-Hansen efter August 28, 2014, 08:52:25
Æv, det går da godt nok ned af bakken med det her projekt.

Jeg har tilføjet 4.7uF på begge nRF24l01, via et breadboard, mit setup ser rigtigt ud, og alligevel virker det ikke. Selv med standart sketchen..

Kan jeg have sat nogle pins forkert? Kan man måle det?
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: Danni-Hansen efter August 28, 2014, 09:17:26
Hej Gerd.

Nu virker det, vha flg. link:
http://elektronik-forum.dk/index.php?topic=756.msg4534#msg4534

Setup var forkert, og skulle sættes op sådan her:
http://elektronik-forum.dk/index.php?action=dlattach;topic=756.0;attach=550;image

Og jeg testede GettingStarted koden af, og jeg får både send og response.

Nu er jeg så 'bare' i tvivl om hvordan jeg skal lave koden til at sende og modtage 'køre info'
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: gerd efter 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


Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: Danni-Hansen efter 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.
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: gerd efter 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.
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: Danni-Hansen efter 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? :)
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: gerd efter August 28, 2014, 21:39:48
I kode 3 er en fejl (linie 205)

Kode:
switch (got_kore_info)
er korrekt
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: Danni-Hansen efter 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
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: gerd efter 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 ?
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: Danni-Hansen efter August 28, 2014, 22:31:34
Virker heller ikke. Sorry.
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: gerd efter 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?
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: gerd efter 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 ...
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: gerd efter September 06, 2014, 18:44:01
jeg kæmper ...   >:(  ???  :(
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: gerd efter 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.
(http://elektronik-forum.dk/gallery/374_07_09_14_9_17_05.jpeg)

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
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: Danni-Hansen efter 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.
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: gerd efter 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.  :)
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: Danni-Hansen efter September 08, 2014, 21:19:06
Hej Gerd.

Hvilken af library's bruger du?

RF24?
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: gerd efter September 08, 2014, 21:37:52
Ja.

(jeg tror den var fra her: https://github.com/maniacbug/RF24 )
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: Danni-Hansen efter September 08, 2014, 21:43:11
Sådanner, mit Arduino Nano board var buggy, så satte en af de andre boards på, nu får jeg samme tal, bogstaver og hex som dig.
Får dog time out når jeg sender tegn som f,b,a,s
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: gerd efter September 08, 2014, 21:47:31
Citér
nu får jeg samme tal, bogstaver og hex som dig.
Paa begge boards? Sender og modtager?
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: Danni-Hansen efter September 08, 2014, 21:52:46
Nope, ikke på modtager kan jeg se.

Modtager viser fejl.

Tror det er en kombi af dårlig breadboard, ledninger og arduino jeg har haft, så nu prøver jeg med modtager og nyt arduino board (har heldigvis 4 Arduino nano af 2 forskellige kopier)
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: gerd efter September 08, 2014, 21:59:41
Jeg testede det med begge samtidig:

Senderen pa dev/ttyUSB0 med arduino IDE's serial console og modtageren pa dev/ttyUSB1 med putty.
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: Danni-Hansen efter September 08, 2014, 22:11:33
Ved ikke om det er rigtigt skrevet, men:

Von meinem Herzen, danke, es funktioniert :)

Der er dog software fejl, den melder ud om:
Now sending 'S' ...failed
Failed, response timed out

Uanset hvilket jeg taster.
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: gerd efter September 08, 2014, 22:32:21
Citér
om det er rigtigt skrevet
;D ;D perfekt!

Nar du trykker F,B,A eller S, tegnet bliver sendet  fra senderen til modtageren.
Modtageren taender motor pins og sender tegnet tilbage.

Sa, du skal se noget som:
Now sending 'F'  Got response 'F'

Men jeg er igen pa hotellet og har ingen arduino her hos mig. Har du en kondensator mellem pin 1 og 2 ? Kan aendre afstanden mellem senderen og modtageren?
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: Danni-Hansen efter September 09, 2014, 22:57:42
Satte Cap imellem 3v3 og GND på begge arduino's.

Lyst til at se videoen af test-run?

https://www.youtube.com/watch?v=w_GxdukzNwQ&feature=share

Lavede lige en sensor ændring, dog virker den ikke endnu, koblede den fra da den buggede for meget.

Tak for alt hjælp Gerd :D
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: gerd efter September 11, 2014, 20:35:42
>Lyst til at se videoen af test-run?
>[video]
whow! Hvad er dit naeste projekt?
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: Danni-Hansen efter September 12, 2014, 11:31:14
Tror egentligt jeg vil starte ud med at forsøge at gøre den bedre og bedre, indtil jeg føler jeg har ordenligt fat og styr på elektronikken :)
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: Jesper_Munkholm efter September 12, 2014, 11:49:49
Fedt projekt!! (det er sådan noget man lære en masse af!) :) (hvad skulle vi gøre uden Gerd??)  ;D
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: Danni-Hansen efter September 12, 2014, 16:32:20
Tak Jesper.

Og jeg er helt enig, hvad skulle vi gøre uden Gerd og hans viden, det hjælper en hel del :)

Jeg kan da godt skrive kode selv, men jeg er bestemt ikke særlig øvet i at lave kombi koder og funktioner, som skal fungere i samme mcu, jeg er fordesuden også mere inde i PHP verden end de andre scripting og hardcode sprog :/
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: Danni-Hansen efter September 13, 2014, 01:00:40
Hmm, skal det være en pol kap der skal sidde på transiverne?


Den driller nemlig ret ofte.
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: gerd efter September 13, 2014, 08:38:08
Nej, det skal være en keramisk kondensator. 100nF eller 1µF.
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: Danni-Hansen efter September 13, 2014, 10:38:02
Ahh, okay :)

Nok derfor problemet opstår så.
Må lige se om jeg ikke har nogen liggende :)
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: Danni-Hansen efter Oktober 01, 2014, 16:54:33
Undre mig lidt.

Jeg har skildt Earnst af i de elektriske dele, også samlet ham igen.
Han virker, men, jeg har sat en 104 keramisk cap på (100nF) på både Earnst og transmitter, nu svare han (hvis jeg er heldig) 1 ud af 70 gange eller sådan noget.

Havde næsten større held med en pol. cap, nogen der kan forklare problemet?

Det er typisk Earnst der ikke kan levere svar til transmitteren.
Titel: Sv: RC bil med nRF24l1 ping/pong problemer
Indlæg af: Danni-Hansen efter Oktober 14, 2014, 08:52:42
Okay, måtte forsøge mig lidt frem, da heldet rendte lidt ud.

Erstattet ceramic caps med 4.7uF +- caps (Altså pol caps)
Dog havde jeg glemt at sætte nrf24l01 plus til på selve Earnst, hvilket resulterede i at jeg fik response af og til, dog uden at få det såkaldte tegn tilbage igen.


Efter jeg så rettede plus benet på nrf24l01 på recive delen (Earnst), så vil den slet ikke reagere.

Nogen der kan hjælpe lidt?