Documente Academic
Documente Profesional
Documente Cultură
// August 2016
// Radar constants
#define BASEBAND_NUM_OF_BINS_MAX 52
typedef struct
uint32_t frameCtr;
uint32_t numOfBins;
float binLength;
float samplingFrequency;
uint32_t carrierFrequency;
float rangeOffset;
}xtDatamsgBasebandAP_header_t;
xtDatamsgBasebandAP_header_t basebandHeader;
/*********************
* SETUP FUNCTION
********************/
// Setup USB serial for debug communication. Will wait for you to connect to
Serial on your computer
Serial.begin(921600);
while (!Serial);
Serial1.begin(115200);
setBaudRate(921600);
Serial1.begin(921600);
delay(2000);
// Reset module
empty_serial_buffer();
Serial.println("Resetting module...");
send_command(&xts_spc_mod_reset, 1);
while (!radar_ready()) {
empty_serial_buffer();
send_command(&xts_spc_mod_reset, 1);
load_sleep_app();
// Set detection zone (0.4 - 2.0 gives radar frame 0.3 - 2.3)
setDetectionZone(0.4, 2.0);
Serial.println("Setting sensitivity...");
setSensitivity(9);
execute_app();
/*********************
* MAIN LOOP
********************/
void loop (void)
// If the arduino is not fast enough to receive all the data from the radar
// we need to empty the buffer of old data to avoid lagging and overflow
empty_serial_buffer();
// Get data
// Process data
if (len > 0) {
/*************************************
*************************************/
/**
* Reads one character from the serial RX buffer.
*/
delay(1);
return Serial1.read();
/**
*/
bool check_overflow()
return true;
return false;
}
// Empties the Serial RX buffer
void empty_serial_buffer()
/**
* Sends a command
*/
// Calculate CRC
crc ^= cmd[i];
/*
Serial1.write(xt_start);
Serial1.write(cmd, len);
Serial1.write(crc);
Serial1.write(xt_stop);
Serial1.flush();*/
/**
*/
int last_char = 0;
while (1)
{
// Check if buffer is overflowed
if (check_overflow())
empty_serial_buffer();
cur_char = serial_read_blocking();
if (cur_char == xt_escape)
if (check_overflow()) {
return -1;
serial_read_blocking();
recv_buf[0] = xt_start;
recv_len = 1;
break;
}
}
while (1)
if (check_overflow()) {
return -1;
// read a byte
if (cur_char == xt_escape)
if (check_overflow()) {
return -1;
cur_char = serial_read_blocking();
recv_buf[recv_len] = cur_char;
recv_len++;
return -1;
else
break;
recv_buf[recv_len] = cur_char;
recv_len++;
if (cur_char == xt_stop) {
// Calculate CRC
char crc = 0;
char escape_found = 0;
// CRC is calculated without the crc itself and the stop byte, hence the -2 in
the counter
crc ^= recv_buf[i];
escape_found = 0;
if (print_data) {
// Serial.print("Data: ");
// Serial.print(recv_buf[i] ,HEX);
// Serial.print(" ");
// Serial.println(" ");
}
// Check if calculated CRC matches the recieved
if (crc == recv_buf[recv_len-2]) {
else {
/*********************
* PROTOCOL COMMANDS
*********************/
/**
*/
void check_ack()
{
if (recv_buf[1] == xts_spr_system) {
receive_data(true);
if (recv_buf[1] != xts_spr_ack) {
while (1) {}
/**
*/
bool radar_ready()
receive_data(true);
if (recv_buf[2] == xts_sprs_ready) {
return true;
delay(500);
}
return false;
/**
* Execute application
*/
void execute_app()
send_buf[0] = xts_spc_mod_setmode;
send_buf[1] = xts_sm_run;
send_command(send_buf, 2);
// Get response
receive_data(true);
/**
*/
void load_sleep_app()
{
send_buf[0] = xts_spc_mod_loadapp;
send_command(send_buf, 5);
//Get response
receive_data(true);
check_ack();
/**
*/
void enable_raw_data()
long data_length = 1;
send_buf[0] = xts_spc_dir_command;
send_buf[1] = xts_sdc_app_setint;
send_command(send_buf, 14);
//Get response
receive_data(true);
check_ack();
/**
*/
send_buf[0] = xts_spc_appcommand;
send_buf[1] = xts_spca_set;
send_command(send_buf, 14);
//Get response
receive_data(true);
check_ack();
/**
* Set sensitivity
*/
send_buf[0] = xts_spc_appcommand;
send_buf[1] = xts_spca_set;
//Get response
receive_data(true);
check_ack();
/**
*/
send_buf[0] = xts_spc_dir_command;
send_buf[1] = xts_sdc_comm_setbaudrate;
send_command(send_buf, 6);
}
/************************
* Higher-level commands
***********************/
/**
*/
float arrayAmplitude[52];
if (data[0] == xts_spr_appdata)
//Check ID of content
if (pcontentId == xts_id_resp_status)
memcpy(&basebandHeader, data+5,
sizeof(xtDatamsgBasebandAP_header_t));
if (basebandHeader.numOfBins != 52) {
// Serial.println(basebandHeader.numOfBins);
memcpy(arrayAmplitude,
data+5+sizeof(xtDatamsgBasebandAP_header_t),
basebandHeader.numOfBins*sizeof(float));
onDatamsgBasebandAP(&basebandHeader, arrayAmplitude);
else
//Serial.println("Unknown data");
}
}
/**
*/
float arrayAmplitudeFiltered[BASEBAND_NUM_OF_BINS_MAX];
int index;
float ampMax;
float distance;
return;
}
arrayCluttermap[i] = arrayCluttermap[i]*(1-adaptiveCluttermapWeight) +
arrayAmplitude[i]*adaptiveCluttermapWeight;
if (index>basebandHeader->numOfBins/2)
triggerThreshold = 1.5;
else
triggerThreshold = 3;
// Detection
last_detection = basebandHeader->frameCtr;
distance = basebandHeader->rangeOffset + index * basebandHeader-
>binLength;
distanceFiltered = distanceFiltered*(1-distanceFilterWeight) +
distance*distanceFilterWeight;
Serial.print("Detection at ");
Serial.print((int)distanceFiltered);
Serial.print(".");
// Serial.println(ampMax);
Serial.println(ampMax);
/**
*/
{
float amax = 0.0;
int idx = 0;
amax = data[i];
idx = i;
*ampMax = amax;
return idx;
/**
*/
// Serial.println("Data:");
for (int i = 0; i < length; i++) {
// Serial.print(data[i]);
// Serial.print(", ");
// Serial.println(" ");