DesignSpark Electrical Logo
  • Brought to you by
  • RS Components
  • Allied Electronics
YanW

May 31, 2017 02:20

一起製作桌面樹莓派自拍照相機 (繁體)

一個使用樹莓派 3加觸摸屏顯示器 、鏡頭和SenseHAT的有趣專案

在這篇文章中,我們將會介紹一個容易完成的專案,它只需要使用四個官方的樹莓派產品,便可以建立一個桌面“自拍”相機。另外一點有趣的地方是它不需要焊接或定制任何電子零件。此外,很多軟體都支援到它的硬件,所以軟體應用程序也是超級簡單的。

硬體

整個專案使用了下列的零件:

  • 樹莓派3型號B
  • 樹莓派觸摸屏
  • 樹莓派相機
  • SenseHAT
  • 電源
  • 32GB Micro SD 卡

另外還配搭了定製激光切割和折疊亞克力盒。即使你沒有激光切割機和亞克力文件夾,也可以使用其他的外殼替代。

O/S及相關

把Raspbian Jessie Lite寫入一張Micro SD卡中,然後將主機名由簡單的raspberrypi更改為其他名稱,編輯根文件系統etc/hostname和etc/hosts文件就可以。這樣在網絡上會更容易找到主機。

openssh服務器現在默認為禁用,因為我更喜欢通過SSH進行登錄,這可以通過在boot partition中建立一個名為ssh的空文件來啟用它。 

觸摸屏技術上是上下倒轉安裝的,所以要將顯示器旋轉到正確的方向,有必要編輯config.txt  - 也在啟動分區,並添加行:

lcd_rotate=2

接下來將Micro SD卡插入Raspberry Pi並接通電源。之後,我建議按照慣例做法,通過登錄並輸入以下内容更新O / S:

$ sudo apt get update
$ sudo apt-get dist-upgrade

請注意,由於我們已將主機名更改為selfiecam,因此可以從另一台Linux電腦使用以下命令登錄到Pi:

$ ssh pi@selfiecam.local

由於我們想使用SenseHAT,相機和帧緩冲區,一些有用的Python軟體也通過安裝:

$ sudo apt-get install sense-hat python-picamera python-pygame

最後,需要啟用相機和重新啟動,這可以透過raspi-config完成:

$ sudo raspi-config

軟體

首先,我們需要導入一些庫,其中包括上面提到的。

import os
import time
import pygame
from picamera import PiCamera
from sense_hat import SenseHat

我們需要初始化Pygame,它將用來顯示圖像到帧緩冲區中(顯示器)。

pygame.init()
screen = pygame.display.set_mode([800,480])

接下來我們設置攝像機,由於它的物理位置被水平翻轉,我們需要通過軟體翻轉它。

camera = PiCamera()
camera.resolution = (800, 480)
camera.hflip = True

之後配置SenseHAT。

sense = SenseHat()
sense.set_rotation(0)

接下來我們將會定義一個函數,把其中一個文件作為参數,然後使用Pygame來繪製屏幕變成黑色,然後再顯示它包含的圖像。

def displayImage(file):
   image = pygame.image.load(file)
   imagerect = image.get_rect()

   screen.fill([0, 0, 0])
   screen.blit(image, imagerect)
   pygame.display.flip()

然後我們定義一個功能,啟用視頻預覽,在SenseHAT LED矩陣上顯示3-2-1-0倒計時,截取靜止圖像前,停止預覽,顯示圖像,並清除LED矩陣。影像文件名中應包含日期和時間。

def getSelfie():
   # Start camera video preview
   camera.start_preview()
   # Commence countdown
   sense.show_letter("3", text_colour=[255, 0, 0])
   time.sleep(1)
   sense.show_letter("2", text_colour=[255, 255, 0])
   time.sleep(1)
   sense.show_letter("1", text_colour=[0, 255, 0])
   time.sleep(1)
   sense.show_letter("0", text_colour=[0, 0, 255])
   # Capture image and stop preview
   filename = time.strftime("/selfies/%Y-%m-%d-%H-%M-%S.jpg")
   camera.capture(filename)
   camera.stop_preview()
   # Display image and clear SenseHAT display
   displayImage(filename)
   sense.clear()

請注意,LED矩陣上顯示的數字顏色是不同的:3 =紅色,2 =黄色,1 =綠色,0 =藍色。

到目前為止,我們只是導入了不同的庫和定義函數。接下來,我們使用displayImage()這個函數在啟動時更新觸摸屏顯示歡迎圖像。

displayImage("/usr/local/share/images/Welcome.png")

最後,我們進入程序的主循環。在這裡,我們等待來自SenseHAT操縱桿的動作。如果這被按住,我們需要等待它被釋放後使用getSelfie()函數。如果它被一直保持在左邊,我們直接關機。我们可以忽略其他相關動作。

while True:
   # Wait for and process joystick events
   event = sense.stick.wait_for_event(emptybuffer=True)
   if event.direction == "middle" and event.action == "released":
      getSelfie()
   elif event.direction == "left" and event.action == "held":
      os.system("/sbin/shutdown -h now")
   else:
      pass

運行

/etc/rc.local文件在啟動時運行,在這文件添加一行代碼防止屏幕自動關閉,接着一秒後會啟動自拍照相機應用程序。

sudo sh -c "TERM=linux setterm -blank 0 >/dev/tty0"
/usr/local/bin/selfie.py &

重新啟動後,我們會看到我們設定的歡迎圖像。按下操縱桿時,會顯示實時視頻預覽,并开始倒數計時。

在倒數到零時將會拍照,並停止視頻預覽,圖像會顯示在屏幕上。

最後圖像可以從SD卡中複製出來。

 

簡單! :o)

Andrew Back

如果你想自己做這個項目,可以在GitHub上找到Python腳本和亞克力外殼的設計文件。

YanW

Blogger, DesignSpark Team