Skip to content

Commit 3cd797e

Browse files
chenzhjielbuque
authored andcommitted
lib/gps: Add GPS Module Support.
Signed-off-by: chcj <[email protected]>
1 parent 8a3ed83 commit 3cd797e

File tree

8 files changed

+657
-0
lines changed

8 files changed

+657
-0
lines changed

docs/en/module/gps.rst

Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
2+
GPSModule
3+
=========
4+
5+
.. include:: ../refs/module.gps.ref
6+
7+
COM.GPS is a satellite positioning module in the M5Stack stacking module series. It is developed based on the NEO-M8N module.
8+
9+
Support the following products:
10+
11+
|GPSModule|
12+
13+
Micropython Example:
14+
15+
.. literalinclude:: ../../../examples/module/gps/gps_core2_example.py
16+
:language: python
17+
:linenos:
18+
19+
20+
UIFLOW2 Example:
21+
22+
|example.png|
23+
24+
.. only:: builder_html
25+
26+
|gps_core2_example.m5f2|
27+
28+
class GPSModule
29+
---------------
30+
31+
Constructors
32+
------------
33+
34+
.. class:: GPSModule(id, rx, tx)
35+
36+
initialize Function.
37+
38+
:param int id: UART controllers id, the range is 0 to 2.
39+
:param int rx: UART rx pin.
40+
:param int tx: UART tx pin.
41+
42+
UIFLOW2:
43+
44+
|init.png|
45+
46+
47+
Methods
48+
-------
49+
50+
.. method:: GPSModule.set_time_zone(value)
51+
52+
set timezone function.
53+
54+
:param int value: timezone value
55+
56+
UIFLOW2:
57+
58+
|set_time_zone.png|
59+
60+
.. method:: GPSModule.get_time_zone()
61+
62+
get timezone function.
63+
64+
:return (int): timezone value
65+
66+
UIFLOW2:
67+
68+
|get_time_zone.png|
69+
70+
.. method:: GPSModule.get_satellite_num()
71+
72+
get satellite numbers.
73+
74+
:return (str): satellite numbers value.
75+
76+
UIFLOW2:
77+
78+
|get_satellite_num.png|
79+
80+
.. method:: GPSModule.get_altitude()
81+
82+
get altitude.
83+
84+
:return (str): altitude unit is meter.
85+
86+
UIFLOW2:
87+
88+
|get_altitude.png|
89+
90+
.. method:: GPSModule.get_time()
91+
92+
get time.
93+
94+
:return (str): time(hh:mm:ss)
95+
96+
UIFLOW2:
97+
98+
|get_time.png|
99+
100+
.. method:: GPSModule.get_date()
101+
102+
get date.
103+
104+
:return (str): date(dd/mm/yy)
105+
106+
UIFLOW2:
107+
108+
|get_date.png|
109+
110+
.. method:: GPSModule.get_latitude()
111+
112+
get latitude.
113+
114+
:return (str): latitude, using degrees minutes format (ddmm.mmmmmN/S).
115+
116+
UIFLOW2:
117+
118+
|get_latitude.png|
119+
120+
.. method:: GPSModule.get_longitude()
121+
122+
get longitude.
123+
124+
:return (str): longitude, using degrees minutes format (ddmm.mmmmmE/W).
125+
126+
UIFLOW2:
127+
128+
|get_longitude.png|
129+
130+
.. method:: GPSModule.get_latitude_decimal()
131+
132+
get latitude decimal.
133+
134+
:return (float): latitude decimal(dd.dddd).
135+
136+
UIFLOW2:
137+
138+
|get_latitude_decimal.png|
139+
140+
.. method:: GPSModule.get_longitude_decimal()
141+
142+
get longitude decimal.
143+
144+
:return (float): longitude decimal(dd.dddd).
145+
146+
UIFLOW2:
147+
148+
|get_longitude_decimal.png|
149+
150+
.. method:: GPSModule.get_speed(type)
151+
152+
get speed.
153+
154+
:return (str): speed.
155+
:param int type: speed type, 0 km/h, 1 knot/h
156+
Options:
157+
- ``km/h``: 0
158+
- ``knot/h``: 1
159+
160+
UIFLOW2:
161+
162+
|get_speed.png|
163+
164+
.. method:: GPSModule.get_course()
165+
166+
get course.
167+
168+
:return (str): course unit is °.
169+
170+
UIFLOW2:
171+
172+
|get_course.png|
173+
174+
.. method:: GPSModule.is_locate_valid()
175+
176+
get locate status.
177+
178+
:return (bool): locate status, true is locate, false is not locate.
179+
180+
UIFLOW2:
181+
182+
|is_locate_valid.png|
183+
184+
185+

docs/en/module/index.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Module
1010
dmx.rst
1111
dualkmeter.rst
1212
gnss.rst
13+
gps.rst
1314
grbl.rst
1415
hmi.rst
1516
llm.rst

docs/en/refs/module.gps.ref

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
2+
.. |GPSModule| image:: https://static-cdn.m5stack.com/resource/docs/products/module/GNSS%20Module/img-824d0251-e9ac-4d4d-ae16-7aaea58827eb.webp
3+
:target: https://docs.m5stack.com/en/module/comx_gps
4+
:height: 200px
5+
:width: 200px
6+
7+
.. |init.png| image:: https://static-cdn.m5stack.com/mpy_docs/module/gps/init.png
8+
.. |set_time_zone.png| image:: https://static-cdn.m5stack.com/mpy_docs/module/gps/set_time_zone.png
9+
.. |get_time_zone.png| image:: https://static-cdn.m5stack.com/mpy_docs/module/gps/get_time_zone.png
10+
.. |get_satellite_num.png| image:: https://static-cdn.m5stack.com/mpy_docs/module/gps/get_satellite_num.png
11+
.. |get_altitude.png| image:: https://static-cdn.m5stack.com/mpy_docs/module/gps/get_altitude.png
12+
.. |get_time.png| image:: https://static-cdn.m5stack.com/mpy_docs/module/gps/get_time.png
13+
.. |get_date.png| image:: https://static-cdn.m5stack.com/mpy_docs/module/gps/get_date.png
14+
.. |get_latitude.png| image:: https://static-cdn.m5stack.com/mpy_docs/module/gps/get_latitude.png
15+
.. |get_longitude.png| image:: https://static-cdn.m5stack.com/mpy_docs/module/gps/get_longitude.png
16+
.. |get_latitude_decimal.png| image:: https://static-cdn.m5stack.com/mpy_docs/module/gps/get_latitude_decimal.png
17+
.. |get_longitude_decimal.png| image:: https://static-cdn.m5stack.com/mpy_docs/module/gps/get_longitude_decimal.png
18+
.. |get_speed.png| image:: https://static-cdn.m5stack.com/mpy_docs/module/gps/get_speed.png
19+
.. |get_course.png| image:: https://static-cdn.m5stack.com/mpy_docs/module/gps/get_course.png
20+
.. |is_locate_valid.png| image:: https://static-cdn.m5stack.com/mpy_docs/module/gps/is_locate_valid.png
21+
22+
.. |example.png| image:: https://static-cdn.m5stack.com/mpy_docs/module/gps/example.png
23+
24+
.. |gps_core2_example.m5f2| raw:: html
25+
26+
<a
27+
href="https://uiflow2.m5stack.com/?example=https://raw.githubusercontent.com/m5stack/uiflow-micropython/develop/examples/module/gps/gps_core2_example.m5f2"
28+
target="_blank"
29+
>
30+
gps_core2_example.m5f2
31+
</a>
32+
33+
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"version":"V2.0","versionNumber":"V2.1.8","type":"core2","components":[{"name":"screen","type":"screen","layer":0,"screenId":"builtin","screenName":"","id":"__core2_screen","createTime":1733292984161,"x":0,"y":0,"width":320,"height":240,"backgroundColor":"#222222","size":0,"isSelected":true},{"name":"GPST","type":"title","layer":1,"screenId":"builtin","screenName":"","id":"tcu_Wl^o-!PyHemD","createTime":1733293424062,"x":0,"y":0,"color":"#ffffff","backgroundColor":"#0000FF","text":" GPS Module Demo","textOffset":3,"font":"Widgets.FONTS.DejaVu18","isSelected":false},{"name":"label0","type":"label","layer":2,"screenId":"builtin","screenName":"","id":"aF*#wiNMBA*je6Sg","createTime":1733293460316,"x":10,"y":27,"color":"#ffffff","backgroundColor":"#222222","text":"Locate status:","engine":"gfx","font":"Widgets.FONTS.DejaVu18","rotation":0,"isSelected":false},{"name":"label1","type":"label","layer":3,"screenId":"builtin","screenName":"","id":"iDFdrnheHSOrJeKb","createTime":1733293493006,"x":2,"y":52,"color":"#ffffff","backgroundColor":"#222222","text":"Satellite nums:","engine":"gfx","font":"Widgets.FONTS.DejaVu18","rotation":0,"isSelected":false},{"name":"label2","type":"label","layer":4,"screenId":"builtin","screenName":"","id":"p^Kwu6ec09N#bKTY","createTime":1733293493006,"x":40,"y":105,"color":"#ffffff","backgroundColor":"#222222","text":"Longitude:","engine":"gfx","font":"Widgets.FONTS.DejaVu18","rotation":0,"isSelected":false},{"name":"label3","type":"label","layer":5,"screenId":"builtin","screenName":"","id":"h3*0`FTpxDJjki1j","createTime":1733293493006,"x":56,"y":77,"color":"#ffffff","backgroundColor":"#222222","text":"Latitude:","engine":"gfx","font":"Widgets.FONTS.DejaVu18","rotation":0,"isSelected":false},{"name":"label4","type":"label","layer":6,"screenId":"builtin","screenName":"","id":"w2vH80as@xI`$nmr","createTime":1733293493006,"x":85,"y":131,"color":"#ffffff","backgroundColor":"#222222","text":"Date:","engine":"gfx","font":"Widgets.FONTS.DejaVu18","rotation":0,"isSelected":false},{"name":"label5","type":"label","layer":7,"screenId":"builtin","screenName":"","id":"rZ4Rx@WjscV`jkVp","createTime":1733293493006,"x":83,"y":159,"color":"#ffffff","backgroundColor":"#222222","text":"Time:","engine":"gfx","font":"Widgets.FONTS.DejaVu18","rotation":0,"isSelected":false},{"name":"label6","type":"label","layer":8,"screenId":"builtin","screenName":"","id":"t0q$QqOYDYOpTc4r","createTime":1733293829356,"x":150,"y":28,"color":"#ffffff","backgroundColor":"#222222","text":"label6","engine":"gfx","font":"Widgets.FONTS.DejaVu18","rotation":0,"isSelected":false},{"name":"label7","type":"label","layer":9,"screenId":"builtin","screenName":"","id":"zzAlz1zXUgLT%IDp","createTime":1733293829356,"x":150,"y":52,"color":"#ffffff","backgroundColor":"#222222","text":"label7","engine":"gfx","font":"Widgets.FONTS.DejaVu18","rotation":0,"isSelected":false},{"name":"label8","type":"label","layer":10,"screenId":"builtin","screenName":"","id":"f&a6zZ@@yH&jtBuz","createTime":1733293829356,"x":150,"y":79,"color":"#ffffff","backgroundColor":"#222222","text":"label8","engine":"gfx","font":"Widgets.FONTS.DejaVu18","rotation":0,"isSelected":false},{"name":"label9","type":"label","layer":11,"screenId":"builtin","screenName":"","id":"fg=^h6ey0dTP0F!^","createTime":1733293829356,"x":150,"y":107,"color":"#ffffff","backgroundColor":"#222222","text":"label9","engine":"gfx","font":"Widgets.FONTS.DejaVu18","rotation":0,"isSelected":false},{"name":"label10","type":"label","layer":12,"screenId":"builtin","screenName":"","id":"pklIusLBcBw4k`KD","createTime":1733293829356,"x":150,"y":134,"color":"#ffffff","backgroundColor":"#222222","text":"label10","engine":"gfx","font":"Widgets.FONTS.DejaVu18","rotation":0,"isSelected":false},{"name":"label11","type":"label","layer":13,"screenId":"builtin","screenName":"","id":"fsA+2tRp$^A-hAky","createTime":1733293829356,"x":150,"y":160,"color":"#ffffff","backgroundColor":"#222222","text":"label11","engine":"gfx","font":"Widgets.FONTS.DejaVu18","rotation":0,"isSelected":false}],"resources":[{"hardware":["hardware_button","hardware_pin_button","imu","speaker","touch","mic"]},{"module":["module_gps"]}],"units":[],"hats":[],"bases":[],"i2cs":[],"blockly":"<block type=\"basic_on_setup\" id=\"setup_block\" deletable=\"false\" x=\"50\" y=\"50\"><mutation isBegin=\"true\"></mutation><field name=\"UPDATEOP\">true</field><statement name=\"FUNC\"><block type=\"system_m5_begin\" id=\"system_m5_begin\"><next><block type=\"module_gps_init\" id=\"0c]1UsyUxOOp|Q+of@Y=\"><field name=\"NAME\">module_gps_0</field><value name=\"UART\"><shadow type=\"module_gps_id_option\" id=\"21a3?|k]+Mo:Z@HVTsR+\"><field name=\"VALUE\">2</field></shadow></value><value name=\"TX\"><shadow type=\"math_number\" id=\"N98-0$J)6ANuuywLS.}y\"><mutation max=\"Infinity\" min=\"-Infinity\" precision=\"0\"></mutation><field name=\"NUM\">14</field></shadow></value><value name=\"RX\"><shadow type=\"math_number\" id=\"[ouuagN/L2r1-{o}eSE/\"><mutation max=\"Infinity\" min=\"-Infinity\" precision=\"0\"></mutation><field name=\"NUM\">13</field></shadow></value><next><block type=\"module_gps_set_time_zone\" id=\"h7zMn$9V$K)lM)pYmSdE\"><field name=\"NAME\">module_gps_0</field><value name=\"VALUE\"><shadow type=\"module_gps_time_zone_option\" id=\"SM(3eUBk;oTq^ZDoCc-s\"><field name=\"VALUE\">8</field></shadow></value></block></next></block></next></block></statement></block><block type=\"basic_on_loop\" id=\"loop_block\" deletable=\"false\" x=\"590\" y=\"70\"><mutation isUpdate=\"true\"></mutation><field name=\"UPDATEOP\">true</field><statement name=\"FUNC\"><block type=\"system_m5_update\" id=\"system_m5_update\"><next><block type=\"controls_if\" id=\"sS]#(DD/,d#LTrcQ;,=/\"><mutation else=\"1\"></mutation><value name=\"IF0\"><block type=\"module_gps_is_locate_valid\" id=\"IsN;G}?G;X0=$Iv_F{gz\"><field name=\"NAME\">module_gps_0</field></block></value><statement name=\"DO0\"><block type=\"label_set_text\" id=\"qyaw/1@FXXitrDn$Z79J\"><field name=\"NAME\">label6</field><value name=\"TEXT\"><shadow type=\"text\" id=\"2=%JoA9T;[ef$AZ40,xT\"><field name=\"TEXT\">OK</field></shadow></value></block></statement><statement name=\"ELSE\"><block type=\"label_set_text\" id=\"Bf3_}oyrfgLj+6sAE5oU\"><field name=\"NAME\">label6</field><value name=\"TEXT\"><shadow type=\"text\" id=\"Z^Nkh~XOyEQCAC*uSeb[\"><field name=\"TEXT\">False</field></shadow></value></block></statement><next><block type=\"label_set_text\" id=\"UMscD%f:%soK+y7^.$xq\"><field name=\"NAME\">label7</field><value name=\"TEXT\"><shadow type=\"text\" id=\"`S1?9;=+r7x*}[l?R4M|\"><field name=\"TEXT\">False</field></shadow><block type=\"module_gps_get_satellite_num\" id=\"mR|`Fvwqn%_pC:`AumXY\"><field name=\"NAME\">module_gps_0</field></block></value><next><block type=\"label_set_text\" id=\"j3:}CqS1oYZq0[?69M@}\"><field name=\"NAME\">label8</field><value name=\"TEXT\"><shadow type=\"text\" id=\"`S1?9;=+r7x*}[l?R4M|\"><field name=\"TEXT\">False</field></shadow><block type=\"module_gps_get_latitude\" id=\"@nwu{B/8in2+d3t+bL^4\"><field name=\"NAME\">module_gps_0</field></block></value><next><block type=\"label_set_text\" id=\"ch?}~*thLq0,*xr}s$oy\"><field name=\"NAME\">label9</field><value name=\"TEXT\"><shadow type=\"text\" id=\"`S1?9;=+r7x*}[l?R4M|\"><field name=\"TEXT\">False</field></shadow><block type=\"module_gps_get_longitude\" id=\",cTE:V8CZ|(9WCwBtJq%\"><field name=\"NAME\">module_gps_0</field></block></value><next><block type=\"label_set_text\" id=\".{:1(0cfIspH.P$e,66N\"><field name=\"NAME\">label10</field><value name=\"TEXT\"><shadow type=\"text\" id=\"`S1?9;=+r7x*}[l?R4M|\"><field name=\"TEXT\">False</field></shadow><block type=\"module_gps_get_date\" id=\"ZLF5Ks6ywvB~F:KfrKpc\"><field name=\"NAME\">module_gps_0</field></block></value><next><block type=\"label_set_text\" id=\"|bTq{P{PNJ(mQzOU$_hJ\"><field name=\"NAME\">label11</field><value name=\"TEXT\"><shadow type=\"text\" id=\"`S1?9;=+r7x*}[l?R4M|\"><field name=\"TEXT\">False</field></shadow><block type=\"module_gps_get_time\" id=\"quON=8QBMN}H8lr^r:35\"><field name=\"NAME\">module_gps_0</field></block></value></block></next></block></next></block></next></block></next></block></next></block></next></block></statement></block>","screen":[{"simulationName":"Built-in","type":"builtin","width":320,"height":240,"scale":0.78,"screenName":"","blockId":"","screenColorType":0,"id":"builtin","createTime":1733292984160}],"logicWhenNum":0,"customList":[]}
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import os, sys, io
2+
import M5
3+
from M5 import *
4+
from module import GPSModule
5+
6+
7+
GPST = None
8+
label0 = None
9+
label1 = None
10+
label2 = None
11+
label3 = None
12+
label4 = None
13+
label5 = None
14+
label6 = None
15+
label7 = None
16+
label8 = None
17+
label9 = None
18+
label10 = None
19+
label11 = None
20+
com_gps_0 = None
21+
22+
23+
def setup():
24+
global \
25+
GPST, \
26+
label0, \
27+
label1, \
28+
label2, \
29+
label3, \
30+
label4, \
31+
label5, \
32+
label6, \
33+
label7, \
34+
label8, \
35+
label9, \
36+
label10, \
37+
label11, \
38+
com_gps_0
39+
40+
M5.begin()
41+
Widgets.fillScreen(0x222222)
42+
GPST = Widgets.Title(
43+
" GPS Module Demo", 3, 0xFFFFFF, 0x0000FF, Widgets.FONTS.DejaVu18
44+
)
45+
label0 = Widgets.Label(
46+
"Locate status:", 10, 27, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18
47+
)
48+
label1 = Widgets.Label(
49+
"Satellite nums:", 2, 52, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18
50+
)
51+
label2 = Widgets.Label("Longitude:", 40, 105, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
52+
label3 = Widgets.Label("Latitude:", 56, 77, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
53+
label4 = Widgets.Label("Date:", 85, 131, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
54+
label5 = Widgets.Label("Time:", 83, 159, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
55+
label6 = Widgets.Label("label6", 150, 28, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
56+
label7 = Widgets.Label("label7", 150, 52, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
57+
label8 = Widgets.Label("label8", 150, 79, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
58+
label9 = Widgets.Label("label9", 150, 107, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
59+
label10 = Widgets.Label("label10", 150, 134, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
60+
label11 = Widgets.Label("label11", 150, 160, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
61+
62+
com_gps_0 = GPSModule(2, 13, 14)
63+
com_gps_0.set_time_zone(8)
64+
65+
66+
def loop():
67+
global \
68+
GPST, \
69+
label0, \
70+
label1, \
71+
label2, \
72+
label3, \
73+
label4, \
74+
label5, \
75+
label6, \
76+
label7, \
77+
label8, \
78+
label9, \
79+
label10, \
80+
label11, \
81+
com_gps_0
82+
M5.update()
83+
if com_gps_0.is_locate_valid():
84+
label6.setText(str("OK"))
85+
else:
86+
label6.setText(str("False"))
87+
label7.setText(str(com_gps_0.get_satellite_num()))
88+
label8.setText(str(com_gps_0.get_latitude()))
89+
label9.setText(str(com_gps_0.get_longitude()))
90+
label10.setText(str(com_gps_0.get_date()))
91+
label11.setText(str(com_gps_0.get_time()))
92+
93+
94+
if __name__ == "__main__":
95+
try:
96+
setup()
97+
while True:
98+
loop()
99+
except (Exception, KeyboardInterrupt) as e:
100+
try:
101+
from utility import print_error_msg
102+
103+
print_error_msg(e)
104+
except ImportError:
105+
print("please update to latest firmware")

m5stack/libs/module/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"DualKmeterModule": "dual_kmeter",
1212
"Encoder4MotorModule": "encoder4_motor",
1313
"GNSSModule": "gnss",
14+
"GPSModule": "gps",
1415
"GRBLModule": "grbl",
1516
"HMIModule": "hmi",
1617
"IotBaseCatmModule": "iot_base_catm",

0 commit comments

Comments
 (0)