樹莓派4B通過16路PWM輸出的PCA9685模塊控制舵機(機械臂)附完整代碼
文章目錄
- 樹莓派4B通過16路PWM輸出的PCA9685模塊控制舵機(機械臂)附完整代碼
- 一、 Servo Driver HAT拓展板介紹
- 二、2開啟I2C
- 三、安裝相關驅動
- 四、通過代碼驅動舵機(機械臂)
- 4.1舵機的初始位置校準
- 4.2完整代碼
內容參考微雪課堂
一、 Servo Driver HAT拓展板介紹
Servo Driver HAT是基于樹莓派而設計的PWM/舵機擴展板,通過PCA9685芯片擴展16路舵機控制或者PWM輸出,每個通道12位解析度,通過I2C介面控制,無需占用額外的引腳,板載5V穩壓芯片,可接電池供電,最大輸出3A電流,適用于控制機械手臂,以及各種舵機機器人,
輸入電壓VIN:6V~12V
舵機電壓:5V
邏輯電壓:3.3V
板子可以從樹莓派上取電不需要額外供電,
也可以通過右邊綠色端子VIN接電池供電,輸入電壓范圍6V~12V,經過板載的5V穩壓芯片輸出5V電源給舵機和樹莓派供電,最大輸出電流3A,
A0~A4可以設定PCA9685芯片的I2C設備地址,可以同時接多個Servo Driver HAT
最上面的排針是舵機介面,黑色排針是GND(大部分舵機對應的是褐色線),
紅色排針是5V電源,黃色排針是PWM信號線,有0~15個通道,可以同時接16個舵機,注意舵機線不要接反,否則舵機不會轉動,
注意:
如果接大功率的舵機可能會出現供電不足,因為整個板子是5V的供電,這個5V連接著樹莓派和舵機供電,功率太大會拉低樹莓派5V電源,導致欠壓樹莓派重啟,把板載上的0R電阻去除,右側綠色VIN端子接外部電源(6-12V)
我操作的是兩個機械臂一共十個舵機所以我外接了一個12V電源
二、2開啟I2C
在終端執行
sudo raspi-config
Interfacing Options-->I2C-->YES-->Finish
保險起見 重啟樹莓派 終端輸入
sudo reboot
三、安裝相關驅動
安裝相關庫檔案
sudo apt-get updata
sudo apt-get install python-pip
sudo pip install RPi.GPIO
sudo apt-get install python-smbus
下載示例程式,并解壓到指定目錄
sudo apt-get install p7zip-full
wget http://www.waveshare.net/w/upload/6/6c/Servo_Driver_HAT.7z
7zr x Servo_Driver_HAT.7z -r -o./Servo_Driver_HAT
sudo chmod 777 -R Servo_Driver_HAT
cd Servo_Driver_HAT/Raspberry\ Pi/
解壓后可以看見有一個名為PCA9685.py的檔案 我們可以在 home/pi 上新建個檔案夾 并把PCA9685.py這個檔案放進這個檔案夾 只有代碼和庫檔案在同一個目錄下才能正確呼叫
四、通過代碼驅動舵機(機械臂)
4.1舵機的初始位置校準

這里用到函式 pwm.setServoPulse(5,500)
這個函式需要兩個引數 第一個是通道號 第二個是脈沖 舵機根據脈沖調整角度 默認500為最小值 2500為最大值 所以當第二個引數為1500時為豎直狀態
調整程序:在上電狀態 將每個舵機引數設定為1500pwm.setServoPulse(5,1500)將每個舵機都拆下并重新組裝即可 (按實際情況而定如此機械臂底盤舵機就可不用另外除錯)
4.2完整代碼
from PCA9685 import PCA9685#呼叫PCA9685庫檔案
import time
pwm=PCA9685(0x40)#對地址初始化
pwm.setPWMFreq(50)#對頻率初始化
def smooth(road,before,after):#對動作的優化函式通過傳遞上一次引數而一脈沖一脈沖改變 顯得更加流暢
if before <=after:
for i in range(before,after+1,1):
pwm.setServoPulse(road,i)
else:
for i in range(before,after+1,-1):
pwm.setServoPulse(road,i)
def action1():#開爪 直立
pwm.setServoPulse(0,500)
pwm.setServoPulse(1,1500)
pwm.setServoPulse(2,1500)
pwm.setServoPulse(3,1500)
pwm.setServoPulse(4,500)
def action2():#低頭抓取
smooth(1,1500,2200)
smooth(3,1500,1000)
smooth(2,1500,2300)
#smooth(3,1000,1000)
#pwm.setServoPulse(4,500)
smooth(4,500,1500)
def action3():#轉向傳遞東西
smooth(1,2200,1500)
smooth(2,2300,1900)
smooth(3,1000,2000)
smooth(4,1500,2000)
smooth(0,500,2500)
def action3h():#開爪低頭呈遞東西
smooth(4,2000,600)
smooth(2,1900,1500)
smooth(3,2000,1500)
smooth(4,500,1500)
#函式1233h操控一號機械臂
#函式4567操控二號機械臂
def action4():#2號機械臂開爪直立
pwm.setServoPulse(5,500)
pwm.setServoPulse(6,1500)
pwm.setServoPulse(7,1500)
pwm.setServoPulse(8,1500)
pwm.setServoPulse(9,500)
def action5():#低頭接過1號機械臂呈遞的東西
smooth(7,1500,1850)
smooth(8,1500,1970)
smooth(9,500,1650)
def action6():#轉向開爪將東西放下
smooth(5,500,1400)
smooth(8,1970,1200)
smooth(6,1500,2200)
smooth(7,1850,2200)
smooth(9,1650,500)
def action7():#恢復直立回到初始位置閉爪
smooth(6,2200,1500)
smooth(7,2200,1500)
smooth(8,1200,1500)
smooth(9,500,1650)
smooth(5,1400,500)
action1()
action4()
action2()
action3()
time.sleep(1)
action5()
action3h()
action6()
action7()
smooth(0,2500,500)#一號機械臂回到初始位置
創作不易,如果文章對你有幫助請點個贊吧,
歡迎各位提問或者對內容進行補充,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/278539.html
標籤:其他
上一篇:STM32中斷系統
