PLEASE NOTE: This is unofficial documentation of The Wand Company’s Pip-Boy 3000 Mk V. For all official documentation and support please refer to the official manual over at https://www.thewandcompany.com/pip-boy-manual.

Audio

Play your own audio files

You can play your own music and audio, but first any files you have must be converted to 16-bit mono channel wave files before they’ll play, this can be achieved easily using ffmpeg.

ffmpeg -i DiamondCityRadio.ogg -ac 1 -ar 16000  DiamondCityRadio.wav

-ac 1 Sets audio channels to 1.

-ar 16000 Sets audio sampling rate to 16000 Hz.

Files should be placed in the USER/ directory on the SD card. Now in the DATA > MAINTENANCE menu, at the bottom is an option to Play audio files, all your .wav files should appear in here.

play audio files screenshot play custom audio screenshot

FM Radio

The built in FM Radio is a RDA5807M.

Datasheet

Create your own apps

Any .js file added under the USER/ directory on the SD card can be loaded as an app.

Hello World

This basic “Hello World” app shows you how to load an app and print something on the screen. Just save it as USER/Hello World.js on your SD card to get started! All users apps appear under INV > APPS.

// Print "Hello World!" on the screen, then 3 seconds later, print some more text.
Pip.typeText("Hello World!").then(() =>
  setTimeout(() => {
    Pip.typeText("Nice app!").then(() => {
      setTimeout(() => {
        // 3 seconds after that, return to the apps menu
        submenuApps()
      }, 3000)
    })
  }, 3000)
)

custom apps view

hello world app

APPINFO

You can also have the app name different to the file name, the below id of helloWorld would map it to an app at USER/helloWorld.js. The name that’s rendered in the UI menu now matches the name in the file which would be saved at APPINFO/helloWorld.json.

{
  "id": "helloWorld",
  "name": "Hello World!"
}

NOTE! The name of the file in APPINFO doesn’t matter, it’s the id in the file that matches it to the app in USER, but it’s worth keeping it the same to keep things logical.

Developing apps

To simplify testing and development of apps there’s a couple of approaches you can take, the easiest to get started with is to use the Espruino IDE. Connect the Pip-Boy up to your computer the same way you would do the official updates and visit the above linked IDE, on there click the Connect icon in the top left and select “Web Serial” and then select the Pip-Boy to connect to.

NOTICE! In the Espruino IDE take great care not to hit any of the “Send to Espruino” icons in the center as you can inadvertently overwrite the firmware already on your device.

Using the console in the left of the IDE you can type commands using the functions listed below, and tab completion etc. to run commands live in your Pip-Boy.

If you’re already somewhat familiar with software development, there’s also a plugin for VSCode for Espruino for connecting to your device from VSCode, or alternatively for an even more simple approach, open a serial connection to the USB to serial port, there are more options and details available at the Espruino Quick Start documentation.

Storage

The built in SD card is a 256MB FAT16 formatted card. This can be replaced though.

Upgrading the SD Card

Storage on the SD card is accessed via the Espruino fs Library which states that in will interface with a FAT32 filesystem on an SD card. You can take a larger SD card, format it as FAT32 and then copy all the files from the built in SD card onto a new larger one and everything appears to work perfectly normally. I tried this with a 16GB SD card and it works completely fine playing a 300MB .wav file, see more about that below in Playing Your Own Audio Files.

Global Variables

Hardware Pin References

These values just alias the standard Espruino pin definitions to labels that are easier to reference.

LED_RED = E4
LED_GREEN = E5
LED_BLUE = E6
LED_TUNING = E3
BTN_PLAY = A1
BTN_TUNEUP = E1
BTN_TUNEDOWN = E2
BTN_TORCH = A2
KNOB2_A = A10
KNOB2_B = A8
KNOB1_BTN = A3
KNOB1_A = B1
KNOB1_B = B0
BTN_POWER = A0
MEAS_ENB = C4
LCD_BL = B15
VUSB_PRESENT = A9
VUSB_MEAS = A5
VBAT_MEAS = A6
CHARGE_STAT = C5
RADIO_AUDIO = A4
MODE_SELECTOR = A7
SDCARD_DETECT = A15

Functions

Pip.isSDCardInserted

Returns true if the SD card is present. Reads SDCARD_DETECT to test presence, an alias of A15.

> Pip.isSDCardInserted()
= true

Pip.getID

Reads the device ID. Device ID is read from memory registers 0x536836624 0x536836632 and 0x536836628.

> Pip.getID()
= "123456Q-12-123B"

Pip.measurePin

Read the average voltage of an analog pin. Used to read the state of the resistor ladder on the mode selection dial.

Parameters

pin Analog pin to read. samples Number of samples to read. Defaults to 10. factor Average is multipled by this factor. Defaults to 2.

> Pip.measurePin(MODE_SELECTOR)
= 0.02578289836 // STAT
> Pip.measurePin(MODE_SELECTOR)
= 1.34515215214 // INV
> Pip.measurePin(MODE_SELECTOR)
= 2.67024886699 // DATA
> Pip.measurePin(MODE_SELECTOR)
= 4.01914486189 // MAP
> Pip.measurePin(MODE_SELECTOR)
= 5.34623848015 // RADIO

Pip.knob1Click

Actions performed when the left knob is turned, plays audio clicks from UI/ROT_V_1.wav and UI/ROT_V_2.wav depending on direction.

Parameters

direction Values greater than 0 play audio 1, less than plays audio 2.

> Pip.knob1Click(1)

Pip.knob2Click

Actions performed when the top knob is turned, plays audio clicks depending on direction. Older versions (< 2v24.206) used UI/PREV.wav but newer uses an audioBuiltin.

Parameters

direction Values greater than 0 play audio 1, less than plays audio 2.

> Pip.knob2Click(1)

Pip.typeText

Prints text onto the screen, the text has a typing effect and plays sounds and prints character by character below a Vault Tec logo.

Parameters

text Text string to display on the screen.

> Pip.typeText("This is some text to demo things!")

Pip.offAnimation

Plays the screen off animation.

> Pip.offAnimation()

Pip.offOrSleep

Power off or sleep the device, can be configured to play or not play various animation sequences.

Parameters

options Object of options, options include forceOff and immediate.

{
  // If true, at the end of the powerOff animation the device will be turned off, if false it will sleep
  forceOff: true/false,

  // If true, skips playing the fade out sequence etc. and will go straight to the powerOff function.
  immediate: true/false
}
> Pip.offOrSleep({ forceOff: false, immediate: false })

Pip.updateBrightness

Sets the brightness of LCD backlight and all LED’s based on the value of Pip.brightness.

> Pip.updateBrightness()

Pip.audioStart

Start playing an audio file from the given path.

Parameters

path Path to the audio file.

> Pip.audioStart("ALARM/Klaxon.wav")

Fun Notes

Default Date

System date defaults to the date and time the bombs dropped at the start of the Great War.

if (new Date().getFullYear() === 2000) {
  setTime(new Date("2077-10-23T09:47").getTime() / 1000)
}

Factory Test Mode

Holding down torch, play and knob1 will enter factory test mode to test fuctionality.