diff --git a/config b/config index 9b3a372d..f33cdae6 100755 --- a/config +++ b/config @@ -424,6 +424,8 @@ elif [ "$1" = "-C" ]; then sudo systemctl stop cubesatsim sudo systemctl stop rpitx + sudo mv -f /home/pi/CubeSatSim/telem.txt /home/pi/CubeSatSim/telem.txt.bk + sudo journalctl --rotate sudo journalctl --vacuum-time=1s diff --git a/main.c b/main.c index dba9612c..65502f4b 100644 --- a/main.c +++ b/main.c @@ -35,12 +35,12 @@ int main(int argc, char * argv[]) { fclose(file_test); fprintf(stderr, " %x ", resbuffer[0]); - fprintf(stderr, " %x ", resbuffer[1]); + fprintf(stderr, " %x \n", resbuffer[1]); if ((resbuffer[0] == '9') && (resbuffer[1] == '0')) { sleep(5); // try sleep at start to help boot voltageThreshold = 3.7; - printf("Pi Zero 2 detected"); + printf("Pi Zero 2 detected\n"); } printf("\n\nCubeSatSim v1.3.2 starting...\n\n"); @@ -369,7 +369,8 @@ int main(int argc, char * argv[]) { // try connecting to STEM Payload board using UART // /boot/config.txt and /boot/cmdline.txt must be set correctly for this to work - if (!ax5043 && !vB3 && !(mode == CW) && !(mode == SSTV)) // don't test for payload if AX5043 is present or CW or SSTV modes +// if (!ax5043 && !vB3 && !(mode == CW) && !(mode == SSTV)) // don't test for payload if AX5043 is present or CW or SSTV modes + if (!ax5043) // don't test for payload if AX5043 is present { payload = OFF; @@ -640,7 +641,85 @@ int main(int argc, char * argv[]) { batteryCurrent = current[map[BAT]]; } + + if (payload == ON) { // moved to here + STEMBoardFailure = 0; + printf("get_payload_status: %d \n", get_payload_serial(FALSE)); // not debug + fflush(stdout); + printf("String: %s\n", buffer2); + fflush(stdout); + strcpy(sensor_payload, buffer2); + printf(" Response from STEM Payload board: %s\n", sensor_payload); + + telem_file = fopen("/home/pi/CubeSatSim/telem.txt", "a"); + printf("Writing payload string\n"); + time_t timeStamp; + time(&timeStamp); // get timestamp +// printf("Timestamp: %s\n", ctime(&timeStamp)); + + char timeStampNoNl[31], bat_string[31]; + snprintf(timeStampNoNl, 30, "%.24s", ctime(&timeStamp)); + printf("TimeStamp: %s\n", timeStampNoNl); + snprintf(bat_string, 30, "BAT %4.2f %5.1f", batteryVoltage, batteryCurrent); + fprintf(telem_file, "%s %s %s\n", timeStampNoNl, bat_string, sensor_payload); // write telemetry string to telem.txt file + fclose(telem_file); + + if ((sensor_payload[0] == 'O') && (sensor_payload[1] == 'K')) // only process if valid payload response + { + int count1; + char * token; + + const char space[2] = " "; + token = strtok(sensor_payload, space); +// printf("token: %s\n", token); + for (count1 = 0; count1 < 17; count1++) { + if (token != NULL) { + sensor[count1] = (float) atof(token); +// #ifdef DEBUG_LOGGING + printf("sensor: %f ", sensor[count1]); // print sensor data +// #endif + token = strtok(NULL, space); + } + } + printf("\n"); +// if (sensor[XS1] != 0) { + if ((sensor[XS1] > -90.0) && (sensor[XS1] < 90.0) && (sensor[XS1] != 0.0)) { + if (sensor[XS1] != latitude) { + latitude = sensor[XS1]; + printf("Latitude updated to %f \n", latitude); + newGpsTime = millis(); + } + } +// if (sensor[XS2] != 0) { + if ((sensor[XS2] > -180.0) && (sensor[XS2] < 180.0) && (sensor[XS2] != 0.0)) { + if (sensor[XS2] != longitude) { + longitude = sensor[XS2]; + printf("Longitude updated to %f \n", longitude); + newGpsTime = millis(); + } + } + } + else + ; //payload = OFF; // turn off since STEM Payload is not responding + } + if ((millis() - newGpsTime) > 60000) { + longitude += rnd_float(-0.05, 0.05) / 100.0; // was .05 + latitude += rnd_float(-0.05, 0.05) / 100.0; + printf("GPS Location with Rnd: %f, %f \n", latitude, longitude); + printf("GPS Location with Rnd: APRS %07.2f, %08.2f \n", toAprsFormat(latitude), toAprsFormat(longitude)); + newGpsTime = millis(); + } + if ((sensor_payload[0] == 'O') && (sensor_payload[1] == 'K')) { + for (int count1 = 0; count1 < 17; count1++) { + if (sensor[count1] < sensor_min[count1]) + sensor_min[count1] = sensor[count1]; + if (sensor[count1] > sensor_max[count1]) + sensor_max[count1] = sensor[count1]; + // printf("Smin %f Smax %f \n", sensor_min[count1], sensor_max[count1]); + } + } + if (sim_mode) { // simulated telemetry double time = ((long int)millis() - time_start) / 1000.0; @@ -770,54 +849,15 @@ int main(int argc, char * argv[]) { } fclose(cpuTempSensor); } - +// move this code out of get_tlm +/* if (payload == ON) { // -55 STEMBoardFailure = 0; printf("get_payload_status: %d \n", get_payload_serial(FALSE)); // not debug fflush(stdout); printf("String: %s\n", buffer2); fflush(stdout); - strcpy(sensor_payload, buffer2); -/* - char c; - unsigned int waitTime; - int i, end, trys = 0; - sensor_payload[0] = 0; - sensor_payload[1] = 0; - while (((sensor_payload[0] != 'O') || (sensor_payload[1] != 'K')) && (trys++ < 10)) { - i = 0; -// serialPutchar(uart_fd, '?'); -// sleep(0.05); // added delay after ? -// printf("%d Querying payload with ?\n", trys); - waitTime = millis() + 500; - end = FALSE; - // int retry = FALSE; - while ((millis() < waitTime) && !end) { - int chars = (char) serialDataAvail(uart_fd); - while ((chars > 0) && !end) { -// printf("Chars: %d\ ", chars); - chars--; - c = (char) serialGetchar(uart_fd); - // printf ("%c", c); - // fflush(stdout); - if (c != '\n') { - sensor_payload[i++] = c; - } else { - end = TRUE; - } - } - } - - sensor_payload[i++] = ' '; - // sensor_payload[i++] = '\n'; - sensor_payload[i] = '\0'; - printf(" Response from STEM Payload board: %s\n", sensor_payload); - - - sleep(0.1); // added sleep between loops - } -*/ printf(" Response from STEM Payload board: %s\n", sensor_payload); if ((sensor_payload[0] == 'O') && (sensor_payload[1] == 'K')) // only process if valid payload response @@ -875,6 +915,7 @@ int main(int argc, char * argv[]) { // printf("Smin %f Smax %f \n", sensor_min[count1], sensor_max[count1]); } } +*/ // } #ifdef DEBUG_LOGGING @@ -1252,7 +1293,7 @@ void get_tlm(void) { sleep(4); // was 2 } else { // APRS using rpitx - +/* if (payload == ON) { telem_file = fopen("/home/pi/CubeSatSim/telem.txt", "a"); printf("Writing payload string\n"); @@ -1267,7 +1308,7 @@ void get_tlm(void) { fprintf(telem_file, "%s %s %s\n", timeStampNoNl, bat_string, sensor_payload); // write telemetry string to telem.txt file fclose(telem_file); } - +*/ strcat(str, footer_str1); // strcat(str, call); if (battery_saver_mode == ON) @@ -1299,8 +1340,10 @@ void get_tlm(void) { return; } -void get_tlm_fox() { +// generates telemetry which is decoded by AMSAT's FoxTelem: https://www.amsat.org/foxtelem-software-for-windows-mac-linux/ +// for more info about how we use FoxTelem see https://www.g0kla.com/foxtelem/amsat_telemetry_designers_handbook.pdf +void get_tlm_fox() { int i; long int sync = syncWord; diff --git a/rpitx.py b/rpitx.py index 6246033f..5bd38104 100644 --- a/rpitx.py +++ b/rpitx.py @@ -523,7 +523,7 @@ if __name__ == "__main__": print("Turning off transmit") system("echo > command_tx False") sleep(5) - output(pd, 0) + output(pd, 1) # changed from 0 to 1 try: f = open("/home/pi/CubeSatSim/cwready") diff --git a/stempayload/Payload_BME280_MPU6050_XS/Payload_BME280_MPU6050_XS.ino b/stempayload/Payload_BME280_MPU6050_XS/Payload_BME280_MPU6050_XS.ino index 7b5ed4ae..dbf250fa 100644 --- a/stempayload/Payload_BME280_MPU6050_XS/Payload_BME280_MPU6050_XS.ino +++ b/stempayload/Payload_BME280_MPU6050_XS/Payload_BME280_MPU6050_XS.ino @@ -1,19 +1,32 @@ // code for Pico or Pro Micro or STM32 on the CubeSat Simulator STEM Payload board // works wih CubeSatSim software v1.3.2 or later -// extra sensors can be added in payload_extension.cpp +// extra sensors can be added in payload_extension.cpp file #include #include #include #include -#include + +#if defined(ARDUINO_ARCH_MBED_RP2040) && defined(ARDUINO_ARCH_RP2040) // if Arduino Mbed OS RP2040 Boards is used in Arduino IDE #include +TinyGPSPlus gps; +UART Serial2(8, 9, 0, 0); + +#elif !defined(ARDUINO_ARCH_MBED_RP2040) && defined(ARDUINO_ARCH_RP2040) // if Raspberry Pi RP2040 Boards in Arduino IDE +#include +TinyGPSPlus gps; +bool check_for_wifi(); +bool wifi = false; +int led_builtin_pin; + +#else // if Sparkfun Pro Micro or STM32 +#include +#endif #define SEALEVELPRESSURE_HPA (1013.25) Adafruit_BME280 bme; MPU6050 mpu6050(Wire); -TinyGPSPlus gps; long timer = 0; int bmePresent; @@ -26,12 +39,8 @@ void ee_prom_word_write(int addr, int val); short ee_prom_word_read(int addr); int first_time = true; int first_read = true; -bool check_for_wifi(); -bool wifi = false; -int led_builtin_pin; -#define PICO_W // define if Pico W board. Otherwise, compilation fail for Pico or runtime fail if compile as Pico W -#if defined ARDUINO_ARCH_RP2040 +#if defined (ARDUINO_ARCH_MBED_RP2040) || (ARDUINO_ARCH_RP2040) float T2 = 26.3; // Temperature data point 1 float R2 = 167; // Reading data point 1 float T1 = 2; // Temperature data point 2 @@ -64,41 +73,47 @@ extern void payload_setup(); // sensor extension setup function defined in payl extern void payload_loop(); // sensor extension read function defined in payload_extension.cpp void setup() { + + Serial.begin(115200); // Serial Monitor for testing -#ifdef ARDUINO_ARCH_RP2040 +#if !defined(ARDUINO_ARCH_MBED_RP2040) && defined(ARDUINO_ARCH_RP2040) Serial1.setRX(1); delay(100); Serial1.setTX(0); delay(100); -#endif +#endif - Serial.begin(115200); // Serial Monitor for testing - - Serial1.begin(115200); // Pi UART faster spd -// Serial1.begin(9600); // Pi UART faster spd + Serial1.begin(115200); // for communication with Pi Zero - delay(10000); - + delay(2000); + +#if defined (ARDUINO_ARCH_MBED_RP2040) && (ARDUINO_ARCH_RP2040) + Serial.println("Pico with Mbed"); +#elif !defined(ARDUINO_ARCH_MBED_RP2040) && defined(ARDUINO_ARCH_RP2040) + Serial.println("Pico with RP2040"); +#elif defined(ARDUINO_ARCH_STM32F0) || defined(ARDUINO_ARCH_STM32F1) || defined(ARDUINO_ARCH_STM32F3) || defined(ARDUINO_ARCH_STM32F4) || defined(ARDUINO_ARCH_STM32L4) + Serial.println("STM32"); +#elif defined __AVR_ATmega32U4__ + Serial.println("Pro Micro"); +#else + Serial.println("Unknown board"); +#endif + Serial.println("Starting!"); -#ifdef ARDUINO_ARCH_RP2040 - Serial.println("This code is for the Raspberry Pi Pico hardware."); - +#if defined (ARDUINO_ARCH_MBED_RP2040) || (ARDUINO_ARCH_RP2040) Serial.println("Starting Serial2 for optional GPS on JP12"); -// Serial2.begin(9600); // serial from - some modules need 115200 +// Serial2.begin(9600); // serial from - some modules need 115200 + Serial2.begin(9600); // serial from GPS or other serial sensor. Some GPS need 115200 - // pinMode(0, INPUT); - // pinMode(1, INPUT); - // set all Pico GPIO connected pins to input - for (int i = 6; i < 22; i++) { + for (int i = 10; i < 22; i++) { pinMode(i, INPUT); } pinMode(26, INPUT); pinMode(27, INPUT); pinMode(28, INPUT); - pinMode(15, INPUT_PULLUP); // squelch - + pinMode(15, INPUT_PULLUP); // squelch #endif blink_setup(); @@ -139,13 +154,10 @@ void setup() { } else { -#ifdef ARDUINO_ARCH_RP2040 Serial.println("Calculating gyro offsets\n"); - mpu6050.calcGyroOffsets(true); -#endif -#ifndef ARDUINO_ARCH_RP2040 - Serial.println("Calculating gyro offsets and storing in EEPROM\n"); - mpu6050.calcGyroOffsets(true); + mpu6050.calcGyroOffsets(true); +#if !defined (ARDUINO_ARCH_RP2040) + Serial.println("Storing gyro offsets in EEPROM\n"); eeprom_word_write(0, 0xA07); eeprom_word_write(1, (int)(mpu6050.getGyroXoffset() * 100.0) + 0.5); @@ -302,7 +314,7 @@ void loop() { // Serial.println(result); // Serial.println("OK"); // Serial.println(counter++); -#ifndef ARDUINO_ARCH_RP2040 +#if !defined (ARDUINO_ARCH_RP2040) if (result == 'R') { Serial1.println("OK"); delay(100); @@ -318,25 +330,32 @@ void loop() { #endif } -#ifdef ARDUINO_ARCH_RP2040 +#if defined (ARDUINO_ARCH_MBED_RP2040) || (ARDUINO_ARCH_RP2040) Serial.print("Squelch: "); Serial.println(digitalRead(15)); + + get_gps(); +#else + delay(1000); // not needed due to gps 1 second polling delay + #endif - -// delay(1000); not needed due to gps 1 second polling delay - get_gps(); - } void eeprom_word_write(int addr, int val) { +#if !defined(ARDUINO_ARCH_MBED_RP2040) && !defined(ARDUINO_ARCH_RP2040) EEPROM.write(addr * 2, lowByte(val)); EEPROM.write(addr * 2 + 1, highByte(val)); +#endif } short eeprom_word_read(int addr) { - return ((EEPROM.read(addr * 2 + 1) << 8) | EEPROM.read(addr * 2)); + int result = 0; +#if !defined(ARDUINO_ARCH_MBED_RP2040) && !defined(ARDUINO_ARCH_RP2040) + result = ((EEPROM.read(addr * 2 + 1) << 8) | EEPROM.read(addr * 2)); +#endif + return result; } void blink_setup() @@ -355,8 +374,14 @@ void blink_setup() pinMode(blueLED,OUTPUT); #endif -#if defined ARDUINO_ARCH_RP2040 - if (check_for_wifi()) { +#if defined(ARDUINO_ARCH_MBED_RP2040) && defined(ARDUINO_ARCH_RP2040) + pinMode(LED_BUILTIN, OUTPUT); + pinMode(18, OUTPUT); // blue LED on STEM Payload Board v1.3.2 + pinMode(19, OUTPUT); // green LED on STEM Payload Board v1.3.2 +#endif + +#if !defined(ARDUINO_ARCH_MBED_RP2040) && defined(ARDUINO_ARCH_RP2040) + if (check_for_wifi()) { wifi = true; led_builtin_pin = LED_BUILTIN; // use default GPIO for Pico W pinMode(LED_BUILTIN, OUTPUT); @@ -369,8 +394,7 @@ void blink_setup() pinMode(18, OUTPUT); pinMode(19, OUTPUT); } -#endif - +#endif } void blink(int length) @@ -384,12 +408,18 @@ void blink(int length) TXLED0; //TX LED is not tied to a normally controlled pin so a macro is needed, turn LED OFF #endif -#if defined ARDUINO_ARCH_RP2040 - if (wifi) +#if defined(ARDUINO_ARCH_MBED_RP2040) && defined(ARDUINO_ARCH_RP2040) + digitalWrite(LED_BUILTIN, HIGH); // set the built-in LED ON +#endif + +#if !defined(ARDUINO_ARCH_MBED_RP2040) && defined(ARDUINO_ARCH_RP2040) + if (wifi) digitalWrite(LED_BUILTIN, HIGH); // set the built-in LED ON else digitalWrite(led_builtin_pin, HIGH); // set the built-in LED ON -#endif +#endif + +delay(length); #if defined(ARDUINO_ARCH_STM32F0) || defined(ARDUINO_ARCH_STM32F1) || defined(ARDUINO_ARCH_STM32F3) || defined(ARDUINO_ARCH_STM32F4) || defined(ARDUINO_ARCH_STM32L4) digitalWrite(PC13, HIGH); // turn the LED off by making the voltage LOW @@ -400,15 +430,16 @@ void blink(int length) TXLED0; //TX LED macro to turn LED ON #endif -#if defined ARDUINO_ARCH_RP2040 - if (wifi) +#if defined(ARDUINO_ARCH_MBED_RP2040) && defined(ARDUINO_ARCH_RP2040) digitalWrite(LED_BUILTIN, LOW); // set the built-in LED OFF - else - digitalWrite(led_builtin_pin, LOW); // set the built-in LED OFF - -// delay(length); // wait for a lenth of time -#endif +#endif +#if !defined(ARDUINO_ARCH_MBED_RP2040) && defined(ARDUINO_ARCH_RP2040) + if (wifi) + digitalWrite(LED_BUILTIN, LOW); // set the built-in LED ON + else + digitalWrite(led_builtin_pin, LOW); // set the built-in LED ON +#endif } void led_set(int ledPin, bool state) @@ -424,7 +455,7 @@ void led_set(int ledPin, bool state) digitalWrite(ledPin, state); #endif -#ifdef ARDUINO_ARCH_RP2040 +#if defined (ARDUINO_ARCH_MBED_RP2040) || (ARDUINO_ARCH_RP2040) if (ledPin == greenLED) digitalWrite(19, state); else if (ledPin == blueLED) @@ -438,24 +469,19 @@ int read_analog() #if defined __AVR_ATmega32U4__ sensorValue = analogRead(A3); #endif + #if defined(ARDUINO_ARCH_STM32F0) || defined(ARDUINO_ARCH_STM32F1) || defined(ARDUINO_ARCH_STM32F3) || defined(ARDUINO_ARCH_STM32F4) || defined(ARDUINO_ARCH_STM32L4) sensorValue = analogRead(PA7); #endif -#if defined ARDUINO_ARCH_RP2040 +#if defined (ARDUINO_ARCH_MBED_RP2040) || (ARDUINO_ARCH_RP2040) sensorValue = analogRead(28); #endif return(sensorValue); } +#if !defined(ARDUINO_ARCH_MBED_RP2040) && defined(ARDUINO_ARCH_RP2040) bool check_for_wifi() { - -#ifndef PICO_W - - Serial.println("WiFi disabled in software"); - return(false); // skip check if not Pico W board or compilation will fail - -#endif - + pinMode(29, INPUT); const float conversion_factor = 3.3f / (1 << 12); uint16_t result = analogRead(29); @@ -470,9 +496,11 @@ bool check_for_wifi() { return(false); } } +#endif +#if defined (ARDUINO_ARCH_MBED_RP2040) || (ARDUINO_ARCH_RP2040) void get_gps() { - +// Serial.println("Getting GPS data"); bool newData = false; unsigned long start = millis(); @@ -489,7 +517,9 @@ void get_gps() { } } if (newData) { - Serial.printf("GPS read new data in ms: %d\n", millis() - start); + Serial.print("GPS read new data in ms: "); + Serial.println(millis() - start); + // float flon = 0.0, flat = 0.0, flalt = 0.0; // unsigned long age; // starting = millis(); @@ -515,5 +545,5 @@ void get_gps() { } else // Serial.printf("GPS read no new data: %d\n", millis() - start); ; - } +#endif diff --git a/stempayload/Payload_BME280_MPU6050_XS/payload_extension.cpp b/stempayload/Payload_BME280_MPU6050_XS/payload_extension.cpp index 61725282..5b8dd2ec 100644 --- a/stempayload/Payload_BME280_MPU6050_XS/payload_extension.cpp +++ b/stempayload/Payload_BME280_MPU6050_XS/payload_extension.cpp @@ -9,7 +9,7 @@ // put your setup code here void payload_setup() { - Serial.println("Starting new sensor!"); +// Serial.println("Starting new sensor!"); } @@ -17,4 +17,9 @@ void payload_setup() { // Very Important: only use print, not println!! void payload_loop() { +/* + Serial1.print(" NEW 0.0"); // send sensor data over serial to Pi Zero + Serial.print(" NEW 0.0"); // send sensor data over serial monitor for testing +*/ + } diff --git a/stempayload/Payload_BME280_MPU6050_XS_Extended/Payload_BME280_MPU6050_XS_Extended.ino b/stempayload/Payload_BME280_MPU6050_XS_Extended/Payload_BME280_MPU6050_XS_Extended.ino index 7825f2d1..dbf250fa 100644 --- a/stempayload/Payload_BME280_MPU6050_XS_Extended/Payload_BME280_MPU6050_XS_Extended.ino +++ b/stempayload/Payload_BME280_MPU6050_XS_Extended/Payload_BME280_MPU6050_XS_Extended.ino @@ -1,19 +1,32 @@ // code for Pico or Pro Micro or STM32 on the CubeSat Simulator STEM Payload board // works wih CubeSatSim software v1.3.2 or later -// extra sensors can be added in payload_extension.cpp +// extra sensors can be added in payload_extension.cpp file #include #include #include #include -#include + +#if defined(ARDUINO_ARCH_MBED_RP2040) && defined(ARDUINO_ARCH_RP2040) // if Arduino Mbed OS RP2040 Boards is used in Arduino IDE #include +TinyGPSPlus gps; +UART Serial2(8, 9, 0, 0); + +#elif !defined(ARDUINO_ARCH_MBED_RP2040) && defined(ARDUINO_ARCH_RP2040) // if Raspberry Pi RP2040 Boards in Arduino IDE +#include +TinyGPSPlus gps; +bool check_for_wifi(); +bool wifi = false; +int led_builtin_pin; + +#else // if Sparkfun Pro Micro or STM32 +#include +#endif #define SEALEVELPRESSURE_HPA (1013.25) Adafruit_BME280 bme; MPU6050 mpu6050(Wire); -TinyGPSPlus gps; long timer = 0; int bmePresent; @@ -26,12 +39,8 @@ void ee_prom_word_write(int addr, int val); short ee_prom_word_read(int addr); int first_time = true; int first_read = true; -bool check_for_wifi(); -bool wifi = false; -int led_builtin_pin; -#define PICO_W // define if Pico W board. Otherwise, compilation fail for Pico or runtime fail if compile as Pico W -#if defined ARDUINO_ARCH_RP2040 +#if defined (ARDUINO_ARCH_MBED_RP2040) || (ARDUINO_ARCH_RP2040) float T2 = 26.3; // Temperature data point 1 float R2 = 167; // Reading data point 1 float T1 = 2; // Temperature data point 2 @@ -60,48 +69,54 @@ bool show_gps = true; // set to false to not see all messages float flon = 0.0, flat = 0.0, flalt = 0.0; void get_gps(); -extern void payload_setup(); // sensor extension setup function defined in payload_extension.cpp -extern void payload_loop(); // sensor extension read function defined in payload_extension.cpp +extern void payload_setup(); // sensor extension setup function defined in payload_extension.cpp +extern void payload_loop(); // sensor extension read function defined in payload_extension.cpp void setup() { + + Serial.begin(115200); // Serial Monitor for testing -#ifdef ARDUINO_ARCH_RP2040 +#if !defined(ARDUINO_ARCH_MBED_RP2040) && defined(ARDUINO_ARCH_RP2040) Serial1.setRX(1); delay(100); Serial1.setTX(0); delay(100); -#endif +#endif - Serial.begin(115200); // Serial Monitor for testing - - Serial1.begin(115200); // Pi UART faster spd -// Serial1.begin(9600); // Pi UART faster spd + Serial1.begin(115200); // for communication with Pi Zero - delay(10000); - + delay(2000); + +#if defined (ARDUINO_ARCH_MBED_RP2040) && (ARDUINO_ARCH_RP2040) + Serial.println("Pico with Mbed"); +#elif !defined(ARDUINO_ARCH_MBED_RP2040) && defined(ARDUINO_ARCH_RP2040) + Serial.println("Pico with RP2040"); +#elif defined(ARDUINO_ARCH_STM32F0) || defined(ARDUINO_ARCH_STM32F1) || defined(ARDUINO_ARCH_STM32F3) || defined(ARDUINO_ARCH_STM32F4) || defined(ARDUINO_ARCH_STM32L4) + Serial.println("STM32"); +#elif defined __AVR_ATmega32U4__ + Serial.println("Pro Micro"); +#else + Serial.println("Unknown board"); +#endif + Serial.println("Starting!"); -#ifdef ARDUINO_ARCH_RP2040 - Serial.println("This code is for the Raspberry Pi Pico hardware."); - +#if defined (ARDUINO_ARCH_MBED_RP2040) || (ARDUINO_ARCH_RP2040) Serial.println("Starting Serial2 for optional GPS on JP12"); -// Serial2.begin(9600); // serial from - some modules need 115200 +// Serial2.begin(9600); // serial from - some modules need 115200 + Serial2.begin(9600); // serial from GPS or other serial sensor. Some GPS need 115200 - // pinMode(0, INPUT); - // pinMode(1, INPUT); - // set all Pico GPIO connected pins to input - for (int i = 6; i < 22; i++) { + for (int i = 10; i < 22; i++) { pinMode(i, INPUT); } pinMode(26, INPUT); pinMode(27, INPUT); pinMode(28, INPUT); - pinMode(15, INPUT_PULLUP); // squelch - + pinMode(15, INPUT_PULLUP); // squelch #endif - blink_setup(); // sensor extension setup function defined in payload_extension.cpp + blink_setup(); blink(500); delay(250); @@ -139,13 +154,10 @@ void setup() { } else { -#ifdef ARDUINO_ARCH_RP2040 Serial.println("Calculating gyro offsets\n"); - mpu6050.calcGyroOffsets(true); -#endif -#ifndef ARDUINO_ARCH_RP2040 - Serial.println("Calculating gyro offsets and storing in EEPROM\n"); - mpu6050.calcGyroOffsets(true); + mpu6050.calcGyroOffsets(true); +#if !defined (ARDUINO_ARCH_RP2040) + Serial.println("Storing gyro offsets in EEPROM\n"); eeprom_word_write(0, 0xA07); eeprom_word_write(1, (int)(mpu6050.getGyroXoffset() * 100.0) + 0.5); @@ -158,7 +170,7 @@ void setup() { Serial.println(((float)eeprom_word_read(3)) / 100.0, DEC); #endif } - payload_setup(); + payload_setup(); // sensor extension setup function defined in payload_extension.cpp } void loop() { @@ -302,7 +314,7 @@ void loop() { // Serial.println(result); // Serial.println("OK"); // Serial.println(counter++); -#ifndef ARDUINO_ARCH_RP2040 +#if !defined (ARDUINO_ARCH_RP2040) if (result == 'R') { Serial1.println("OK"); delay(100); @@ -318,25 +330,32 @@ void loop() { #endif } -#ifdef ARDUINO_ARCH_RP2040 +#if defined (ARDUINO_ARCH_MBED_RP2040) || (ARDUINO_ARCH_RP2040) Serial.print("Squelch: "); Serial.println(digitalRead(15)); + + get_gps(); +#else + delay(1000); // not needed due to gps 1 second polling delay + #endif - -// delay(1000); not needed due to gps 1 second polling delay - get_gps(); - } void eeprom_word_write(int addr, int val) { +#if !defined(ARDUINO_ARCH_MBED_RP2040) && !defined(ARDUINO_ARCH_RP2040) EEPROM.write(addr * 2, lowByte(val)); EEPROM.write(addr * 2 + 1, highByte(val)); +#endif } short eeprom_word_read(int addr) { - return ((EEPROM.read(addr * 2 + 1) << 8) | EEPROM.read(addr * 2)); + int result = 0; +#if !defined(ARDUINO_ARCH_MBED_RP2040) && !defined(ARDUINO_ARCH_RP2040) + result = ((EEPROM.read(addr * 2 + 1) << 8) | EEPROM.read(addr * 2)); +#endif + return result; } void blink_setup() @@ -355,8 +374,14 @@ void blink_setup() pinMode(blueLED,OUTPUT); #endif -#if defined ARDUINO_ARCH_RP2040 - if (check_for_wifi()) { +#if defined(ARDUINO_ARCH_MBED_RP2040) && defined(ARDUINO_ARCH_RP2040) + pinMode(LED_BUILTIN, OUTPUT); + pinMode(18, OUTPUT); // blue LED on STEM Payload Board v1.3.2 + pinMode(19, OUTPUT); // green LED on STEM Payload Board v1.3.2 +#endif + +#if !defined(ARDUINO_ARCH_MBED_RP2040) && defined(ARDUINO_ARCH_RP2040) + if (check_for_wifi()) { wifi = true; led_builtin_pin = LED_BUILTIN; // use default GPIO for Pico W pinMode(LED_BUILTIN, OUTPUT); @@ -369,8 +394,7 @@ void blink_setup() pinMode(18, OUTPUT); pinMode(19, OUTPUT); } -#endif - +#endif } void blink(int length) @@ -384,12 +408,18 @@ void blink(int length) TXLED0; //TX LED is not tied to a normally controlled pin so a macro is needed, turn LED OFF #endif -#if defined ARDUINO_ARCH_RP2040 - if (wifi) +#if defined(ARDUINO_ARCH_MBED_RP2040) && defined(ARDUINO_ARCH_RP2040) + digitalWrite(LED_BUILTIN, HIGH); // set the built-in LED ON +#endif + +#if !defined(ARDUINO_ARCH_MBED_RP2040) && defined(ARDUINO_ARCH_RP2040) + if (wifi) digitalWrite(LED_BUILTIN, HIGH); // set the built-in LED ON else digitalWrite(led_builtin_pin, HIGH); // set the built-in LED ON -#endif +#endif + +delay(length); #if defined(ARDUINO_ARCH_STM32F0) || defined(ARDUINO_ARCH_STM32F1) || defined(ARDUINO_ARCH_STM32F3) || defined(ARDUINO_ARCH_STM32F4) || defined(ARDUINO_ARCH_STM32L4) digitalWrite(PC13, HIGH); // turn the LED off by making the voltage LOW @@ -400,15 +430,16 @@ void blink(int length) TXLED0; //TX LED macro to turn LED ON #endif -#if defined ARDUINO_ARCH_RP2040 - if (wifi) +#if defined(ARDUINO_ARCH_MBED_RP2040) && defined(ARDUINO_ARCH_RP2040) digitalWrite(LED_BUILTIN, LOW); // set the built-in LED OFF - else - digitalWrite(led_builtin_pin, LOW); // set the built-in LED OFF - -// delay(length); // wait for a lenth of time -#endif +#endif +#if !defined(ARDUINO_ARCH_MBED_RP2040) && defined(ARDUINO_ARCH_RP2040) + if (wifi) + digitalWrite(LED_BUILTIN, LOW); // set the built-in LED ON + else + digitalWrite(led_builtin_pin, LOW); // set the built-in LED ON +#endif } void led_set(int ledPin, bool state) @@ -424,7 +455,7 @@ void led_set(int ledPin, bool state) digitalWrite(ledPin, state); #endif -#ifdef ARDUINO_ARCH_RP2040 +#if defined (ARDUINO_ARCH_MBED_RP2040) || (ARDUINO_ARCH_RP2040) if (ledPin == greenLED) digitalWrite(19, state); else if (ledPin == blueLED) @@ -438,24 +469,19 @@ int read_analog() #if defined __AVR_ATmega32U4__ sensorValue = analogRead(A3); #endif + #if defined(ARDUINO_ARCH_STM32F0) || defined(ARDUINO_ARCH_STM32F1) || defined(ARDUINO_ARCH_STM32F3) || defined(ARDUINO_ARCH_STM32F4) || defined(ARDUINO_ARCH_STM32L4) sensorValue = analogRead(PA7); #endif -#if defined ARDUINO_ARCH_RP2040 +#if defined (ARDUINO_ARCH_MBED_RP2040) || (ARDUINO_ARCH_RP2040) sensorValue = analogRead(28); #endif return(sensorValue); } +#if !defined(ARDUINO_ARCH_MBED_RP2040) && defined(ARDUINO_ARCH_RP2040) bool check_for_wifi() { - -#ifndef PICO_W - - Serial.println("WiFi disabled in software"); - return(false); // skip check if not Pico W board or compilation will fail - -#endif - + pinMode(29, INPUT); const float conversion_factor = 3.3f / (1 << 12); uint16_t result = analogRead(29); @@ -470,9 +496,11 @@ bool check_for_wifi() { return(false); } } +#endif +#if defined (ARDUINO_ARCH_MBED_RP2040) || (ARDUINO_ARCH_RP2040) void get_gps() { - +// Serial.println("Getting GPS data"); bool newData = false; unsigned long start = millis(); @@ -489,7 +517,9 @@ void get_gps() { } } if (newData) { - Serial.printf("GPS read new data in ms: %d\n", millis() - start); + Serial.print("GPS read new data in ms: "); + Serial.println(millis() - start); + // float flon = 0.0, flat = 0.0, flalt = 0.0; // unsigned long age; // starting = millis(); @@ -515,5 +545,5 @@ void get_gps() { } else // Serial.printf("GPS read no new data: %d\n", millis() - start); ; - } +#endif