Introduction: Division 2 Functional ISAC Brick (Air Quality Sensor Suite)

Hey all, this is my first Instructable so let me know how I did!


One of my hobbies is making props, but I like to try and take things a step further and try to make them as functionally equivalent to the source item as possible. Most of the time it's not really possible, but the ISAC Brick from Tom Clancy's Division 2 caught my eye. It's something that all the agents wear and it functions as a combination of a communication device and a sensor suite, which is definitely within the realm of possibility.

The first step was to try and figure out what the real life version would do, and for that I took a quick look through the sensors available on Sparkfun and Adafruit to see what I could come up with. In the end I settled on a particulate matter (pollution/air quality), TVOC(Harmful gasses)/CO2, Temperature/Humidity/Pressure, and UV sensor, as all of them were fairly small and provide useful information that we wouldn't normally have access to.

As a heads-up

This isn't an easy project, and I wrote the Instructable assuming that the reader has a good understanding of electronics work, coding, and 3D printing. If you're not sure that you have the skills to make this project but really want to, try finding a local makerspace and getting help there.


This device isn't meant to be a scientific instrument or life-saving device, so do not use it as such.

Use your common sense while making and using this, check the data sheets, and read any warnings or instructions that come with the parts.

Step 1: Materials

Try to follow the part list as close as possible, since I designed the case around these exact parts. Quick disclaimer, I'm not endorsed by anyone, I just happen to like Adafruit's selection of parts.



  • Soldering iron, ideally with a fine tip
  • Solder
  • Wire stripper/cutter
  • Multimeter
  • Helping hands
  • Heat shrink and a lighter/heat gun
  • Hot glue gun
  • Superglue
  • Cardboard
  • Double-sided sticky tape
  • Hobby Knife

Step 2: 3D Printing and Physical Assembly

3D Printing

All of the STLs necessary for this project can be downloaded from my Thingiverse page here.

Parts should be printed at .3mm layer height with 40% infill and no supports. If that sounds like a lot of material, that's because it is. Not only do we want the part to be tough, but by making the infill dense we make sure the holes for the threaded inserts are well supported. (I've had issues where screw holes would tear out if the infill pattern wasn't dense enough) We print with no support material because there are channels cut through the part for airflow that aren't possible to clean support material out of by hand.

Try to print the files in the same orientation as in the images, they are setup this way to try and get the best surface finish without compromising part strength.

Physical Assembly

Use the soldering iron to insert the threaded inserts into the 3D printed parts in the spots marked in the images. Line up the inserts with the appropriate holes in the part, heat up the soldering iron and place the tip of the soldering iron in the insert. I found that the best way to get a solid joint was to let the weight of the soldering iron push the insert into the plastic part, as this way we know the insert is hot enough to fully melt the plastic. Make sure that the top of the insert is flush with the surface of the plastic part, and you're done. The threaded inserts will retain heat a lot longer than you might expect, so be careful when handling the part after installing them.

Step 3: Fake Antenna

Fake Antenna

The ISAC Brick has a flat strip antenna that we are going to replicate using a strip of paper and plasti-dip. Make a few strips of paper about 25mm wide by about 70cm long. If you're making the strips out of a few smaller strips of paper, use glue to attach them as plasti-dip won't stick to tape, and any small surface imperfections will show.

Plasti-dip is amazing stuff, but the fumes are strong and pretty bad for you. Read and follow the instructions and warnings on the can before using it.

Hang the paper strips from something so that they can dry without touching anything, and cover the floor below them with newspaper or scrap cardboard to catch drips. Open the plasti-dip and slowly feed the strip of paper into the goo, and then slowly remove it and let it dry. It's ok if the top of the paper strip doesn't get coated, we are going to cut it down to size later. You will need multiple coats of plasti-dip, wait at least half an hour (or whatever the instructions say) before applying a second coat. Once the "antenna" is as thick as you want it, let it dry overnight to try and get rid of as much smell as possible.

Step 4: Electrical Schematic

This is the rough schematic for the electronics. Check the annotations in the image for more information.

A couple of specifics:

  • The power switch should disconnect the battery from everything. This will give it better shelf life when charged, as well as allowing us to hard power cycle the device if necessary.
  • Everything is shown as connecting directly to the Feather, but in reality we will solder everything to the shield. This is because the shield has 2 solder points for each electrical connection, so we can use one for headers to connect to the Feather and the other to connect to external devices (i2c sensors, buttons, etc.)
  • You can skip the PMS5003 enable wire but you have to use the 5V converter enable wire. The Feather can only charge at 100mA, so we need to turn off as much as possible when charging. When entering charge mode, the code will disable the 5V converter and turn the Neopixels off (2 will remain dim red so we know it's on) to help the battery charge as fast as possible.

Step 5: Antenna Mount Assembly

  1. Glue two of the buttons together with superglue in the same orientation as shown in the first picture.
  2. Use a black wire to connect one side of the switches together, this wire will connect to common ground. Solder one wire per switch to the other side of the switches, these will connect to pins on the Feather.
  3. The power switch is an SPDT switch, snip one of the wires to turn it into an SPST switch. Common should be the wire in the center, but it's worth double checking with a multimeter just in case. Thread the remaining two wires through the small hole in the deeper of the two cavities in the 3d printed antenna mount part. Glue the switch in the shallower of the two cavities.
  4. Take the antenna mount 3D printed part and try fitting the two buttons into the deeper of the two cavities. Chances are they will slide in way too far, so take some cardboard and use it to reduce the depth of that cavity. Once the top of the buttons are sitting flush with the part, feed the wires through the small hole in the side of the cavity and glue everything in place.
  5. Wrap the fake antenna from an earlier step as shown in the 4th image. Carefully mark where the antenna lines up with the bottom screw hole in the antenna mount part and then cut small holes there with a hobby knife. Take an M3x30 screw, 2 washers, and a locknut, and screw the antenna into place. Wrap a velcro cable tie around the loose end of the fake antenna and trim the excess material so it matches the picture.
  6. Thread the wires through the small hole in the main piece and then use 2 M3x20 screws to fasten it in place.

Step 6: Stressful Soldering

Getting 3.3V from the Audio Shield

The audio shield doesn't have a good soldering point for a 3.3V connection, so we're going to fake one. Take a thin wire (I used a single wire from the ribbon cable) and solder one end to the top of the header pin shown in the first image, and then feed the wire through the hole in the PCB. This is to try and make a stronger mechanical connection as well as to align the 3.3v wire with the ones we will solder on in the future. Make sure that the coating on the wire is undamaged so the metal wire doesn't touch the metal edges of the hole we are feeding it through.

Getting the Battery Voltage

The Feather's Audio Shield uses the same physical pin as the battery monitor, so we will need to disconnect the battery monitoring hardware from the physical pin on the micro-controller and then reconnect it to a different pin. Using the tip of a hobby knife, make a small cut in the location shown in the pictures. PAY ATTENTION TO WHICH FEATHER YOU ARE USING AND FOLLOW THE APPROPRIATE IMAGES. This will disconnect the battery sensing hardware from the pin. Then, solder a wire onto the resistors, route the wire, and solder it onto the end of the header pin as shown in the images. This will connect the battery sensing hardware to the analog pin of our choosing, in this case A0. Use a multimeter to test that everything is connected (and disconnected) properly before powering the board.

Step 7: Easy Soldering and Assembly

Place all the parts into the case as shown in the first image and measure and cut your ribbon cables appropriately. The location of the SGP30 and BME280 are especially important as they are in the path of the air being circulated by the PMS5003's fan, so they never get readings from "stale" air.

Follow the schematic in the second image. When you solder to any PCBs with components on them, make sure you have the wires coming out of the PCB on the top as shown in the third image except for the Audio Shield and the VEML6075. Solder the wires facing the other direction for these two boards. Cut small chunks of perfboard to help with wire management as necessary. Use hot glue to attach the PCBs to the sides of the case when you're ready to install all the parts. Don't glue the Feather down, as we'll need to get access to it to get the SD card out.

Make sure to leave some extra wire for all the components that are going to be attached to the top piece of the case. (Neopixels, VEML6075, and USB cable)

Take the 3D printed cover piece and glue the Neopixels and VEML6075 into it. The orientation of the Neopixel ring does matter, but if it isn't oriented properly you can fix it in code later, it'll just be annoying to do so. The VEML6075 should be glued into place so that the physical UV sensor lines up with the small clear window in the cover piece. You will want to do this near a window or other source of UV light to test alignment before gluing the VEML6075 in place, just run a demo sketch to read out the UV Value from the VEML6075. Thread the USB cable through the hole in the bottom of the cover piece and screw it into place, then plug it into the Feather. Screw the cover piece into place and we're done with assembly.

Step 8: Attaching the Mounting Plate

The mounting plate was designed to fit standard M.O.L.L.E. compatible webbing so it could be attached to any "tactical" backpack, but it should be easy enough to use this plate to attach the ISAC Brick to whatever you want. Experiment with the 1" Nylon straps and the mounting plate to see what works for your backpack.

Thread 6 M3x14 screws through the holes in the mounting plate and tighten a lock nut on each screw as shown in the image. The screw should be able to rotate but not wiggle in place. When screwing the mounting plate onto the ISAC Brick, make sure to continually change which screw you are tightening so the mounting plate doesn't bend too much while attaching it.

Step 9: Programming

Because we are using an Arduino compatible board not natively supported by the IDE, we'll need to add support for the Feather boards to the Arduino IDE. Follow Adafruit's tutorial to add their boards to the board manager and install the necessary board files.

You will also need to install the following libraries:

  • Adafruit's nRF51 BLE Library (if you're using the bluetooth board)
  • Adafruit's Neopixel Library
  • Adafruit's VS1053 Music Maker library
  • Adafruit Unified Sensor Library
  • Adafruit SGP30 Sensor Library
  • Adafruit BME280 Sensor Library
  • Adafruit BusIO Library
    • This is for the VEML6075, since when I wrote the code the VEML6075 library didn't work on the ATSAMD21 chipset

Code for this project can be found on my github for both the bluetooth and non-bluetooth versions. Download it, open it in the Arduino IDE, and upload it. Make sure when you open it that you get all 5 files opened in tabs across the top, otherwise it won't compile.

You'll also need to add two folders to your SD Card, one named Voice and one named Data. Put all of the audio files from my github into the Voice folder. The Data folder should be empty, this is where the code will write the SGP30 calibration values and the sensor log data if you turn on logging. Don't delete or edit the calibration file or the SGP30 will not work properly.

Step 10: Using Your New ISAC Brick

In it's default state, the ISAC Brick will alert you to elevated levels of "contamination", "chemical signature", and "carbon dioxide", which are high levels of particulates, high levels of VOCs, and high levels of CO2, respectively. Change the warning thresholds in the code as you deem necessary. The SGP30 can be a little bit unreliable while it warms up, but you can make the SGP30 slightly more reliable by running a 12 hour "burn-in", which the code automatically does when in charge mode. Just make sure to exit charge mode fully before turning off the device to ensure the calibration results are saved. The Feather can only charge the battery at 100mAh, so charging may take a long time, especially since some things are connected directly to the battery.

The two buttons hidden under the antenna are how we control the ISAC Brick. Each button responds to a short press, a medium press, and a long press.

For the bottom button:

  • Short - toggle "Curtailed" mode, turns off Neopixels and audio
  • Medium - read out any alerts that are currently active
  • Long - show/hide the charge level on the Neopixels - note that this won't update, and shouldn't be left active while charging as the increased current draw from the LEDs will significantly slow the process.

For the top button:

  • Short - enter charging mode, turns off most of the Neopixels and disables the 5V converter to lower the power draw and increase charging speed
  • Medium - start or stop logging data to the SD card
  • Long - unused

If you went with the bluetooth variant, pressing both buttons at the same time for a long press will make the ISAC Brick allow incoming bluetooth connection requests for 10 seconds, otherwise you won't be able to connect to it.

Using Bluetooth

As of right now there is a companion app for Android for the ISAC Brick in the works, and I will update the Instructable with the link when the app is done (but it will probably be posted on my github if you want to watch that instead). The ISAC Brick may require a firmware update to use the app.

Right now you can get the TVOC, eCO2 and PM1.0, PM2.5, and PM10.0 data using any bluetooth terminal app on Android or iOS. The available commands are just a single character, and are:

  • o - send the data Once
  • c - start/stop sending the data Constantly (once per second)
  • h - force the bluetooth radio to use the Highest power it can
  • l - force the bluetooth radio to use the Lowest power it can

Data Logs

The logging function will save the data from every sensor into a .CSV file on the SD card that you can open in any data manipulation software of your choice. A new header will be generated each time you start logging so you'll be able to tell the different logging sessions apart.

That's about it, if you've got questions leave them in the comments and I'll see what I can do to help.

Good luck agents, I'll see you in DC!

Games Contest

Participated in the
Games Contest