The map data is vectorial, lines and polygons, stored in the SD card in a compact format. The features are drawn in the display with some basic styling. You can extract any area of the world from OSM and customize which map features you want to import and the look and feel of each one. I actually use only a small subset of all OSM map elements.
The idea is to have a small device with IPS screen for good visibility, to navigate with the bike or hiking showing only the most basic elements: paths, roads, streets, rivers, buildings, forest...
To show a very detailed map is not the goal of the project. Usually when you follow a track with the bike or walking, you just need to decide quickly if you have to take the left or right path without having to stop and check the mobile or paper map. So a very simple and clean map view plus the track. This is also the concept of some comercial ligth GPS devives. And the battery should last many hours or even days.
Elements:
- ESP32 Wrover micro controller.
- GPS module.
- Small display.
- Micro-sd card with the maps data.
- Vectorial maps data from OpenStreetMap. Basically polylines and polygons to display the roads, paths, rivers, buildings, forest, etc.
The prototype is already functional. It shows your position in the map with the little triangle, and it refresh as you move.
In the protoboard:
The wiring:
The MCU should be the ESP32 Wrover to have enough memory, but I haven't found the Fritzing image.
The code for the ESP32 and the scripts are in the github repository.
More details in: https://github.com/aresta/ESP32_GPS
It loads a map in a custom file stored in the SD card. The map is created out of Openstreetmap data extracted and clipped to a concrete area. The map file creation is done in a desktop computer with some scripts and then copied to the SD card.
To extract the map data I use an OpenStreetMap PBF file of the country (download: Geofabrik) and a bash script with the GDAL ogr2ogr tool and some python scripts to create the custom map file with the needed features and styles. All them are in the github repo with a docker configuration to facilitate the setup. Then you have to copy this file into the SD card.
The main challenge is the memory usage and optimization, to store a buffer area big enougth around your position and load more small areas when you go out of the buffer. Although vectorial maps needs very little memory compared with images, the ESP32 memory is very limited. I will try also with a ESP32 wrover with additional 8 MB of memory.
There is still work to do in several different areas. Any help is welcome!
- Optimize several aspects related to maps storage and memory.
- Add GPX track display and record track.
- A PCB, once the design is completed.
- Some buttons and user interface.
- Test with IPS smaller displays and round (clock) displays.
- A proper plastic housing.
- Battery power. AAA or small Li-XX batteries.
- Show and record the GPX tracks.
- ...
Actually I will really need help, I have little experience in some of the topics :-)
The excellent map data is available thanks to the great OpenStreetMap project, under the Open Database License.
© OpenStreetMap contributors
Very cool project!