{"id":51928392,"url":"https://github.com/geerlingguy/tufty-gps-time","last_synced_at":"2026-07-28T05:01:15.876Z","repository":{"id":371368615,"uuid":"1299350619","full_name":"geerlingguy/tufty-gps-time","owner":"geerlingguy","description":"GPS Time app for Pimoroni Badgeware Tufty","archived":false,"fork":false,"pushed_at":"2026-07-14T17:42:33.000Z","size":1306,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-07-14T18:27:36.360Z","etag":null,"topics":["apps","badgeware","gps","micropython","pimoroni","time"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/geerlingguy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-07-13T13:55:25.000Z","updated_at":"2026-07-14T17:42:38.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/geerlingguy/tufty-gps-time","commit_stats":null,"previous_names":["geerlingguy/tufty-gps-time"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/geerlingguy/tufty-gps-time","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/geerlingguy%2Ftufty-gps-time","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/geerlingguy%2Ftufty-gps-time/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/geerlingguy%2Ftufty-gps-time/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/geerlingguy%2Ftufty-gps-time/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/geerlingguy","download_url":"https://codeload.github.com/geerlingguy/tufty-gps-time/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/geerlingguy%2Ftufty-gps-time/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35976727,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-07-28T02:00:06.341Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["apps","badgeware","gps","micropython","pimoroni","time"],"created_at":"2026-07-28T05:01:15.280Z","updated_at":"2026-07-28T05:01:15.863Z","avatar_url":"https://github.com/geerlingguy.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GPS Time for Tufty 2350\n\nA GPS time app for Pimoroni's [Tufty 2350](https://shop.pimoroni.com/products/tufty-2350?variant=55811986194811), using the [Adafruit Mini GPS PA1010D](https://www.adafruit.com/product/4415) GPS module.\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"images/tufty-2350-gps-time.jpg\" width=\"550\" height=\"auto\"\u003e\u003c/p\u003e\n\nThe PA1010D is built around MediaTek's [MT3333 GPS SoC](https://ia902802.us.archive.org/21/items/mt3333-datasheet/MT3333_Datasheet.pdf). It uses around 30 mW of power when tracking, and 40 mW during acquisition. PPS output is accurate to within ±20 ns.\n\nThe module plugs in with a [50mm QWIIC cable](https://shop.pimoroni.com/products/jst-sh-cable-qwiic-stemma-qt-compatible?variant=40407104290899)—I'm using one that came with the STEM kit.\n\n## AI Disclosure\n\nMuch of the code was generated by Claude Sonnet 5 (Medium). The initial prompt is shown in `Requirements.md`, but I'm lazy and don't have my full chat history incorporated into this repo, sorry.\n\n## Hardware\n\nPlug the [Adafruit PA1010D GPS](https://www.adafruit.com/product/4415) module directly into the QWIIC plug labeled 'I2C' on the back of the Tufty 2350.\n\nYou can plug into either side of the GPS module.\n\n### PPS Watch Compatibility\n\nThe GPS Time app includes support for the u-blox MAX-M10S, but is is not enabled by default. To use it (e.g. with a [PPS Watch](https://github.com/idlehandsdev/pps-watch)'s QWIIC connector output):\n\n  1. Plug a QWIIC cable between the Tufty and the MAX-M10S device\n  1. Turn on the Tufty, then turn on the MAX-M10S device (if it requires separate power, as is the case with the PPS Watch)\n  1. Open the GPS Time app\n  1. Go into settings (the Cog icon)\n  1. Move down to the 'GPS Module Address' setting, and change it from `0x10` to `0x42`\n  1. Press B to go back to the GPS Time main screen\n\nAt this point, the GPS Time app should configure the MAX-M10S to send over NMEA sentences so it can get timing data.\n\n\u003e **NOTE**: The first version of the PPS Watch PCB had the QWIIC connector reversed. [I made a QWIIC crossover cable](https://github.com/geerlingguy/tufty-gps-time/issues/1) for compatibility. If you have one of these early PPS Watches, make sure you reverse the connections between the boards!\n\n### 3D Printed GPS bracket\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"images/tufty-2350-minigps-clip.jpg\" width=\"550\" height=\"auto\"\u003e\u003c/p\u003e\n\nFor best GPS reception, the patch antenna (the big ceramic thing on top of the GPS chip) should face the sky. I modified the official [Badgeware Multi-sensor Stick Clip](https://www.printables.com/model/1726590-badgeware-multi-sensor-stick-clip) design to hold the GPS module vertically, so it will be pointed 'up' while you're wearing the badge.\n\nThe 3D design files are in the '3d mount' directory, but I've also published them on Printables: [Badgewear MiniGPS Clip](https://www.printables.com/model/1787732-badgeware-minigps-clip).\n\nSources used for 3D modeling the bracket:\n\n  - [Pimoroni Badgeware Blank](https://www.printables.com/model/1779998-pimoroni-badgeware-blank/files)\n  - [Pimoroni Badgeware Multi-Sensor Stick Clip](https://www.printables.com/model/1726590-badgeware-multi-sensor-stick-clip)\n  - [AdaFruit 4415 Mini GPS PA1010D](https://learn.adafruit.com/adafruit-mini-gps-pa1010d-module/downloads)\n\nThis bracket is also useful if you're debugging the badge or displaying it on your desk using the [Badgeware stand](https://www.printables.com/model/1726520-badgeware-stand).\n\n### PPS Output\n\nYou can solder two pins to the 'PPS' and 'GND' pins for PPS output, to allow 1 Hz external clock disciplining or GPS module comparison. Unfortunately, there are [no GPIO pins exposed on Tufty's PCB](https://forums.pimoroni.com/t/pps-input-on-tufty-gpio-pin/28958) for the RP2350 to ingest a PPS signal.\n\n### PPS Input\n\nSee discussion [PPS input on Tufty GPIO pin?](https://forums.pimoroni.com/t/pps-input-on-tufty-gpio-pin/28958) for more on PPS input.\n\n## Software\n\nThis process was validated on a Mac running macOS 26. Use on other OSes may vary.\n\nTo install the GPS Time app on your Tufty 2350 badge:\n\n  1. Plug Tufty 2350 into your computer with a USB cable\n  2. Double-click the 'RESET' button on the back of the badge to enter USB Disk Mode\n  3. Copy over the entire `gps_time` directory into Tufty's `apps` directory\n  4. Eject the TUFTY volume.\n  5. The GPS Time app should be showing in the apps list now\n\nAlternatively, you can just run `update_tufty.sh` to copy over the app once you have the TUFTY volume mounted.\n\nUpdating the software:\n\n  1. Do all the above to get the TUFTY volume mounted.\n  1. Run the `update_tufty.sh` script to copy over the updated Python code and unmount the TUFTY volume.\n\n### GPS Data Logging\n\nGPS Data Logging is enabled by default. You can disable it on the Settings screen. To get a GPS log file off the device, run the following while the device is on (note: this will lock up whatever is running currently):\n\n  1. `pip install mpremote`\n  1. `./download_gps_log.sh` (add `--clear` to erase from Tufty)\n\nAlternatively, open Thonny, connect to the board, then browse to the 'state' directory and open the log files within Thonny. They're in the `state` directory at the root of the device's filesystem.\n\n### GPS Log Visualization\n\nThere is a tiny webapp you can run locally (single HTML file) to visualize the logged GPS data on a map, with color corresponding to signal quality.\n\nOpen `gps_log_map.html` in your web browser, and click 'Load CSV', then select your CSV log file.\n\nIf you need to aggregate multiple log files into one, run the following:\n\n```\n{ head -n 1 gps_log_0001.csv; for f in gps_log_*.csv; do tail -n +2 \"$f\"; done; } \u003e combined_gps_log.csv\n```\n\n## Author\n\nAuthored by [Jeff Geerling](https://www.jeffgeerling.com) in 2026, with help from Claude Sonnet 5 and Pimoroni's excellent forum users.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgeerlingguy%2Ftufty-gps-time","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgeerlingguy%2Ftufty-gps-time","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgeerlingguy%2Ftufty-gps-time/lists"}