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.7 KiB
C++
111 lines
3.7 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 BasicSender.ino
|
|
* Use this to test simple sender/receiver functionality with two
|
|
* DW1000. Complements the "BasicReceiver" 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
|
|
boolean sent = false;
|
|
volatile boolean sentAck = false;
|
|
volatile unsigned long delaySent = 0;
|
|
int16_t sentNum = 0; // todo check int type
|
|
DW1000Time sentTime;
|
|
|
|
void setup() {
|
|
// DEBUG monitoring
|
|
Serial.begin(9600);
|
|
Serial.println(F("### DW1000-arduino-sender-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(5);
|
|
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) sent messages
|
|
DW1000.attachSentHandler(handleSent);
|
|
// start a transmission
|
|
transmitter();
|
|
}
|
|
|
|
void handleSent() {
|
|
// status change on sent success
|
|
sentAck = true;
|
|
}
|
|
|
|
void transmitter() {
|
|
// transmit some data
|
|
Serial.print("Transmitting packet ... #"); Serial.println(sentNum);
|
|
DW1000.newTransmit();
|
|
DW1000.setDefaults();
|
|
String msg = "Hello DW1000, it's #"; msg += sentNum;
|
|
DW1000.setData(msg);
|
|
// delay sending the message for the given amount
|
|
DW1000Time deltaTime = DW1000Time(10, DW1000Time::MILLISECONDS);
|
|
DW1000.setDelay(deltaTime);
|
|
DW1000.startTransmit();
|
|
delaySent = millis();
|
|
}
|
|
|
|
void loop() {
|
|
if (!sentAck) {
|
|
return;
|
|
}
|
|
// continue on success confirmation
|
|
// (we are here after the given amount of send delay time has passed)
|
|
sentAck = false;
|
|
// update and print some information about the sent message
|
|
Serial.print("ARDUINO delay sent [ms] ... "); Serial.println(millis() - delaySent);
|
|
DW1000Time newSentTime;
|
|
DW1000.getTransmitTimestamp(newSentTime);
|
|
Serial.print("Processed packet ... #"); Serial.println(sentNum);
|
|
Serial.print("Sent timestamp ... "); Serial.println(newSentTime.getAsMicroSeconds());
|
|
// note: delta is just for simple demo as not correct on system time counter wrap-around
|
|
Serial.print("DW1000 delta send time [ms] ... "); Serial.println((newSentTime.getAsMicroSeconds() - sentTime.getAsMicroSeconds()) * 1.0e-3);
|
|
sentTime = newSentTime;
|
|
sentNum++;
|
|
// again, transmit some data
|
|
transmitter();
|
|
}
|