diff --git a/README.md b/README.md index 7478be63..a40d8112 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,31 @@ # CubeSatSim +To test out the PD120 SSTV image transmit after performing the software install steps below: + + +`cd ~/CubeSatSim` + +`git checkout dev` + +`git pull` + +`echo "ARG1=s" > .mode` + +`cd ~/pi-power-button` + +`git checkout dev` + +`git pull` + +`./script/install` + +`sudo systemctl restart cubesatsim` + + + + +You can also press and hold the push button and release on 4 flashes to switch to SSTV mode! + The CubeSat Simulator https://github.com/alanbjohnston/CubeSatSim/wiki is a low cost satellite emulator that runs on solar panels and batteries, transmits UHF radio telemetry, has a 3D printed frame, and can be extended by additional sensors and modules. This project is sponsored by the not-for-profit [Radio Amateur Satellite Corporation, AMSATĀ®](https://amsat.org). There are several hardware versions and software branches to go with them - see below for information. diff --git a/afsk/main.c b/afsk/main.c index 8f9b9dea..d5a17302 100644 --- a/afsk/main.c +++ b/afsk/main.c @@ -201,10 +201,32 @@ struct SensorConfig config_sensor(char *bus, int address, int milliAmps) { struct SensorConfig data; if (access(bus, W_OK | R_OK) < 0) { // Test if I2C Bus is missing - printf("ERROR: %s bus not present \n", bus); + printf("ERROR: %s bus not present\n Check raspi-config Interfacing Options/I2C and /boot/config.txt \n", bus); data.fd = OFF; return (data); } + char result[128]; + int pos = strlen(bus) / sizeof(bus[0]) - 1; + // printf("Bus size %d \n", pos); + // printf("Bus value %d \n", atoi(&bus[pos])); + char command[50] = "timeout 10 i2cdetect -y "; + strcat (command, &bus[pos]); + FILE *i2cdetect = popen(command, "r"); + + while (fgets(result, 128, i2cdetect) != NULL) { + ; + // printf("result: %s", result); + } + + int error = pclose(i2cdetect)/256; + + // printf("%s error: %d \n", &command, error); + if (error != 0) + { + printf("ERROR: %s bus has a problem \n Check I2C wiring and pullup resistors \n", bus); + data.fd = OFF; + return (data); + } data.fd = wiringPiI2CSetupInterface(bus, address); @@ -433,10 +455,18 @@ else if (vB5) sensor[PLUS_Y] = config_sensor("/dev/i2c-1", 0x41, 400); sensor[BUS] = config_sensor("/dev/i2c-1", 0x45, 400); sensor[BAT] = config_sensor("/dev/i2c-1", 0x44, 400); - sensor[PLUS_Z] = config_sensor("/dev/i2c-3", 0x40, 400); - sensor[MINUS_X] = config_sensor("/dev/i2c-3", 0x41, 400); - sensor[MINUS_Y] = config_sensor("/dev/i2c-3", 0x44, 400); - sensor[MINUS_Z] = config_sensor("/dev/i2c-3", 0x45, 400); + if (access("/dev/i2c-11", W_OK | R_OK) >= 0) { // Test if I2C Bus 11 is present + printf("/dev/i2c-11 is present\n\n"); + sensor[PLUS_Z] = config_sensor("/dev/i2c-11", 0x40, 400); + sensor[MINUS_X] = config_sensor("/dev/i2c-11", 0x41, 400); + sensor[MINUS_Y] = config_sensor("/dev/i2c-11", 0x44, 400); + sensor[MINUS_Z] = config_sensor("/dev/i2c-11", 0x45, 400); + } else { + sensor[PLUS_Z] = config_sensor("/dev/i2c-3", 0x40, 400); + sensor[MINUS_X] = config_sensor("/dev/i2c-3", 0x41, 400); + sensor[MINUS_Y] = config_sensor("/dev/i2c-3", 0x44, 400); + sensor[MINUS_Z] = config_sensor("/dev/i2c-3", 0x45, 400); + } } else { diff --git a/afsk/telem.c b/afsk/telem.c index 648cb041..0e956f0e 100644 --- a/afsk/telem.c +++ b/afsk/telem.c @@ -125,13 +125,34 @@ struct SensorData read_sensor_data(struct SensorConfig sensor) { //struct SensorConfig config_sensor(int sensor, int milliAmps) { struct SensorConfig config_sensor(char *bus, int address, int milliAmps) { struct SensorConfig data; - - if (access(bus, W_OK | R_OK) < 0) { // Test if I2C Bus is missing - printf("ERROR: %s bus not present \n", bus); + + if (access(bus, W_OK | R_OK) < 0) { // Test if I2C Bus is missing + printf("ERROR: %s bus not present \n Check raspi-config Interfacing Options/I2C and /boot/config.txt \n", bus); data.fd = OFF; return (data); } + char result[128]; + int pos = strlen(bus) / sizeof(bus[0]) - 1; +// printf("Bus size %d \n", pos); +// printf("Bus value %d \n", atoi(&bus[pos])); + char command[50] = "timeout 10 i2cdetect -y "; + strcat (command, &bus[pos]); + FILE *i2cdetect = popen(command, "r"); + + while (fgets(result, 128, i2cdetect) != NULL) { + ; +// printf("result: %s", result); + } + + int error = pclose(i2cdetect)/256; +// printf("%s error: %d \n", &command, error); + if (error != 0) + { + printf("ERROR: %s bus has a problem \n Check I2C wiring and pullup resistors \n", bus); + data.fd = OFF; + return (data); + } data.fd = wiringPiI2CSetupInterface(bus, address); data.config = INA219_CONFIG_BVOLTAGERANGE_32V | @@ -214,15 +235,24 @@ int main(int argc, char *argv[]) { if (digitalRead(26) != HIGH) { - printf("vB5 Present\n"); + printf("vB5 Present\n"); // Don't print normal board detection sensor[PLUS_X] = config_sensor("/dev/i2c-1", 0x40, 400); sensor[PLUS_Y] = config_sensor("/dev/i2c-1", 0x41, 400); sensor[BUS] = config_sensor("/dev/i2c-1", 0x45, 400); sensor[BAT] = config_sensor("/dev/i2c-1", 0x44, 400); - sensor[PLUS_Z] = config_sensor("/dev/i2c-3", 0x40, 400); - sensor[MINUS_X] = config_sensor("/dev/i2c-3", 0x41, 400); - sensor[MINUS_Y] = config_sensor("/dev/i2c-3", 0x44, 400); - sensor[MINUS_Z] = config_sensor("/dev/i2c-3", 0x45, 400); + + if (access("/dev/i2c-11", W_OK | R_OK) >= 0) { // Test if I2C Bus 11 is present + printf("/dev/i2c-11 is present\n\n"); + sensor[PLUS_Z] = config_sensor("/dev/i2c-11", 0x40, 400); + sensor[MINUS_X] = config_sensor("/dev/i2c-11", 0x41, 400); + sensor[MINUS_Y] = config_sensor("/dev/i2c-11", 0x44, 400); + sensor[MINUS_Z] = config_sensor("/dev/i2c-11", 0x45, 400); + } else { + sensor[PLUS_Z] = config_sensor("/dev/i2c-3", 0x40, 400); + sensor[MINUS_X] = config_sensor("/dev/i2c-3", 0x41, 400); + sensor[MINUS_Y] = config_sensor("/dev/i2c-3", 0x44, 400); + sensor[MINUS_Z] = config_sensor("/dev/i2c-3", 0x45, 400); + } } else { diff --git a/demo.sh b/demo.sh index 7a29a981..20aef361 100755 --- a/demo.sh +++ b/demo.sh @@ -10,6 +10,9 @@ if [ "$1" = "a" ]; then elif [ "$1" = "b" ]; then echo "Mode is continuous BPSK" /home/pi/CubeSatSim/radioafsk bpsk +elif [ "$1" = "s" ]; then + echo "Mode is continuous SSTV" + while true; do sleep 5; done else echo "Mode is continuous FSK" /home/pi/CubeSatSim/radioafsk fsk diff --git a/groundstation/config_webrx_ubuntu.py b/groundstation/config_webrx_ubuntu.py new file mode 100644 index 00000000..2d948035 --- /dev/null +++ b/groundstation/config_webrx_ubuntu.py @@ -0,0 +1,889 @@ +# -*- coding: utf-8 -*- + +""" +config_webrx: configuration options for OpenWebRX + + This file is part of OpenWebRX, + an open-source SDR receiver software with a web UI. + Copyright (c) 2013-2015 by Andras Retzler + Copyright (c) 2019-2020 by Jakob Ketterl + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + In addition, as a special exception, the copyright holders + state that config_rtl.py and config_webrx.py are not part of the + Corresponding Source defined in GNU AGPL version 3 section 1. + + (It means that you do not have to redistribute config_rtl.py and + config_webrx.py if you make any changes to these two configuration files, + and use them for running your web service with OpenWebRX.) + + portions inspired by http://gephi.michalnovak.eu/config_webrx.py + +""" + +# configuration version. please only modify if you're able to perform the associated migration steps. +version = 2 + +# NOTE: you can find additional information about configuring OpenWebRX in the Wiki: +# https://github.com/jketterl/openwebrx/wiki/Configuration-guide + +# ==== Server settings ==== +web_port = 8073 +max_clients = 20 + +# ==== Web GUI configuration ==== +receiver_name = "KU2Y" +receiver_location = "Philadelphia, PA" +receiver_asl = 200 +receiver_admin = "ku2y@amsat.org" +receiver_gps = (40.0376, -75.3492) +receiver_gps = {"lat": 40.0376, "lon": -75.3492} +photo_title = "ARISS" +photo_desc = """ +You can add your own background photo and receiver information.
+Receiver is operated by: ku2y@amsat.org
+Device: RTL-SDR
+Antenna:
+Website: http://ariss-radio:8073 +""" + +# ==== DSP/RX settings ==== +fft_fps = 9 +fft_size = 4096 # Should be power of 2 +fft_voverlap_factor = ( + 0.3 # If fft_voverlap_factor is above 0, multiple FFTs will be used for creating a line on the diagram. +) + +audio_compression = "adpcm" # valid values: "adpcm", "none" +fft_compression = "adpcm" # valid values: "adpcm", "none" + +digimodes_enable = True # Decoding digimodes come with higher CPU usage. +digimodes_fft_size = 1024 + +# determines the quality, and thus the cpu usage, for the ambe codec used by digital voice modes +# if you're running on a Raspi (up to 3B+) you'll want to leave this on 1 +digital_voice_unvoiced_quality = 1 +# enables lookup of DMR ids using the radioid api +digital_voice_dmr_id_lookup = True + +""" +Note: if you experience audio underruns while CPU usage is 100%, you can: +- decrease `samp_rate`, +- set `fft_voverlap_factor` to 0, +- decrease `fft_fps` and `fft_size`, +- limit the number of users by decreasing `max_clients`. +""" + +# ==== I/Q sources ==== +# (Uncomment the appropriate by removing # characters at the beginning of the corresponding lines.) + +############################################################################### +# Is my SDR hardware supported? # +# Check here: https://github.com/jketterl/openwebrx/wiki/Supported-Hardware # +############################################################################### + +# Currently supported types of sdr receivers: +# "rtl_sdr", "rtl_sdr_soapy", "sdrplay", "hackrf", "airspy", "airspyhf", "fifi_sdr", +# "perseussdr", "lime_sdr", "pluto_sdr", "soapy_remote" +# +# In order to use rtl_sdr, you will need to install librtlsdr-dev and the connector. +# In order to use sdrplay, airspy or airspyhf, you will need to install soapysdr, the corresponding driver, and the +# connector. +# +# https://github.com/jketterl/owrx_connector +# +# In order to use Perseus HF you need to install the libperseus-sdr +# +# https://github.com/Microtelecom/libperseus-sdr +# +# and do the proper changes to the sdrs object below +# (see also Wiki in https://github.com/jketterl/openwebrx/wiki/Sample-configuration-for-Perseus-HF-receiver). +# + +sdrs = { + "rtlsdr": { + "name": "RTL-SDR", + "type": "rtl_sdr_soapy", + "ppm": 0, + # you can change this if you use an upconverter. formula is: + # center_freq + lfo_offset = actual frequency on the sdr + # "lfo_offset": 0, + "profiles": { + "wx": { + "name": "Weather Band", + "center_freq": 162350000, + "rf_gain": 20, + "samp_rate": 1000000, + "start_freq": 162400000, + "start_mod": "nfm", + }, + "2m": { + "name": "2m Band", + "center_freq": 145000000, + "rf_gain": 20, + "samp_rate": 2400000, + "start_freq": 145725000, + "start_mod": "nfm", + }, + "70cm": { + "name": "70cm Band", + "center_freq": 435500000, + "rf_gain": 20, + "samp_rate": 2400000, + "start_freq": 4355000000, + "start_mod": "nfm", + }, + "fm": { + "name": "FM Band", + "center_freq": 91000000, + "rf_gain": 20, + "samp_rate": 2400000, + "start_freq": 90000000, + "start_mod": "nfm", + }, + "10mv": { + "name": "10m Band", + "center_freq": 28000000, + "rf_gain": 20, + "samp_rate": 2400000, + "start_freq": 28500000, + "start_mod": "usb", + }, + "6m": { + "name": "6m Band", + "center_freq": 51000000, + "rf_gain": 20, + "samp_rate": 2400000, + "start_freq": 51000000, + "start_mod": "usb", + }, + "110MHz": { + "name": "110 MHz", + "center_freq": 110000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 110000000, + "start_mod": "nfm", + }, + "112MHz": { + "name": "112 MHz", + "center_freq": 112000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 112000000, + "start_mod": "nfm", + }, + "114MHz": { + "name": "114 MHz", + "center_freq": 114000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 114000000, + "start_mod": "nfm", + }, + "116mhz": { + "name": "116 MHz", + "center_freq": 116000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 116000000, + "start_mod": "nfm", + }, + "118mhz": { + "name": "118 MHz Air Band", + "center_freq": 118000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 118000000, + "start_mod": "nfm", + }, + "120mhz": { + "name": "120 MHz Air Band", + "center_freq": 120000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 120000000, + "start_mod": "nfm", + }, + "122mhz": { + "name": "122 MHz Air Band", + "center_freq": 122000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 122000000, + "start_mod": "nfm", + }, + "124mhz": { + "name": "124 MHz Air Band", + "center_freq": 124000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 124000000, + "start_mod": "nfm", + }, + "126mhz": { + "name": "126 MHz Air Band", + "center_freq": 126000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 126000000, + "start_mod": "nfm", + }, + "128mhz": { + "name": "126 MHz Air Band", + "center_freq": 128000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 128000000, + "start_mod": "nfm", + }, + "130mhz": { + "name": "130 MHz Air Band", + "center_freq": 130000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 130000000, + "start_mod": "nfm", + }, + "132mhz": { + "name": "132 MHz Air Band", + "center_freq": 132000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 132000000, + "start_mod": "nfm", + }, + "134mhz": { + "name": "134 MHz Air Band", + "center_freq": 134000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 134000000, + "start_mod": "nfm", + }, + "136mhz": { + "name": "136 MHz Air Band", + "center_freq": 136000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 136000000, + "start_mod": "nfm", + }, + "138mhz": { + "name": "138 MHz NOAA Weather Satellite Band", + "center_freq": 138000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 138000000, + "start_mod": "nfm", + }, + "140mhz": { + "name": "140 MHz", + "center_freq": 140000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 140000000, + "start_mod": "nfm", + }, + "142mhz": { + "name": "142 MHz", + "center_freq": 142000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 142000000, + "start_mod": "nfm", + }, + "144mhz": { + "name": "144 MHz Ham Band", + "center_freq": 144000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 144000000, + "start_mod": "nfm", + }, + "146mhz": { + "name": "146 MHz Ham Band", + "center_freq": 146000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 146000000, + "start_mod": "nfm", + }, + "148mhz": { + "name": "148 MHz Ham Band", + "center_freq": 148000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 148000000, + "start_mod": "nfm", + }, + "150mhz": { + "name": "150 MHz", + "center_freq": 150000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 150000000, + "start_mod": "nfm", + }, + "152mhz": { + "name": "152 MHz", + "center_freq": 152000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 152000000, + "start_mod": "nfm", + }, + "154mhz": { + "name": "154 MHz", + "center_freq": 154000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 154000000, + "start_mod": "nfm", + }, + "156mhz": { + "name": "156 MHz", + "center_freq": 156000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 156100000, + "start_mod": "nfm", + }, + "158mhz": { + "name": "158 MHz", + "center_freq": 158000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 158000000, + "start_mod": "nfm", + }, + "160mhz": { + "name": "160 MHz", + "center_freq": 160000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 160000000, + "start_mod": "nfm", + }, + "162mhz": { + "name": "162 MHz Weather Band", + "center_freq": 162000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 162000000, + "start_mod": "nfm", + }, + "164mhz": { + "name": "164 MHz", + "center_freq": 164000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 164000000, + "start_mod": "nfm", + }, + "166mhz": { + "name": "166 MHz", + "center_freq": 166000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 166000000, + "start_mod": "nfm", + }, + "168mhz": { + "name": "168 MHz", + "center_freq": 168000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 168000000, + "start_mod": "nfm", + }, + "170mhz": { + "name": "170 MHz", + "center_freq": 170000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 170000000, + "start_mod": "nfm", + }, + "172mhz": { + "name": "172 MHz", + "center_freq": 172000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 172000000, + "start_mod": "nfm", + }, + "174mhz": { + "name": "174 MHz", + "center_freq": 174000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 174000000, + "start_mod": "nfm", + }, + "420mhz": { + "name": "420 MHz 70cm Ham Band", + "center_freq": 420000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 420000000, + "start_mod": "nfm", + }, + "422mhz": { + "name": "422 MHz 70cm Ham Band", + "center_freq": 422000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 422000000, + "start_mod": "nfm", + }, + "424mhz": { + "name": "424 MHz 70cm Ham Band", + "center_freq": 424000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 424000000, + "start_mod": "nfm", + }, + "426mhz": { + "name": "426 MHz 70cm Ham Band", + "center_freq": 426000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 426000000, + "start_mod": "nfm", + }, + "428mhz": { + "name": "426 MHz 70cm Ham Band", + "center_freq": 428000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 428000000, + "start_mod": "nfm", + }, + "430mhz": { + "name": "430 MHz 70cm Ham Band", + "center_freq": 430000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 430000000, + "start_mod": "nfm", + }, + "432mhz": { + "name": "432 MHz 70cm Ham Band", + "center_freq": 432000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 432000000, + "start_mod": "nfm", + }, + "434mhz": { + "name": "434 MHz 70cm Ham Band", + "center_freq": 434000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 434000000, + "start_mod": "nfm", + }, + "436mhz": { + "name": "436 MHz 70cm Ham Band", + "center_freq": 436000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 436000000, + "start_mod": "nfm", + }, + "438mhz": { + "name": "438 MHz 70cm Ham Band", + "center_freq": 138000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 438000000, + "start_mod": "nfm", + }, + "446mhz": { + "name": "446 MHz", + "center_freq": 446000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 446000000, + "start_mod": "nfm", + }, + "460mhz": { + "name": "460 MHz", + "center_freq": 460000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 460000000, + "start_mod": "nfm", + }, + "462mhz": { + "name": "462 MHz FRS/GMRS", + "center_freq": 462000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 462000000, + "start_mod": "nfm", + }, + "467mhz": { + "name": "467 MHz FRS/GMRS", + "center_freq": 467000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 467000000, + "start_mod": "nfm", + }, + "860mhz": { + "name": "860 MHz", + "center_freq": 860000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 860000000, + "start_mod": "nfm", + }, + "862mhz": { + "name": "862 MHz", + "center_freq": 862000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 862000000, + "start_mod": "nfm", + }, + "864mhz": { + "name": "864 MHz", + "center_freq": 864000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 864000000, + "start_mod": "nfm", + }, + "866mhz": { + "name": "866 MHz", + "center_freq": 866000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 866000000, + "start_mod": "nfm", + }, + "868mhz": { + "name": "868 MHz SRD Band", + "center_freq": 868000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 868000000, + "start_mod": "nfm", + }, + "870mhz": { + "name": "870 MHz", + "center_freq": 870000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 870000000, + "start_mod": "nfm", + }, + "915mhz": { + "name": "915 MHz ISM Band", + "center_freq": 915000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 915000000, + "start_mod": "nfm", + }, + "1090mhz": { + "name": "1090 MHz", + "center_freq": 1090000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 1090000000, + "start_mod": "nfm", + }, + "1880mhz": { + "name": "1880 MHz", + "center_freq": 1880000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 1880000000, + "start_mod": "nfm", + }, + "1882mhz": { + "name": "1882 MHz", + "center_freq": 1882000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 1882000000, + "start_mod": "nfm", + }, + "1884mhz": { + "name": "1884 MHz", + "center_freq": 1884000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 1884000000, + "start_mod": "nfm", + }, + "1886mhz": { + "name": "1886 MHz", + "center_freq": 1886000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 1886000000, + "start_mod": "nfm", + }, + "1888mhz": { + "name": "1888 MHz", + "center_freq": 1888000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 1888000000, + "start_mod": "nfm", + }, + "1890mhz": { + "name": "1890 MHz", + "center_freq": 1890000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 1890000000, + "start_mod": "nfm", + }, + "1892mhz": { + "name": "1892 MHz", + "center_freq": 1892000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 1892000000, + "start_mod": "nfm", + }, + "1894mhz": { + "name": "1894 MHz", + "center_freq": 1894000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 1894000000, + "start_mod": "nfm", + }, + "1896mhz": { + "name": "1896 MHz", + "center_freq": 1896000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 1896000000, + "start_mod": "nfm", + }, + "1898mhz": { + "name": "1898 MHz", + "center_freq": 1898000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 1898000000, + "start_mod": "nfm", + }, + "1900mhz": { + "name": "1900 MHz", + "center_freq": 1900000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 1900000000, + "start_mod": "nfm", + }, + "23cm": { + "name": "23cm Ham Band", + "center_freq": 1270000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 1270000000, + "start_mod": "nfm", + }, + "13cm": { + "name": "13cm Ham Band", + "center_freq": 2370000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 2370000000, + "start_mod": "nfm", + }, + "9cm": { + "name": "9cm Band", + "center_freq": 3440000000, + "rf_gain": 30, + "samp_rate": 2400000, + "start_freq": 3440000000, + "start_mod": "nfm", + }, + "10m": { + "name": "10m Ham Band HF", + "center_freq": 29150000, + "rf_gain": 10, + "samp_rate": 2400000, + "start_freq": 28283000, + "start_mod": "usb", + "direct_sampling": 2, + }, + "19m": { + "name": "19m Broadcast Band HF", + "center_freq": 16000000, + "rf_gain": 10, + "samp_rate": 2400000, + "start_freq": 15400000, + "start_mod": "am", + "direct_sampling": 2, + }, + "20m": { + "name": "20m Ham Band HF", + "center_freq": 14150000, + "rf_gain": 10, + "samp_rate": 2400000, + "start_freq": 14070000, + "start_mod": "usb", + "direct_sampling": 2, + }, + "30m": { + "name": "30m Ham Band HF", + "center_freq": 10125000, + "rf_gain": 10, + "samp_rate": 2400000, + "start_freq": 10142000, + "start_mod": "usb", + "direct_sampling": 2, + }, + "40m": { + "name": "40m Ham Band HF", + "center_freq": 7100000, + "rf_gain": 10, + "samp_rate": 2400000, + "start_freq": 7070000, + "start_mod": "lsb", + "direct_sampling": 2, + }, + "49m": { + "name": "49m Broadcast Band HF", + "center_freq": 6000000, + "rf_gain": 10, + "samp_rate": 2400000, + "start_freq": 6070000, + "start_mod": "am", + "direct_sampling": 2, + }, + "80m": { + "name": "80m Ham Band HF", + "center_freq": 3650000, + "rf_gain": 10, + "samp_rate": 2400000, + "start_freq": 3570000, + "start_mod": "lsb", + "direct_sampling": 2, + }, + "160m": { + "name": "160m Band HF", + "center_freq": 1700000, + "rf_gain": 10, + "samp_rate": 2400000, + "start_freq": 1440000, + "start_mod": "am", + "direct_sampling": 2, + }, + }, + }, +} + +# ==== Color themes ==== + +# A guide is available to help you set these values: https://github.com/simonyiszk/openwebrx/wiki/Calibrating-waterfall-display-levels + +### default theme by teejez: +waterfall_colors = [0x000000FF, 0x0000FFFF, 0x00FFFFFF, 0x00FF00FF, 0xFFFF00FF, 0xFF0000FF, 0xFF00FFFF, 0xFFFFFFFF] +waterfall_min_level = -88 # in dB +waterfall_max_level = -20 +waterfall_auto_level_margin = {"min": 5, "max": 40} +### old theme by HA7ILM: +# waterfall_colors = "[0x000000ff,0x2e6893ff, 0x69a5d0ff, 0x214b69ff, 0x9dc4e0ff, 0xfff775ff, 0xff8a8aff, 0xb20000ff]" +# waterfall_min_level = -115 #in dB +# waterfall_max_level = 0 +# waterfall_auto_level_margin = {"min": 20, "max": 30} +##For the old colors, you might also want to set [fft_voverlap_factor] to 0. + +# Note: When the auto waterfall level button is clicked, the following happens: +# [waterfall_min_level] = [current_min_power_level] - [waterfall_auto_level_margin["min"]] +# [waterfall_max_level] = [current_max_power_level] + [waterfall_auto_level_margin["max"]] +# +# ___|________________________________________|____________________________________|________________________________________|___> signal power +# \_waterfall_auto_level_margin["min"]_/ |__ current_min_power_level | \_waterfall_auto_level_margin["max"]_/ +# current_max_power_level __| + +# === Experimental settings === +# Warning! The settings below are very experimental. +csdr_dynamic_bufsize = False # This allows you to change the buffering mode of csdr. +csdr_print_bufsizes = False # This prints the buffer sizes used for csdr processes. +csdr_through = False # Setting this True will print out how much data is going into the DSP chains. + +nmux_memory = 50 # in megabytes. This sets the approximate size of the circular buffer used by nmux. + +google_maps_api_key = "" + +# how long should positions be visible on the map? +# they will start fading out after half of that +# in seconds; default: 2 hours +map_position_retention_time = 2 * 60 * 60 + +# decoder queue configuration +# due to the nature of some operating modes (ft8, ft8, jt9, jt65, wspr and js8), the data is recorded for a given amount +# of time (6 seconds up to 2 minutes) and decoded at the end. this can lead to very high peak loads. +# to mitigate this, the recordings will be queued and processed in sequence. +# the number of workers will limit the total amount of work (one worker will losely occupy one cpu / thread) +decoding_queue_workers = 2 +# the maximum queue length will cause decodes to be dumped if the workers cannot keep up +# if you are running background services, make sure this number is high enough to accept the task influx during peaks +# i.e. this should be higher than the number of decoding services running at the same time +decoding_queue_length = 10 + +# wsjt decoding depth will allow more results, but will also consume more cpu +wsjt_decoding_depth = 3 +# can also be set for each mode separately +# jt65 seems to be somewhat prone to erroneous decodes, this setting handles that to some extent +wsjt_decoding_depths = {"jt65": 1} + +# JS8 comes in different speeds: normal, slow, fast, turbo. This setting controls which ones are enabled. +js8_enabled_profiles = ["normal", "slow"] +# JS8 decoding depth; higher value will get more results, but will also consume more cpu +js8_decoding_depth = 3 + +temporary_directory = "/tmp" + +services_enabled = False +services_decoders = ["ft8", "ft4", "wspr", "packet"] + +# === aprs igate settings === +# if you want to share your APRS decodes with the aprs network, configure these settings accordingly +aprs_callsign = "N0CALL" +aprs_igate_enabled = False +aprs_igate_server = "euro.aprs2.net" +aprs_igate_password = "" +# beacon uses the receiver_gps setting, so if you enable this, make sure the location is correct there +aprs_igate_beacon = False + +# path to the aprs symbols repository (get it here: https://github.com/hessu/aprs-symbols) +aprs_symbols_path = "/opt/aprs-symbols/png" + +# === PSK Reporter setting === +# enable this if you want to upload all ft8, ft4 etc spots to pskreporter.info +# this also uses the receiver_gps setting from above, so make sure it contains a correct locator +pskreporter_enabled = False +pskreporter_callsign = "N0CALL" + +# === Web admin settings === +# this feature is experimental at the moment. it should not be enabled on shared receivers since it allows remote +# changes to the receiver settings. enable for testing in controlled environment only. +# webadmin_enabled = False diff --git a/rpitx.py b/rpitx.py index fc572bfb..ba90e7e0 100644 --- a/rpitx.py +++ b/rpitx.py @@ -15,14 +15,25 @@ if GPIO.input(12) == False: transmit = True if GPIO.input(27) == False: transmit = True - + txLed = 22 + txLedOn = False + txLedOff = True +else: + txLed = 27 + txLedOn = True + txLedOff = False + +GPIO.setup(txLed, GPIO.OUT) + print(transmit) file = open("/home/pi/CubeSatSim/sim.cfg") callsign = file.readline().split(" ")[0] print(callsign) +GPIO.output(txLed, txLedOn); os.system("echo 'de " + callsign + "' > id.txt && gen_packets -M 20 id.txt -o morse.wav -r 48000 > /dev/null 2>&1 && cat morse.wav | csdr convert_i16_f | csdr gain_ff 7000 | csdr convert_f_samplerf 20833 | sudo /home/pi/rpitx/rpitx -i- -m RF -f 434.9e3") +GPIO.output(txLed, txLedOff); time.sleep(2) @@ -38,7 +49,17 @@ if __name__ == "__main__": print("AFSK") while True: time.sleep(5) - elif (('b' == sys.argv[1]) or ('bpsk' in sys.argv[1])): + elif (('s' == sys.argv[1]) or ('sstv' in sys.argv[1])): + print("SSTV") +# os.system("(while true; do (sleep 10 && cat /home/pi/CubeSatSim/wav/sstv.wav | csdr convert_i16_f | csdr gain_ff 7000 | csdr convert_f_samplerf 20833 | sudo rpitx -i- -m RF -f 434.9e3); done)") + while True: + GPIO.output(txLed, txLedOff); + print("Sleeping") + time.sleep(10) + print("Transmitting SSTV") + GPIO.output(txLed, txLedOn); + os.system("cat /home/pi/CubeSatSim/wav/sstv.wav | csdr convert_i16_f | csdr gain_ff 7000 | csdr convert_f_samplerf 20833 | sudo rpitx -i- -m RF -f 434.9e3") + elif (('b' == sys.argv[1]) or ('bpsk' in sys.argv[1])): print("BPSK") os.system("sudo nc -l 8080 | csdr convert_i16_f | csdr fir_interpolate_cc 2 | csdr dsb_fc | csdr bandpass_fir_fft_cc 0.002 0.06 0.01 | csdr fastagc_ff | sudo /home/pi/rpitx/sendiq -i /dev/stdin -s 96000 -f 434.9e6 -t float") else: diff --git a/rpitx.sh b/rpitx.sh index e2cb4245..e95613a1 100755 --- a/rpitx.sh +++ b/rpitx.sh @@ -2,4 +2,4 @@ echo -e "\nrpitx for CubeSatSim at 434.9 MHz using python\n" -python /home/pi/CubeSatSim/rpitx.py $1 +python -u /home/pi/CubeSatSim/rpitx.py $1 diff --git a/wav/sstv.wav b/wav/sstv.wav new file mode 100644 index 00000000..ea55df99 Binary files /dev/null and b/wav/sstv.wav differ