znlgis 博客

GIS开发与技术分享

第23章:舵机与电机控制

本章介绍舵机、直流电机、130电机的驱动原理与控制方法。


23.1 舵机控制

23.1.1 舵机工作原理

舵机内部包含:

  • 直流电机
  • 减速齿轮组
  • 位置传感器
  • 控制电路

通过 PWM 信号控制角度。

23.1.2 PWM 信号规范

周期: 20ms (50Hz)
脉宽: 0.5ms (0°) ~ 2.5ms (180°)

23.1.3 舵机驱动类

'''
舵机驱动类
'''
from machine import Pin, PWM

class Servo:
    def __init__(self, pin):
        self.pwm = PWM(Pin(pin))
        self.pwm.freq(50)
        self.min_duty = 1638   # 0.5ms
        self.max_duty = 8192   # 2.5ms
        self.current_angle = 90
    
    def set_angle(self, angle):
        """设置角度 (0-180)"""
        angle = max(0, min(180, angle))
        duty = int(self.min_duty + (self.max_duty - self.min_duty) * angle / 180)
        self.pwm.duty_u16(duty)
        self.current_angle = angle
    
    def smooth_move(self, target, step=1, delay_ms=20):
        """平滑移动"""
        import time
        
        while self.current_angle != target:
            if self.current_angle < target:
                self.current_angle = min(self.current_angle + step, target)
            else:
                self.current_angle = max(self.current_angle - step, target)
            self.set_angle(self.current_angle)
            time.sleep_ms(delay_ms)
    
    def release(self):
        """释放舵机"""
        self.pwm.duty_u16(0)

# 使用
servo = Servo(16)
servo.set_angle(0)
time.sleep(1)
servo.smooth_move(180)

23.2 直流电机控制

23.2.1 驱动原理

直流电机需要驱动电路(如 L298N、L9110):

GPIO1 → 驱动芯片 → 电机+
GPIO2 → 驱动芯片 → 电机-

正转: GPIO1=高, GPIO2=低
反转: GPIO1=低, GPIO2=高
停止: GPIO1=低, GPIO2=低

23.2.2 PWM 调速

'''
直流电机 PWM 调速
'''
from machine import Pin, PWM

class DCMotor:
    def __init__(self, pin1, pin2):
        self.pwm1 = PWM(Pin(pin1))
        self.pwm2 = PWM(Pin(pin2))
        self.pwm1.freq(1000)
        self.pwm2.freq(1000)
    
    def forward(self, speed=100):
        """正转"""
        duty = int(speed / 100 * 65535)
        self.pwm1.duty_u16(duty)
        self.pwm2.duty_u16(0)
    
    def backward(self, speed=100):
        """反转"""
        duty = int(speed / 100 * 65535)
        self.pwm1.duty_u16(0)
        self.pwm2.duty_u16(duty)
    
    def stop(self):
        """停止"""
        self.pwm1.duty_u16(0)
        self.pwm2.duty_u16(0)
    
    def brake(self):
        """刹车"""
        self.pwm1.duty_u16(65535)
        self.pwm2.duty_u16(65535)

# 使用
motor = DCMotor(14, 15)
motor.forward(50)  # 50% 速度正转
time.sleep(2)
motor.backward(30)  # 30% 速度反转
time.sleep(2)
motor.stop()

23.3 130 电机风扇模块

23.3.1 模块介绍

130 电机风扇模块包含:

  • 130 微型直流电机
  • 风扇叶片
  • 驱动电路

23.3.2 控制代码

'''
实验:130 风扇电机控制
'''
from machine import Pin, PWM

fan = PWM(Pin(14))
fan.freq(1000)

def set_fan_speed(percent):
    """设置风扇速度 (0-100%)"""
    duty = int(percent / 100 * 65535)
    fan.duty_u16(duty)

# 风速等级
speeds = [0, 30, 60, 100]

for speed in speeds:
    print(f"风速: {speed}%")
    set_fan_speed(speed)
    time.sleep(3)

23.3.3 温控风扇

'''
实验:温控风扇
'''
from machine import ADC

temp_sensor = ADC(4)

def read_temperature():
    raw = temp_sensor.read_u16()
    voltage = raw * 3.3 / 65535
    return 27 - (voltage - 0.706) / 0.001721

while True:
    temp = read_temperature()
    
    # 温度-速度映射
    if temp < 30:
        speed = 0
    elif temp < 35:
        speed = 30
    elif temp < 40:
        speed = 60
    else:
        speed = 100
    
    set_fan_speed(speed)
    print(f"温度: {temp:.1f}°C  风速: {speed}%")
    time.sleep(2)

23.4 多舵机协调

23.4.1 机械臂控制

'''
实验:简易机械臂
'''
class RobotArm:
    def __init__(self, base_pin, shoulder_pin, elbow_pin, gripper_pin):
        self.base = Servo(base_pin)
        self.shoulder = Servo(shoulder_pin)
        self.elbow = Servo(elbow_pin)
        self.gripper = Servo(gripper_pin)
        self.home()
    
    def home(self):
        """归位"""
        self.base.set_angle(90)
        self.shoulder.set_angle(90)
        self.elbow.set_angle(90)
        self.gripper.set_angle(90)
    
    def grab(self):
        """抓取"""
        self.gripper.smooth_move(30)
    
    def release(self):
        """释放"""
        self.gripper.smooth_move(90)
    
    def pick_and_place(self, from_pos, to_pos):
        """拾取放置"""
        # 移动到拾取位置
        self.base.smooth_move(from_pos[0])
        self.shoulder.smooth_move(from_pos[1])
        self.elbow.smooth_move(from_pos[2])
        
        # 抓取
        self.grab()
        time.sleep(0.5)
        
        # 移动到放置位置
        self.shoulder.smooth_move(90)  # 抬起
        self.base.smooth_move(to_pos[0])
        self.shoulder.smooth_move(to_pos[1])
        self.elbow.smooth_move(to_pos[2])
        
        # 释放
        self.release()

# 使用
arm = RobotArm(16, 17, 18, 19)
arm.pick_and_place((45, 60, 120), (135, 60, 120))

23.5 本章小结

本章介绍了执行器控制:

  1. 舵机控制
    • PWM 信号控制角度
    • 平滑移动实现
  2. 直流电机
    • H 桥驱动原理
    • PWM 调速
  3. 应用案例
    • 温控风扇
    • 机械臂控制

下一章将学习综合项目实践。