DAMI BASE rx_base_v3

 

 

 

//
// DAMI nRF24L01 RX base station
//
// fixed station that collect real time data from robot
// using the nRF24L01 2.4GHz transciver
//
// it provides output to display on serial monitor
// or to use in a processing3 sketch for map display
//
// based on SimpleRxAckPayload - the slave or the receiver
// http://forum.arduino.cc/index.php?topic=421081
//

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define CE_PIN 9
#define CSN_PIN 10

const byte thisSlaveAddress[5] = {'R','x','A','A','A'};

RF24 radio(CE_PIN, CSN_PIN);

int ackData[8] = {0, 0, 0 , 0 , 0, 0, 0 }; // the values to be sent to the master
bool newRadioData = false;

char radioDataReceivedBuffer[32]; // this must match dataToSend in the TX

union u_tag {
byte b[4];
int i[2];
long l;
double d;
} rData[2][8]; // 0=loopData, 1=frontScanData

boolean rDataNew[2] = {false, false};

int stationInternalCommand = 0;
int stationSerialDataDisplayCode = 0;

int remoteCommand = 0;

//==============

void setup() {
Serial.begin(115200);
//Serial.println("DAMI nRF24L01 RX base station starting...");
radio.begin();
radio.setDataRate( RF24_250KBPS );
radio.openReadingPipe(1, thisSlaveAddress);
radio.enableAckPayload();
radio.writeAckPayload(1, &ackData, sizeof(ackData)); // pre-load data
radio.startListening();
}

//==========

void loop() {
// get remote robot data
getRadioData();

// get serial data
getSerialData();

// show remote robot data
showData();
}

//============

void getRadioData() {
if ( radio.available() ) {
radio.read( &radioDataReceivedBuffer, sizeof(radioDataReceivedBuffer) );
updateReplyData();
newRadioData = true;
}
}

//============

void getSerialData() {
// if there's any serial available, read it:
while (Serial.available() > 0) {
// look for the next valid integer in the incoming serial stream:
int tmp1 = Serial.parseInt();
if (Serial.read() == '\n') {
stationInternalCommand = tmp1;
switch(stationInternalCommand) {
case 0:
case 1:
case 2:
stationSerialDataDisplayCode = tmp1;
break;
case 11:
remoteCommand = 11;
break;
case 12:
remoteCommand = 2;
break;
case 19:
remoteCommand = 254;
break;
}
}
}
}

//============

void showData() {

int i;
byte currentPage = 0;

if (newRadioData == true) {
// manage received radio data using first byte of 32 byte page as index
// before apply the page index check that index value is allowed
if(radioDataReceivedBuffer[0] >= 0 && radioDataReceivedBuffer[0] < 2) { // HARDCODED
currentPage = radioDataReceivedBuffer[0];
for(i=0; i < 8; i++) {
rData[currentPage][i].b[0] = radioDataReceivedBuffer[i*4 + 0];
rData[currentPage][i].b[1] = radioDataReceivedBuffer[i*4 + 1];
rData[currentPage][i].b[2] = radioDataReceivedBuffer[i*4 + 2];
rData[currentPage][i].b[3] = radioDataReceivedBuffer[i*4 + 3];
}
}

// bof debug 
//Serial.print(stationInternalCommand); Serial.print(" ");
//Serial.print(remoteCommand); Serial.print(" ");
//Serial.println("");
//bof debug

// select the output for data
switch(stationSerialDataDisplayCode) {
case 0:
//showData4ProcessingMap();
break;
case 1:
showData4ProcessingMap();
break;
case 2:
showData4SerialMonitor();
break;
}

// reset flag
newRadioData = false;

// reset rdata page
if(currentPage > 0) {
for(i=0; i < 8; i++) {
rData[currentPage][i].b[0] = 0;
rData[currentPage][i].b[1] = 0;
rData[currentPage][i].b[2] = 0;
rData[currentPage][i].b[3] = 0;
}
}
}
}

void showData4SerialMonitor() {
Serial.print("D0 ");

Serial.print(rData[0][0].b[0]); Serial.print(" "); // data type
Serial.print(rData[0][0].b[1]); Serial.print(" "); // loopTime
Serial.print(rData[0][0].b[2]); Serial.print(" "); // prgIdx
Serial.print(rData[0][0].b[3]); Serial.print(" "); // cmd

Serial.print(rData[0][1].b[0]); Serial.print(" "); // prgCmd[prgIdx].intCmd
Serial.print(rData[0][1].b[1]); Serial.print(" "); // internalCmdProcessStatus
Serial.print(rData[0][1].b[2]); Serial.print(" "); // prgCmd[prgIdx].extCmd
Serial.print(rData[0][1].b[3]); Serial.print(" "); // bodyMoveProcessStatus

Serial.print(rData[0][2].i[0]); Serial.print(" "); // bodyFrontLaserDistanceQuick
Serial.print(rData[0][2].i[1]); Serial.print(" "); // bodyFrontLaserDistance
Serial.print(rData[0][3].i[0]); Serial.print(" "); // bodySonarDistance[0]
Serial.print(rData[0][3].i[1]); Serial.print(" "); // bodySonarDistance[1]

Serial.print(rData[0][4].d); Serial.print(" "); // bodyThetaRadians * 180 / PI
Serial.print(rData[0][5].d); Serial.print(" "); // bodyPosX
Serial.print(rData[0][6].d); Serial.print(" "); // bodyPosY

Serial.print(rData[0][7].i[0]); Serial.print(" "); // target (int)prgCmd[prgIdx].units
Serial.print(rData[0][7].i[1]); Serial.print(" "); // done (int)stepsToUnits(bodyMotorLeftSteps)

//

Serial.print("SSKD ");
Serial.print(rData[1][1].i[0]); Serial.print(" "); // 0
Serial.print(rData[1][1].i[1]); Serial.print(" "); // 15
Serial.print(rData[1][2].i[0]); Serial.print(" "); // 30
Serial.print(rData[1][2].i[1]); Serial.print(" "); // 45
Serial.print(rData[1][3].i[0]); Serial.print(" "); // 60
Serial.print(rData[1][3].i[1]); Serial.print(" "); // 75
Serial.print(rData[1][4].i[0]); Serial.print(" "); // 90
Serial.print(rData[1][4].i[1]); Serial.print(" "); // 105
Serial.print(rData[1][5].i[0]); Serial.print(" "); // 120
Serial.print(rData[1][5].i[1]); Serial.print(" "); // 135
Serial.print(rData[1][6].i[0]); Serial.print(" "); // 150
Serial.print(rData[1][6].i[1]); Serial.print(" "); // 165
Serial.print(rData[1][7].i[0]); Serial.print(" "); // 180

//

Serial.print("AKPL ");
Serial.print(ackData[0]);
Serial.print(", ");
Serial.print(ackData[1]);
Serial.print(", ");
Serial.print(ackData[2]);
Serial.print(", ");
Serial.print(ackData[3]);
Serial.print(", ");
Serial.println(ackData[4]);
}

void showData4ProcessingMap() {
Serial.print(0); Serial.print(" ");
Serial.print(rData[0][5].d); Serial.print(" "); // bodyPosX
Serial.print(rData[0][6].d); Serial.print(" "); // bodyPosY
Serial.print(rData[0][4].d); Serial.print(" "); // bodyThetaRadians * 180 / PI

Serial.print(rData[0][2].i[1]); Serial.print(" "); // bodyFrontLaserDistance
Serial.print(0); Serial.print(" ");
Serial.print(rData[0][3].i[0]); Serial.print(" "); // bodySonarDistance[0]
Serial.print(-90); Serial.print(" ");
Serial.print(rData[0][3].i[1]); Serial.print(" "); // bodySonarDistance[1]
Serial.print(90); Serial.print(" ");

Serial.print(rData[1][1].i[0]); Serial.print(" "); // 0
Serial.print(0); Serial.print(" ");
Serial.print(rData[1][1].i[1]); Serial.print(" "); // 15
Serial.print(15); Serial.print(" ");
Serial.print(rData[1][2].i[0]); Serial.print(" "); // 30
Serial.print(30); Serial.print(" ");
Serial.print(rData[1][2].i[1]); Serial.print(" "); // 45
Serial.print(45); Serial.print(" ");
Serial.print(rData[1][3].i[0]); Serial.print(" "); // 60
Serial.print(60); Serial.print(" ");
Serial.print(rData[1][3].i[1]); Serial.print(" "); // 75
Serial.print(75); Serial.print(" ");
Serial.print(rData[1][4].i[0]); Serial.print(" "); // 90
Serial.print(90); Serial.print(" ");
Serial.print(rData[1][4].i[1]); Serial.print(" "); // 105
Serial.print(105); Serial.print(" ");
Serial.print(rData[1][5].i[0]); Serial.print(" "); // 120
Serial.print(120); Serial.print(" ");
Serial.print(rData[1][5].i[1]); Serial.print(" "); // 135
Serial.print(135); Serial.print(" ");
Serial.print(rData[1][6].i[0]); Serial.print(" "); // 150
Serial.print(150); Serial.print(" ");
Serial.print(rData[1][6].i[1]); Serial.print(" "); // 165
Serial.print(165); Serial.print(" ");
Serial.print(rData[1][7].i[0]); Serial.print(" "); // 180
Serial.print(180); Serial.print(" ");

Serial.print(rData[1][0].b[1]); Serial.print(" "); // decision
Serial.print(rData[0][0].b[1]); Serial.print(" "); // loopTime
Serial.print(rData[0][0].b[2]); Serial.print(" "); // prgIdx
Serial.print(rData[0][0].b[3]); Serial.print(" "); // cmd

Serial.print(rData[0][1].b[0]); Serial.print(" "); // prgCmd[prgIdx].intCmd
Serial.print(rData[0][1].b[1]); Serial.print(" "); // internalCmdProcessStatus
Serial.print(rData[0][1].b[2]); Serial.print(" "); // prgCmd[prgIdx].extCmd
Serial.print(rData[0][1].b[3]); Serial.print(" "); // bodyMoveProcessStatus

Serial.println("");
}

//================
/*
// coordinates based on polar coordinates and pose
// point distante, point angle and robot orientation
float getPointXpos(int d, float a, float t) {
float b = t + (float)(a / 180.0) * PI;
return d * cos(b);
}

float getPointYpos(int d, float a, float t) {
float b = t + (float)(a / 180.0) * PI;
return d * sin(b);
}
*/
//================

void updateReplyData() {
// the values to be sent to the master
// this is a global variable for debuging
//int ackData[8] = {0, 0, 0 , 0 , 0, 0, 0 };

//Serial.print("updateReplyData ");
//Serial.println(remoteCommand);
switch(remoteCommand) {
case 11:
case 254:
ackData[1] = remoteCommand;
break;
case 2:
ackData[1] = 2;
ackData[2] = 0;
ackData[3] = 2;
ackData[4] = 500;
break;
}

// send command
radio.writeAckPayload(1, &ackData, sizeof(ackData)); // load the payload for the next time

// command sent
if(remoteCommand) {
// reset vars
remoteCommand = 0;
// required because ackData is a
// global variable for debuging
ackData[1] = 0;
ackData[2] = 0;
ackData[3] = 0;
ackData[4] = 0;
}
}