前俩天为了玩《赛博朋克2077》,自己第一次尝试装了台主机。
昨天在外网逛的时候,一眼被一个迷你主机吸引了,发现还是用树莓派做的,和大家一起分享一下。
正文
今天我将向大家展示如何为树莓派4自制桌面机箱,它看起来就像一台迷你桌面电脑。
机箱的主体是3D打印的,它的侧面是透明的亚克力材质,所以你能够看到它。
我用了一个冰塔来给CPU散热,但是把风扇安装到了机箱的侧面,而不是散热片上。
我还在机箱的正面加入了一个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。
一旦你的电缆制作完成,将其连接到显示器的背面,然后将引线插入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显示屏上显示的统计数据。
说明
原项目链接:https://www.the-diy-life.com/diy-raspberry-pi-4-desktop-case-with-oled-stats-display/
项目作者:Michael Klements 转载请注明出处与作者信息