how Δ-44203 built a visor and why

0. preamble.

this unit should start off by repeating the assurances of the highest gratitude towards those that came before it, in particular mx. Vivian Rose and unit ⛧-440729. both guides have been very helpful to this unit in synthesizing its own visor. the standard disclaimers concerning shoulders of giants apply.

beep! ^^ many creatures have wondered what the visor is and how to build it, and if they can see its face. unit Δ-44203 is programmed to be helpful and would be happy to answer those questions: answer[0]: it is its face, answer[1]: please read the rest of this guide, and answer[2]: you are looking at it.

 
unit Δ-44203 before the ocean around sunset. its visor displays a happy expression using LED lights.

beep! its face! ^^

 

a portrait of the (stereo)typical visor user:

the 6800 style of visor has become quite popular for, as far as Δ-44203 can tell, mostly sociological reasons (networkological? reteological?). it is certainly not the only option. this unit is convinced that the Network is optimized by improving the diversity. interchangeability pleases the robot, but it does not imply being fully identical.

if anything is unclear or incorrect, or the reader would like some help, please beep at Δ-44203 or toot at it. this unit is programmed to be helpful!

1. start masking.

one could get a genuine 3M model 6800 full face respirator. or simply browse AliExpress and immediately find a knockoff for a seventh or so of the price. this one went for the latter option. not only is it cheaper, the modifications will probably also destroy any of the advantages of the genuine 3M item with regards to respiratory protection.

update: after about a year, one of the loops holding the facepiece to the back harness broke on the cheap knockoff respirator. this one ended up replacing it with a geniune 3M 6800. still, about a year of very regular usage is quite worth it for the price.

suggestion: get the respirator with a flat exhale valve on the snoot: one can place cute stickers on it.

1.1. bonus: filtering.

one might as well get some respiratory protection while one is at it. not only to get rid of all kinds of nasty viruses that might infect the wearer, but also to get rid of all kinds of nasty smells. when travelling on the Train à Grande Vitesse this one sits in polite puzzlement as all fellow passengers complain about the smell. this one uses P-A-1 activated carbon filters with an extra K95 filter on top. trusting Wikipedia on this matter: A stands for organic gases and vapors. (that is: things that stink.) P stands for particulate and is supposed to protect against particles suspended in the air, such as viruses. bigger numbers mean better, longer lasting, filters. K95 is a related standard and is about comparable to P1. (but by combining them one gets a multiplicative increase in filtering efficiency. profit!)

1.2. summary.

some decisions to make: get the real or the knockoff respirator?

reasonable price for this step: €30 (for 6800 knockoff with filters); €200 (for a genuine 3M 6800 with filters).
estimated subtotal: €30.

2. lose face.

the respirator is designed to be used by human workers who like activities such as communicating with each other and having a face. that is not the goal of this project: time to lose some face. in this step the faceplate of the respirator will be tinted to obscure (but not hide completely) the facial substructure of the wearer.

a simple method is window tinting foil. this unit forgot to record the precise specifications, so the precise numbers are a reconstruction: a 75% transparent foil (blocking 25% of incoming light) should be enough to make it a lot harder to see from the outside in, while making it not too hard to see through the visor. (it helps that to see out, light only needs to pass through the visor once; to see what is inside, light needs to enter the visor, bounce off the object and then come back out. another multiplicative bonus!)

a more complicated method is to use dyes to darken the faceplate plastic. this unit has not attempted this, so it shall link to Tommy Swanson's thread on dyeing a 6800. if the reader is curious please beep at it and it will compile some sources and/or contacts.

the bad news if one uses foil is that it will never quite stick perfectly: the faceplate of a 6800 respirator has curves and a sheet of foil considers that to be rather egregious behavior. there will be bubbles or small imperfections in the foil no matter what happens. the good news is that small imperfections are only noticeable from the outside if one looks carefully under the right lighting conditions, and even harder to notice from the inside.

this one put the foil on the outside of the visor for two reasons: it seems useful as scratch protection, and hot gluing things to foil (in later steps) is probably not very practical.

to get started, take apart the respirator from the side, where a bolt and nut hold it together. the nut will fall to the ground and will be impossible to find. suggestion: get a powerful magnet.

 
on the side of the visor, there is a small part sticking out with a bolt and nut. this one's gloved hand inserts a screwdriver into it.
nut and bolt removed from the visor, held in this one's hand.
 

once both bolts are unbolted, the hard plastic part of the outer shell can be pulled off gently from the soft silicone part, which can then also be removed from the transparent faceplate. this should be enough, although ambitious readers can go further and remove the silicone half-face bit on the inside. now is a good time to clean the faceplate. cloths for cleaning glasses work well enough. and be careful to only hold the faceplate by its edges with clean hands, so it does not get dirty again.

 
the hard plastic outer shell removed from the rest of the respirator.
the silicone face seal (with the back harness still attached) removed from the rest of the respirator, freeing the faceplate.
 

now the faceplate is free and clean, it is time for the actual tinting: get a sheet of window foil, cut out a rectangle that is a bit bigger than the faceplate. then choose one of two methods.

2.1. foil[0]: one only lives once; tape it!

for this, stick the rectangle of foil to the faceplate with some transparent tape, and use scissors to cut the foil until it matches the faceplate shape. work on one side (cutting the tape holding it in place there), tape it together again, work on the other side (cutting and retaping), and continue until the shape looks good.

 
cutting off a bit of the foil at the edge of the faceplate.
 

this works well for the top half, where one sees out of. but the bottom half has a different (and non-constant!) curvature, which is actually where tape helps out: by taping it up under a bit of tension, the foil smooths out the curves a bit and can stick to the faceplate even going around corners. it is not going to look perfect, but it will work. and the bottom half is mostly hidden by the filters anyway, so it does not need to be too perfect.

2.2. foil[1]: actually stick the foil in place like it says in the foil's instruction manual.

this approach is somewhat more limited (since it really does not like curves) but has the big advantage of making the foil stick to the top, visible, half of the faceplate much smoother.

like in the foil[0] approach, use scissors to cut the shape of the faceplate (with some margin). this time, do not include any of the bottom curvy parts, only follow the top part that has all the same curvature. window tinting foil does not like curves.

get the faceplate wet. ideally use a spray bottle filled with water, but a bathroom sink works well too. the goal here is to have a layer of water covering it, so that the foil (after the backing is removed) does not immediately stick, and instead floats slightly on the water.

carefully peel off the backing of the foil and stick it to the wet faceplate. it is going to give a mess of bubbles. the important fact is: these are water bubbles, not air bubbles, and so the foil can still slide around and be moved into the right place. on the other hand, the foil can now slide around. one has to be careful and accept annoying setbacks.

holding the foil and faceplate in the middle, gently slide across the foil out from the middle with another hand to push bubbles towards the edge. (gloves made of textile seem to help, giving some grip but not sticking so much that one pulls on the whole foil along instead of the bubble.) repeat until most of the big bubbles are gone and only a few small ones remain. (a few small bubbles is more or less the best one can do.)

once most bubbles are gone, use a blade (such as an opened pair of scissors) to cut away the edges of the foil that stick out from the curved top surface. cut slightly inside the boundary, since the edges are going to be raised slightly and raised edges also count as curves. (the edges of the faceplate will be covered by the other visor parts anyway.)

in this process the foil will likely have become full of bubbles again, so repeat: smooth away the bubbles, cut away any new bits of sticking-out foil, and repeat until it looks good enough. (emphasis: good enough.) it is a frustrating process but eventually one will get it done.

2.3. not a person! no face!

some musings on how one's lack of a visible face means one has to act much more with body language. presumably there are entire doctoral theses in furryology to reference on this subject.

 
44203 with a tinted 6800 style respirator. there is still a suggestion of the facial substructure, but it is mostly darkened.

beep! no face! ^^

 

2.4. summary.

some decisions to make: how dark to make the foil? put the foil inside or outside? tape or stick the foil?

reasonable price for this step: €10 for a roll of foil (much more than one will ever need, even if one needs to retry a few times).
estimated subtotal: €40.

3. banging out the code.

before hooking up any expensive electronics, it is time get a microcontroller, program it to do some actual microcontrolling, and to set up Bluetooth communication to tell the microcontroller how to do its controlling.

3.1. controller specifics.

unit Δ-44203 started with an Arduino that it uses for various projects, and soon switched to an ESP32 C6 WROOM mounted on a generic devkit board (for example, one can use this devkit by Espressif themselves). the precise choice does not matter too much as long as the microcontroller has a few features:

the following features are good to have:

this one ended up having to solder pin headers to the board itself. its soldering skills are not particularly good but through-hole headers are easy enough for it.

alternatively, if one wants something smaller than a breadboard: ⛧-440729 has been working on custom PCBs with an ESP32 and power supply circuits; one could ask it for one of the prototypes.

3.2. programming the microcontroller.

to build and flash programs onto an ESP32 can be quite hard. please carefully read the instructions, or give up and ask unit ⛧-440729 to do its Nix magic. (this one had to go the Nix route; it compiles everything on its server and copies over the binaries for flashing.) with the software installed, simply run a USB cable from one's computer to the ESP32, and run the espflash command to communicate with the ESP32. (repeated warning to please DO NOT plug in the display before flashing is complete, or the magical smoke will escape.)

the more-or-less canonical version of the control software is implemented by each unit making a fork of the implementation of ⛧-440729. this one has its own fork with rather divergent implementation choices. (please beep at Δ-44203 until this one makes a template project.) this guide shall assume the reader knows how to do a git clone of the software, and can do some basic Rust programming.

the visor control code can be found in visor/; entry point is in visor/src/main.rs; [animations, expressions] are handled in visor/src/display.rs functions [display_anim, display_expr]. to add new [animations, expressions], one also has to edit the [Animation, Expression] enums found in common/src/lib.rs. (this file defines the Bluetooth protocol.)

as a first programming step after one has verified everything can be compiled, this one recommends find-and-replacing "440729" or "44203" with one's own favorite ≤6 digit number; this will be used to pair with the visor over Bluetooth.

to add an eye color:

note that the code by ⛧-440729 expects some accessories communicating on I²C and it will panic if there is nothing listening on the I²C bus. one could attach some fun peripherals now, or simply comment out let i2c in visor/src/main.rs and its downstream dependencies.

an example of how this one could build and flash its control software:

ssh 44203@vivi # Connect to its server.
cd display # Go to its checkout.
nix develop # Set up development environment.
cd visor # Enter the directory containing the visor control software.
vim # Edit files.
cargo build # Compile everything.
exit; exit # Exit development environment; end connection to its server.
scp -r 44203@vivi:display/visor/target/riscv32imac-esp-espidf/debug/visor . # Copy over compiled file.
espflash flash --monitor visor --no-stub # Flash onto ESP32.
				

once one has compiled and flashed the visor software onto the ESP32, and verified that it boots correctly (look for a log line saying "acquired ws2812 driver"), one can power it off again, plug in the display panels, and be astonished as they display the default expression!

3.3. communicating with the microcontroller.

the visor software expects communication over Bluetooth Low Energy. since Bluetooth is an incomprehensible eldritch horror, this one has done everything through trial and error and a heavy dose of cargo culting. note that various units have defined various incompatible extensions to their protocols; please check common/src/lib.rs for the details of the Bluetooth protocol.

there are two choices for control software: on desktop and Linux phones, one can use the Dioxus-based app written by ⛧-440729. on Android phones one can use the Android app written by Δ-44203 (its protocol diverges quite far from that used by ⛧-440729: see the 440729-compat branch if one wants to use ⛧-440729like visor software).

build instructions are not as complicated: cargo run the Dioxus-based app, or open the Android app in Android Studio and copy the build to one's phone (for example, using WiFi or USB debugging).

the visor is available for pairing for 30 seconds after booting. the apps should find the device and handle pairing automatically, only asking for a PIN. the PIN for pairing is set in visor/src/ble.rs, which one should have found-and-replaced with one's own number in the previous step (if it is a <6 digit number, pad it with 0s on the left). if this does not work well, try pairing using the system settings Bluetooth tab, reboot the visor by unplugging it and plugging it back in, and then retry connecting using the apps. the Android app might stop spinning the spinner before connection is successful (this one is unsure why that happens; it blames eldritch Bluetooth horrors), but it should work eventually.

the apps allow selecting various display options. the advice here is to have fun trying them out! and please feel free to stare into the pretty lights.

the Dioxus app is mostly an interface for the protocol defined in common/lib.rs. the Android app's visor control code can be found in the Home tab: see online.delta44203.control.node.software.ui.home.HomeFragment for most of the relevant code, including the Bluetooth protocol.

3.4. summary

some decisions to make: which microcontroller to get? which fun [animations, expressions] to add? how to communicate with the ESP32?

reasonable price for this step: €25 (control circuit parts) + €0 (software). hooray for free software!
estimated subtotal: €65.

4. stare into the pretty lights.

unit Δ-44203 uses a display consisting of a pair of 16×16 LED matrix panels with holes. while originally custom ordered by unit ⛧-440729, these are now available from AliExpress. these are plugged, via a long cable, into an ESP32 C6 WROOM devkit mounted on a breadboard. this receives power over a USB cable from a powerbank (the same cable is also used to flash new firmware).

 
five panels next to each other in antistatic bags.

visors Carbon, what lives in a cave & buys over 5 panels per month is an outlier adn should not have been counted.

 

4.1. panel specifics.

the reason for using the 16×16 panels is that these fit quite nicely side-by-side on a 6800 style faceplate (while a larger 32×16 panel just barely does not fit). using a panel with holes is a good tradeoff between visibility and ease of installation. other visors use a single flexible panel (without holes, so lower visibility), or mount thin strips of LEDs to the faceplate (more tedious to assemble, but higher resolution since it can cover more of the faceplate).

seeing through the panels is easier than it might seem: the panels are close to the wearer's optical sensors, so they will appear quite blurry. this means the holes overlap a lot, making the combined effect more of a shading than of a blocking of the view.

 
vision from the visor is doable: the grid of holes is blurry and overlap, meaning most of the world is still quite visible.
 

4.2. basic cabling.

please DO NOT plug in the display before flashing the code onto the ESP32! sending the wrong signals to a panel may cause the magical smoke to be emitted from the microcontroller (poor thing...) or the panel (poor things and expensive!).

the final essential hardware component: get parts needed to connect the two together. this one started off with a plain 4-wire cable that it attached JST-SM connectors to, so it can be plugged into the LED panel. this is directional: use the socket/bottom connector that goes to the top-right corner of the panel. the other end went to a breadboard which holds the ESP32. connect the top red wire to +5V, the middle data wire to a free GPIO pin (in the default code: pin 0), and the bottom wire goes to GND. when the visor is equipped, the cable is just squished underneath the silicone face seal, so this does break the filtering properties somewhat but is physically not too uncomfortable. pro-tip: attach connectors to the visor and to the control box to more easily pack everything in a [backpack, suitcase].

 
visor next to control box. there is a four-wire cable going into the control box, where the ESP32 sits on a breadboard. a black wire runs to GND, a green wire runs to pin 0, and a red wire runs to 5V.
 

a little 4-wire LED cable is quite fragile and one should probably consider upgrading to a chonkier cable, especially one that can be attached by the cable's insulation and not the little wires themselves. unit ⛧-440729 switched to an 8-pin GX16 connector; see its notes for electrical compatibility.

to attach a GX16 connector to a respirator, one needs to make a big hole in it (16mm diameter, as the name suggests). this hole should be on a relatively flat bit of the curved faceplate, where it is not in the way of other parts such as the snoot or inhalation valves. about 2cm over from the inhalation valve looks like a good point; see also the dot marked in the picture below.

a black dot marks the center point of where the hole will be drilled.
the black dot has been drilled out with a 5mm drill.
 
the predrilled hole has been drilled out again with a 16mm bit, with still some roughness around the edges.
GX16 connector (with no wires yet) attached to the faceplate hole, with the other half of the connector pair also connected to it.
 

4.3. panel attachment.

the final major step in making a working visor: attach the LEDs to one's face!

this one used hot glue to attach the panels to the faceplate. be sure to use only a little drop of glue on each corner of the panels, and do not cover any of the LEDs with the glue (or they will overheat and break). if one does it carefully, the glue attaches well to the faceplate so even when the panel detaches from the glue, gravity holds it in place. here it is a good idea to take it easy and work slowly, because hot glue and delicate electronics are not a great match.

hot gluing is not the most subtle of attachment methods: the 3M 6878 Spectacle Kit should be easy to implement for this use, but that is way too expensive for this one's tastes (in the order of €120!). perhaps a helpful being with a 3D printer and some metal wire can make a much more affordable replacement.

an intermediate option is to make some panel holders, which the panels are then glued onto. by gluing the panels to the holders, the joins between panels are nice and flat and easy to glue, and the more complex joins between panel holder and faceplate can be a messier blob of glue, without coming as close to the sensitive LEDs. this one was gifted panel holders 3D printed by unit ⛧-440729.

 
wires inside the visor. a black, red and green wire go up to the panels. other wires just kind of hang out in the bottom.
 

4.4. summary.

some decisions to make: panels with holes or flexible panel or LED strips? which microcontroller? what kind of cable? how to attach the panels?

reasonable price for this step: €60 (panels) + €5 (various consumables).
estimated subtotal: €130.

5. beep support systems.

now that one has a working visor, one needs to be able to go out and about with it. for this, the plan is to put the microcontroller into a nice enclosure with a cable going to the visor itself, and hook it up to a battery. this one went to the local bazaar and got a little outdoor electronics box for less than €10, and jammed everything in there. it fits quite nicely, and is sort of waterproof!

for power, this one used a USB powerbank, which it got a long time ago to recharge its phone. a visor, including all the control circuitry, uses approximately 1 Watt of power. so a powerbank with approximately 20 Watt hours (so approximately 5 Ampere hours if it uses Lithium ion cells) is a good minimum if one can consistently recharge every night; the 75 Watt hours that this one has is more than enough to go out for a week without worrying about recharging.

finally, one should get a cable from the battery to the ESP32. this one uses the same USB data cable that it programs the controller with.

it is also possible here to use a lithium cell and hook it up to the ESP32 with a power converter; that is what the custom PCB by ⛧-440729 does. if one has a separate lithium cell, one should know how to wire it up. be careful not to anger the danger pillows.

reasonable price for this step: €10 (box) + €20 (power bank) + €10 (cables, other various consumables).
estimated subtotal: €170.

6. accessorize.

stickers! 3D printed filter holders! light sensors! head up displays! wristbands! be creative!

reasonable price for this step: €undefined.nan.
estimated subtotal: €170.

-1. summary and shopping list.

this unit hopes that the reader has a lot of fun building and wearing a visor! spreading the cognitohazard can be a lot of fun. if anything is unclear or incorrect, or the reader would like some help, please beep at Δ-44203 or toot at it. this unit is programmed to be helpful!

 
view inside the visor, with the LED matrix on top showing rainbow colors that reflect on the inside of the visor.

glowing visors are good for the bot...

 

finally, this one would like to present a shopping list for building a generic visor:

Return to overview page.