// Dorkboard vs. Nordic RF2401A // bzzt@knowhere.net // USE FREELY AT YOUR OWN RISK! int ledPin = 13; // LED connected to digital pin 13 int DR1_PIN = 3; // data ready int CLK1_PIN = 4; // clock int DATA_PIN = 5; // data bin int CS_PIN = 6; // chip select (enables config mode) int CE_PIN = 7; // chip enable unsigned char data_array[4]; unsigned char counter; bool isTransmit = 0; // config_setup = 0b.0010.0011.0110.1110.0000.0101; //Look at pages 13-15 for more bit info const static unsigned long baseConfigWord = 0x236E04; void writeBits(uint32_t data, uint32_t bits) { for (uint32_t i = 0; i < bits; i++) { uint32_t bit = (data & (1L << ((bits - 1L) - i))) ? HIGH : LOW; digitalWrite(DATA_PIN, bit); digitalWrite(CLK1_PIN, 1); digitalWrite(CLK1_PIN, 0); } } void sendConfig(unsigned long config) { pinMode(DATA_PIN, OUTPUT); // sets the digital pin as output pinMode(CE_PIN, OUTPUT); pinMode(CS_PIN, OUTPUT); pinMode(CLK1_PIN, OUTPUT); pinMode(DR1_PIN, INPUT); digitalWrite(CE_PIN, LOW); digitalWrite(CS_PIN, HIGH); delay(5); writeBits(config, 24); digitalWrite(CS_PIN, LOW); digitalWrite(CE_PIN, LOW); delay(200); } //2.4G Configuration - Receiver //This setups up a RF-24G for receiving at 1mbps void configure_receiver(void) { // Receiver mode config is the same as transmit except we need to turn on recv bit unsigned long recvConfig = baseConfigWord | 0x1; sendConfig(recvConfig); pinMode(DATA_PIN, INPUT); //Start monitoring the air digitalWrite(CE_PIN, 1); delay(200); Serial.println("RX Configuration finished..."); } //2.4G Configuration - Transmitter //This sets up one RF-24G for shockburst transmission void configure_transmitter(void) { unsigned long transConfig = baseConfigWord; sendConfig(transConfig); Serial.println("TX Configuration finished..."); } //This sends out the data stored in the data_array //data_array must be setup before calling this function void transmit_data(void) { digitalWrite(CE_PIN, 1); //Clock in address // rf_address = 0b.1110.0111; //Power-on Default for all units (on page 11) unsigned char rf_address = 0xE7; writeBits(rf_address, 8); //Clock in the data_array for(unsigned char i = 0 ; i < 4 ; i++) //4 bytes { unsigned char temp = data_array[i]; writeBits(temp, 8); } digitalWrite(CE_PIN, 0); } //This will clock out the current payload into the data_array void receive_data(void) { unsigned char i, j, temp; // digitalWrite(CE_PIN, 0); //Erase the current data array so that we know we are looking at actual received data data_array[0] = 0x00; data_array[1] = 0x00; data_array[2] = 0x00; data_array[3] = 0x00; //Clock in data, we are setup for 32-bit payloads for(i = 0 ; i < 4 ; i++) //4 bytes { temp = 0; for(j = 0 ; j < 8 ; j++) //8 bits each { temp <<= 1; temp = temp | digitalRead(DATA_PIN); digitalWrite(CLK1_PIN, 1); delay(1); digitalWrite(CLK1_PIN, 0); } data_array[i] = temp; //Store this byte } // DR should go low after reading all of the data // if (digitalRead(DR1_PIN) == 0) // Serial.println("DR went low"); Serial.println("Data received"); for (i = 0; i < 4; i++) Serial.println(data_array[i], HEX); // digitalWrite(CE_PIN, 1); } void setup() // run once, when the sketch starts { pinMode(ledPin, OUTPUT); // sets the digital pin as output Serial.begin(9600); delay(100); if (isTransmit) configure_transmitter(); else configure_receiver(); } void looptransmit() { counter++; data_array[0] = 0x12; data_array[1] = 0x34; data_array[2] = 0xAB; data_array[3] = counter; Serial.println("Sending data"); transmit_data(); digitalWrite(ledPin, HIGH); // delay(1000); //Have a second between transmissions just for evaluation digitalWrite(ledPin, LOW); } void loopreceive() { unsigned long timer = millis(); while (digitalRead(DR1_PIN) == 0) { if (millis() - timer > 10000) { Serial.println("timeout.."); break; } } // if (digitalRead(DR1_PIN) == HIGH) // Serial.print("fuck yeah bitz"); receive_data(); } void loop() // run over and over again { if (isTransmit) looptransmit(); else loopreceive(); }