From 1ed10b5a950d3ba779d66dec1b9782720eac4abc Mon Sep 17 00:00:00 2001 From: Egor Shitikov Date: Mon, 22 Jul 2024 16:17:04 -0700 Subject: [PATCH] first commit --- .gitignore | 5 + .vscode/extensions.json | 10 ++ README.md | 21 ++++ SpectrumScan.py | 176 +++++++++++++++++++++++++++++ include/README | 39 +++++++ lib/README | 46 ++++++++ media/UCOG-SA.JPEG | Bin 0 -> 4235 bytes media/ucog-mono.png | Bin 0 -> 1124 bytes media/ucog.png | Bin 0 -> 86047 bytes platformio.ini | 19 ++++ src/images.h | 101 +++++++++++++++++ src/main.cpp | 244 ++++++++++++++++++++++++++++++++++++++++ test/README | 11 ++ 13 files changed, 672 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/extensions.json create mode 100644 README.md create mode 100644 SpectrumScan.py create mode 100644 include/README create mode 100644 lib/README create mode 100644 media/UCOG-SA.JPEG create mode 100644 media/ucog-mono.png create mode 100644 media/ucog.png create mode 100644 platformio.ini create mode 100644 src/images.h create mode 100644 src/main.cpp create mode 100644 test/README diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..89cc49c --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.pio +.vscode/.browse.c_cpp.db* +.vscode/c_cpp_properties.json +.vscode/launch.json +.vscode/ipch diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..080e70d --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,10 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "platformio.platformio-ide" + ], + "unwantedRecommendations": [ + "ms-vscode.cpptools-extension-pack" + ] +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..130eec1 --- /dev/null +++ b/README.md @@ -0,0 +1,21 @@ +# Lora SA(Spectrum Analyzer) +RF Spectrum Analyzer using Lora Radio + +RadioLib SX126x Spectrum Scan + +Perform a spectrum power scan using SX126x. +The output is in the form of scan lines, each line has 33 power bins. +First power bin corresponds to -11 dBm, the second to -15 dBm and so on. +Higher number of samples in a bin corresponds to more power received +at that level. + +The spectrum analyzer perform power measurements in the configured bandwidth. + +To show the results in a plot, run the Python script +RadioLib/extras/SX126x_Spectrum_Scan/SpectrumScan.py + +# VSCode Platform.IO installation + +# Hardware + +# 3D printed case diff --git a/SpectrumScan.py b/SpectrumScan.py new file mode 100644 index 0000000..acc37a0 --- /dev/null +++ b/SpectrumScan.py @@ -0,0 +1,176 @@ +#!/usr/bin/python3 +# -*- encoding: utf-8 -*- + +import argparse +import serial +import sys +import numpy as np +import matplotlib as mpl +import matplotlib.pyplot as plt + +from datetime import datetime +from argparse import RawTextHelpFormatter + +# number of samples in each scanline +SCAN_WIDTH = 33 + +# scanline Serial start/end markers +SCAN_MARK_START = 'SCAN ' +SCAN_MARK_FREQ = 'FREQ ' +SCAN_MARK_END = ' END' + +# output path +OUT_PATH = 'out' + +# default settings +DEFAULT_BAUDRATE = 115200 +DEFAULT_COLOR_MAP = 'viridis' +DEFAULT_SCAN_LEN = 200 +DEFAULT_RSSI_OFFSET = -11 + +# Print iterations progress +# from https://stackoverflow.com/questions/3173320/text-progress-bar-in-terminal-with-block-characters +def printProgressBar (iteration, total, prefix = '', suffix = '', decimals = 1, length = 50, fill = '█', printEnd = "\r"): + """ + Call in a loop to create terminal progress bar + @params: + iteration - Required : current iteration (Int) + total - Required : total iterations (Int) + prefix - Optional : prefix string (Str) + suffix - Optional : suffix string (Str) + decimals - Optional : positive number of decimals in percent complete (Int) + length - Optional : character length of bar (Int) + fill - Optional : bar fill character (Str) + printEnd - Optional : end character (e.g. "\r", "\r\n") (Str) + """ + percent = ("{0:." + str(decimals) + "f}").format(100 * (iteration / float(total))) + filledLength = int(length * iteration // total) + bar = fill * filledLength + '-' * (length - filledLength) + print(f'\r{prefix} |{bar}| {percent}% {suffix}', end = printEnd) + if iteration == total: + print() + + +def main(): + parser = argparse.ArgumentParser(formatter_class=RawTextHelpFormatter, description=''' + RadioLib SX126x_Spectrum_Scan plotter script. Displays output from SX126x_Spectrum_Scan example + as grayscale and + + Depends on pyserial and matplotlib, install by: + 'python3 -m pip install pyserial matplotlib' + + Step-by-step guide on how to use the script: + 1. Upload the SX126x_Spectrum_Scan example to your Arduino board with SX1262 connected. + 2. Run the script with appropriate arguments. + 3. Once the scan is complete, output files will be saved to out/ + ''') + parser.add_argument('port', + type=str, + help='COM port to connect to the device') + parser.add_argument('--speed', + default=DEFAULT_BAUDRATE, + type=int, + help=f'COM port baudrate (defaults to {DEFAULT_BAUDRATE})') + parser.add_argument('--map', + default=DEFAULT_COLOR_MAP, + type=str, + help=f'Matplotlib color map to use for the output (defaults to "{DEFAULT_COLOR_MAP}")') + parser.add_argument('--len', + default=DEFAULT_SCAN_LEN, + type=int, + help=f'Number of scanlines to record (defaults to {DEFAULT_SCAN_LEN})') + parser.add_argument('--offset', + default=DEFAULT_RSSI_OFFSET, + type=int, + help=f'Default RSSI offset in dBm (defaults to {DEFAULT_RSSI_OFFSET})') + parser.add_argument('--freq', + default=-1, + type=float, + help=f'Default starting frequency in MHz') + args = parser.parse_args() + + freq_mode = False + scan_len = args.len + if (args.freq != -1): + freq_mode = True + scan_len = 1000 + + # create the color map and the result array + arr = np.zeros((SCAN_WIDTH, scan_len)) + + # scanline counter + row = 0 + + # list of frequencies in frequency mode + freq_list = [] + + # open the COM port + with serial.Serial(args.port, args.speed, timeout=None) as com: + while(True): + # update the progress bar + if not freq_mode: + printProgressBar(row, scan_len) + + # read a single line + try: + line = com.readline().decode('utf-8') + except: + continue + + if SCAN_MARK_FREQ in line: + new_freq = float(line.split(' ')[1]) + if (len(freq_list) > 1) and (new_freq < freq_list[-1]): + break + + freq_list.append(new_freq) + print('{:.3f}'.format(new_freq), end = '\r') + continue + + # check the markers + if (SCAN_MARK_START in line) and (SCAN_MARK_END in line): + # get the values + scanline = line[len(SCAN_MARK_START):-len(SCAN_MARK_END)].split(',') + for col in range(SCAN_WIDTH): + arr[col][row] = int(scanline[col]) + + # increment the row counter + row = row + 1 + + # check if we're done + if (not freq_mode) and (row >= scan_len): + break + + # scale to the number of scans (sum of any given scanline) + num_samples = arr.sum(axis=0)[0] + arr *= (num_samples/arr.max()) + + if freq_mode: + scan_len = len(freq_list) + + # create the figure + fig, ax = plt.subplots() + + # display the result as heatmap + extent = [0, scan_len, -4*(SCAN_WIDTH + 1), args.offset] + if freq_mode: + extent[0] = freq_list[0] + extent[1] = freq_list[-1] + im = ax.imshow(arr[:,:scan_len], cmap=args.map, extent=extent) + fig.colorbar(im) + + # set some properites and show + timestamp = datetime.now().strftime('%y-%m-%d %H-%M-%S') + title = f'RadioLib SX126x Spectral Scan {timestamp}' + if freq_mode: + plt.xlabel("Frequency [Hz]") + else: + plt.xlabel("Time [sample]") + plt.ylabel("RSSI [dBm]") + ax.set_aspect('auto') + fig.suptitle(title) + fig.canvas.manager.set_window_title(title) + plt.savefig(f'{OUT_PATH}/{title.replace(" ", "_")}.png', dpi=300) + plt.show() + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/include/README b/include/README new file mode 100644 index 0000000..194dcd4 --- /dev/null +++ b/include/README @@ -0,0 +1,39 @@ + +This directory is intended for project header files. + +A header file is a file containing C declarations and macro definitions +to be shared between several project source files. You request the use of a +header file in your project source file (C, C++, etc) located in `src` folder +by including it, with the C preprocessing directive `#include'. + +```src/main.c + +#include "header.h" + +int main (void) +{ + ... +} +``` + +Including a header file produces the same results as copying the header file +into each source file that needs it. Such copying would be time-consuming +and error-prone. With a header file, the related declarations appear +in only one place. If they need to be changed, they can be changed in one +place, and programs that include the header file will automatically use the +new version when next recompiled. The header file eliminates the labor of +finding and changing all the copies as well as the risk that a failure to +find one copy will result in inconsistencies within a program. + +In C, the usual convention is to give header files names that end with `.h'. +It is most portable to use only letters, digits, dashes, and underscores in +header file names, and at most one dot. + +Read more about using header files in official GCC documentation: + +* Include Syntax +* Include Operation +* Once-Only Headers +* Computed Includes + +https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff --git a/lib/README b/lib/README new file mode 100644 index 0000000..2593a33 --- /dev/null +++ b/lib/README @@ -0,0 +1,46 @@ + +This directory is intended for project specific (private) libraries. +PlatformIO will compile them to static libraries and link into executable file. + +The source code of each library should be placed in an own separate directory +("lib/your_library_name/[here are source files]"). + +For example, see a structure of the following two libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- README --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +and a contents of `src/main.c`: +``` +#include +#include + +int main (void) +{ + ... +} + +``` + +PlatformIO Library Dependency Finder will find automatically dependent +libraries scanning project source files. + +More information about PlatformIO Library Dependency Finder +- https://docs.platformio.org/page/librarymanager/ldf.html diff --git a/media/UCOG-SA.JPEG b/media/UCOG-SA.JPEG new file mode 100644 index 0000000000000000000000000000000000000000..2af6b6625d984946f742c11f61a3e8273c79504d GIT binary patch literal 4235 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 literal 0 HcmV?d00001 diff --git a/media/ucog-mono.png b/media/ucog-mono.png new file mode 100644 index 0000000000000000000000000000000000000000..0f73927dad28ee5f4814c0eb7b50757f7d558f9c GIT binary patch literal 1124 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

Az%Klb#$y#u)66<+fKpTGP3E87RocdSS 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 literal 0 HcmV?d00001 diff --git a/platformio.ini b/platformio.ini new file mode 100644 index 0000000..0be4ad5 --- /dev/null +++ b/platformio.ini @@ -0,0 +1,19 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[env:heltec_wifi_lora_32_V3] +platform = espressif32 +board = heltec_wifi_lora_32_V3 +framework = arduino +upload_speed = 115200 +monitor_speed = 115200 +board_build.f_cpu = 240000000 +lib_deps = + ropg/Heltec_ESP32_LoRa_v3@^0.9.1 diff --git a/src/images.h b/src/images.h new file mode 100644 index 0000000..7461691 --- /dev/null +++ b/src/images.h @@ -0,0 +1,101 @@ + +//'Logo_UCOG', 128x64px +//https://www.online-utility.org/image/convert/to/XBM +//https://javl.github.io/image2cpp/ +//#define 1721604660673_width 128 +//#define 1721604660673_height 64 + +const unsigned char epd_bitmap_ucog [] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0xF8, 0x01, 0x00, 0x00, + 0x00, 0xC0, 0x00, 0x00, 0x10, 0x84, 0xC3, 0x81, 0x03, 0x00, 0x60, 0x00, + 0xCC, 0x07, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x30, 0xE6, 0xF3, 0xE3, + 0x07, 0x00, 0x60, 0x00, 0x0C, 0x3E, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, + 0x30, 0x66, 0x10, 0x36, 0x00, 0x00, 0x60, 0x00, 0x06, 0xF8, 0x00, 0x00, + 0x00, 0x0E, 0x00, 0x00, 0x30, 0x26, 0x18, 0x36, 0x00, 0x00, 0x60, 0x00, + 0x07, 0xE0, 0x03, 0x00, 0x00, 0x07, 0x00, 0x00, 0x30, 0x26, 0x18, 0x36, + 0x07, 0x00, 0x60, 0x00, 0x03, 0x00, 0x1F, 0x00, 0xC0, 0x01, 0x00, 0x00, + 0x30, 0x26, 0x18, 0x36, 0x06, 0x00, 0x60, 0x80, 0x01, 0x00, 0x7C, 0x00, + 0xE0, 0x00, 0x00, 0x00, 0x30, 0x66, 0x38, 0x76, 0x06, 0x0C, 0x60, 0xC0, + 0x01, 0x00, 0xF0, 0x01, 0x78, 0x00, 0x00, 0x00, 0xE0, 0xE3, 0xF3, 0xE3, + 0x07, 0x0E, 0x60, 0xC0, 0x03, 0x00, 0x80, 0x0F, 0x1C, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0x60, 0xE0, 0x07, 0x00, 0x00, 0x3E, + 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x60, 0x60, + 0x0E, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xE0, 0x01, 0x60, 0x70, 0x1C, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x60, 0x30, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x60, 0x18, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0xF0, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0xFC, 0x0D, 0xE0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0xFE, 0x0F, + 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x67, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x61, 0x1C, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x60, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x60, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xE0, 0xE0, 0x01, 0x00, 0x00, 0x00, + 0xF0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x67, 0xE0, 0x83, + 0x03, 0x00, 0x00, 0xE0, 0xFF, 0xE1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, + 0xD0, 0x63, 0x60, 0x07, 0x07, 0x00, 0xC0, 0xFF, 0x03, 0x80, 0x03, 0x00, + 0x00, 0x08, 0x00, 0x02, 0xF0, 0x61, 0x60, 0x1C, 0x1F, 0x80, 0xFF, 0x07, + 0x00, 0x00, 0x0E, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xF8, + 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x18, 0x00, 0x02, + 0xF0, 0x7F, 0x60, 0xDC, 0x1F, 0x80, 0xFF, 0x07, 0x00, 0x00, 0x1E, 0x00, + 0x00, 0x00, 0x00, 0x02, 0xD0, 0x61, 0x60, 0x07, 0x0F, 0x00, 0xC0, 0xFF, + 0x03, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x67, 0xE0, 0x83, + 0x03, 0x00, 0x00, 0xF0, 0xFF, 0xC1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7E, 0xE0, 0xC1, 0x01, 0x00, 0x00, 0x00, 0xF8, 0x7F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x60, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xC0, 0x61, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x67, 0x0F, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0x0F, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1C, 0x00, 0xFC, 0x0D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0xF0, 0x18, 0xE0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x60, 0x18, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x60, 0x30, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x60, 0x70, 0x3C, 0x00, 0x00, 0xE0, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x60, 0x60, + 0x1E, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x07, 0x60, 0xE0, 0x0F, 0x00, 0x00, 0x3E, 0x0F, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x03, 0x00, 0x0F, 0x60, 0xC0, 0x03, 0x00, 0x80, 0x0F, + 0x1C, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x07, 0x00, 0x0C, 0x60, 0xC0, + 0x01, 0x00, 0xF0, 0x01, 0x38, 0x00, 0x00, 0x00, 0x00, 0x80, 0x81, 0x05, + 0x00, 0x08, 0x60, 0xC0, 0x01, 0x00, 0x7C, 0x00, 0xE0, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x83, 0x0C, 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, 0x1F, 0x00, + 0xC0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x8E, 0x0C, 0x00, 0x00, 0x60, 0x00, + 0x07, 0xE0, 0x03, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0xCC, 0x0F, + 0x00, 0x00, 0x60, 0x00, 0x06, 0xF8, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, + 0x00, 0x00, 0xCC, 0x1F, 0x00, 0x00, 0x60, 0x00, 0x0E, 0x3E, 0x00, 0x00, + 0x00, 0x1C, 0x00, 0x00, 0x00, 0x80, 0x67, 0x18, 0x00, 0x00, 0x60, 0x00, + 0xCC, 0x07, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x60, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0xFC, 0x01, 0x00, 0x00, + 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, +}; + +// Array of all bitmaps for convenience. (Total bytes used to store images in PROGMEM = 1040) +const int epd_bitmap_allArray_LEN = 1; +const unsigned char* epd_bitmap_allArray[1] = { + epd_bitmap_ucog +}; diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..51f5108 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,244 @@ + /** + RadioLib SX126x Spectrum Scan + + This example shows how to perform a spectrum power scan using SX126x. + The output is in the form of scan lines, each line has 33 power bins. + First power bin corresponds to -11 dBm, the second to -15 dBm and so on. + Higher number of samples in a bin corresponds to more power received + at that level. + + To show the results in a plot, run the Python script + RadioLib/extras/SX126x_Spectrum_Scan/SpectrumScan.py + + WARNING: This functionality is experimental and requires a binary patch + to be uploaded to the SX126x device. There may be some undocumented + side effects! + + For default module settings, see the wiki page + https://github.com/jgromes/RadioLib/wiki/Default-configuration#sx126x---lora-modem + + For full API reference, see the GitHub Pages + https://jgromes.github.io/RadioLib/ +*/ + +// frequency range in MHz to scan +#define FREQ_BEGIN 400.00 +#define FREQ_END 500.00 + +// Measurement bandwidth. Allowed bandwidth values (in kHz) are: +// 4.8, 5.8, 7.3, 9.7, 11.7, 14.6, 19.5, 23.4, 29.3, 39.0, 46.9, 58.6, +// 78.2, 93.8, 117.3, 156.2, 187.2, 234.3, 312.0, 373.6 and 467.0 +#define BANDWIDTH 93.8//467.0 + +// (optional) major and minor tickmarks at x MHz +#define MAJOR_TICKS 10 +// #define MINOR_TICKS 5 + +// Turns the 'PRG' button into the power button, long press is off +#define HELTEC_POWER_BUTTON // must be before "#include " +#include +#include +#include + +// This file contains binary patch for the SX1262 +#include "modules/SX126x/patches/SX126x_patch_scan.h" + +// Prints the scan measurement bins from the SX1262 in hex +#define PRINT_SCAN_VALUES +#define PRINT_PROFILE_TIME + +// numbers of the spectrum screan lines = width of screan +#define STEPS 128 +// Number of samples for each scan. Fewer samples = better temporal resolution. +#define SAMPLES 256 //(scan time = 1294) +#define MAJOR_TICK_LENGTH 3 +#define MINOR_TICK_LENGTH 1 +#define X_AXIS_WEIGHT 2 +#define HEIGHT RADIOLIB_SX126X_SPECTRAL_SCAN_RES_SIZE +// +#define SCALE_TEXT_TOP (HEIGHT + X_AXIS_WEIGHT + MAJOR_TICK_LENGTH) +#define STATUS_TEXT_TOP (64 - 14) +#define RANGE (float)(FREQ_END - FREQ_BEGIN) +#define SINGLE_STEP (float)(RANGE / STEPS) + +// Array to store the scan results +uint16_t result[RADIOLIB_SX126X_SPECTRAL_SCAN_RES_SIZE]; +// global variable +unsigned short int scan_var = 0; +// initialized flag +bool initialized = false; +bool led_flag = true; +// drone tetection flag +unsigned short int drone_detected = 0; + +unsigned int start_scan_text = (128 / 2) - 3; + +unsigned int scan_time = 0; + +uint64_t start = 0; + +unsigned int x,y = 0; + + +/** + * @brief Draws ticks on the display at regular whole intervals. + * + * @param every The interval between ticks in MHz. + * @param length The length of each tick in pixels. + */ +void drawTicks(float every, int length) { + float first_tick = FREQ_BEGIN + (every - (FREQ_BEGIN - (int)(FREQ_BEGIN / every) * every)); + if (first_tick < FREQ_BEGIN){ + first_tick += every; + } + for (float tick_freq = first_tick; tick_freq <= FREQ_END; tick_freq += every) { + int tick = round((tick_freq - FREQ_BEGIN) / SINGLE_STEP); + display.drawLine(tick, HEIGHT + X_AXIS_WEIGHT, tick, HEIGHT + X_AXIS_WEIGHT + length); + } +} + + +/** + * @brief Decorates the display: everything but the plot itself. + */ +void displayDecorate() { + if (!initialized) { + // begining and end ticks + display.fillRect(0, HEIGHT + X_AXIS_WEIGHT, 2, MAJOR_TICK_LENGTH); + display.fillRect(126, HEIGHT + X_AXIS_WEIGHT, 2, MAJOR_TICK_LENGTH); + // frequencies + display.setTextAlignment(TEXT_ALIGN_LEFT); + display.drawString(0, SCALE_TEXT_TOP, String(FREQ_BEGIN)); + display.setTextAlignment(TEXT_ALIGN_RIGHT); + display.drawString(127, SCALE_TEXT_TOP, String(FREQ_END)); + } + + if(led_flag == true){ + digitalWrite(35, HIGH); + led_flag = false; + } else { + digitalWrite(35, LOW); + led_flag = true; + } + // Status text block + if (drone_detected == 0) { + // "Scanning" + display.setTextAlignment(TEXT_ALIGN_CENTER); + //clear status line + display.setColor(BLACK); + display.fillRect(0, STATUS_TEXT_TOP, 128, 16); + display.setColor(WHITE); + if (scan_var == 0) { + display.drawString(start_scan_text, STATUS_TEXT_TOP, "Scanning. "); + } + else if (scan_var == 1) { + display.drawString(start_scan_text, STATUS_TEXT_TOP, "Scanning.. "); + } + else if (scan_var == 2) { + display.drawString(start_scan_text, STATUS_TEXT_TOP, "Scanning..."); + } + scan_var++; + if (scan_var == 3) scan_var = 0; + } + + if (!initialized) { + // X-axis + display.fillRect(0, HEIGHT, STEPS, X_AXIS_WEIGHT); + // ticks + #ifdef MAJOR_TICKS + drawTicks(MAJOR_TICKS, MAJOR_TICK_LENGTH); + #endif + #ifdef MINOR_TICKS + drawTicks(MINOR_TICKS, MINOR_TICK_LENGTH); + #endif + } + initialized = true; +} + + +void setup() { + pinMode(35, OUTPUT); + heltec_setup(); + display.clear(); + // draw the logo + display.drawXbm(0, 0, 128, 64, epd_bitmap_ucog); + display.display(); + heltec_delay(4000); + // initialize SX1262 FSK modem at the initial frequency + both.println("Init radio"); + RADIOLIB_OR_HALT(radio.beginFSK(FREQ_BEGIN)); + // upload a patch to the SX1262 to enable spectral scan + // NOTE: this patch is uploaded into volatile memory, + // and must be re-uploaded on every power up + both.println("Upload SX1262 patch"); + // Upload binary patch into the SX126x device RAM. Patch is needed to e.g., enable spectral scan and must be uploaded again on every power cycle. + RADIOLIB_OR_HALT(radio.uploadPatch(sx126x_patch_scan, sizeof(sx126x_patch_scan))); + // configure scan bandwidth and disable the data shaping + both.println("Setting up radio"); + RADIOLIB_OR_HALT(radio.setRxBandwidth(BANDWIDTH)); + // and disable the data shaping + RADIOLIB_OR_HALT(radio.setDataShaping(RADIOLIB_SHAPING_NONE)); + both.println("Starting scaning..."); + float vbat = heltec_vbat(); + both.printf("Vbat: %.2fV (%d%%)\n", vbat, heltec_battery_percent(vbat)); + heltec_delay(800); + + display.clear(); + displayDecorate(); +} + +void loop() { + displayDecorate(); + #ifdef PRINT_PROFILE_TIME + start = millis(); + #endif + // clear the scan plot rectangle + display.setColor(BLACK); + display.fillRect(0, 0, STEPS, HEIGHT); + display.setColor(WHITE); + + // do the scan + for (x = 0; x < STEPS; x++) { + float freq = FREQ_BEGIN + (RANGE * ((float) x / STEPS)); + radio.setFrequency(freq); + #ifdef PRINT_SCAN_VALUES + Serial.println(); + Serial.print("step-"); + Serial.print(x); + Serial.print(" Frequancy:"); + Serial.print(freq); + Serial.println(); + #endif + // start spectral scan + radio.spectralScanStart(SAMPLES, 1); + // wait for spectral scan to finish + while(radio.spectralScanGetStatus() != RADIOLIB_ERR_NONE) { + heltec_delay(1); + } + digitalWrite(25, HIGH); + // read the results Array to which the results will be saved + radio.spectralScanGetResult(result); + for (y = 0; y < RADIOLIB_SX126X_SPECTRAL_SCAN_RES_SIZE; y++) { + #ifdef PRINT_SCAN_VALUES + Serial.printf("%04X,", result[y]); + #endif + if (result[y]) { + display.setPixel(x, y); + } + } + #ifdef PRINT_SCAN_VALUES + Serial.println(); + #endif + // wait a little bit before the next scan, otherwise the SX1262 hangs + heltec_delay(4); + } + #ifdef PRINT_SCAN_VALUES + Serial.println(); + #endif + display.display(); + #ifdef PRINT_PROFILE_TIME + scan_time = millis() - start; + Serial.printf("Scan took %lld ms\n", scan_time); + #endif +} + diff --git a/test/README b/test/README new file mode 100644 index 0000000..9b1e87b --- /dev/null +++ b/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PlatformIO Test Runner and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PlatformIO Unit Testing: +- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html