diff --git a/README b/README deleted file mode 100644 index f887070..0000000 --- a/README +++ /dev/null @@ -1,12 +0,0 @@ -Arduino driver for nRF24L01 2.4GHz Wireless Transceiver - -See Datasheet at http://www.nordicsemi.com/files/Product/data_sheet/nRF24L01_Product_Specification_v2_0.pdf - -This chip uses the SPI bus, plus two chip control pins. Remember that pin 10 must still remain an output, or -the SPI hardware will go into 'slave' mode. - -Design Goals: This library is designed to be... -* Maximally compliant with the intended operation of the chip -* Easy for beginners to use -* Consumed with a public interface that's similiar to other Arduino standard libraries -* Built against the standard SPI library. diff --git a/README.md b/README.md new file mode 100644 index 0000000..504829f --- /dev/null +++ b/README.md @@ -0,0 +1,19 @@ +# Arduino driver for nRF24L01 2.4GHz Wireless Transceiver + +Design Goals: This library is designed to be... +* Maximally compliant with the intended operation of the chip +* Easy for beginners to use +* Consumed with a public interface that's similiar to other Arduino standard libraries +* Built against the standard SPI library. + +Please refer to: + +* [Documentation Main Page](http://maniacbug.github.com/RF24) +* [RF24 Class Documentation](http://maniacbug.github.com/RF24/classRF24.html) +* [Source Code](https://github.com/maniacbug/RF24) +* [Downloads](https://github.com/maniacbug/RF24/archives/master) +* [Chip Datasheet](http://www.nordicsemi.com/files/Product/data_sheet/nRF24L01_Product_Specification_v2_0.pdf) + +This chip uses the SPI bus, plus two chip control pins. Remember that pin 10 must still remain an output, or +the SPI hardware will go into 'slave' mode. + diff --git a/RF24.h b/RF24.h index 3f91ff9..0975fdf 100644 --- a/RF24.h +++ b/RF24.h @@ -13,21 +13,6 @@ /** * Driver for nRF24L01 2.4GHz Wireless Transceiver - * - * Please refer to: - * - * @li Detailed Documentation - * @li Source Code - * @li Chip Datasheet - * - * This chip uses the SPI bus, plus two chip control pins. Remember that pin 10 must still remain an output, or - * the SPI hardware will go into 'slave' mode. - * - * Design Goals: This library is designed to be... - * @li Maximally compliant with the intended operation of the chip - * @li Easy for beginners to use - * @li Consumed with a public interface that's similiar to other Arduino standard libraries - * @li Built against the standard SPI library. */ class RF24 @@ -182,7 +167,9 @@ public: * Set Payload Size * * This implementation uses a pre-stablished fixed payload size for all - * transmissions. + * transmissions. If this method is never called, the driver will always + * transmit the maximum payload size (32 bytes), no matter how much + * was sent to write(). * * @todo Implement variable-sized payloads feature * @@ -197,7 +184,7 @@ public: * * @return The number of bytes in the payload */ - uint8_t getPayloadSize(void) ; + uint8_t getPayloadSize(void) ; /** * Print a giant block of debugging information to stdout @@ -301,8 +288,8 @@ public: * Only the least significant byte should be unique, e.g. * * @code - * openReadingPipe(0xF0F0F0F0AA); - * openReadingPipe(0xF0F0F0F066); + * openReadingPipe(1,0xF0F0F0F0AA); + * openReadingPipe(2,0xF0F0F0F066); * @endcode * * @todo Enforce the restriction that all pipes must share the top 32 bits @@ -319,13 +306,44 @@ public: * * This is an example of how to use the RF24 class. Write this sketch to two different nodes, * connect the role_pin to ground on one. The ping node sends the current time to the pong node, - * which responds by sending the value back. + * which responds by sending the value back. The ping node can then see how long the whole cycle + * took. */ /** - * @mainpage Driver Library for nRF24L01 + * @example starping.pde * - * See the RF24 class for details on how to drive this chip. + * This sketch is a more complex example of using the RF24 library for Arduino. + * Deploy this on up to six nodes. Set one as the 'pong receiver' by tying the + * role_pin low, and the others will be 'ping transmit' units. The ping units + * unit will send out the value of millis() once a second. The pong unit will + * respond back with a copy of the value. Each ping unit can get that response + * back, and determine how long the whole cycle took. + * + * This example requires a bit more complexity to determine which unit is which. + * The pong receiver is identified by having its role_pin tied to ground. + * The ping senders are further differentiated by a byte in eeprom. + */ + +/** + * @mainpage Driver for nRF24L01 2.4GHz Wireless Transceiver + * + * Design Goals: This library is designed to be... + * @li Maximally compliant with the intended operation of the chip + * @li Easy for beginners to use + * @li Consumed with a public interface that's similiar to other Arduino standard libraries + * @li Built against the standard SPI library. + * + * Please refer to: + * + * @li Documentation Main Page + * @li RF24 Class Documentation + * @li Source Code + * @li Downloads Page + * @li Chip Datasheet + * + * This chip uses the SPI bus, plus two chip control pins. Remember that pin 10 must still remain an output, or + * the SPI hardware will go into 'slave' mode. */ #endif // __RF24_H__ diff --git a/examples/pingpair/pingpair.pde b/examples/pingpair/pingpair.pde index 18456e2..3a1cf41 100644 --- a/examples/pingpair/pingpair.pde +++ b/examples/pingpair/pingpair.pde @@ -9,11 +9,10 @@ /** * Example RF Radio Ping Pair * - * This sketch is an example of using the RF24 library for Arduino. Deploy this on - * two nodes, set one as the 'trasmit' and the other the 'receive' unit. The transmit - * unit will send out the value of millis() once a second. The receive unit will respond - * back with a copy of the value. The transmit unit can get that 'ping' back, and - * determine how long the whole cycle took. + * This is an example of how to use the RF24 class. Write this sketch to two different nodes, + * connect the role_pin to ground on one. 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 diff --git a/examples/starping/starping.pde b/examples/starping/starping.pde index 34e2eb9..f3c4e9c 100644 --- a/examples/starping/starping.pde +++ b/examples/starping/starping.pde @@ -10,14 +10,14 @@ * Example RF Radio Ping Star Group * * This sketch is a more complex example of using the RF24 library for Arduino. - * Deploy this on up to six nodes. Set one as the 'pong receiver' and the others - * as 'ping transmit' units. The ping units unit will send out the value of millis() - * once a second. The pong unit will respond back with a copy of the value. - * The ping unit can get that response back, and - * determine how long the whole cycle took. + * Deploy this on up to six nodes. Set one as the 'pong receiver' by tying the + * role_pin low, and the others will be 'ping transmit' units. The ping units + * unit will send out the value of millis() once a second. The pong unit will + * respond back with a copy of the value. Each ping unit can get that response + * back, and determine how long the whole cycle took. * - * This example requires a bit more complexity to determine which unit is - * which. The pong receiver is identified by having its role_pin tied to ground. + * This example requires a bit more complexity to determine which unit is which. + * The pong receiver is identified by having its role_pin tied to ground. * The ping senders are further differentiated by a byte in eeprom. */ @@ -27,8 +27,6 @@ #include "RF24.h" #include "printf.h" -extern EEPROMClass EEPROM; - // // Hardware configuration // @@ -45,9 +43,14 @@ const int role_pin = 7; // Topology // -// Radio pipe addresses for the 6 nodes to communicate -const uint64_t talking_pipes[6] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL, 0xF0F0F0F0C3LL, 0xF0F0F0F0B4LL, 0xF0F0F0F0A5LL, 0xF0F0F0F096LL }; -const uint64_t listening_pipes[6] = { 0x3A3A3A3AE1LL, 0x3A3A3A3AD2LL, 0x3A3A3A3AC3LL, 0x3A3A3A3AB4LL, 0x3A3A3A3AA5LL, 0x3A3A3A3A96LL }; +// Radio pipe addresses for the nodes to communicate. Only ping nodes need +// dedicated pipes in this topology. Each ping node has a talking pipe +// that it will ping into, and a listening pipe that it will listen for +// the pong. The pong node listens on all the ping node talking pipes +// and sends the pong back on the sending node's specific listening pipe. + +const uint64_t talking_pipes[5] = { 0xF0F0F0F0D2LL, 0xF0F0F0F0C3LL, 0xF0F0F0F0B4LL, 0xF0F0F0F0A5LL, 0xF0F0F0F096LL }; +const uint64_t listening_pipes[5] = { 0x3A3A3A3AD2LL, 0x3A3A3A3AC3LL, 0x3A3A3A3AB4LL, 0x3A3A3A3AA5LL, 0x3A3A3A3A96LL }; // // Role management @@ -76,7 +79,8 @@ role_e role; const uint8_t address_at_eeprom_location = 0; // What is our address (SRAM cache of the address from EEPROM) -// Note that zero is an INVALID address +// Note that zero is an INVALID address. The pong back unit takes address +// 1, and the rest are 2-6 uint8_t node_address; void setup(void) @@ -139,26 +143,26 @@ void setup(void) // // Open pipes to other nodes for communication // - - // Open 'our' pipe for writing - // ping nodes open the parent's pipe for reading - // pong node opens all children's pipes for reading - + + // The pong node listens on all the ping node talking pipes + // and sends the pong back on the sending node's specific listening pipe. if ( role == role_pong_back ) { - // Listen to all ping nodes' talking pipes - radio.openReadingPipe(1,talking_pipes[1]); - radio.openReadingPipe(2,talking_pipes[2]); - radio.openReadingPipe(3,talking_pipes[3]); - radio.openReadingPipe(4,talking_pipes[4]); - radio.openReadingPipe(5,talking_pipes[5]); + radio.openReadingPipe(1,talking_pipes[0]); + radio.openReadingPipe(2,talking_pipes[1]); + radio.openReadingPipe(3,talking_pipes[2]); + radio.openReadingPipe(4,talking_pipes[3]); + radio.openReadingPipe(5,talking_pipes[4]); } + + // Each ping node has a talking pipe that it will ping into, and a listening + // pipe that it will listen for the pong. if ( role == role_ping_out ) { // Write on our talking pipe - radio.openWritingPipe(talking_pipes[node_address-1]); + radio.openWritingPipe(talking_pipes[node_address-2]); // Listen on our listening pipe - radio.openReadingPipe(1,listening_pipes[node_address-1]); + radio.openReadingPipe(1,listening_pipes[node_address-2]); } // @@ -172,6 +176,15 @@ void setup(void) // radio.printDetails(); + + // + // Prompt the user to assign a node address if we don't have one + // + + if ( role == role_invalid ) + { + printf("\n\r*** NO NODE ADDRESS ASSIGNED *** Send 1 through 6 to assign an address\n\r"); + } } void loop(void) @@ -238,7 +251,7 @@ void loop(void) done = radio.read( &got_time, sizeof(unsigned long) ); // Spew it - printf("Got payload %lu from %i...",got_time,pipe_num); + printf("Got payload %lu from node %i...",got_time,pipe_num+1); } // First, stop listening so we can talk @@ -277,4 +290,4 @@ void loop(void) } } } -// vim:ai sts=2 sw=2 ft=cpp +// vim:ai:ci sts=2 sw=2 ft=cpp