繼上一次我們使用了樹莓派來控制步進馬達之後,接下來就是把這個步進馬達鎖在我們的遙控車上,然後再把攝影機固定在步進馬達的轉軸上,如此,我們就可以透過程式來遠端控制鏡頭的轉向,藉以提升遙控車的視野。首先,還是先來看看Youtube上的成果展示:

在此影片中,我們使用了兩個視窗,左側的視窗使用的是UV4L Stream的功能,它被架在8080這個埠號上。另外,右側的視窗則是我們用來控制遙控車的網頁介面,我們使用的是Flask來製作,這個在前面那篇文章有介紹,設定在埠號9000做監聽。當我們在網頁上按下Camera Left,則鏡頭會往左看,反之則往右看,就如同影片中示範的一樣。

而在硬體方面,同樣是萬能的單芯線,而這次再加上萬能的–三合一咖啡攪拌棒–,就完成了,如下所示:

DSC_4059

而在Flask的主控制程式碼中,除了前一篇文章中的遙控車介面之外,再加上步進馬達的控制介面,更新後的cmd.py程式如下:

#!/usr/bin/env python
from flask import Flask, render_template, Response

import RPi.GPIO as gpio
import time


gpio.setwarnings(False)
gpio.setmode(gpio.BOARD)

pin = [7, 11, 13, 15, 29, 31, 33, 35]
for i in range(8):
    gpio.setup(pin[i], gpio.OUT)

app = Flask(__name__)

forward_sq = ['0011', '1001', '1100', '0110']
reverse_sq = ['0110', '1100', '1001', '0011']

def forward(steps, delay):
    for i in range(steps):
        for step in forward_sq:
            set_motor(step)
            time.sleep(delay)

def reverse(steps, delay):
    for i in range(steps):
        for step in reverse_sq:
            set_motor(step)
            time.sleep(delay)

def set_motor(step):
    for i in range(4):
        gpio.output(pin[i+4], step[i] == '1')

def setio(p7, p11, p13, p15):
    gpio.output(7, p7)
    gpio.output(11, p11)
    gpio.output(13, p13)
    gpio.output(15, p15)

@app.route('/')
@app.route('/<cmd>')
def index(cmd=None):
    """Video streaming home page."""
    if cmd == 'go':
        setio(True, False, True, False)
    elif cmd == 'stop':
        setio(False, False, False, False)
    elif cmd == 'back':
        setio(False, True, False, True)
    elif cmd == 'right':
        setio(False, True, False, False)
        time.sleep(0.5)
        setio(True, False, True, False)
    elif cmd == 'left':
        setio(False, False, False, True)
        time.sleep(0.5)
        setio(True, False, True, False)
    elif cmd == 'rights':
        setio(True, True, True, False)
    elif cmd == 'lefts':
        setio(True, False, False, True)
    elif cmd == 'camleft':
        set_motor('0000')
        reverse(45, 0.005)
    elif cmd == 'camright':
        set_motor('0000')
        forward(45, 0.005)

    return render_template('cmd.html',cmd=cmd)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=9000, debug=True, threaded=True)

在我們的設定中,每次按左看或是右看,預設是轉動45度,效果看起來還不錯。但是,由於沒有設定自動歸位的指令,所以轉過之後,要記得轉正回來。我想,在實用上,還是要在鏡頭的前方設定一個車身方向位置指示器才行。

(777)

%d 位部落客按了讚: