Driving an 80s robot with a 90s OS at VCF West 2026
John Floren
Home | Blog | Uses | Links
Back to blog archive<br>Posted 2026/8/4
Driving an 80s robot with a 90s OS at VCF West 2026
Table of Contents
Hero BASIC programs
Plan 9 shell scripts
Webcam
Driving the robot
Crowd reactions
Conclusions
A few months ago I acquired three Heathkit HERO 20001 robots (and two HERO 1 robots) when, to my astonishment, someone actually answered my “Heathkit robots wanted” Craiglist ad. They were all in various stages of disarray but after some fiddling and some new batteries I have one of each up and running more or less as designed.
With VCF West coming up, I thought it might be fun to take the Hero 2000 and drive it around the show. As a kid I always thought these 80s “home robots” were so cool, but never got to see them in person… so let’s get out there and let some other people see them in person!
I was short on time and extremely short on documentation (seriously, if you have Hero 2000 documentation, email me) so I needed a simple way to remote-control the robot. Without more documentation I had no hopes of programming it for autonomy, and I don’t want to gut the original hardware to put something else in. I settled on the following architecture:
Onboard 8088 computer running in BASIC mode
Thinkpad running Plan 9 hanging off the back of the robot, connected via RS-232 serial
Thinkpad running FreeBSD which connects to the Plan 9 system, from which I issue commands
I went with Plan 9 for a few reasons. First, I’d been meaning to spend more time with 9front for a while now, and this was a good opportunity. Second, I find using serial ports easier on Plan 9 than on any other system: I can configure the serial port and send data using nothing more than echo.
Hero BASIC programs
After staring at the only source of Hero 2000 programming documentation I can find for a while, I came up with a few simple BASIC programs that I could wire together into a demo. I’ll reproduce them here:
10 for i = 0 to 10<br>20 if sonar(23)
Turning left and right is as simple as sending a command like rht 10 (drive the right motor 10 units), so I didn’t really need to write programs for those.
Plan 9 shell scripts
To actually execute these programs, I wrapped them in small rc shell scripts. Because I was in a hurry, I hard-coded the particular USB-serial adapter I was using, and also had each shell script set the ready-to-send flag on the serial port (which turns out to be necessary for actually transmitting the bytes over the wire to the robot, I don’t know if this is a fluke of the 9front drivers or the way the robot implements its serial port or what).
hero-fwd:
#!/bin/rc<br>echo r1 > /dev/eiaUa3a94ctl<br>echo new > /dev/eiaUa3a94<br>cat > /dev/eiaUa3a94 /dev/eiaUa3a94
hero-findpath:
#!/bin/rc<br>echo r1 > /dev/eiaUa3a94ctl<br>echo new > /dev/eiaUa3a94<br>cat > /dev/eiaUa3a94 /dev/eiaUa3a94
hero-left:
#!/bin/rc<br>echo r1 > /dev/eiaUa3a94ctl<br>echo rht 5 > /dev/eiaUa3a94
hero-right:
#!/bin/rc<br>echo r1 > /dev/eiaUa3a94ctl<br>echo lft 5 > /dev/eiaUa3a94
hero-stop:
#!/bin/rc<br>echo r1 > /dev/eiaUa3a94ctl<br>echo > /dev/eiaUa3a94
hero-say:
#!/bin/rc<br>echo r1 > /dev/eiaUa3a94ctl<br>echo new > /dev/eiaUa3a94<br>cat > /dev/eiaUa3a94 /dev/eiaUa3a94
With those in hand, I made a little script that watches for keypresses and dispatches the appropriate script:
#!/bin/rc<br>fwd=w<br>rev=s<br>left=a<br>right=d<br>findpath=f<br>stop=' '<br>quit=q<br>if (~ $1 t) {<br>echo TWIDDLER MODE<br>fwd=e<br>rev=t<br>left=n<br>right=r<br>findpath=o<br>stop=' '<br>quit=a<br>echo rawon<br>while () {<br>ifs=() cmd=`{read -c 1}<br>switch ($cmd) {<br>case $fwd<br>echo forward > /dev/cons<br>hero-fwd &<br>case $left<br>echo left > /dev/cons<br>hero-left &<br>case $right<br>echo right > /dev/cons<br>hero-right &<br>case $findpath<br>echo find path > /dev/cons<br>hero-findpath &<br>case $stop<br>echo STOP > /dev/cons<br>hero-stop &<br>case $quit<br>exit<br>case q<br># just so it's easy to remember how to quit even in twiddler mode<br>exit<br>}/dev/consctl
Webcam
I used double-sided tape to stick a Logitech webcam on top of the sonar turret. This was plugged into the Plan 9 laptop, with the intention of viewing it remotely, but I found that video over drawterm wasn’t going to work, between wifi and the known “performance” of 9p2.
Since it was only 2 days to VCF, I vIBeCoDeD a little Go tool that converts the Plan 9 image format of the video file to MJPEG and serves it over HTTP. This worked well enough to go on.
Driving the robot
Getting things ready to run turned out to be a bit of a dance. First, I booted the Plan 9 laptop, connected to wifi3, and ran a script which enabled incoming cpu connections to the terminal. Then I closed the laptop and slid it into a little Ikea trash basket I had zip-tied to the back of the robot (there’s not enough room inside the torso for the laptop, sadly).
On my FreeBSD laptop, I used drawterm to connect to Plan 9, then ran a small script which set up a few windows in a large font:...