Raspberry Pi Stack Exchange is a question and answer site for users and developers of hardware and software for Raspberry Pi. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I'm newbie at this topic. I'm actually beginner at arduino. I'm trying to send some data from Arduino to Raspberry Pi and Raspberry Pi to Arduino. I can ping back and ping out from Arduino to Raspberry Pi but can't from Raspberry Pi to Arduino. Other hand i have to send message to each other. Not ping. I mean Raspberry Pi send some data to Arduinos and the Ardino that should accepted one send back some data to Raspberry Pi. I used to use RF24 library on github but can't handle the situation. Here is my Arduino sketch.

/*
 Copyright (C) 2011 J. Coliz <[email protected]>

 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"
#include <dht11.h> 
#define DHT11PIN 2


dht11 DHT11;

//
// 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)
{
  int chk = DHT11.read(DHT11PIN);
  //
  // 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 char message[16] = "Hello, Arduino!";
    bool ok = radio.write( &message, sizeof(unsigned char) * 16);


    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
      Serial.print("Sicaklik (Celcius): ");
      Serial.println((float)DHT11.temperature, 2);
      Serial.print("Nem (%): ");
      Serial.println((float)DHT11.humidity, 2);
    }

    // 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()){
          while (radio.available()) {  
        char message[16];
        radio.read( &message, sizeof(char) * 16); 
        Serial.print(F("Got message: "));
        Serial.println(String(message));
      }

      radio.stopListening(); 
      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]);
    }
  }
}

Here is my C++ code run on Raspberry Pi.

    /*
     Copyright (C) 2011 J. Coliz <[email protected]>

     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.

     03/17/2013 : Charles-Henri Hallard (http://hallard.me)
                  Modified to use with Arduipi board http://hallard.me/arduipi
                              Changed to use modified bcm2835 and RF24 library
    TMRh20 2014 - Updated to work with optimized RF24 Arduino library

     */

    /**
     * Example RF Radio Ping Pair
     *
     * This is an example of how to use the RF24 class on RPi, communicating to an Arduino running
     * the GettingStarted sketch.
     */

    #include <cstdlib>
    #include <iostream>
    #include <sstream>
    #include <string>
    #include <unistd.h>
    #include <RF24/RF24.h>

    using namespace std;
    //
    // Hardware configuration
    // Configure the appropriate pins for your connections

    /****************** Raspberry Pi ***********************/

    // Radio CE Pin, CSN Pin, SPI Speed
    // See http://www.airspayce.com/mikem/bcm2835/group__constants.html#ga63c029bd6500167152db4e57736d0939 and the related enumerations for pin information.

    // Setup for GPIO 22 CE and CE0 CSN with SPI Speed @ 4Mhz
    //RF24 radio(RPI_V2_GPIO_P1_22, BCM2835_SPI_CS0, BCM2835_SPI_SPEED_4MHZ);

    // NEW: Setup for RPi B+
    //RF24 radio(RPI_BPLUS_GPIO_J8_15,RPI_BPLUS_GPIO_J8_24, BCM2835_SPI_SPEED_8MHZ);

    // Setup for GPIO 15 CE and CE0 CSN with SPI Speed @ 8Mhz
    //RF24 radio(RPI_V2_GPIO_P1_15, RPI_V2_GPIO_P1_24, BCM2835_SPI_SPEED_8MHZ);

    // RPi generic:
    RF24 radio(22,0);

    /*** RPi Alternate ***/
    //Note: Specify SPI BUS 0 or 1 instead of CS pin number.
    // See http://tmrh20.github.io/RF24/RPi.html for more information on usage

    //RPi Alternate, with MRAA
    //RF24 radio(15,0);

    //RPi Alternate, with SPIDEV - Note: Edit RF24/arch/BBB/spi.cpp and  set 'this->device = "/dev/spidev0.0";;' or as listed in /dev
    //RF24 radio(22,0);


    /****************** Linux (BBB,x86,etc) ***********************/

    // See http://tmrh20.github.io/RF24/pages.html for more information on usage
    // See http://iotdk.intel.com/docs/master/mraa/ for more information on MRAA
    // See https://www.kernel.org/doc/Documentation/spi/spidev for more information on SPIDEV

    // Setup for ARM(Linux) devices like BBB using spidev (default is "/dev/spidev1.0" )
    //RF24 radio(115,0);

    //BBB Alternate, with mraa
    // CE pin = (Header P9, Pin 13) = 59 = 13 + 46 
    //Note: Specify SPI BUS 0 or 1 instead of CS pin number. 
    //RF24 radio(59,0);

    /********** User Config *********/
    // Assign a unique identifier for this node, 0 or 1
    bool radioNumber = 1;

    /********************************/

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


    int main(int argc, char** argv){

      bool role_ping_out = true, role_pong_back = false;
      bool role = role_pong_back;

      cout << "RF24/examples/GettingStarted/\n";

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

      // optionally, increase the delay between retries & # of retries
      radio.setRetries(15,15);
      // Dump the configuration of the rf unit for debugging
      radio.printDetails();


    /********* Role chooser ***********/

      printf("\n ************ Role Setup ***********\n");
      string input = "";
      char myChar = {0};
      cout << "Choose a role: Enter 0 for pong_back, 1 for ping_out (CTRL+C to exit) \n>";
      getline(cin,input);

      if(input.length() == 1) {
        myChar = input[0];
        if(myChar == '0'){
            cout << "Role: Pong Back, awaiting transmission " << endl << endl;
        }else{  cout << "Role: Ping Out, starting transmission " << endl << endl;
            role = role_ping_out;
        }
      }
    /***********************************/
      // This simple sketch opens two pipes for these two nodes to communicate
      // back and forth.

        if ( !radioNumber )    {
          radio.openWritingPipe(pipes[0]);
          radio.openReadingPipe(1,pipes[1]);
        } else {
          radio.openWritingPipe(pipes[1]);
          radio.openReadingPipe(1,pipes[0]);
        }

        radio.startListening();

        // forever loop
        while (1)
        {
            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

                printf("Now sending...\n");
                unsigned char message[16] = "Hello, Arduino!";
                    bool ok = radio.write( &message, sizeof(unsigned char) * 16);

                if (!ok){
                    printf("failed.\n");
                }
                // 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");
                }
                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",got_time,millis()-got_time);
                }
                sleep(1);
            }

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

                    // Fetch the payload, and see if this was the last one.
                    while(radio.available()){
                        radio.read( &got_time, sizeof(unsigned long) );
                    }
                    radio.stopListening();

                    radio.write( &got_time, sizeof(unsigned long) );

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

                    // Spew it
                    printf("Got payload(%d) %lu...\n",sizeof(unsigned long), got_time);

                    delay(925); //Delay after payload responded to, minimize RPi CPU time

                }

            }

        } // forever loop

      return 0;
    }

I'm really stuck now. I control my cables many times. But there is no difference.

share|improve this question

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Browse other questions tagged or ask your own question.