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

March 13, 2017 10:34

一起制作桌面树莓派自拍照相机

一个使用树莓派 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脚本和亞克力外壳的设计文件。

Andrew Back

Open source (hardware and software!) advocate, Treasurer and Director of the Free and Open Source Silicon Foundation, organiser of Wuthering Bytes technology festival and founder of the Open Source Hardware User Group.