在 Python 中控制舵机(Servo Motor)通常涉及使用微控制器(如 Raspberry Pi、Arduino 或 ESP32)或者通过 GPIO 库直接控制,以下是几种常见的方法:
使用 Raspberry Pi 控制舵机
Raspberry Pi 可以通过 GPIO 引脚发送 PWM 信号来控制舵机。
安装库:
pip install RPi.GPIO
示例代码:
import RPi.GPIO as GPIO
import time
# 设置 GPIO 模式
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
# 定义舵机连接的 GPIO 引脚
SERVO_PIN = 18
# 初始化 GPIO
GPIO.setup(SERVO_PIN, GPIO.OUT)
# 创建 PWM 对象
pwm = GPIO.PWM(SERVO_PIN, 50) # 50 Hz 是舵机的标准频率
# 启动 PWM
pwm.start(0)
try:
while True:
# 设置舵机角度 (0-180 度)
for angle in range(0, 181, 10):
duty_cycle = (angle / 18.0) + 2.5 # 计算占空比
pwm.ChangeDutyCycle(duty_cycle)
time.sleep(1)
for angle in range(180, -1, -10):
duty_cycle = (angle / 18.0) + 2.5
pwm.ChangeDutyCycle(duty_cycle)
time.sleep(1)
except KeyboardInterrupt:
pass
finally:
pwm.stop()
GPIO.cleanup()
使用 Arduino 控制舵机
如果你使用 Arduino,可以通过串口与 Python 通信,让 Python 发送指令来控制舵机。
Arduino 代码:
#include <Servo.h>
Servo myServo;
void setup() {
myServo.attach(9); // 舵机连接到数字引脚 9
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
int angle = Serial.parseInt(); // 读取串口数据
if (angle >= 0 && angle <= 180) {
myServo.write(angle); // 设置舵机角度
}
}
}
Python 代码:
import serial import time # 设置串口ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1) # 根据实际端口修改 try: while True: angle = int(input("请输入舵机角度 (0-180): ")) if 0 <= angle <= 180: ser.write(str(angle).encode()) # 发送角度值 time.sleep(1) else: print("角度必须在 0-180 之间!") except KeyboardInterrupt: pass finally: ser.close()
使用 ESP32 控制舵机
ESP32 也可以通过 PWM 控制舵机,并且可以通过 Wi-Fi 或蓝牙与 Python 通信。
ESP32 代码:
#include <Servo.h>
Servo myServo;
void setup() {
myServo.attach(18); // 舵机连接到 GPIO 18
Serial.begin(115200);
}
void loop() {
if (Serial.available() > 0) {
int angle = Serial.parseInt();
if (angle >= 0 && angle <= 180) {
myServo.write(angle);
}
}
}
Python 代码:
import serial
import time
# 设置串口
ser = serial.Serial('/dev/ttyUSB0', 115200, timeout=1) # 根据实际端口修改
try:
while True:
angle = int(input("请输入舵机角度 (0-180): "))
if 0 <= angle <= 180:
ser.write(str(angle).encode()) # 发送角度值
time.sleep(1)
else:
print("角度必须在 0-180 之间!")
except KeyboardInterrupt:
pass
finally:
ser.close()
注意事项
- 电源问题:舵机需要较大的电流,建议使用外部电源供电,而不是直接从微控制器供电。
- PWM 频率:舵机的标准 PWM 频率是 50 Hz,占空比范围通常是 2.5% 到 12.5%。
- 角度范围:大多数舵机的角度范围是 0-180 度,但某些舵机可能支持更大范围。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/484606.html



