通過樹莓派控制舵機旋轉固定角度

2021-10-03 13:14:54 字數 4467 閱讀 6782

最近專案遇到乙個小需求:通過轉動旋鈕對裝置進行調焦。傻瓜式操作,只需要乙個電機帶動旋鈕就好了。重點倒是如何識別影象是否達到自己想要的清晰度。不多說,上**。

整體說明一下:通過相機採集影象,鍵盤按『q』,採集一張影象,然後通過smd2去分析得到影象的清晰度,再根據清晰度去對應調整舵機旋轉的角度。這邊只是測試舵機控制。

import atexit

import rpi.gpio as gpio # 引入gpio模組

import time

import cv2 as cv

import numpy as np

import math

atexit.register(gpio.cleanup)

#影象採集

defgrap_photo()

: cap = cv.videocapture(0)

while

true

: ret,frame = cap.read(

)if ret:

cv.imshow(

'test'

,frame)

if cv.waitkey(1)

&0xff

==ord

('q'):

# ~ file_name = "xieyang.jpeg"

# ~ cv2.imwrite(file_name, frame)

img=cv.cvtcolor(frame,cv.color_bgr2gray)

return img

# ~ break

else

:break

cap.release(

) cv.destroyallwindows(

)#清晰度分析

defsmd2

(img)

:'''

:param img:narray 二維灰度影象

:return: float 影象約清晰越大

'''img = cv.cvtcolor(img,cv.color_bgr2gray)

img = cv.resize(img,

(480

,640))

shape = np.shape(img)

out =

0for x in

range(0

, shape[0]

-1):

for y in

range(0

, shape[1]

-1):

out+=math.fabs(

int(img[x,y])-

int(img[x+

1,y]))

*math.fabs(

int(img[x,y]

-int

(img[x,y+1]

)))return out

defnew_smd2_

(img)

:'''

:param img:narray 二維灰度影象

:return: float 影象約清晰越大

'''img = cv.cvtcolor(img,cv.color_bgr2gray)

img = cv.resize(img,

(480

,640))

img = np.float32(img)

#轉換後:float32

timea = time.time(

) h, w = img.shape

sharpness = np.

sum(np.

abs(img[

:h-1

,:w-1]

- img[1:

,:w-1]

)* np.

abs(img[

:h-1

,:w-1]

- img[

:h-1,1

:]))

# print('new: '.format(time.time()-timea))

return sharpness

#該方法(new_smd2_)採用矩陣運算,處理速度比smd2要快許多。值得注意的是:需要對img的資料型別轉換,

#原圖資料型別是uint8,計算方差時資料較大,會導致陣列越界,最後得到的數值和smd2不一樣。所以需要轉換

#可控制300度旋轉的舵機

defcontrol_300

(angle=

none):

try:

while

true

:# ~ # 等待輸入乙個0到300的角度

# ~ direction = angle

direction =

float

(input

("請輸入移動角度: "))

if direction <

0or direction >

300:

print

("請輸入正確的角度"

)continue

duty =(1

/30)* direction +

2.5# 將角度轉換為占空比

pwm.changedutycycle(duty)

# 改變pwm占空比

time.sleep(

0.02

)finally

: pwm.stop(

)# 停止pwm

gpio.cleanup(

)# 清理釋放gpio資源,將gpio復位

#可控制360度旋轉舵機

defcontrol_360

(angle=

none):

try:

while

true

:# ~ # 等待輸入乙個0到300的角度

# ~ direction = angle

direction =

float

(input

("請輸入移動角度: "))

if direction <

0or direction >

360:

print

("請輸入正確的角度"

)continue

duty =(1

/36)* direction +

2.5# 將角度轉換為占空比

pwm.changedutycycle(duty)

# 改變pwm占空比

time.sleep(

0.02

)finally

: pwm.stop(

)# 停止pwm

gpio.cleanup(

)# 清理釋放gpio資源,將gpio復位

#不可控360度旋轉

defuncontrol_360

(angle=

none):

try:

# 等待輸入乙個0到300的角度

direction = angle

# ~ direction = float(input("請輸入移動角度: "))

if direction <

0or direction >

360:

print

("請輸入正確的角度"

) duty =(1

/30)* direction +

2.5# 將角度轉換為占空比

pwm.changedutycycle(duty)

# 改變pwm占空比

time.sleep(

0.02

)finally

: pwm.stop(

)# 停止pwm

gpio.cleanup(

)# 清理釋放gpio資源,將gpio復位

if __name__ ==

'__main__'

: servopin =

21 pwmfreq =

50# pwm訊號頻率

gpio.setmode(gpio.bcm)

# 使用bcm編號方式

gpio.setup(servopin, gpio.out)

# 將gpio19設定為輸出模式

pwm = gpio.pwm(servopin, pwmfreq)

# 建立pwm物件,並設定頻率為50

pwm.start(0)

# 啟動pwm,並設定初始占空比0

# ~ uncontrol_360()

control_360(

)# ~ img = grap_photo()

# ~ data = smd2(img)

# ~ print(data)

# ~ if data>10000:

# ~ control_300(200)

# ~ else:

# ~ control_300(10)

樹莓派python控制舵機 樹莓派控制舵機資料

舵機介紹 樹莓派pwm函式介紹 舵機角度和占空比對應的關係動畫。對應關係如下,範圍為 90 到 90 為了方便計算,可以將其對映到0 180 角度20ms內脈衝寬度 占空比對映後角度 90 0.5ms 2.5 0 45 1ms5.0 45 0 1.5ms 7.5 90 45 2ms10.0 135 ...

樹莓派控制舵機

說在前面 在網上找了一圈有關樹莓派控制舵機的 發現好多都是一模一樣的,重點是它們都貼著 原創 標籤。樹莓派不能直接輸出模擬電訊號,但我們可以使用pwm 脈寬調變 方法來模擬這一點。我們製作乙個固定頻率的數碼訊號,在那裡我們將改變脈衝寬度,將 轉換 改為 平均 輸出電壓的電平,我們可以使用這個 平均 ...

樹莓派控制SG90舵機

sg90一共三根線,紅線接5 電源,棕線gnd。黃線為資料控制線,該線接到gpio上,這裡我們是bcm模式的pin 21.sg90 脈衝週期為20毫秒 millisecond 不是20微秒 microsecond 兩者差1000倍呢!也就是說最多1秒鐘內可以轉動5 次,但是考慮到每次轉動還要耗時,所...