Hi community,
I'm trying to make a wireless communication link between my raspberry pi and MSP430G2553 launchpad using nRF24L01 modules.
I'm using RF24 library for raspberry pi and Enrf24 library for launchpad.
First thing I tried was to configure one of mu launchpad+nRF module as transmitter and other pair as a reciever( as in the sample comes with Enrf24 library ) and it works fine.
Now I want my raspberry pi to be the receiver. But Pi is not at all receiving the message.
These are the source files I'm using :
// For launchpad : MSP430G2553 as transmitter #include <Enrf24.h> #include <nRF24L01.h> #include <string.h> #include <SPI.h> // For MSP430G2553 Enrf24 radio(P2_0, P2_1, P2_2); // P2.0=CE, P2.1=CSN, P2.2=IRQ const uint8_t txaddr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0x01 }; const char *str_on = "ON"; const char *str_off = "OFF"; void setup() { SPI.begin(); SPI.setDataMode(SPI_MODE0); SPI.setBitOrder(MSBFIRST); radio.begin(); // Defaults 1Mbps, channel 0, max TX power radio.setTXaddress((void*)txaddr); // set push button // pinMode( P1_3, INPUT ); // set leds pinMode( P1_0, OUTPUT ); // do some startup animation for( int i = 0; i < 5; i++ ) { digitalWrite( P1_0, HIGH ); delay( 250 ); digitalWrite( P1_0, LOW ); delay( 250 ); } digitalWrite(P1_0, LOW); } void loop() { digitalWrite( P1_0, LOW ); radio.print(str_on); radio.flush(); // Force transmit (don't wait for any more data) delay(250); digitalWrite( P1_0, HIGH ); radio.print(str_off); radio.flush(); // delay(250); }
// For raspberry pi, as receiver #include <cstdlib> #include <iostream> #include <RF24/RF24.h> using namespace std; // Radio pipe addresses for the 2 nodes to communicate. // First pipe is for writing, 2nd, 3rd, 4th, 5th & 6th is for reading... const uint64_t pipes[6] = { 0xDEADBEEF01LL, 0xDEADBEEF01LL, 0xDEADBEEF01LL, 0xDEADBEEF01LL, 0xDEADBEEF01LL, 0xDEADBEEF01LL // 0x01EFBEADDELL, // 0x01EFBEADDELL, // 0x01EFBEADDELL, // 0x01EFBEADDELL, // 0x01EFBEADDELL, // 0x01EFBEADDELL }; // CE Pin, CSN Pin, SPI Speed // Setup for GPIO 22 CE and GPIO 25 CSN with SPI Speed @ 1Mhz //RF24 radio(RPI_V2_GPIO_P1_22, RPI_V2_GPIO_P1_18, BCM2835_SPI_SPEED_1MHZ); // Setup for GPIO 22 CE and CE0 CSN with SPI Speed @ 4Mhz //RF24 radio(RPI_V2_GPIO_P1_15, BCM2835_SPI_CS0, BCM2835_SPI_SPEED_4MHZ); // Setup for GPIO 22 CE and CE1 CSN with SPI Speed @ 8Mhz RF24 radio(RPI_V2_GPIO_P1_15, RPI_V2_GPIO_P1_26, BCM2835_SPI_SPEED_8MHZ); int main(int argc, char** argv) { uint8_t len; // Refer to RF24.h or nRF24L01 DS for settings radio.begin(); radio.enableDynamicPayloads(); radio.setAutoAck(1); radio.setRetries(15,15); radio.setDataRate(RF24_1MBPS); // radio.setPALevel(RF24_PA_MAX); radio.setChannel(0); radio.setCRCLength(RF24_CRC_16); radio.openReadingPipe(0,pipes[0]); radio.openReadingPipe(1,pipes[1]); radio.openReadingPipe(2,pipes[2]); radio.openReadingPipe(3,pipes[3]); radio.openReadingPipe(4,pipes[4]); radio.openReadingPipe(5,pipes[5]); // Start listening radio.startListening(); // Dump the configuration of the rf unit for debugging radio.printDetails(); printf("Output below : \n"); delay(1); while(1) { char receivePayload[32]; uint8_t pipe = 1; // Start listening radio.startListening(); while ( radio.available(&pipe) ) { len = radio.getDynamicPayloadSize(); radio.read( receivePayload, len ); // Display it on screen printf("Recv: size=%i payload=%s pipe=%i\n",len,receivePayload,pipe); pipe++; // reset pipe to 0 if ( pipe > 6 ) pipe = 0; } delayMicroseconds(20); } return 0; }
Can anybody please tell me what I'm doing wrong ??
I also tried to scan the spectrum using raspberry Pi in order to ensure that my connections are correct. I used this code :
// To report channel activity , running on raspberry pi #include <cstdlib> #include <iostream> #include <sstream> #include <string> #include <RF24/RF24.h> using namespace std; // CE Pin, CSN Pin, SPI Speed // Setup for GPIO 22 CE and CE1 CSN with SPI Speed @ 1Mhz //RF24 radio(RPI_V2_GPIO_P1_22, RPI_V2_GPIO_P1_26, BCM2835_SPI_SPEED_1MHZ); // Setup for GPIO 22 CE and CE0 CSN with SPI Speed @ 4Mhz //RF24 radio(RPI_V2_GPIO_P1_15, BCM2835_SPI_CS0, BCM2835_SPI_SPEED_4MHZ); // Setup for GPIO 22 CE and CE0 CSN with SPI Speed @ 8Mhz RF24 radio(RPI_V2_GPIO_P1_15, RPI_V2_GPIO_P1_26, BCM2835_SPI_SPEED_8MHZ); // Radio pipe addresses for the 2 nodes to communicate. //const uint8_t pipes[][6] = {"1Node","2Node"}; // const uint8_t rxAddress[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0x01 }; const uint8_t rxAddress[] = { 0x01, 0xEF, 0xBE, 0xAD, 0xDE }; //const uint64_t pipes[2] = { 0xABCDABCD71LL, 0x544d52687CLL }; int main(int argc, char** argv){ printf("RF24 Test Program\n"); // Setup and configure rf radio radio.begin(); // set channels to 0 radio.setChannel( 79 ); // optionally, increase the delay between retries & # of retries radio.setRetries(15,15); // Dump the configuration of the rf unit for debugging radio.printDetails(); // start listening printf( "Opening Address : " ); radio.openReadingPipe(1, rxAddress); printf( " [COMPLETED]\n " ); printf( "Listening...\n" ); radio.startListening(); // Dump the configuration of the rf unit for debugging radio.printDetails(); int16_t i, j; uint8_t strength, chan=0, dumpbuf[33]; printf("nRF24L01+ Channel Activity Scan\n"); printf("-------------------------------\n"); // Sample channels 0 through 125. for (chan=0; chan < 126; chan++) { // Force RX off, change channel & force back on. radio.startListening(); delay( 10 ); radio.stopListening(); delay( 10 ); radio.setChannel(chan); radio.startListening(); delay(1); // Strawman delay to make sure the RF engine is fully spun-up on the new channel /* Sample the RPD register (Receive Power Detect, >= -64dBm signal detected) * 256 times, once every 4 milliseconds, incrementing the 'strength' variable each * time it's detected. This will be used to produce a relative estimate of how * strong the ambient noise/crosstalk is on this channel. */ strength = 0; for (i=0; i<100; i++) { if (radio.testRPD()) strength++; delay(4); } /* Discover the highest bit set in our 'strength' variable; that will * be the size of the bargraph we'll show for this channel. */ j = 0; for (i=7; i >= 0; i--) { if (strength & (1 << i)) { j = i+1; break; } } /* Each channel represents a 1MHz bandwidth starting at 2400MHz, e.g. * channel 125 is 2525MHz, channel 64 is 2464MHz. */ printf("\nChannel %d", chan); printf(" ("); printf("%d", 2400+chan); printf("MHz): "); for (i=0; i < j; i++) { printf("*"); } printf(" %d - %d", j, strength ); if (radio.available()) { /* Just in case some data got inadvertently received while * we were doing our scan, clear it out. */ radio.read(dumpbuf, 33); } } // Loop to the next channel... printf("\nChannel scan done; halting CPU. Hit RESET to do another scan.\n"); // Serial.flush(); // radio.deepsleep(); // while(1) ; // Permanently halt the CPU. Using while(1) is more portable e.g. to Stellaris LP. return 0; }
And I got this output :
Channel 0 (2400MHz): ******* 7 - 80 Channel 1 (2401MHz): 0 - 0 Channel 2 (2402MHz): 0 - 0 Channel 3 (2403MHz): 0 - 0 ...... Channel 54 (2454MHz): 0 - 0 Channel 55 (2455MHz): 0 - 0 Channel 56 (2456MHz): *** 3 - 4 Channel 57 (2457MHz): 0 - 0 Channel 58 (2458MHz): ** 2 - 3 Channel 59 (2459MHz): * 1 - 1 Channel 60 (2460MHz): ** 2 - 2 Channel 63 (2463MHz): *** 3 - 4 Channel 64 (2464MHz): *** 3 - 6 Channel 65 (2465MHz): *** 3 - 4 Channel 66 (2466MHz): *** 3 - 6 Channel 67 (2467MHz): ***** 5 - 16 Channel 68 (2468MHz): 0 - 0 Channel 69 (2469MHz): 0 - 0
( sorry for messing up the output, I don't know what is happening )
So now I'm sure that my transmitter is at channel0 and the activity around channel 60 may be due to my router.