RRoy 发表于 2020-12-22 10:37:12

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

本帖最后由 RRoy 于 2020-12-22 10:37 编辑

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


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


## 正文

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


![](https://cdn.jsdelivr.net/gh/RalstonLiu/MdnicePic/2020-12-18/1608256133905-image.png)





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

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





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

你现在可以购买这个(https://www.etsy.com/listing/890956138/raspberry-pi-4b-desktop-computer-case "Raspberry Pi 4桌面机箱的预制套件")--在这里购买。



### 材料准备


![](https://cdn.jsdelivr.net/gh/RalstonLiu/MdnicePic/2020-12-18/1608256337779-image.png)


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


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

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

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

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




### 制作Raspberry Pi 4桌面盒

#### 3D打印机身

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



![](https://cdn.jsdelivr.net/gh/RalstonLiu/MdnicePic/2020-12-18/1608256409539-image.png)


*注:模型文件文末下载。*

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

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

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



![](https://cdn.jsdelivr.net/gh/RalstonLiu/MdnicePic/2020-12-18/1608256446974-image.png)

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

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

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


![](https://cdn.jsdelivr.net/gh/RalstonLiu/MdnicePic/2020-12-18/1608256475001-image.png)

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

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

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

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


![](https://cdn.jsdelivr.net/gh/RalstonLiu/MdnicePic/2020-12-18/1608256516932-image.png)

### 安装Raspberry Pi和冰塔散热器
现在机箱的主体已经完成,让我们把树莓派安装进去。

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

![](https://cdn.jsdelivr.net/gh/RalstonLiu/MdnicePic/2020-12-18/1608256554082-image.png)

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

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


![](https://cdn.jsdelivr.net/gh/RalstonLiu/MdnicePic/2020-12-18/1608256596299-image.png)


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



![](https://cdn.jsdelivr.net/gh/RalstonLiu/MdnicePic/2020-12-18/1608256646700-image.png)

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

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


![](https://cdn.jsdelivr.net/gh/RalstonLiu/MdnicePic/2020-12-18/1608256674831-image.png)

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


![](https://cdn.jsdelivr.net/gh/RalstonLiu/MdnicePic/2020-12-18/1608256712959-image.png)


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

### 安装OLED显示屏

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



![](https://cdn.jsdelivr.net/gh/RalstonLiu/MdnicePic/2020-12-18/1608256771204-image.png)

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



![](https://cdn.jsdelivr.net/gh/RalstonLiu/MdnicePic/2020-12-18/1608256792970-image.png)

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


![](https://cdn.jsdelivr.net/gh/RalstonLiu/MdnicePic/2020-12-18/1608256818612-image.png)


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

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

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





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

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



![](https://cdn.jsdelivr.net/gh/RalstonLiu/MdnicePic/2020-12-18/1608256869912-image.png)


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

### 制作亚克力的侧面

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


![](https://cdn.jsdelivr.net/gh/RalstonLiu/MdnicePic/2020-12-18/1608256921212-image.png)

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

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


![](https://cdn.jsdelivr.net/gh/RalstonLiu/MdnicePic/2020-12-18/1608256946774-image.png)

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


![](https://cdn.jsdelivr.net/gh/RalstonLiu/MdnicePic/2020-12-18/1608256970287-image.png)

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


![](https://cdn.jsdelivr.net/gh/RalstonLiu/MdnicePic/2020-12-18/1608256989580-image.png)

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

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



![](https://cdn.jsdelivr.net/gh/RalstonLiu/MdnicePic/2020-12-18/1608257031578-image.png)


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


![](https://cdn.jsdelivr.net/gh/RalstonLiu/MdnicePic/2020-12-18/1608257057877-image.png)

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


![](https://cdn.jsdelivr.net/gh/RalstonLiu/MdnicePic/2020-12-18/1608257100981-image.png)

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

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

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


![](https://cdn.jsdelivr.net/gh/RalstonLiu/MdnicePic/2020-12-18/1608257189555-image.png)


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


![](https://cdn.jsdelivr.net/gh/RalstonLiu/MdnicePic/2020-12-18/1608257200312-image.png)


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

![](https://cdn.jsdelivr.net/gh/RalstonLiu/MdnicePic/2020-12-18/1608257244076-image.png)


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





![](https://cdn.jsdelivr.net/gh/RalstonLiu/MdnicePic/2020-12-18/1608257276597-image.png)


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

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

### 为OLED显示屏编程

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

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

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


```c
# 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


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


```bash
cd Adafruit_Python_SSD1306
```

安装Python 3的库。

```bash
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继续启动并在后台运行脚本。


![](https://cdn.jsdelivr.net/gh/RalstonLiu/MdnicePic/2020-12-18/1608257616991-image.png)


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


![](https://cdn.jsdelivr.net/gh/RalstonLiu/MdnicePic/2020-12-18/1608257638761-image.png)






![](https://cdn.jsdelivr.net/gh/RalstonLiu/MdnicePic/2020-12-18/1608257666689-image.png)



![](https://cdn.jsdelivr.net/gh/RalstonLiu/MdnicePic/2020-12-18/1608257752661-image.png)


### 说明

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

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

帅猫 发表于 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 发表于 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 发表于 2021-1-27 11:21:10

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

很长很长时间{:5_130:}

救赎 发表于 2024-6-13 16:46:57

感谢博主,树莓派5的话只需要改边上的切口吗?

RRoy 发表于 2024-6-13 17:22:22

救赎 发表于 2024-6-13 16:46
感谢博主,树莓派5的话只需要改边上的切口吗?

手上没有树莓派5 {:5_143:}

救赎 发表于 2024-7-21 23:13:54

救赎 发表于 2024-6-13 16:46
感谢博主,树莓派5的话只需要改边上的切口吗?

5和4,usb和网口位置反了,然后亚克力那里改一下就行
页: [1]
查看完整版本: 这个树莓派机箱,有点香!