Add PWM-based servo control skill for RDK nodes with hardware servo support. Changes: - Add taiyang skill with SKILL.md and servo_dance.py script - Update Dockerfile and Containerfile to include taiyang skill - Update SOUL.md with skill constraints documentation The skill controls two servos via /sys/class/pwm interface and must run on node side only. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
79 lines
2.1 KiB
Python
79 lines
2.1 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
太阳!- 双舵机舞动脚本
|
|
让舵机像太阳升起一样充满活力地挥动
|
|
"""
|
|
import time
|
|
import os
|
|
import sys
|
|
|
|
PWM0 = "/sys/class/pwm/pwmchip0/pwm0"
|
|
PWM1 = "/sys/class/pwm/pwmchip0/pwm1"
|
|
PERIOD = 20000000 # 20ms = 50Hz
|
|
|
|
def init_pwm():
|
|
"""初始化两个PWM通道"""
|
|
for pwm in [PWM0, PWM1]:
|
|
try:
|
|
with open(os.path.join(pwm, "period"), "w") as f:
|
|
f.write(str(PERIOD))
|
|
with open(os.path.join(pwm, "duty_cycle"), "w") as f:
|
|
f.write("1500000") # 中心位置 90°
|
|
with open(os.path.join(pwm, "enable"), "w") as f:
|
|
f.write("1")
|
|
except Exception as e:
|
|
print(f"Error initializing {pwm}: {e}")
|
|
sys.exit(1)
|
|
|
|
def set_angle(pwm, angle):
|
|
"""设置舵机角度 (0-180°)"""
|
|
duty = int(1000000 + (angle / 180.0) * 1000000)
|
|
with open(os.path.join(pwm, "duty_cycle"), "w") as f:
|
|
f.write(str(duty))
|
|
|
|
def wave_pattern():
|
|
"""波浪模式:两舵机反向运动"""
|
|
for a in range(0, 181, 30):
|
|
set_angle(PWM0, a)
|
|
set_angle(PWM1, 180 - a)
|
|
time.sleep(0.2)
|
|
for a in range(180, -1, -30):
|
|
set_angle(PWM0, a)
|
|
set_angle(PWM1, 180 - a)
|
|
time.sleep(0.2)
|
|
|
|
def sync_pattern():
|
|
"""同步模式:两舵机同步运动"""
|
|
for a in [0, 90, 180, 90]:
|
|
set_angle(PWM0, a)
|
|
set_angle(PWM1, a)
|
|
time.sleep(0.3)
|
|
|
|
def stop_pwm():
|
|
"""停止PWM输出"""
|
|
set_angle(PWM0, 90)
|
|
set_angle(PWM1, 90)
|
|
time.sleep(0.3)
|
|
for pwm in [PWM0, PWM1]:
|
|
with open(os.path.join(pwm, "enable"), "w") as f:
|
|
f.write("0")
|
|
|
|
def main():
|
|
print("🌞 太阳!- 舵机舞动开始")
|
|
print("=" * 40)
|
|
init_pwm()
|
|
|
|
try:
|
|
while True:
|
|
print("🌊 波浪模式...")
|
|
wave_pattern()
|
|
print("🎯 同步模式...")
|
|
sync_pattern()
|
|
except KeyboardInterrupt:
|
|
print("\n停止舞动...")
|
|
stop_pwm()
|
|
print("🌞 太阳落山了,再见!")
|
|
|
|
if __name__ == "__main__":
|
|
main()
|