During this study, the Raspberry Pi was evaluated in nine scenarios. Six of these scenarios involved one of the following cases:
- The official Raspberry Pi 4B case from the Raspberry Pi Foundation.
- The Flirc Raspberry Pi 4B heatsink case, using the heatsink adhesive pad to connect the CPU to the integrated heatsink block (and removing the standard heatsink, of course).
- A custom-designed case to house a generic 5V fan mounted directly above the CPU and venting through the top (which I’ll refer to as the “Fan Top” case).
- A custom-designed case to house a generic 5V fan mounted at the far end of the case and venting through the side (the “Fan Side” case).
- A custom-designed case to house a Noctua NF-A4x10 5V 3-pin fan mounted directly above the CPU and venting through the top (the “Noctua Top” case).
- A custom-designed case to house a Noctua NF-A4x10 5V 3-pin fan, again mounted directly above the CPU, but with additional vents at the far ends of the case (the “Noctua Vent” case).
In addition to the cases, a few other scenarios were tested as controls:
- The Raspberry Pi without a case, sitting on a wooden benchtop, and without the CPU heatsink attached (“Bare”).
- The Raspberry Pi without a case, sitting on a wooden benchtop, with the CPU heatsink attached (“Heatsink”).
- The Raspberry Pi inside the Fan Top case, but with the fan disconnected (“Enclosed”).
Why all of these custom-printed cases?
This project began, in a way, when I first received my RPi 4B, noticed that it was running as hot as early reports indicated, and decided to design and 3D-print a fan case. I purchased this el-cheapo fan from Amazon, at $8.99 for a pack of two, and then banged out a simple design on my Prusa i3 MK3 printer using Hatchbox PLA filament, which is my staple for prototyping. I designed the cases using Autodesk’s free Tinkercad service, sliced it into Gcode with Simplify3D, and managed the printing processes with OctoPrint running on a Raspberry Pi 3B+. After printing that case – and iterating on the design a dozen times or so! – I decided to try some additional configurations, and also to try swapping in a Noctua fan.
The models for the custom-designed cases can be downloaded from Tinkercad at the hyperlinks above. You’ll also need to print the base, and to acquire and use some basic hardware: four M2.5 bolts and standoffs to secure the RPi to the base, and four M5 nuts and bolts to hold together the base and the cover. (I really like 3D printing, but I prefer to use hardware for coupling elements – plastic is too brittle and temperature-sensitive.) All of the hardware can be acquired from eBay for maybe $10-$15. The custom-printed cases and the base may also be added to other Raspberry Pi projects.
Each scenario was tested by running this shell script three times (with plenty of time between trials to allow the CPU and case to cool to room temperature). The script has three phases:
- Startup Idle: The Raspberry Pi was plugged in and the script was run promptly so that the CPU and case started at room temperature. The first phase of the script simply idles the processor and checks and reports the temperature every five seconds for about 15 minutes. The purpose of this phase is to determine the idle temperature of the device in each configuration.
- Stress Test: The second phase of the script repeatedly runs the sysbench CPU performance test on all four cores and with a maximum prime of 5,000 and reports the temperature after each instance. Running at full speed (without throttling), the RPi 4B can complete this task in 8-10 seconds; with the temperature throttle fully engaged to conserve processing, this task requires closer to 20 seconds. This phase runs for about 30 minutes (longer if throttled, of course). The purpose of this phase is to determine the maximum temperature of the Raspberry Pi under a full computational load, as well as the duration to reach the start of throttling (80°C) from the idle temperature.
- Post-Stress Idle: The third phase of the script again idles the processor and checks and reports the temperature every five seconds for about 25 minutes. The purpose of this phase is to determine the duration required for the Raspberry Pi to return to its idle temperature following a maximum temperature under a full CPU load.
For each scenario, the standard deviation for the set of three trials was found to range from 0.58°C to 1.23°C. The significant differences between the cases are an order of magnitude larger (in the range of 10-20°C), so the results appear to be reproducible with an acceptable range of variance.
Some case temperature observations were recoded using an ennoLogic T6650D Dual Laser Infrared Thermometer. For the cases with active cooling, testing was performed to measure sound levels of the cases using an iPhone 7 Plus and the Decibel X PRO app.
The tests were performed using an out-of-the-box Raspberry Pi 4B (4gb version) running Raspbian Buster Lite (Linux 4.19.57-v7l+) after a full
apt-get update and
apt-get dist-upgrade. No additional software was installed and the device was not configured to run anything in the background. The Pi was connected using an official Raspberry Pi 4 power supply and a Sandisk Ultra 16gb MicroSD card. The device was connected to WiFi, but with no USB or Ethernet connections.
Lastly, following the tests for the nine scenarios listed above, the USB 3 controller firmware was updated (from VL805 FW version 00013701 to VL805 FW version 00137a8) following the instructions in this guide, and five configurations were retested for comparison to gauge the impact of the firmware update.