Servo Kit 180°
这是 Servo 180 Unit 的驱动库,用于控制舵机的旋转角度。
支持以下产品:
UiFlow2 应用示例
设置舵机角度
在 UiFlow2 中打开 cores3_servo180_example.m5f2 项目。
该示例控制舵机旋转到不同角度。
UiFlow2 代码块:
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 度舵机电机。
- 参数:
UiFlow2 代码块:


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)
将舵机设置为指定角度。
UiFlow2 代码块:

MicroPython 代码块:
servo_0.set_angle(90) # Set servo to 90 degrees
- set_duty(duty, wait=True)
以微秒为单位设置占空比。
UiFlow2 代码块:

MicroPython 代码块:
servo_0.set_duty(1500) # Set duty to 1500 microseconds
- set_percent(percent, wait=True)
将舵机位置设置为百分比。
UiFlow2 代码块:

MicroPython 代码块:
servo_0.set_percent(50) # Set servo to 50% position
- set_radian(radian, wait=True)
以弧度为单位设置舵机位置。
UiFlow2 代码块:

MicroPython 代码块:
servo_0.set_radian(1.57) # Set servo to π/2 radians
- deinit()
反初始化舵机电机。

