要控制 SG90 伺服馬達並根據 RFID 標籤 ID 改變位置,你可以使用 Raspberry Pi 的 GPIO 接腳來驅動伺服馬達。以下是一個實現這個功能的 Python 程式範例:
SG90 伺服馬達
Raspberry Pi
適當的連接線
外接電源(選擇性,依據馬達的功率需求)
將伺服馬達的信號線連接到 Raspberry Pi 的一個 PWM 支持的 GPIO 接腳,如 GPIO 18。
將伺服馬達的電源線連接到 5V 和地線。
安裝控制伺服馬達所需的 Python 函式庫:
bash
複製程式碼
pip install RPi.GPIO
以下是完整的 Python 程式碼,包括伺服馬達控制和 RFID 讀取:
以下是一個調整後的程式碼範例,加入了錯誤處理和清理邏輯,以及在程序開始時設置 GPIO 模式:
python
複製程式碼
import RPi.GPIO as GPIO
from mfrc522 import SimpleMFRC522
import time
# 禁用 GPIO 警告
GPIO.setwarnings(False)
# 嘗試設置 GPIO 模式,如果已設置則忽略錯誤
try:
GPIO.setmode(GPIO.BCM)
except ValueError:
pass
# 初始化 RFID 讀取器
reader = SimpleMFRC522()
# 伺服馬達的 GPIO 接腳
servo_pin = 27
GPIO.setup(servo_pin, GPIO.OUT)
# 設置 PWM 參數
pwm = GPIO.PWM(servo_pin, 50) # 50 Hz (20 ms PWM period)
pwm.start(0) # 初始化 PWM, 0% 占空比
def set_servo_angle(angle):
duty_cycle = angle / 18 + 2
pwm.ChangeDutyCycle(duty_cycle)
time.sleep(0.5)
pwm.ChangeDutyCycle(0) # 停止給伺服馬達送信號以防止抖動
try:
print("開始讀取,請靠近 RFID 標籤...")
set_servo_angle(90) # 初始位置
while True:
id, text = reader.read()
if id == 770942766340:
set_servo_angle(30)
time.sleep(1)
set_servo_angle(90)
elif id == 768886444178:
set_servo_angle(150)
time.sleep(1)
set_servo_angle(90)
else:
set_servo_angle(1)
time.sleep(0.5)
set_servo_angle(180)
time.sleep(0.5)
set_servo_angle(90)
finally:
pwm.stop()
GPIO.cleanup()
print("清理完成,程式結束。")
在你的程式中統一使用 GPIO.setwarnings(False) 來禁用警告,這可以避免因重複使用 GPIO 接腳而產生的警告信息。
通過在 try 語句之前設置 GPIO 模式,並在程序結束時清理 GPIO 設置,確保 GPIO 資源得到適當的管理。
上述程式中使用的 ID 需要根據你的實際 RFID 標籤進行調整。
確保在更改伺服馬達角度時進行適當的延時,讓馬達有足夠的時間到達指定位置。
在 set_servo_angle 函數中,計算 duty cycle 的公式根據伺服馬達的不同可能需要調整。