RRoy | NPC | 创造力: | 帖子: | 发消息 | 串个门 | 加好友 | 打招呼
2020-12-22 10:37:12 [显示全部楼层]
1092浏览
查看: 1092|回复: 7

[项目] 这个树莓派机箱,有点香!

[复制链接]
本帖最后由 RRoy 于 2020-12-22 10:37 编辑

前俩天为了玩《赛博朋克2077》,自己第一次尝试装了台主机。
IMG_8267.JPG

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

正文

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

TueDecember-202012228722..png

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

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

TueDecember-202012221822..png

我还在机箱的正面加入了一个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。

TueDecember-202012226823..png

一旦你的电缆制作完成,将其连接到显示器的背面,然后将引线插入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显示屏上显示的统计数据。

TueDecember-202012221312..png

说明

原项目链接: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, 下载次数: 47

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

41.1 KB, 下载次数: 46

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

59.3 KB, 下载次数: 47

stats (1).zip

2.22 KB, 下载次数: 41

帅猫  高级技师

发表于 2020-12-22 18:07:19

我也曾想过做一个PI机箱,不过我的想法时加一块Arduino在关机时给PI断电
回复

使用道具 举报

pATAq  版主

发表于 2020-12-24 23:11:45

666,感谢分享
回复

使用道具 举报

20060606  高级技匠

发表于 2020-12-27 08:31:18

能运行Windows10arm版吗?
回复

使用道具 举报

RRoy  NPC
 楼主|

发表于 2020-12-28 10:54:11

20060606 发表于 2020-12-27 08:31
能运行Windows10arm版吗?

可以的,树莓派3就可以运行完整版的Windows 10 on ARM了,4代的话更好一点,GitHub上有WoA的简易安装包:https://github.com/WOA-Project/WOA-Deployer-Rpi
回复

使用道具 举报

20060606  高级技匠

发表于 2021-1-22 15:17:41

RRoy 发表于 2020-12-28 10:54
可以的,树莓派3就可以运行完整版的Windows 10 on ARM了,4代的话更好一点,GitHub上有WoA的简易安装包: ...

谢谢,但win 10 for arm能装正常的电脑软件吗
回复

使用道具 举报

gray6666  初级技神

发表于 2021-1-26 18:04:32

机箱打印需要多长时间?
回复

使用道具 举报

RRoy  NPC
 楼主|

发表于 2021-1-27 11:21:10

gray6666 发表于 2021-1-26 18:04
机箱打印需要多长时间?

很长很长时间
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2021 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail