这个树莓派机箱,有点香!

2020-12-221.6万
精华项目
AI 快速预览详细 收起
本文介绍了如何为树莓派4自制一个桌面机箱。首先,你需要准备一些材料,如Raspberry Pi 4、3D打印机、亚克力板等。然后,通过3D打印技术制作机箱主体,并安装冰塔散热器和OLED显示屏。最后,编写Python脚本来控制OLED显示屏显示系统状态。这个项目不仅能够提升你的DIY技能,还能让你拥有一个独特的迷你桌面电脑。

前俩天为了玩《赛博朋克2077》,自己第一次尝试装了台主机。
这个树莓派机箱,有点香!图1

昨天在外网逛的时候,一眼被一个迷你主机吸引了,发现还是用树莓派做的,和大家一起分享一下。

正文

今天我将向大家展示如何为树莓派4自制桌面机箱,它看起来就像一台迷你桌面电脑。

这个树莓派机箱,有点香!图2

机箱的主体是3D打印的,它的侧面是透明的亚克力材质,所以你能够看到它。

我用了一个冰塔来给CPU散热,但是把风扇安装到了机箱的侧面,而不是散热片上。

这个树莓派机箱,有点香!图3

我还在机箱的正面加入了一个OLED显示屏,可以显示Pi的IP地址和一些统计数据,比如CPU、存储和内存的使用情况,以及CPU的温度。

你现在可以购买这个Raspberry Pi 4桌面机箱的预制套件--在这里购买。

材料准备

  • Raspberry Pi 4 (任何型号 )
  • 微型SD卡
  • 树莓派电源
  • 冰塔散热器
  • I2C OLED显示器
  • 带状电缆
  • 母头针
  • 机器螺钉
  • 2毫米亚克力
  • 黑色PLA耗材

除了上面的材料,还需要有一台3D打印机来打印外壳的塑料部分。

我们不需要激光切割机来完成这个制作,虽然它对制作侧面有很大帮助。

我们也可以使用在线激光切割服务,或者干脆使用手工工具切割自己的侧面。

作者使用的是Desktop K40激光切割机/雕刻机。

制作Raspberry Pi 4桌面盒

3D打印机身

我首先在Tinkercad中设计了3D打印的箱体。

注:模型文件文末下载。

我画了一个机箱的大致轮廓,然后将树莓派放置在机箱内,这样USB和以太网端口可以通过正面使用,而电源、HDMI和音频端口则可以通过侧板连接试用。

OLED显示屏被放置在机箱正面的端口上方。

OLED显示屏将用两个小夹子固定在顶部边缘,底部用一个带塑料夹子的螺丝固定,这个设计我之前在我的基于Arduino的反应计时器上使用过。

树莓派将被安装在冰塔的黄铜支座上,所以我加了一些孔来适应M2.5的螺纹。

我并不经常取下树莓派背面的SD卡,所以我没有为它增加一个切口。如果你这样做,那么只要在后面的外壳上加一个圆形的切口。

如果你没有这个切口的话,换SD卡会比较麻烦,因为你需要把Pi从机箱上取下来才能存取。

我使用黑色PLA材料打印了树莓派4的机箱外壳,层高0.2mm,填充15%。

我还为显示屏的切口和前面的端口添加了打印支撑。

你可能也需要添加这些,这在你的切片软件中很容易做到。

此外,你还需要打印小的塑料显示屏夹子。

安装Raspberry Pi和冰塔散热器

现在机箱的主体已经完成,让我们把树莓派安装进去。

首先将黄铜支座拧入底座的孔中。

我只是改变了冰塔提供的螺丝和支座安装的方向,使它们直接拧入机箱底部,不需要和通孔。

如果你按照冰塔的安装手册,你会发现支座和螺丝的安装方向是相反的。

接下来,我们需要将风扇从冰塔上取下,这样我们就可以将其连接到亚克力侧板上。通过将风扇移动到侧板上,我们可以确保冷空气从机箱外部吸入,然后必须从对面的排风口呼出。

按照说明将支撑架添加到冰塔散热片的底部。

注意确保遵循这些支架的正确方向。

将树莓派放好,然后分别把四个螺丝对应拧到机身外壳的四个螺丝柱上,固定好。

将散热片贴到Pi的CPU上,并撕掉上面的一层保护膜。将冰塔散热器放置在CPU上的散热垫上,然后用四颗螺丝固定在黄铜螺丝柱上。

安装OLED显示屏

现在我们需要将OLED显示屏安装到前面板上。如果你的显示器没有将引脚焊接到位,请将它们焊接到显示器的背面。

将显示器的顶部边缘滑入塑料夹子下面,然后轻轻地将其推入切口中的位置。

使用3D打印的夹子用小螺丝固定。你可能需要一个十字螺丝刀来拧紧螺丝。

现在我们需要准备OLED显示屏的布线。

我们需要为GPIO引脚做4个连接,两个用于电源,两个用于通信。

我用一些杜邦连接器和一些带状电缆制作了这个短连接器电缆。你也可以使用一些母引脚头条或母面包板跳线来连接显示器和Pi。

这个树莓派机箱,有点香!图4

一旦你的电缆制作完成,将其连接到显示器的背面,然后将引线插入GPIO引脚,如下所示。

  • VCC至Pin1 3. 3V电源
  • GND至Pin14接地
  • SCL至引脚3 SCL
  • SDA至引脚2 SDA

我注意到这些OLED显示器有两个版本,它们的电源引脚是相反的,一个版本有VCC和GND,一个版本有GND和VCC,所以确保你的显示器连接电源的方式是正确的。

制作亚克力的侧面

现在箱子的内部零件已经完成了大半,我们来补上亚克力边框,把它合上。

再次打开Tinkercad,在机箱中大致定位了一个冰塔散热器的位置,这样风扇的孔就在侧板的正确位置。然后我把机箱和散热片的侧面轮廓导出,在Inkscape中打开,绘制激光切割轮廓。

我们需要两个侧面,一个是风扇的进风口,一个是有一些孔的排风口。

我们可以去掉内侧边缘的轮廓,因为我们只需要机箱的轮廓和螺丝孔。我们需要增加一个风扇的孔和周围四个风扇螺丝的孔。还需要在树莓派的侧面增加端口的切口。

接下来,我将风扇侧与排风侧做了一个镜像,并画了一个六边形的图案作为排风口。

注:打印模型文件,文末下载

如果你不打算用激光切割边框,而是用手工切割出来,那就在同样的区域用圆形钻孔(Ø8mm)代替这些六角孔。

现在让我们把侧板切出来。我用2毫米的透明亚克力做侧板。

如果你愿意的话,也可以用有色或不透明的亚克力。很多彩色板材只有3毫米的。也没关系,只是会让机箱的边缘更厚一点而已。

要将风扇安装到侧板上,你需要将一些M3螺母压入螺丝孔旁的口袋中。

最简单的方法是将螺母放在一个平面上,然后将风扇孔压在螺母上,将其推入到位。这些螺母很紧,所以在拧紧螺丝的时候不需要用扳手来固定。

如果你想重复使用风扇螺丝,它们会太短,无法穿过亚克力和风扇,然后进入螺母,你需要将螺母压入风扇的前部(亚克力一侧)。这并不是连接风扇的最佳方式,因为你并没有真正夹紧任何东西。我们只是依靠螺母和风扇之间的摩擦力来固定它,不过在这种情况下它也能正常使用。

使用四个M3 x 8mm六角头机器螺丝将风扇侧板拧到3D打印机箱上。

螺丝要紧一点,因为孔的里面不是螺纹。

现在把风扇插到Pi上的5V电源上,然后安装另一边的面板。红线接4号针(5V),黑线接6号针(地)。

装配就到这里了,树莓派4桌面机箱已经完成了。

接下来,我们只需要让OLED显示屏工作。

为OLED显示屏编程

为了让显示器工作,我们需要运行一个Python脚本。你需要启动你的Pi来完成这项工作。

Raspberry Pi使用I2C通信与显示器进行通信,所以您需要确保在您的偏好设置中启用该功能。您还需要确保Python-smbus和i2c-tools库都已安装。它们应该是默认安装的,但最好检查一下。

这个脚本主要是基于Adafruit Python库中的一个用于OLED显示模块的示例脚本,Shakhizat Nurgaliyev做了一些修改,增加了CPU温度和改变显示格式。

# Copyright (c) 2017 Adafruit Industries
# Author: Tony DiCola & James DeVito
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
import time

import Adafruit_GPIO.SPI as SPI
import Adafruit_SSD1306

from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

import subprocess

# Raspberry Pi pin configuration:
RST = None     # on the PiOLED this pin isnt used
# Note the following are only used with SPI:
DC = 23
SPI_PORT = 0
SPI_DEVICE = 0

# Beaglebone Black pin configuration:
# RST = 'P9_12'
# Note the following are only used with SPI:
# DC = 'P9_15'
# SPI_PORT = 1
# SPI_DEVICE = 0

# 128x32 display with hardware I2C:
disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST)

# 128x64 display with hardware I2C:
# disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST)

# Note you can change the I2C address by passing an i2c_address parameter like:
# disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST, i2c_address=0x3C)

# Alternatively you can specify an explicit I2C bus number, for example
# with the 128x32 display you would use:
# disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST, i2c_bus=2)

# 128x32 display with hardware SPI:
# disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST, dc=DC, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE, max_speed_hz=8000000))

# 128x64 display with hardware SPI:
# disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST, dc=DC, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE, max_speed_hz=8000000))

# Alternatively you can specify a software SPI implementation by providing
# digital GPIO pin numbers for all the required display pins.  For example
# on a Raspberry Pi with the 128x32 display you might use:
# disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST, dc=DC, sclk=18, din=25, cs=22)

# Initialize library.
disp.begin()

# Clear display.
disp.clear()
disp.display()

# Create blank image for drawing.
# Make sure to create image with mode '1' for 1-bit color.
width = disp.width
height = disp.height
image = Image.new('1', (width, height))

# Get drawing object to draw on image.
draw = ImageDraw.Draw(image)

# Draw a black filled box to clear the image.
draw.rectangle((0,0,width,height), outline=0, fill=0)

# Draw some shapes.
# First define some constants to allow easy resizing of shapes.
padding = -2
top = padding
bottom = height-padding
# Move left to right keeping track of the current x position for drawing shapes.
x = 0

# Load default font.
font = ImageFont.load_default()

# Alternatively load a TTF font.  Make sure the .ttf font file is in the same directory as the python script!
# Some other nice fonts to try: http://www.dafont.com/bitmap.php
# font = ImageFont.truetype('Minecraftia.ttf', 8)

while True:

    # Draw a black filled box to clear the image.
    draw.rectangle((0,0,width,height), outline=0, fill=0)

    # Shell scripts for system monitoring from here : https://unix.stackexchange.com/questions/119126/command-to-display-memory-usage-disk-usage-and-cpu-load
    cmd = "hostname -I |cut -f 2 -d ' '"
    IP = subprocess.check_output(cmd, shell = True )
    cmd = "top -bn1 | grep load | awk '{printf \"CPU Load: %.2f\", $(NF-2)}'"
    CPU = subprocess.check_output(cmd, shell = True )
    cmd = "free -m | awk 'NR==2{printf \"Mem: %s/%sMB %.2f%%\", $3,$2,$3*100/$2 }'"
    MemUsage = subprocess.check_output(cmd, shell = True )
    cmd = "df -h | awk '$NF==\"/\"{printf \"Disk: %d/%dGB %s\", $3,$2,$5}'"
    Disk = subprocess.check_output(cmd, shell = True )
    cmd = "vcgencmd measure_temp |cut -f 2 -d '='"
    temp = subprocess.check_output(cmd, shell = True )

    # Write two lines of text.

    draw.text((x, top), "IP: " + str(IP,'utf-8'), font=font, fill=255)
    draw.text((x, top+8), str(CPU,'utf-8') + " " + str(temp,'utf-8') , font=font, fill=255)
    draw.text((x, top+16), str(MemUsage,'utf-8'), font=font, fill=255)
    draw.text((x, top+25), str(Disk,'utf-8'), font=font, fill=255)

    # Display image.
    disp.image(image)
    disp.display()
    time.sleep(.1)

注:OLED显示屏Python脚本下载见文末

你需要从Github上下载Adafruit原版示例库,按照以下步骤完成设置。https://github.com/adafruit/Adafruit_Python_SSD1306

打开一个新的终端窗口,然后导航到库的目录。

cd Adafruit_Python_SSD1306

安装Python 3的库。

sudo python3 setup.py install

然后你可以在Adafruit目录下运行上面的stats.py文件或示例stats.py文件,只是Adafruit示例的显示布局略有不同。

改到包含stats.py脚本的目录下。

cd examples

执行脚本

python3 stats.py

在设置脚本自动运行之前,你可以测试运行脚本,检查你的显示是否正常工作,是否有任何错误。

要设置脚本自动运行,你需要找到脚本的目录,然后打开crontab,添加一行运行脚本。

@reboot python3 /home/pi/stats.py &

很明显,你需要更改目录/home/pi/来反映你保存脚本的目录。

不要忘了在最后加上&,告诉Pi继续启动并在后台运行脚本。

重新启动Pi,让它自动运行脚本,然后我们应该可以在Pi启动时,看到OLED显示屏上显示的统计数据。

这个树莓派机箱,有点香!图5

说明

原项目链接:https://www.the-diy-life.com/diy-raspberry-pi-4-desktop-case-with-oled-stats-display/

项目作者:Michael Klements   转载请注明出处与作者信息


3D-Printed-Sides (1).zip

13.79 KB, 下载次数: 10150

Raspberry-Pi-Desktop-Case-Print-Files (1).zip

41.1 KB, 下载次数: 10073

Raspberry-Pi-Desktop-Case-Sides-1 (1).zip

59.3 KB, 下载次数: 10295

stats (1).zip

2.22 KB, 下载次数: 10046

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(5)
救赎
救赎
感谢博主,树莓派5的话只需要改边上的切口吗?
救赎
救赎回复救赎
5和4,usb和网口位置反了,然后亚克力那里改一下就行
RRoy
RRoy
作者
回复救赎
手上没有树莓派5
gray6666
gray6666
机箱打印需要多长时间?
RRoy
RRoy
作者
回复gray6666
很长很长时间
20060606
20060606
能运行Windows10arm版吗?
20060606
20060606回复RRoy
谢谢,但win 10 for arm能装正常的电脑软件吗
RRoy
RRoy
作者
回复20060606
可以的,树莓派3就可以运行完整版的Windows 10 on ARM了,4代的话更好一点,GitHub上有WoA的简易安装包:https://github.com/WOA-Project/WOA-Deployer-Rpi
pATAq
pATAq
666,感谢分享
帅猫
帅猫
我也曾想过做一个PI机箱,不过我的想法时加一块Arduino在关机时给PI断电
- 没有更多了 -