Servo Kit 180°

这是 Servo 180 Unit 的驱动库,用于控制舵机的旋转角度。

支持以下产品:

Servo Kit 180°

UiFlow2 应用示例

设置舵机角度

在 UiFlow2 中打开 cores3_servo180_example.m5f2 项目。

该示例控制舵机旋转到不同角度。

UiFlow2 代码块:

cores3_servo180_example.png

MicroPython 应用示例

设置舵机角度

该示例控制舵机旋转到不同角度。

MicroPython 代码块:

  1# SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
  2#
  3# SPDX-License-Identifier: MIT
  4
  5import os, sys, io
  6import M5
  7from M5 import *
  8import m5ui
  9import lvgl as lv
 10from unit import Servo180Unit
 11
 12
 13page0 = None
 14label0 = None
 15button0 = None
 16slider0 = None
 17label1 = None
 18slider1 = None
 19button1 = None
 20label2 = None
 21slider2 = None
 22button2 = None
 23label3 = None
 24slider3 = None
 25button3 = None
 26servo_0 = None
 27
 28
 29def button0_short_clicked_event(event_struct):
 30    global \
 31        page0, \
 32        label0, \
 33        button0, \
 34        slider0, \
 35        label1, \
 36        slider1, \
 37        button1, \
 38        label2, \
 39        slider2, \
 40        button2, \
 41        label3, \
 42        slider3, \
 43        button3, \
 44        servo_0
 45    servo_0.set_angle(slider0.get_value())
 46
 47
 48def button1_short_clicked_event(event_struct):
 49    global \
 50        page0, \
 51        label0, \
 52        button0, \
 53        slider0, \
 54        label1, \
 55        slider1, \
 56        button1, \
 57        label2, \
 58        slider2, \
 59        button2, \
 60        label3, \
 61        slider3, \
 62        button3, \
 63        servo_0
 64    servo_0.set_duty(slider1.get_value())
 65
 66
 67def button2_short_clicked_event(event_struct):
 68    global \
 69        page0, \
 70        label0, \
 71        button0, \
 72        slider0, \
 73        label1, \
 74        slider1, \
 75        button1, \
 76        label2, \
 77        slider2, \
 78        button2, \
 79        label3, \
 80        slider3, \
 81        button3, \
 82        servo_0
 83    servo_0.set_percent(slider2.get_value())
 84
 85
 86def button3_short_clicked_event(event_struct):
 87    global \
 88        page0, \
 89        label0, \
 90        button0, \
 91        slider0, \
 92        label1, \
 93        slider1, \
 94        button1, \
 95        label2, \
 96        slider2, \
 97        button2, \
 98        label3, \
 99        slider3, \
100        button3, \
101        servo_0
102    servo_0.set_radian((slider3.get_value()) / 100)
103
104
105def button0_event_handler(event_struct):
106    global \
107        page0, \
108        label0, \
109        button0, \
110        slider0, \
111        label1, \
112        slider1, \
113        button1, \
114        label2, \
115        slider2, \
116        button2, \
117        label3, \
118        slider3, \
119        button3, \
120        servo_0
121    event = event_struct.code
122    if event == lv.EVENT.SHORT_CLICKED and True:
123        button0_short_clicked_event(event_struct)
124    return
125
126
127def button1_event_handler(event_struct):
128    global \
129        page0, \
130        label0, \
131        button0, \
132        slider0, \
133        label1, \
134        slider1, \
135        button1, \
136        label2, \
137        slider2, \
138        button2, \
139        label3, \
140        slider3, \
141        button3, \
142        servo_0
143    event = event_struct.code
144    if event == lv.EVENT.SHORT_CLICKED and True:
145        button1_short_clicked_event(event_struct)
146    return
147
148
149def button2_event_handler(event_struct):
150    global \
151        page0, \
152        label0, \
153        button0, \
154        slider0, \
155        label1, \
156        slider1, \
157        button1, \
158        label2, \
159        slider2, \
160        button2, \
161        label3, \
162        slider3, \
163        button3, \
164        servo_0
165    event = event_struct.code
166    if event == lv.EVENT.SHORT_CLICKED and True:
167        button2_short_clicked_event(event_struct)
168    return
169
170
171def button3_event_handler(event_struct):
172    global \
173        page0, \
174        label0, \
175        button0, \
176        slider0, \
177        label1, \
178        slider1, \
179        button1, \
180        label2, \
181        slider2, \
182        button2, \
183        label3, \
184        slider3, \
185        button3, \
186        servo_0
187    event = event_struct.code
188    if event == lv.EVENT.SHORT_CLICKED and True:
189        button3_short_clicked_event(event_struct)
190    return
191
192
193def setup():
194    global \
195        page0, \
196        label0, \
197        button0, \
198        slider0, \
199        label1, \
200        slider1, \
201        button1, \
202        label2, \
203        slider2, \
204        button2, \
205        label3, \
206        slider3, \
207        button3, \
208        servo_0
209    m5ui.init()
210    page0 = m5ui.M5Page(bg_c=0xFFFFFF)
211    label0 = m5ui.M5Label(
212        "angle:",
213        x=6,
214        y=36,
215        text_c=0x000000,
216        bg_c=0xFFFFFF,
217        bg_opa=0,
218        font=lv.font_montserrat_14,
219        parent=page0,
220    )
221    button0 = m5ui.M5Button(
222        text="set",
223        x=258,
224        y=26,
225        bg_c=0x2196F3,
226        text_c=0xFFFFFF,
227        font=lv.font_montserrat_14,
228        parent=page0,
229    )
230    slider0 = m5ui.M5Slider(
231        x=60,
232        y=38,
233        w=180,
234        h=10,
235        mode=lv.slider.MODE.NORMAL,
236        min_value=0,
237        max_value=180,
238        value=180,
239        bg_c=0x2193F3,
240        color=0x2193F3,
241        parent=page0,
242    )
243    label1 = m5ui.M5Label(
244        "duty:",
245        x=6,
246        y=76,
247        text_c=0x000000,
248        bg_c=0xFFFFFF,
249        bg_opa=0,
250        font=lv.font_montserrat_14,
251        parent=page0,
252    )
253    slider1 = m5ui.M5Slider(
254        x=60,
255        y=74,
256        w=180,
257        h=10,
258        mode=lv.slider.MODE.NORMAL,
259        min_value=500,
260        max_value=2500,
261        value=500,
262        bg_c=0x2193F3,
263        color=0x2193F3,
264        parent=page0,
265    )
266    button1 = m5ui.M5Button(
267        text="set",
268        x=258,
269        y=66,
270        bg_c=0x2196F3,
271        text_c=0xFFFFFF,
272        font=lv.font_montserrat_14,
273        parent=page0,
274    )
275    label2 = m5ui.M5Label(
276        "per:",
277        x=6,
278        y=116,
279        text_c=0x000000,
280        bg_c=0xFFFFFF,
281        bg_opa=0,
282        font=lv.font_montserrat_14,
283        parent=page0,
284    )
285    slider2 = m5ui.M5Slider(
286        x=60,
287        y=118,
288        w=180,
289        h=10,
290        mode=lv.slider.MODE.NORMAL,
291        min_value=0,
292        max_value=100,
293        value=100,
294        bg_c=0x2193F3,
295        color=0x2193F3,
296        parent=page0,
297    )
298    button2 = m5ui.M5Button(
299        text="set",
300        x=258,
301        y=110,
302        bg_c=0x2196F3,
303        text_c=0xFFFFFF,
304        font=lv.font_montserrat_14,
305        parent=page0,
306    )
307    label3 = m5ui.M5Label(
308        "rad:",
309        x=6,
310        y=162,
311        text_c=0x000000,
312        bg_c=0xFFFFFF,
313        bg_opa=0,
314        font=lv.font_montserrat_14,
315        parent=page0,
316    )
317    slider3 = m5ui.M5Slider(
318        x=60,
319        y=163,
320        w=180,
321        h=10,
322        mode=lv.slider.MODE.NORMAL,
323        min_value=0,
324        max_value=314,
325        value=0,
326        bg_c=0x2193F3,
327        color=0x2193F3,
328        parent=page0,
329    )
330    button3 = m5ui.M5Button(
331        text="set",
332        x=258,
333        y=152,
334        bg_c=0x2196F3,
335        text_c=0xFFFFFF,
336        font=lv.font_montserrat_14,
337        parent=page0,
338    )
339
340    button0.add_event_cb(button0_event_handler, lv.EVENT.ALL, None)
341    button1.add_event_cb(button1_event_handler, lv.EVENT.ALL, None)
342    button2.add_event_cb(button2_event_handler, lv.EVENT.ALL, None)
343    button3.add_event_cb(button3_event_handler, lv.EVENT.ALL, None)
344
345    servo_0 = Servo180Unit((8, 9))
346    label0.align_to(page0, lv.ALIGN.TOP_LEFT, 6, 20)
347    label1.align_to(label0, lv.ALIGN.OUT_BOTTOM_RIGHT, 0, 40)
348    label2.align_to(label1, lv.ALIGN.OUT_BOTTOM_RIGHT, 0, 40)
349    label3.align_to(label2, lv.ALIGN.OUT_BOTTOM_RIGHT, 0, 40)
350    slider0.align_to(label0, lv.ALIGN.OUT_RIGHT_MID, 20, 0)
351    slider1.align_to(label1, lv.ALIGN.OUT_RIGHT_MID, 20, 0)
352    slider2.align_to(label2, lv.ALIGN.OUT_RIGHT_MID, 20, 0)
353    slider3.align_to(label3, lv.ALIGN.OUT_RIGHT_MID, 20, 0)
354    button0.align_to(slider0, lv.ALIGN.OUT_RIGHT_MID, 20, 0)
355    button1.align_to(slider1, lv.ALIGN.OUT_RIGHT_MID, 20, 0)
356    button2.align_to(slider2, lv.ALIGN.OUT_RIGHT_MID, 20, 0)
357    button3.align_to(slider3, lv.ALIGN.OUT_RIGHT_MID, 20, 0)
358    page0.screen_load()
359    servo_0.set_angle(59)
360
361
362def loop():
363    global \
364        page0, \
365        label0, \
366        button0, \
367        slider0, \
368        label1, \
369        slider1, \
370        button1, \
371        label2, \
372        slider2, \
373        button2, \
374        label3, \
375        slider3, \
376        button3, \
377        servo_0
378    M5.update()
379
380
381if __name__ == "__main__":
382    try:
383        setup()
384        while True:
385            loop()
386    except (Exception, KeyboardInterrupt) as e:
387        try:
388            m5ui.deinit()
389            from utility import print_error_msg
390
391            print_error_msg(e)
392        except ImportError:
393            print("please update to latest firmware")

API参考

Servo180Unit

class unit.servo180.Servo180Unit(port=None, pin=0, freq=50, count_low=500, count_high=2500)

基类:object

控制 180 度舵机电机。

参数:
  • port (tuple) – 舵机连接的端口。

  • pin (int) – 舵机连接的引脚(如果不使用端口)。

  • freq (int) – PWM 频率。默认值为 50 Hz。

  • count_low (int) – 0 度的占空比微秒计数。默认值为 500。

  • count_high (int) – 180 度对应的占空比微秒计数。默认值为 2500。

UiFlow2 代码块:

init.png

init_advanced.png

MicroPython 代码块:

from unit import Servo180Unit
servo_0 = Servo180Unit((33, 32)) # Adjust the port as needed
servo_1 = Servo180Unit(None, pin=15)  # Directly specify the pin
set_angle(angle, wait=True)

将舵机设置为指定角度。

参数:
  • angle (int) – 角度(单位:度,范围:0 到 180)。

  • wait (bool) – 是否等待舵机到达目标位置。

返回类型:

None

UiFlow2 代码块:

set_angle.png

MicroPython 代码块:

servo_0.set_angle(90)  # Set servo to 90 degrees
set_duty(duty, wait=True)

以微秒为单位设置占空比。

参数:
  • duty (int) – 以微秒为单位的占空比(500 到 2500)。

  • wait (bool) – 是否等待舵机到达目标位置。

返回类型:

None

UiFlow2 代码块:

set_duty.png

MicroPython 代码块:

servo_0.set_duty(1500)  # Set duty to 1500 microseconds
set_percent(percent, wait=True)

将舵机位置设置为百分比。

参数:
  • percent (int) – 位置百分比(0 到 100)。

  • wait (bool) – 是否等待舵机到达目标位置。

返回类型:

None

UiFlow2 代码块:

set_percent.png

MicroPython 代码块:

servo_0.set_percent(50)  # Set servo to 50% position
set_radian(radian, wait=True)

以弧度为单位设置舵机位置。

参数:
  • radian (float) – 以弧度表示的位置(0 到 π)。

  • wait (bool) – 是否等待舵机到达目标位置。

返回类型:

None

UiFlow2 代码块:

set_radian.png

MicroPython 代码块:

servo_0.set_radian(1.57)  # Set servo to π/2 radians
deinit()

反初始化舵机电机。