Anchor (esp32/uwb_anchor): - DW1000Ranging library (200m range, MODE_LONGDATA_RANGE_ACCURACY) - Unique addresses per anchor (anchor0/anchor1 build envs) - +RANGE output: anchor_id, tag_addr, range_mm, rssi - ESP-NOW receiver: forwards tag packets + priority E-STOP to Jetson - AT+ID? command Tag with Display (esp32/uwb_tag): - DW1000Ranging as tag, auto-discovers anchors - SSD1306 OLED: big distance, per-anchor ranges, RSSI bars, link status - ESP-NOW broadcast: range/heartbeat/estop packets - E-Stop on GPIO 0 (BOOT button), 10Hz TX while held - Display at 5Hz, ranging driven by DW1000Ranging.loop() Shared: - lib/DW1000/ extracted from mf_DW1000.zip (Makerfabs fork) - lib_extra_dirs for PlatformIO to find local library
111 lines
3.5 KiB
C++
111 lines
3.5 KiB
C++
/*
|
|
* Copyright (c) 2015 by Thomas Trojer <thomas@trojer.net>
|
|
* Decawave DW1000 library for arduino.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
* @file BasicReceiver.ino
|
|
* Use this to test simple sender/receiver functionality with two
|
|
* DW1000. Complements the "BasicSender" example sketch.
|
|
*
|
|
* @todo
|
|
* - move strings to flash (less RAM consumption)
|
|
*
|
|
*/
|
|
|
|
#include <SPI.h>
|
|
#include <DW1000.h>
|
|
|
|
// connection pins
|
|
const uint8_t PIN_RST = 9; // reset pin
|
|
const uint8_t PIN_IRQ = 2; // irq pin
|
|
const uint8_t PIN_SS = SS; // spi select pin
|
|
|
|
// DEBUG packet sent status and count
|
|
volatile boolean received = false;
|
|
volatile boolean error = false;
|
|
volatile int16_t numReceived = 0; // todo check int type
|
|
String message;
|
|
|
|
void setup() {
|
|
// DEBUG monitoring
|
|
Serial.begin(9600);
|
|
Serial.println(F("### DW1000-arduino-receiver-test ###"));
|
|
// initialize the driver
|
|
DW1000.begin(PIN_IRQ, PIN_RST);
|
|
DW1000.select(PIN_SS);
|
|
Serial.println(F("DW1000 initialized ..."));
|
|
// general configuration
|
|
DW1000.newConfiguration();
|
|
DW1000.setDefaults();
|
|
DW1000.setDeviceAddress(6);
|
|
DW1000.setNetworkId(10);
|
|
DW1000.enableMode(DW1000.MODE_LONGDATA_RANGE_LOWPOWER);
|
|
DW1000.commitConfiguration();
|
|
Serial.println(F("Committed configuration ..."));
|
|
// DEBUG chip info and registers pretty printed
|
|
char msg[128];
|
|
DW1000.getPrintableDeviceIdentifier(msg);
|
|
Serial.print("Device ID: "); Serial.println(msg);
|
|
DW1000.getPrintableExtendedUniqueIdentifier(msg);
|
|
Serial.print("Unique ID: "); Serial.println(msg);
|
|
DW1000.getPrintableNetworkIdAndShortAddress(msg);
|
|
Serial.print("Network ID & Device Address: "); Serial.println(msg);
|
|
DW1000.getPrintableDeviceMode(msg);
|
|
Serial.print("Device mode: "); Serial.println(msg);
|
|
// attach callback for (successfully) received messages
|
|
DW1000.attachReceivedHandler(handleReceived);
|
|
DW1000.attachReceiveFailedHandler(handleError);
|
|
DW1000.attachErrorHandler(handleError);
|
|
// start reception
|
|
receiver();
|
|
}
|
|
|
|
void handleReceived() {
|
|
// status change on reception success
|
|
received = true;
|
|
}
|
|
|
|
void handleError() {
|
|
error = true;
|
|
}
|
|
|
|
void receiver() {
|
|
DW1000.newReceive();
|
|
DW1000.setDefaults();
|
|
// so we don't need to restart the receiver manually
|
|
DW1000.receivePermanently(true);
|
|
DW1000.startReceive();
|
|
}
|
|
|
|
void loop() {
|
|
// enter on confirmation of ISR status change (successfully received)
|
|
if (received) {
|
|
numReceived++;
|
|
// get data as string
|
|
DW1000.getData(message);
|
|
Serial.print("Received message ... #"); Serial.println(numReceived);
|
|
Serial.print("Data is ... "); Serial.println(message);
|
|
Serial.print("FP power is [dBm] ... "); Serial.println(DW1000.getFirstPathPower());
|
|
Serial.print("RX power is [dBm] ... "); Serial.println(DW1000.getReceivePower());
|
|
Serial.print("Signal quality is ... "); Serial.println(DW1000.getReceiveQuality());
|
|
received = false;
|
|
}
|
|
if (error) {
|
|
Serial.println("Error receiving a message");
|
|
error = false;
|
|
DW1000.getData(message);
|
|
Serial.print("Error data is ... "); Serial.println(message);
|
|
}
|
|
}
|