diff --git a/CubeSatSim.ino b/CubeSatSim.ino new file mode 100644 index 00000000..cc3c84e3 --- /dev/null +++ b/CubeSatSim.ino @@ -0,0 +1,125 @@ +/* + * Transmits CubeSat Telemetry at 434.9MHz in AFSK, FSK, or CW format + * + * Copyright Alan B. Johnston + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * (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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +// This code is an Arduino sketch for the Raspberry Pi Pico +// based on the Raspberry Pi Code + +#include "main.h" + +void setup() { + + Serial.begin(9600); + + Serial.println("Pico v0.1 starting...\n\n"); + + +// set all Pico GPIO pins to input + +// detect Pi Zero using 3.3V + +// if Pi is present, run Payload OK software + +// otherwise, run CubeSatSim Pico code + + Serial.println("\n\nCubeSatSim Pico v0.1 starting...\n\n"); + + mode = FSK; + frameCnt = 1; + + Serial.println("v1 Present with UHF BPF\n"); + txLed = 2; + txLedOn = HIGH; + txLedOff = LOW; + vB5 = TRUE; + onLed = 27; + onLedOn = HIGH; + onLedOff = LOW; + transmit = TRUE; + + if (mode == FSK) { + bitRate = 200; + rsFrames = 1; + payloads = 1; + rsFrameLen = 64; + headerLen = 6; + dataLen = 58; + syncBits = 10; + syncWord = 0b0011111010; + parityLen = 32; + amplitude = 32767 / 3; + samples = S_RATE / bitRate; + bufLen = (frameCnt * (syncBits + 10 * (headerLen + rsFrames * (rsFrameLen + parityLen))) * samples); + + samplePeriod = (int) (((float)((syncBits + 10 * (headerLen + rsFrames * (rsFrameLen + parityLen)))) / (float) bitRate) * 1000 - 500); + sleepTime = 0.1f; + + frameTime = ((float)((float)bufLen / (samples * frameCnt * bitRate))) * 1000; // frame time in ms + +// printf("\n FSK Mode, %d bits per frame, %d bits per second, %d ms per frame, %d ms sample period\n", +// bufLen / (samples * frameCnt), bitRate, frameTime, samplePeriod); + } else if (mode == BPSK) { + bitRate = 1200; + rsFrames = 3; + payloads = 6; + rsFrameLen = 159; + headerLen = 8; + dataLen = 78; + syncBits = 31; + syncWord = 0b1000111110011010010000101011101; + parityLen = 32; + amplitude = 32767; + samples = S_RATE / bitRate; + bufLen = (frameCnt * (syncBits + 10 * (headerLen + rsFrames * (rsFrameLen + parityLen))) * samples); + + samplePeriod = ((float)((syncBits + 10 * (headerLen + rsFrames * (rsFrameLen + parityLen))))/(float)bitRate) * 1000 - 1800; + // samplePeriod = 3000; + // sleepTime = 3.0; + //samplePeriod = 2200; // reduce dut to python and sensor querying delays + sleepTime = 2.2f; + + frameTime = ((float)((float)bufLen / (samples * frameCnt * bitRate))) * 1000; // frame time in ms + +// printf("\n BPSK Mode, bufLen: %d, %d bits per frame, %d bits per second, %d ms per frame %d ms sample period\n", +// bufLen, bufLen / (samples * frameCnt), bitRate, frameTime, samplePeriod); + + sin_samples = S_RATE/freq_Hz; + // printf("Sin map: "); + for (int j = 0; j < sin_samples; j++) { + sin_map[j] = (short int)(amplitude * sin((float)(2 * M_PI * j / sin_samples))); + // printf(" %d", sin_map[j]); +// } + printf("\n"); + } + +// program Transceiver board + +} + +void loop() { + + // query INA219 sensors and Payload sensors + + // encode as digits (APRS or CW mode) or binary (DUV FSK) + + // send telemetry + + // delay some time + +} + +