Skip to content

Commit

Permalink
RaspberryPi Pico support (#152)
Browse files Browse the repository at this point in the history
<!-- Please Give Your PR a relevant title-->

## Description of Problem
After the loss of multiple Teensy4.1s, we've been looking at some more
affordable alternatives for Catalyst-2. Current candidates include the
ProMicro and RaspberryPi Pico. These boards have slightly different
pinouts and chip architectures than the Teensy, so some changes will
need to be made to the firmware to support them.

## Solution
- Added a PlatformIO `env` for the RaspberryPi Pico
- After migrating some chip settings to a central settings file, a build
flag was added to the `pico` env to separate settings for different
architectures.
- Settings for the RaspberryPi Pico were added to support a different
pinout and reduced RAM.

**A Raspberry Pi Pico should now be a drop-in replacement for the Teensy
in Catalyst-2**
JonathanSafer authored Aug 15, 2023
1 parent fbfc02f commit f82891d
Showing 7 changed files with 80 additions and 56 deletions.
10 changes: 5 additions & 5 deletions main/bmp_altimeter.h
Original file line number Diff line number Diff line change
@@ -22,7 +22,7 @@ bmpReading getBMP()
{
bmpReading sample;
if (!bmp.performReading()) {
Serial1.println("Failed to perform BMP388 reading.");
XBeeSerial.println("Failed to perform BMP388 reading.");
return sample;
}
//sample.temp = bmp.temperature; // Temperature in Celcius
@@ -49,10 +49,10 @@ void setGroundLevelPressure() { //Reads bmp data and sets ground lvl pressure
*/
void setupBMP()
{
Serial1.print("Setting up BMP388... ");
XBeeSerial.print("Setting up BMP388... ");
delay(3000);
if (!bmp.begin_SPI(BMP_CS)) { // hardware I2C mode, can pass in address & alt Wire
Serial1.println("could not find a valid BMP388 sensor, check wiring!");
XBeeSerial.println("could not find a valid BMP388 sensor, check wiring!");
return;
}

@@ -65,9 +65,9 @@ void setupBMP()
getBMP();
bmpReading sample = getBMP();
if(sample.altitude != 0)
Serial1.println("BMP setup successful.");
XBeeSerial.println("BMP setup successful.");
else
Serial1.println("BMP setup failed, check wiring or pin settings.");
XBeeSerial.println("BMP setup failed, check wiring or pin settings.");
delay(2000);
setGroundLevelPressure();
}
32 changes: 19 additions & 13 deletions main/data.h
Original file line number Diff line number Diff line change
@@ -7,7 +7,12 @@
#include "utils.h"
#include <SD.h>

#ifndef PICO
const int CS_SD = BUILTIN_SDCARD;
#else
const int CS_SD = 15;
#endif // PICO

char filename[50];
RingQueue<imuReading> imuQueue;
RingQueue<bmpReading> bmpQueue;
@@ -23,18 +28,18 @@ RingQueue<gpsReading> gpsQueue;
void transmitData(double altitude, gpsReading gps, char phase)
{
//phase packet
Serial1.print("0 ");
Serial1.println(phase); //0: ONPAD, 1: ASCENDING, 2: DESCENDING, 3: POST_FLIGHT
XBeeSerial.print("0 ");
XBeeSerial.println(phase); //0: ONPAD, 1: ASCENDING, 2: DESCENDING, 3: POST_FLIGHT

//altitude packet
Serial1.print("1 ");
Serial1.println(altitude,1);
XBeeSerial.print("1 ");
XBeeSerial.println(altitude,1);

//gps packet
Serial1.print("3 ");
Serial1.print(gps.latitude, 4);
Serial1.print(" ");
Serial1.println(gps.longitude, 4);
XBeeSerial.print("3 ");
XBeeSerial.print(gps.latitude, 4);
XBeeSerial.print(" ");
XBeeSerial.println(gps.longitude, 4);
}

/**
@@ -46,21 +51,22 @@ void transmitData(double altitude, gpsReading gps, char phase)
*/
void setupSD(String date){
if (!SD.begin(CS_SD)){
Serial1.println("MicroSD card: failed or not present");
XBeeSerial.println("MicroSD card: failed or not present");
return;
}
else
Serial1.println("MicroSD card: successful");
XBeeSerial.println("MicroSD card: successful");
String filestart = "Catalyst2-";
filestart.concat(date).concat(".csv");
filestart.concat(date);
filestart.concat(".csv");
filestart.toCharArray(filename, 50);
File dataFile = SD.open(filename, FILE_WRITE);
if (dataFile) {
dataFile.println("Time(us),Altitude(m),Latitude,Longitude,GyroX,GyroY,GyroZ,AccelX,AccelY,AccelZ,AttitudeX,AttitudeY,AttitudeZ,state");
dataFile.close();
}
else {
Serial1.println("MicroSD card: error opening file");
XBeeSerial.println("MicroSD card: error opening file");
}
}

@@ -108,7 +114,7 @@ void recordData(gpsReading sample, bool prelaunch){
void backupToSD(){
File dataFile = SD.open(filename, FILE_WRITE);
if(!dataFile){
Serial1.println("error opening datalog");
XBeeSerial.println("error opening datalog");
return;
}
while(!imuQueue.isEmpty()){
24 changes: 12 additions & 12 deletions main/gps.h
Original file line number Diff line number Diff line change
@@ -19,7 +19,7 @@ Adafruit_GPS GPS(&GPSSerial);
*/
String setupGPS()
{
Serial1.println("Setting up GPS...");
XBeeSerial.println("Setting up GPS...");
unsigned int startTime = millis();
// 9600 NMEA is the default baud rate for Adafruit MTK GPS's- some use 4800
GPS.begin(9600); // 9600 is the default baud rate
@@ -54,29 +54,29 @@ String setupGPS()
timer = millis() + 10000;
int minutes = (timer - startTime)/60000;
int secs = ((timer - startTime) / 1000) % 60;
Serial1.print("Acquiring GPS signal... Time elapsed: ");
Serial1.print(minutes);//minutes
Serial1.print(":");
XBeeSerial.print("Acquiring GPS signal... Time elapsed: ");
XBeeSerial.print(minutes);//minutes
XBeeSerial.print(":");
if(secs < 10)
Serial1.print("0");
Serial1.println(secs);//seconds
XBeeSerial.print("0");
XBeeSerial.println(secs);//seconds
}
if(millis() - startTime > GPS_WAIT_TIME * 1000){
Serial1.println("CAUTION!!! GPS timeout: Progressing with no GPS signal");
XBeeSerial.println("CAUTION!!! GPS timeout: Progressing with no GPS signal");
return ERR_NO_GPS;
}
}
Serial1.println("GPS signal acquired");
XBeeSerial.println("GPS signal acquired");
uint8_t hour = GPS.hour;
uint8_t minute = GPS.minute;
uint8_t year = GPS.year;
uint8_t month = GPS.month;
uint8_t day = GPS.day;
uint8_t yearPrefix = 20;
String date = String(yearPrefix).concat(year).concat('-').concat(month).concat('-').concat(day).concat("--").concat(hour).concat('-').concat(minute);
Serial1.print("Date: ");
Serial1.println(date);

String date = String(yearPrefix) + String(year) + '-' + String(month) + '-' + String(day) + "--"+ String(hour) + '-' + String(minute);
XBeeSerial.print("Date: ");
XBeeSerial.println(date);
return date;
}

30 changes: 15 additions & 15 deletions main/gy521_imu.h
Original file line number Diff line number Diff line change
@@ -57,7 +57,7 @@ imuReading getIMU()
* Verify that the connection is operating properly by taking a sample.
*/
void setupIMU(){
Serial1.print("Setting up IMU... ");
XBeeSerial.print("Setting up IMU... ");

Wire.beginTransmission(MPU); //This is the I2C address of the MPU (b1101000/b1101001 for AC0 low/high datasheet sec. 9.2)
Wire.write(0x6B); //Accessing the register 6B - Power Management (Sec. 4.28)
@@ -78,28 +78,28 @@ void setupIMU(){
imuReading sample = getIMU(); // Reads 1 sample of data from IMU.

if(sample.accel.x != 0 || sample.accel.y != 0 || sample.accel.z != 0)
Serial1.println("IMU setup successful.");
XBeeSerial.println("IMU setup successful.");
else{
Serial1.println("Setup failed, did not read acceleration values from IMU.");
XBeeSerial.println("Setup failed, did not read acceleration values from IMU.");
}

Serial1.print("X Acceleration: ");
Serial1.println(sample.accel.x);
XBeeSerial.print("X Acceleration: ");
XBeeSerial.println(sample.accel.x);
delay(1000);
Serial1.print("Y Acceleration: ");
Serial1.println(sample.accel.y);
XBeeSerial.print("Y Acceleration: ");
XBeeSerial.println(sample.accel.y);
delay(1000);
Serial1.print("Z Acceleration: ");
Serial1.println(sample.accel.z);
XBeeSerial.print("Z Acceleration: ");
XBeeSerial.println(sample.accel.z);
delay(1000);
Serial1.print("X Gyro: ");
Serial1.println(sample.gyro.x);
XBeeSerial.print("X Gyro: ");
XBeeSerial.println(sample.gyro.x);
delay(1000);
Serial1.print("Y Gyro: ");
Serial1.println(sample.gyro.y);
XBeeSerial.print("Y Gyro: ");
XBeeSerial.println(sample.gyro.y);
delay(1000);
Serial1.print("Z Gyro: ");
Serial1.println(sample.gyro.z);
XBeeSerial.print("Z Gyro: ");
XBeeSerial.println(sample.gyro.z);
delay(1000);

}
16 changes: 8 additions & 8 deletions main/main.ino
Original file line number Diff line number Diff line change
@@ -15,14 +15,14 @@ Attitude attitude;

void setup()
{
Serial1.begin(115200); // xBee baudrate: 115200, 9600
Serial1.print("\n\n\n");
XBeeSerial.begin(115200); // xBee baudrate: 115200, 9600
XBeeSerial.print("\n\n\n");

pinMode(BUZZER_PIN, OUTPUT); // Set buzzer pin as an output
for(int i = 0; i < 5; i++) // Play 5 beeps
{
tone(BUZZER_PIN, 1000); // Send 1KHz sound signal...
Serial1.println("beep!");
XBeeSerial.println("beep!");
delay(1000); // ...for 1 sec
noTone(BUZZER_PIN); // Stop sound...
delay(1000); // ...for 1sec
@@ -108,13 +108,13 @@ flightPhase runOnPad(uint32_t tick){
transmitData(lastBmp.altitude, lastGps, '0');
}
if(tick % 1000 == 3 && tick < 30000){
Serial1.print("Calibrating IMU... time remaining: ");
Serial1.print((30000 - tick)/6000);
Serial1.print(":");
XBeeSerial.print("Calibrating IMU... time remaining: ");
XBeeSerial.print((30000 - tick)/6000);
XBeeSerial.print(":");
int seconds = ((30000 - tick)/100) % 60;
if(seconds < 10)
Serial1.print("0");
Serial1.println(seconds);
XBeeSerial.print("0");
XBeeSerial.println(seconds);
}
if(hasLaunched)
return ASCENDING;
10 changes: 8 additions & 2 deletions main/settings.h
Original file line number Diff line number Diff line change
@@ -16,10 +16,16 @@ constexpr uint32_t TICK_TIME_ASCENDING = 10000;
constexpr uint32_t TICK_TIME_DESCENDING = 50000;
constexpr uint32_t TICK_TIME_POST_FLIGHT = 1000000;

constexpr uint32_t RING_QUEUE_LENGTH = 3000;//each 100 elements is 1 seconds of data at 100hz

constexpr uint32_t GPS_WAIT_TIME = 300; //number of seconds to wait for GPS to acquire signal before moving on

constexpr int BMP_CS = 10; //SPI chipSelect of bmp altimeter
#ifdef PICO
#define GPSSerial Serial1 //Hardware Serial Location of GPS
#define XBeeSerial Serial //Hardware Serial Location of XBee
constexpr uint32_t RING_QUEUE_LENGTH = 1000;//each 100 elements is 1 seconds of data at 100hz
#else
#define XBeeSerial Serial1 //Hardware Serial Location of XBee
#define GPSSerial Serial2 //Hardware Serial Location of GPS
constexpr uint32_t RING_QUEUE_LENGTH = 3000;//each 100 elements is 1 seconds of data at 100hz
#endif // PICO
constexpr int BUZZER_PIN = 33;
14 changes: 13 additions & 1 deletion platformio.ini
Original file line number Diff line number Diff line change
@@ -10,7 +10,7 @@

[platformio]
src_dir = main
default_envs = teensy41
default_envs = teensy41, pico

[env:teensy41]
platform = teensy
@@ -22,6 +22,18 @@ lib_deps =
adafruit/Adafruit GPS Library@^1.7.0
test_ignore = *

[env:pico]
platform = raspberrypi
board = pico
framework = arduino
lib_deps =
adafruit/Adafruit BMP3XX Library@^2.1.2
adafruit/Adafruit GPS Library@^1.7.0
arduino-libraries/SD@1.2.4
test_ignore = *
build_flags =
-D PICO

[env:native]
platform = native
test_framework = googletest

0 comments on commit f82891d

Please sign in to comment.