設計思路
Arduino Leonardo初始化為發送模式,發送完成后,立即切換為接收模式,不停的監聽,收到數據后立即切換為發送模式,若超過一定時間還為接收到數據,則切換為發送模式。
樹莓派初始化為接收模式,接收到數據后立即切換為發送模式,超過一定時間為接收到數據則切換為發送模式,發送數據后立即切換為接收模式。
代碼實現
Arduino Leonardo代碼
如下:
#include <SPI.h> #include "RF24.h" #include <SPI.h> #include "RF24.h" #include <printf.h> /****************** User Config ***************************/ /*** Set this radio as radio number 0 or 1 ***/ bool radioNumber = 0; /* Hardware configuration: Set up nRF24L01 radio on SPI bus plus pins 7 & 8 */ RF24 radio(9,10); /**********************************************************/ byte addresses[][6] = {"1Node","2Node"}; // Used to control whether this node is sending or receiving bool role = 1;//1表示發送模式,0表示接收模式 unsigned long start_time = micros(); //這個是我們即將建立的傳輸渠道編碼 //!!要和另一個模塊的一致 const uint64_t pipes = 0xE8E8F0F0E1LL; //這個變量會保持我們接受到的信息 //變量類型一定要和傳過來的一樣 //要傳輸的數據 unsigned long sendData = 1; unsigned long head = 0x01000000;//高8位為頭標志,根據標志不同區分不同發送源,0x00為中心主節點 unsigned long receData; void setup() { pinMode(13,OUTPUT);//指示燈 Serial.begin(57600); printf_begin(); Serial.println(F("RF24/examples/GettingStarted")); radio.begin(); radio.setPALevel(RF24_PA_MAX); radio.openWritingPipe(pipes); } void loop() { Serial.print("role:"); Serial.println(role); if(role){ unsigned long data = sendData+head; Serial.print("Sending:"); Serial.println(data); digitalWrite(13,HIGH); bool ok = radio.write(&data,sizeof(unsigned long)); role = 0;
radio.openReadingPipe(1,pipes); radio.startListening(); start_time = micros(); } if(!role){ digitalWrite(13,LOW); if(radio.available()){ radio.read(&receData,sizeof(unsigned long)); Serial.print("Response:"); Serial.println(receData); role = 1; radio.stopListening();
radio.openWritingPipe(pipes); }else{ unsigned long end_time = micros(); if((end_time-start_time)>=1000){ role = 1; radio.stopListening();
radio.openWritingPipe(pipes); } } } } // Loop
樹莓派代碼
如下:
#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; bool role = 0;//receive mode unsigned long start_time=millis(); unsigned long count=0; /********************************/ // Radio pipe addresses for the 2 nodes to communicate. const uint64_t pipes = 0xE8E8F0F0E1LL; unsigned long receData; unsigned long respData=0x01; unsigned long head=0x00000000; int main(int argc, char** argv){ 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(); radio.openReadingPipe(1,pipes); /***********************************/ // This simple sketch opens two pipes for these two nodes to communicate // back and forth. radio.startListening(); cout << "Listening .... \n"; // forever loop while (1) { // Pong back role. Receive each packet, dump it out, and send it back // if(!role){ if(radio.available()){ count++; radio.read(&receData,sizeof(unsigned long)); printf("Get Data:size(%d),count(%lu) %lu \n",sizeof(unsigned long),count,receData); role = 1; radio.stopListening();
radio.openWritingPipe(pipes); }else{ unsigned long end_time = millis(); if((end_time-start_time)>=1000){ role = 1; radio.stopListening();
radio.openWritingPipe(pipes); } } } if(role){ unsigned long data = respData + head; radio.write(&data,sizeof(unsigned long)); printf("Send Data:size(%d),%lu \n",sizeof(unsigned long),data); role = 0; radio.startListening();
radio.openReadingPipe(1,pipes); start_time = millis(); } } // forever loop return 0; }