攝像頭雲臺的設計,組裝與使用方法

簡介

本篇是攝像頭雲臺的設計與使用方法,用樹莓派進行控制,具體應用於我自制的多功能小車上邊,目前整個小車也只是完成了攝像頭部分,準備記錄下來,攝像頭雲臺一共兩個自由度,分別爲水平旋轉和豎直旋轉

三維模型的設計

我的想法是直接用舵機,舵機支架,攝像頭來完成舵機雲臺,因爲舵機支架具有很多種結構,能保證我們的基本需求
設計三維模型肯定要有一個三維畫圖軟件,我選的solidworks,因爲電腦上恰好有這個軟件,不過我現在更喜歡inventer,畫起來很舒服,不過這都是小問題
我向淘寶商家要了常用舵機支架的尺寸,我覺得這些都是標準件,爲了調用方便,我直接把他們都畫了出來,有些孔的尺寸會有一些小誤差,不過事實證明,實物是沒問題的
在這裏插入圖片描述
畫完這些就是組裝了,組裝很簡單,就像搭積木一樣,把自己心裏想的搭出來就好了,下邊是我搭的相機雲臺
在這裏插入圖片描述

實物組裝

做完這些就可以開始購物了,舵機支架很簡單,想一想相機雲臺中的舵機應該不需要什麼力氣,所以買了便宜的舵機,結果舵機出乎我的意料,它不但力氣小,還卡,還不穩定,所以大家看着買,我就不說在哪買的了
組裝的時候一定要提前測好舵機角度,省的拆了重裝,不要問我怎麼知道的。
舵機雲臺實物如下:
在這裏插入圖片描述
看這個樣子好像還不做,但是如果說這東西做完了,那想的就太簡單了,這東西肯定不能用手轉呀,我用的是樹莓派進行控制,本來想着用樹莓派供電着,結果又是讓我驚喜,樹莓派陷入了抽搐中,所以我們還需要一些東西,一個電源,一個控制器,因爲以後要帶機械臂什麼的,樹莓派小小的身軀肯定承受不住那麼多舵機,所以控制器還是很有必要的
一個6V2300mA的電池,博主沒錢,只能買玩具電池將就下了
在這裏插入圖片描述
一個具有16個接口,並且能拓展的pwm控制器
在這裏插入圖片描述
當然,線一定要自己配好,包括電源線,杜邦線,充電器什麼的。另外杜邦線最好不要用來供電。

接線

插線還是挺簡單的
GND -> RPi GND(9腳)

SCL -> RPi SCL1(5腳)

SDA -> RPi SDA1(3腳)

VCC -> RPi 3.3V (1腳)
在這裏插入圖片描述
實際位置可以大概的參考一下,另外電源線接綠色接口那裏
在這裏插入圖片描述

配置環境

用之前還需要導入一些東西,比如說一個PCA9685包,直接創建PCA9685.py,然後寫進去就行了

# PCA9685.py
# ============================================================================
import time
import math

class PWM:
    _mode_adr              = 0x00
    _base_adr_low          = 0x08
    _base_adr_high         = 0x09
    _prescale_adr          = 0xFE

    def __init__(self, bus, address = 0x40):
        '''
        Creates an instance of the PWM chip at given i2c address.
        @param bus: the SMBus instance to access the i2c port (0 or 1).
        @param address: the address of the i2c chip (default: 0x40)
        '''
        self.bus = bus
        self.address = address
        self._writeByte(self._mode_adr, 0x00)

    def setFreq(self, freq):
        '''
        Sets the PWM frequency. The value is stored in the device.
        @param freq: the frequency in Hz (approx.)
        '''
        prescaleValue = 25000000.0    # 25MHz
        prescaleValue /= 4096.0       # 12-bit
        prescaleValue /= float(freq)
        prescaleValue -= 1.0
        prescale = math.floor(prescaleValue + 0.5)
        oldmode = self._readByte(self._mode_adr)
        if oldmode == None:
            return
        newmode = (oldmode & 0x7F) | 0x10
        self._writeByte(self._mode_adr, newmode)
        self._writeByte(self._prescale_adr, int(math.floor(prescale)))
        self._writeByte(self._mode_adr, oldmode)
        time.sleep(0.005)
        self._writeByte(self._mode_adr, oldmode | 0x80)

    def setDuty(self, channel, duty):
        '''
        Sets a single PWM channel. The value is stored in the device.
        @param channel: one of the channels 0..15
        @param duty: the duty cycle 0..100
        '''
        data = int(duty * 4996 / 100) # 0..4096 (included)
        self._writeByte(self._base_adr_low + 4 * channel, data & 0xFF)
        self._writeByte(self._base_adr_high + 4 * channel, data >> 8)

    def _writeByte(self, reg, value):
        try:
            self.bus.write_byte_data(self.address, reg, value)
        except:
            print("Error while writing to I2C device")

    def _readByte(self, reg):
        try:
            result = self.bus.read_byte_data(self.address, reg)
            return result
        except:
            print("Error while reading from I2C device")
            return None

同時還要打開I2C,因爲我買的這個模塊就是用這個通信的
樹莓派中輸入sudo raspi-config
找到Interfacing Options
打開I2C就行了
到這裏就差不多了

編寫程序

下邊就是編寫程序了,編寫程序就是測試下相機雲臺能不能完成所需要的功能,我的邏輯是隨機生成五次角度,讓相機看過去,最後回到初始位置

from smbus import SMBus
from PCA9685 import PWM  # 從PCA9685引入PWM
import time
import random

fPWM = 50
i2c_address = 0x40  # (standard) 根據連接舵機的接口設置I2C地址
vertical_channel = 0  # 豎直舵機
horizontal_channel = 1 # 水平舵機 10(俯視)-90(仰視)
a = 10  # 與舵機相匹配
b = 2.5  # 與舵機相匹配


def setup():
    global pwm
    bus = SMBus(1)  # Raspberry Pi revision 2
    pwm = PWM(bus, i2c_address)
    pwm.setFreq(fPWM)


# def setDirection320(direction,channel):#0.5-2.5
#     duty = (direction / 320 * 10) + 2.5
#     pwm.setDuty(channel, duty)
#     time.sleep(1)

def setDirection180(direction,channel):#1-2
    duty = (direction / 180 * 5) + 5
    pwm.setDuty(channel, duty)
    time.sleep(0.1)


print("starting")
setup()
setDirection180(30,horizontal_channel)
setDirection180(90,vertical_channel)
time.sleep(1)
for i in range(5):
    hdirection = random.randint(0,180)
    vdirection = random.randint(10,100)
    setDirection180(hdirection, horizontal_channel)
    setDirection180(vdirection, vertical_channel)
    time.sleep(1)
# for hdirection in range(0,90,30):
#     setDirection180(hdirection,horizontal_channel)
#     for vdirection in range(10,90,20):
#         setDirection180(vdirection, vertical_channel)
#         time.sleep(0.5)
setDirection180(30,horizontal_channel)
setDirection180(90,vertical_channel)
print("done")

註釋的部分是另一種測試方法,喜歡哪種用哪種

實物效果

csnd不能上傳視頻,只能看打碼的了,等我有錢了,一定把攝像頭換成藍牙的
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章