ENG-CANSAT-PICO-GPS
Forewords
Transmitting the CanSat localisation while the parachute descent will, for sure, help you to find on the ground!
The CanSat GPS module use the GPS / GALILEO / GLONASS / QZSS satellite networks to calculate the current position.
The GPS module used a Patch Antenna made it very compact while still offering a -165 dBm sensitivity. The high sensitivity made it possible to detect the localisation signal even under bad conditions.
With the patch antenna already oriented to the sky, the module is ready to mount on the CanSat with a simple Grove cable!
Hot Start Localisation
What's make the difference of this GPS is its hot start capability.
The Hot Start requires a CR2032 coin cell to be inserted. Then the GPS module keeps an accurate time tracking making it possible to get satellite fix within 1 second!
Without the CR2032, the GPS module tries to locate the networks as it will do the very first time, this cold start may take up to 35 seconds (datasheet).
Technical details
- Supported Networks: GPS/GALILEO/GLONASS/QZSS;
- Channels: 33/99 channels
- Hardware support: MT3333
- Refresh Rate: 1-10Hz
- TTFF (Time To First Fix): 1s (hot start)/35s (cold start)
- Sensisivity: -165dBm
- Interface: UART, I2C
- Protocol: NMEA
- Voltage: 3-4.3V
- Antenna: ceramic patch antenna
- Size: 16x16mm. Height: 6.7mm
- Circular Error Probable: 3m(CEP)
- Speed accuracy: 0.1m/s
- PPS Accuracy: 20ns (PPS=Pulse Per Second)
- SBAS, EPO, EASY, always Locate, LOCUS
Installing the GPS library
The board is compatible with GPS-Ultimate MicroPython library (available on GitHub).
You can download and copy the library manually to your board from the Repository.
First, open the repository, then navigate to the file lib/adafruit_gps.py and lib/gps_config.py.
Follow the steps as describes in the "BMP280 library installation" to copy the GPS library files to your micropython board.
Once copied, you can also check the proper installation by typing from adafruit_gps import GPS .
The GPS-Ultimate library repository contains examples of usage. Do not hesitate to check them!
Connect CanSat GPS
Quite simple, just plug the grove cable to the Cansat-GPS and the other end to UART connector.
GPS test
The cansat-belgium-micropython repository contains a test-gps subfolder with demonstration script.
Wait the fix!
The LED next to the GPS:
- Blinks while searching GPS network
- Lit (fixed) when synchronized with GPS Network.
Minimal test
The minimal test script perform the following tasks:
- Opens and configure the UART (serial port) of the Pico
- Create a GPS object (attached to the UART)
- Send some command to the GPS to configure it.
- Start an infinite while loop to print measurement each seconds
- Wait the GPS to get a Network Fix (NMEA protocol returns the Fix status)
- Display useful information from the GPS
from machine import UART, Pin
import utime as time
from adafruit_gps import GPS
uart = UART( 0, rx=Pin(1), tx=Pin(0), baudrate=9600, timeout=3000)
gps = GPS(uart) # Create the GPS object
# Turn on the basic GGA and RMC info
gps.send_command( 'PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0')
# Set update rate to once a second (1hz)
gps.send_command( 'PMTK220,1000')
# Main loop runs
last_print = time.ticks_ms()
while True:
gps.update() # update object with data sent by GPS over uart
current = time.ticks_ms()
if time.ticks_diff(current, last_print) >= 1000: # Print once a second only
last_print = current
if not gps.has_fix:
print('Waiting for fix...')
continue # restart the While loop
print('=' * 40)
print('Fix timestamp: {}/{}/{} {:02}:{:02}:{:02}'.format(
gps.timestamp_utc[1],
gps.timestamp_utc[2],
gps.timestamp_utc[0],
gps.timestamp_utc[3],
gps.timestamp_utc[4],
gps.timestamp_utc[5]))
print('Latitude: {} degrees'.format(gps.latitude))
print('Longitude: {} degrees'.format(gps.longitude))
if gps.satellites is not None:
print('# satellites: {}'.format(gps.satellites))
if gps.track_angle_deg is not None:
print('Speed: {} km/h'.format(gps.speed_knots*1.8513))
Ce qui produit la sortie suivante dans la session REPL.
======================================== Fix timestamp: 10/18/2025 16:37:18 Latitude: 50.69057 degrees Longitude: 4.400766 degrees # satellites: 12 Speed: 0.074052 km/h ======================================== Fix timestamp: 10/18/2025 16:37:19 Latitude: 50.69057 degrees Longitude: 4.400765 degrees # satellites: 12 Speed: 1.203345 km/h ======================================== Fix timestamp: 10/18/2025 16:37:20 Latitude: 50.69057 degrees Longitude: 4.400765 degrees # satellites: 12 Speed: 1.073754 km/h ========================================
Localise on Google Maps
The collected latitude and longitude can be enter directly in the search field of Google Maps as follow:
latitude , longitude
From the preceding test script, the position could be encoded as 50.69057 , 4.400765
Once the return key pressed, the location will be reformatted and maps positioned above the coordinates! (it is the MCHobby address)
Simple test
The simpletest.py script example is based on the former example.
This new one contains more GPS commands and show more information collect from the GPS data.
Here the kind of result it can produce:
======================================== Fix timestamp: 10/18/2025 17:03:51 Latitude: 50.69063 degrees Longitude: 4.400778 degrees Fix quality: 1 # satellites: 10 Altitude: 110.0 meters Speed: 0.36 knots and 0.666468 km/h Track angle: 159.4 degrees Horizontal dilution: 1.19 Height geo ID: 47.4 meters ======================================== Fix timestamp: 10/18/2025 17:03:52 Latitude: 50.69063 degrees Longitude: 4.40078 degrees Fix quality: 1 # satellites: 10 Altitude: 110.0 meters Speed: 0.31 knots and 0.573903 km/h Track angle: 159.4 degrees Horizontal dilution: 1.19 Height geo ID: 47.4 meters
Written by Meurisse D. for MCHobby

