Skip to content

Commit bb2d476

Browse files
finish blog first draft
1 parent 4a8ac4d commit bb2d476

7 files changed

Lines changed: 103 additions & 36 deletions

File tree

data/blog/2026-05-01-zerocalc.md

Lines changed: 70 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
[![Cover](../assets/blog-images/cover-wide.png)](../assets/blog-images/cover-wide.png)
2+
13
# ZeroCalc
24

3-
_Published: 01 May 2026_
5+
<span class="published">01 May 2026</span>
46

57
How to go from delivery to a ZeroCalc 2W in 2026: My happy standalone little Pico8 dev machine.
68

@@ -78,15 +80,15 @@ In Imager:
7880
11. Unplug the SD card and plug it into your Pi Zero 2W.
7981
```
8082

81-
## 3 Building the hardware
83+
# 3 Building the hardware
8284

8385
Others have covered this topic better than I could. You can watch Michael's video for a great walkthrough, and the summary below is the steps I took.
8486

85-
### Video
87+
## Video
8688

8789
Michael posted a great build video that [goes over the soldering](https://www.youtube.com/watch?v=wgE0R1M0_ZE), and physical build.
8890

89-
### Text Summary
91+
## Text Summary
9092

9193
```
9294
1. Solder the 20pin headers to the adapter board
@@ -103,15 +105,15 @@ Michael posted a great build video that [goes over the soldering](https://www.yo
103105

104106
_Note: in this image my SD card isn't plugged in, it should be plugged into the Pi Zero 2W._
105107

106-
## Software setup
108+
# Software setup
107109

108110
Source: [github.com/nibheis/picocalc_trixie](https://github.com/nibheis/picocalc_trixie)
109111

110-
### Power on.
112+
## Power on.
111113

112114
Once you have flashed the SD card and completed the hardware build. Power it on. You'll find it may reboot a couple times the first time you hit it; don't worry, it'll eventually come up stable. I think it's doing SD expansiona nd initial set up at that time.
113115

114-
### Find your Pi on the network
116+
## Find your Pi on the network
115117

116118
The easiest wat to find your zerocalc on the network is to use `ping` with the hostname you set in the imager. For example, if you set your hostname to `zerocalc` you can ping it with:
117119

@@ -121,7 +123,7 @@ ping zerocalc.local
121123
ping zerocalc
122124
```
123125

124-
### SSH into the Pi
126+
## SSH into the Pi
125127

126128
Use the same hostname or ip to ssh in:
127129

@@ -131,36 +133,36 @@ ssh zerocalc
131133
ssh james@zerocalc
132134
```
133135

134-
### Update installed software
136+
## Update installed software
135137

136138
Out the gate you want to run apt update.
137139

138140
```
139141
sudo apt update && sudo apt upgrade -y
140142
```
141143

142-
### Install git
144+
## Install git
143145

144146
```
145147
sudo apt install git -y
146148
```
147149

148-
### Clone the picocalc_trixie repo
150+
## Clone the picocalc_trixie repo
149151

150152
```
151153
git clone https://github.com/nibheis/picocalc_trixie.git
152154
```
153155

154156
It should be cloned into `~/picocalc_trixie`(`/home/your-username/picocalc_trixie`)
155157

156-
### In the picocalc_trixie directory, copy the display firmware
158+
## In the picocalc_trixie directory, copy the display firmware
157159

158160
```
159161
cd picocalc_trixie
160162
sudo cp display/picomipi.bin /lib/firmware/
161163
```
162164

163-
## Display setup
165+
## Set up the display
164166

165167
### Activate the SPI Interface for the display
166168

@@ -183,7 +185,7 @@ dtparam=backlight-gpio=18
183185
dtparam=clock-frequency=50
184186
```
185187

186-
### configure the framebuffer configuration in the kernel command line
188+
### Configure the framebuffer configuration in the kernel command line
187189

188190
```
189191
sudo nano /boot/firmware/cmdline.txt
@@ -211,7 +213,7 @@ When you reboot this time, your display should work, but your keyboard won't be
211213
1. `cd` to the `picocalc_trixie` directory
212214
1. `cd` into the `keyboard` directory
213215

214-
#### If you need the mouse, edit the firmware
216+
### If you need the mouse, edit the firmware
215217

216218
If you need the mouse emulation that comes with pico calc:
217219
`press shift to turn the arrow keys into the mouse, and the square brackets into lmb and rmb`
@@ -248,7 +250,7 @@ dtparam=i2c_arm=on
248250
dtoverlay=picocalc_kbd
249251
```
250252

251-
## Configure Audio
253+
## Set up Audio
252254

253255
```
254256
sudo nano /boot/firmware/config.txt
@@ -271,7 +273,7 @@ sudo reboot
271273

272274
Once you've rebooted you should have most things working! The rest is optional but might be handy.
273275

274-
## optional: Configure your terminal font for a better display experience
276+
## (Optional) Configure your terminal font for a better display experience
275277

276278
Source: [a comment by Lachlan_Beveridge](https://forum.clockworkpi.com/t/raspberry-pi-zero-2-on-picocalc/17946/235?u=jamescodesthings)
277279

@@ -288,9 +290,9 @@ font: Terminus
288290
size: 6×12
289291
```
290292

291-
## optional: fix keyboard layout
293+
## (Optional) Fix keyboard layout
292294

293-
if, like me you flashed with the wrong keyboard layout, you can fix it with:
295+
If, like me, you flashed with the wrong keyboard layout, you can fix it with:
294296

295297
```
296298
sudo nano /etc/default/keyboard
@@ -301,9 +303,50 @@ sudo nano /etc/default/keyboard
301303
3. Save the file and exit
302304
4. Reboot the Pi
303305

304-
## Optional:
306+
## Optional: Copy useful scripts to your path
307+
308+
Source: [github.com/nibheis/picocalc_trixie](https://github.com/nibheis/picocalc_trixie)
309+
310+
The `picocalc_trixie` repo has some useful scripts for running Pico8 and other utilities. You can copy them to a directory in your `PATH` for easier access.
311+
312+
```sh
313+
# Go to the picocalc_trixie directory
314+
cd ~/picocalc_trixie
315+
# Copy the scripts to /usr/local/bin
316+
sudo cp -r user_bin/* /usr/local/bin/
317+
# one is called "shudown" which will lead to an infinite loop. rename it.
318+
mv /usr/local/bin/shutdown /usr/local/bin/shutdown-pi
319+
320+
# alternatively, modify the script and have it point to /usr/sbin/shutdown
321+
sudo nano /usr/local/bin/shutdown
322+
# Change 'shutdown' to '/usr/sbin/shutdown' and save the file.
323+
```
324+
325+
## Optional: Power off shutdown script
326+
327+
I haven't had this consistently work but I'd like you to know it exists: https://github.com/nibheis/picocalc_trixie#step-7-make-the-pi-turn-off-the-main-board-when-powering-off
328+
329+
tldr; this service should trigger the pi to send a power off signal to the mainboard when the Pi shuts down.
330+
331+
For me, it hasn't been; but that's not a huge issue. Once it's shut down you hold the power button for a few seconds and the green light on the ZeroCalc will turn off.
305332

306-
## Resources
333+
If I get this fixed I'll add an update here.
334+
335+
# Shameless Plug: Handle, stand, grip for the ZeroCalc
336+
337+
<div class="image-carousel">
338+
<a href="../assets/blog-images/cover-tall.png"><img src="../assets/blog-images/cover-tall.png" alt="Front"></a>
339+
<a href="../assets/blog-images/side-on.png"><img src="../assets/blog-images/side-on.png" alt="Side"></a>
340+
<a href="../assets/blog-images/rear-view.png"><img src="../assets/blog-images/rear-view.png" alt="Rear"></a>
341+
</div>
342+
343+
If you like the grip in the cover image, you can find it on at Makerworld: [PicoCalc Grip Stand Handle](https://makerworld.com/en/models/2748402-picocalc-grip-stand-handle).
344+
345+
If you like it, check out the other things I make!
346+
347+
Heads up; there's a version you can print without the `pico-8` logo on the front. It's plate 2 in the print profile, and the `.step` files are included in the 3D model files if you want to modify it yourself.
348+
349+
# Resources
307350

308351
Here's the main resources I used when working this out.
309352

@@ -313,6 +356,10 @@ Here's the main resources I used when working this out.
313356
- [The Trixie 64bit install instructions](https://github.com/nibheis/picocalc_trixie/)
314357
- [A comment in the forum post about making the default font easier to work with](https://forum.clockworkpi.com/t/raspberry-pi-zero-2-on-picocalc/17946/235?u=jamescodesthings)
315358

316-
```
359+
# Fin
317360

318-
```
361+
That's it for this one! I hope it's useful to anyone looking to do something similar. If you have any questions, or suggestions for improvements, feel free to reach out.
362+
363+
Many thanks to everyone mentioned in the resources, and anyone else who's worked on this in the forums. It's a great community and I'm grateful for all the work that's gone into making this possible.
364+
365+
If anyone involved in the project wants to add anything, or correct any mistakes, just let me know!
1.66 MB
Loading
4.86 MB
Loading
1.21 MB
Loading

src/assets/blog-images/side-on.png

1.18 MB
Loading

src/css/styles.css

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1137,6 +1137,7 @@ html:not(.dark) .bento-badge:hover {
11371137
.blog-post {
11381138
max-width: 800px;
11391139
margin: var(--space-2xl) auto;
1140+
margin-bottom: 75vh;
11401141
padding: 0 var(--space-lg);
11411142
}
11421143

@@ -1243,16 +1244,10 @@ html:not(.dark) .bento-badge:hover {
12431244
}
12441245

12451246
.blog-post img {
1246-
border-radius: var(--border-radius-lg);
1247-
border: 1px solid black;
12481247
max-width: 100%;
12491248
width: 100%;
12501249
}
12511250

1252-
.blog-post img:hover, .dark .blog-post img:hover {
1253-
border-color: var(--color-accent);
1254-
}
1255-
12561251
.blog-post iframe.yt {
12571252
width: 100%;
12581253
max-width: 100%;
@@ -1266,10 +1261,6 @@ html:not(.dark) .bento-badge:hover {
12661261
color: var(--color-text-muted);
12671262
}
12681263

1269-
.dark .blog-post img {
1270-
border-color: white;
1271-
}
1272-
12731264
.blog-post {counter-reset: section; counter-increment: section -1;}
12741265
.blog-post h1{counter-reset: sub-section}
12751266
.blog-post h2{counter-reset: composite}
@@ -1309,6 +1300,33 @@ html:not(.dark) .bento-badge:hover {
13091300
content: counter(section) counter(sub-section, lower-alpha) counter(composite, lower-roman) counter(detail, lower-roman);
13101301
}
13111302

1303+
p:has(.published) {
1304+
margin-top: calc(var(--space-lg) * -1);
1305+
}
1306+
.blog-post .published {
1307+
font-family: var(--font-mono);
1308+
font-size: 0.8em;
1309+
color: var(--color-text-muted);
1310+
}
1311+
1312+
.blog-post .image-carousel {
1313+
display: flex;
1314+
gap: var(--space-sm);
1315+
overflow-x: auto;
1316+
padding-bottom: var(--space-md);
1317+
}
1318+
1319+
.blog-post .image-carousel a {
1320+
1321+
}
1322+
1323+
.blog-post .image-carousel a img {
1324+
width: 100%;
1325+
height: 100%;
1326+
transition: transform 0.2s ease;
1327+
}
1328+
1329+
13121330
/* ============================================
13131331
Responsive
13141332
============================================ */

src/utils.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ import showdown from 'showdown';
77
import config from './config.js';
88

99
const debug = Debug('codesthings:utils');
10-
debug.enabled = false;
10+
debug.enabled = true;
11+
const trace = Debug('codesthings:utils:trace');
12+
trace.enabled = false;
1113

1214
const converter = new showdown.Converter({ tables: true, ghCodeBlocks: true });
1315

@@ -72,10 +74,10 @@ export async function cpDir(srcDir, destDir) {
7274
const srcPath = `${srcDir}/${entry.name}`;
7375
const destPath = `${destDir}/${entry.name}`;
7476
if (entry.isDirectory()) {
75-
debug(`cp ${destPath}`);
77+
trace(`cp ${destPath}`);
7678
await cpDir(srcPath, destPath);
7779
} else {
78-
debug(`cp ${destPath}`);
80+
trace(`cp ${destPath}`);
7981
await copyFile(srcPath, destPath);
8082
}
8183
}

0 commit comments

Comments
 (0)