Home made LED array to expose presensitized PCB blanks to UV light


Point-to-Point soldering is no fun. PCB is where it is at. As a hobby enthusiast, I enjoy designing and fabricating my own boards. My method of choice up to this point has been toner transfer. While I have had some successful boards, the toner transfer part stresses me out big time. I’ve tried irons and laminators. I’ve tried photo paper, magazine shiny paper, special purpose blue transfer paper, cooking parchment. All of them give me inconsistent results and generally stress me out.

My next hope is UV exposure and pre-sensitized boards. Laser printing a transparency seems stress free. If I have a reasonable way to expose the board to UV light, I’ll be in business.


There are so many amazing tutorials, guides, and testimonals for custom made PCB exposure rigs. Here are a select few that I’ve drawn inspiration from:


Some people use UV to bronze their bodies. I use it to make printed circuit boards. This is my UV LED Exposure rig. Drawn from the inspirational sites above and my own creativity.

Quickly overwhelmed by the amazing completed projects that I read about, I decided to phase the construction. The first phase is a simple UV LED matrix with no controller or enclosure. This lets me gain experience in the photo lithography world and get my own ideas for what the final creation will be. Future phases hopefully include:

closeup perspective view of LEDs arranged in rows and columns
  • Enclosure to ease operation and shield stray UV light
  • Controller to automatically turn off the lights and alert me that its done
  • Option for double sided exposure

Phase 1 - UV LED Matrix

The first step was to build a simple UV LED Matrix, loosely following the light panel steps from the first Instructable link above. I replaced the Veroboard with a custom PCB designed in Fritzing.

Very simple circuit of 12V input, a single resistor, and 3 LEDs connected in series to GND. Repeated 28 times, resulting in 28 resistors and 84 LEDs. When designing the PCB in software, I manually enlarged all traces and left wide clearances, a decision I was thankful for.

after etching, before acetone wash

I had some recent success with toner transfer using parchment paper and a modified laminator. On small boards. This is a 9x6 inch gigantor. She doesn’t heat up very well, leaving toner a stone cold mess when attempting transfer with parchment paper and laminator or clothes iron. A third attempt with some 10 year old press-n-peel blue stuff and a clothes iron gave me enough of an outline to work with. I rolled up my sleeves, got a magic marker, and drew the entire circuit by hand. Let dry for 2 hours. Etch with some fresh H2O2/HCL and we’re good to go. Tons of copper to etch because I didn’t use a copper flood. I had enough trouble with toner that I didn’t want to add a massive plane to the mix.

After etching, before acetone to remove toner. You can see where I did not apply the magic marker, relying upon the Press-n-Peel that transfered via iron. Plus there are the remnant copper planes where I chickened out and removed from the etching bath before traces got cut. I figured it was better to have some residual laying around rather than undercut wanted copper and at 22 minutes of etching I pulled the plug. The traces were so wide to begin with, it would not have caused any issue to stay in the bath a few minutes more.

shattered LED housing

I am the strongest man alive!!! The drilled holes for this LED were the slightest bit wider than the physical dimension of the wires coming out of the LED case. As I pinched down to press it flush with the surface of the board, POW, she shattered right in my hand. Delicate treatment with a pin vice to widen the holes solved the problem. The broken LED is added to my trophy room of destruction.

Underside of the board after soldering and trimming the thru-hole leads. Nice view of the SMD resistors in 2512 package. I used those for:

  • fun
  • practice with SMD design and handling
  • compact vertical space
  • clean looking component side with LEDs only
  • reduced drilling
SMD resistors and clipped LED legs

I paid close attention to aligning the LEDs. They are wide angle enough (120-140 degrees) that they overlap nicely at even a close distance. My TLC was more for my own fun rather than function, but this whole exercise is for my own fun so that works just fine. Technique was to do each column of 7 LEDs at a time (repeat times 12 rows), solder one leg of each LED. Then stand the board up vertically and with left hand, hold the board while pressing one finger firmly on an LED, meantime right hand applies soldering iron to the lead. Using this method, the LED would snap right into the board and sit nice and flush. Once the column was done for a single lead, visually inspect to ensure good alignment and perform fine level corrections. Then solder other leads to finalize the process.

The way the board is laid out, I can test the results every 3 rows. Very happy robot maker when that first group of 21 LEDs light up like the 4th of July.

test exposure pattern

Phase 1 - Exposure Test

Once I had my LED Matrix complete, I was ready to play with a real live circuit. The first step is to select a distance between LED Matrix and presensitized PCB surface. To choose a distance, I simply added some standoffs and the longest 3MM screws I had and took a look. At that distance there were still some ever so slight visible “focal points” of light on the surface. Add a few more standoffs resulting in a 5cm distance between LEDs and target PCB, providing nice and even illumination, at least when inspected visually. Good enough to get started.

test pattern exposed to UV light

The idea behind the exposure test is to make a strip of PCB and expose each section of it for a different amount of time. This is achieved by laying an opaque barrier over the board, exposing only the first section to begin with. At set intervals, slide the opaque barrier to expose the next section (plus keeping the original section exposed, now for a second interval). Repeat this until the whole board is exposed. Once you complete this, you develop the board and see which photoresist pattern came out the best. Follow up with etching the copper to really get the results at an electronic level. The section that works best becomes your desired exposure time for real boards.

Here is the circuit I used. There are timing intervals along the bottom with solid blocks of resist/copper and the text of how much exposure time. I had no idea what to expect so I just went with 10 minutes total, broken into 20 segments of 30 seconds each. The top part is a nonsense short-circuit extravaganza with a surface mount IC, a header, and some narrow traces run close and parallel. It was designed with Robot Room Copper Connection (sadly does not exist anymore).

test pattern after developing before etching

She is in action during one of the early exposure increments. You can see the block of wood sitting on top of some thick black card stock forming the moving opaque barrier. Every 30 seconds I would slide it along the glass to expose an additional section of board. It was kind of like watching water boil or paint dry, I was very excited to get to the end and see the results. Patience, patience, 10 minutes is not really that long, is it?

Time is up, turn off the UV, remove the glass and transparency, throw the board into the developer. The instructions said to expect 1-2 minutes, I had nearly instant results. By the time I could grab a sponge brush to wipe the board inside the developer solution, the resist had mostly already dissolved. I kept it in there about 20 seconds just to be sure, but was concerned I might over do it and destroy the good resist and invalidate my test. After I washed it off in water, I turned on the lights and didn’t know if that would kill the remaining resist by exposing to more light. I quickly snapped a picture, getting some nice shadows of my hand in the process.

copper clad board taking a bath in some acid

Initial inspection seems as though the 1:30-2:30 sections look the best. Anything shorter looks like there’s plenty of unwanted resist still on there, and anything much further out looks like traces that I wanted to keep are overexposed and gone after developing. Let’s etch to see what the electronic results are…

Here she is sitting in some HCL/H2O2 (which is actually mostly CuCl2 right now, if my chemistry is right). This is the same solution I used the day before to etch the LED Matrix, which means it ate quite a bit of copper. Today with the test exposure board, 20 minutes yielded essentially zero etching. Pour a small batch of fresh echant and a few minutes the board was done.

Since then, I read up on HCL/H2O2 and see that I probably need an aerator to get some oxygen in there or a small amount of hydrogen peroxide to get the reaction moving again. Ah well, always something new to learn, but for now, it is time to examine the final board…

Visually, the results of the developer examination are confirmed, the 1:30-2:30 look the best. Electrical continuity test with multimeter reveals some issues out in the 2:30 range, but perfect results in 1:30 and 2:00. Future exposure time will be 1:45.

examining the test pattern after etching

Two early findings from this test:

  1. Pits in the solid copper region, even in the optimal 1:30-2:00 zones. Others suggest making two transparencies and carefully align them. This elimiates/reduces poor print quality from my laser printer.

  2. Cutting the PCB. The bottom edge in the picture is attrocious. I was nervous about exposing the board to light once I pulled it from the bag. Working in the dark, I manually held a block of wood in place as a straight edge and used a utility knife to score the board. I’m surprised I didn’t remove a finger in the process, and the cut edge is awful. I’ve since discovered that you don’t really need darkroom conditions until you remove the peel-off backing, so cutting the board can be done in well lit conditions with no rush on time. My future robots thank me for learning (and remembering) this.

All in all, this test was a big win. Lots of mistakes and learning along the way. Despite those hicups, the resultant exposure time of 1:45 has great potential if I can get this level of quality, fine traces, close spacing on my very first board. A real treat when considering the toner transfer methods of the past.

Procedure for Exposing and Developing

These are the steps I use given my current (Phase 1 as of this writing) rig, materials, and supplies. Many steps can be reduced or eliminated with a nice quality enclosure and controller, but I’m taking baby steps here.

  1. Finalize circuit in CAD software, perform final inspection of all traces and parts

  2. Print to transparency

    1. Print excel template for header information
      Make sure it is oriented such that toner side goes to the board.

    2. Print copper.
      For bottom layer copper (which is the default for single side boards) use POSITIVE MIRROR
      (in Copper Connection, this is the Transfer setting, not the Photo Expose setting)
      This is because you flip the transparency to keep the toner against the copper board

  3. Print 2nd copy of transparency. Cut one to smaller size, align them, and tape together.

  4. Cut the board to size

  5. File/smooth edges

  6. Clean glass surface with windex, both sides

  7. Prepare bucket of cold water

  8. Prepare developer solution - 10 parts cold water : 1 part developer

  9. Prepare stopwatch

  10. Prepare power supply for UV lights

  11. Position transparency for easy access in next step - toner side facing down


  13. Peel protective layer

  14. Place PCB on work surface, presensitized side facing up.

  15. Position transparency (toner side down) over PCB.

  16. Place heavy glass on top

  17. Position UV array over PCB-transparency-glass assembly

  18. UV lights on

  19. Start timer

  20. Don’t get distracted, 1:45 is not thaaaat long to sit and wait

  21. Time’s up, UV lights off

  22. Remove glass

  23. Remove transparency

  24. Board into developer
    • Gently wipe with foam brush “until exposed resist is removed”
    • MG Chemicals tutorial says 1-2 minutes
    • Test experience shows 20 seconds works with fresh developer
  25. Flush board with water


  27. Etch a sketch


Transparencies for Laser printer

  • Amazon - School Smart Copier Transparency Film without Sensing Strip
  • 8 1/2 x 11 inches - Pack of 100 ($15.65)

Presensitized copper board

  • Search Amazon for “MG Chemicals 600” and get 2 small ones of 1/16 and
  • 2 small ones of 1/32 to see the difference
  • ($7.95 each for the 1/16, $8.95 for the 1/32) ($34.00)

Developing chemical

  • Amazon - MG Chemicals 418 ($10.95)


  • EBay - 100 x LED 5mm UV / Purple Ultra Bright Flat Top Wide Angle LEDs Light Lamp Car ($19.99)


  • The LEDs are rated 3.0-3.4V.
  • 12V in, 3x3.0= 9.0V leaving 3.0V for the resistor. 20mA needs 150R
  • 12V in, 3x3.4=10.2V leaving 1.8V for the resistor. 20mA needs 90R
  • If you use a 90R and get a batch of 3@3.0, the current will be 33mA

  • Lets call it an average batch, so calcs are based on a 3.2V LED. Resistor eats 2.4V / 20mA = 120R
  • 0.048 watts for the resistor,
  • 0.064 watts for each LED (0.192 total for all 3)
  • Full circuit = 0.240 watts for the full 3 LEDs and 1 resistor.

  • So, need 28 (some day 56) 120R 1/10 or 1/4 watt resistors.
  • Digikey has 1 watt surface mount SMD in a 2512 body for $0.13 each (A102499CT-ND)
  • about $9 for 70 of them.

12V Power Supply

  • There are 28 groups of 3 LEDs on the panel, giving 84 LEDs (arranged 7x12 grid)

  • Power:
  • Each 3 LED segment is .24 watts.
  • Total power is 6.72 watts for 1 panel, 13.44 watts for 2 panels (some day)

  • Current:
  • Each 3 LED segment pulls 20mA.
  • Total current is 560mA for 1 panel, 1.12A for 2 panels

  • Amazon has a 12V 5A power supply by Intocircuit with a inner diameter 2.5mm
  • and outer diameter 5.5mm connector. ($7.91)
  • Digikey has a connector ( CP-6-ND) for ($2.58)

Prototype board for LEDs/Resistors

  • Amazon - MG Chemicals 500 - 9x6 1/16 board ($8.65)

Terminal block or some other header/connector for incoming juice

  • Amazon - 30Pcs 2 Pole 5mm Pitch PCB Mount Screw Terminal Block 8A 250V ($6.15 for 30)

Piece of glass

  • Go to Lowes or Humpey Doe and pick something out, roughly sheet of paper sized.

Small Cardboard box - bigger than the prototype board, but small enough to be covered by… Large cardboard box - big enough to go over the whole she-bang, forming the poor man’s enclosure

Technically, you’ll need etching supplies, but you already have them:

  • Muriatic Acid (HCL)
  • Hydrogen Peroxide (H2O2)


Laser Beam Timer was a really fun project. Shortly after finishing Crabby construction, I needed a way to measure the results of line following algorithm changes. Sitting there with a stopwatch and “paying attention” is for the birds. Instead, I designed and built a custom laser beam timing system.

The major pieces of this project are a laser and CdS photoresistor in a block of wood, a small mirror to reflect the laser back into the CdS, an Adafruit Trinket Arduino compatible controller, and an LCD. Due to low number of i/o pins on the controller, a basic analog comparator is used to monitor the battery level, and a face plate / pseudo enclosure was crafted from leftover plywood that was used for Crabby’s body.

Follow along my journey through two prototypes and a final production model that is in service as we speak, timing my robot around my floor tape course…

prototype arduino and breadboard

Prototype A

When first starting a project, I’m often frustrated by how feeble all the parts are. Sure, in the final production model, everything will be nice and squared away, but those first few components are just stuck together by pressure fit wires in a breadboard. Sneeze while holding it and it comes apart.

My LCD and Arduino kept separating and intermittently failing during early development, so I looked around the room and grabbed the first thing that came to mind: cardboard and zip ties! Worked amazing as a makeshift prototype board.

closeup of LCD display

At this stage of the project, I was using a 16x2 LCD with a many pin Hitachi interface. I was able to cram 3 different times, a lap count, a laser illumination ADC value, and a mode indicator into those 32 characters.

This version of prototype uses the classic Arduino UNO development board. Very handy for getting things up and running quickly, prove the basic concepts, and plan for bigger and better things to come.

The hardest thing to make work was soldering a wire to the casing of the laser pointer. The whole metal case serves as the positive connector, and it is a giant heat sink for my little 40w soldering iron.

Laser and Mirror Assembly

laser and mirror as seen from above
detail view of emitter/receiver block
small dental mirror reflecting laser

The switching part of the timing system is a very basic one. A source of illumination (laser pointer) normally shines on a CdS photoresistor. The photocell is arranged as a voltage divider in series with a fixed resistor, and the controller reads the brightness level. When something blocks the laser, such as a passing line following robot, the photoresistor goes dark and the controller can sense the change.

My very first iteration had the CdS wired and positioned right next to the controller. Long wires were then fed under the line following tiles (or under the tape on the carpet) to power the laser sitting in the middle of the robot course, aimed directly at the photocell. Kludgey, at best.

Rummage through the junk pile and find a little dental mirror on a telescoping stick. Rip that off the stick and mount it on a scrap piece of wood using some 14-gague copper wire. Reposition the CdS and Laser into the same block and aimed parallel to one another.

Now you can see the arrangement of the laser and photocell sitting right next to eachother snug in their 2x4 housing, and the reflector sits in the middle of the robot course, no awkward wires to deal with. The way the mirror is mounted, it can be positioned for fine tuning the aim and ensuring the CdS is fully illuminated when no obstruction is present. In the middle picture, you can see the laser emitter in the large/central hole, and the well-illuminated hidey hole for the sensor, bright red because the mirror is reflecting directly into the hole.

The deep hole and recessed mounting position does an excellent job of shielding it from ambient light. In the normal lighting conditions in a few rooms in my house I routinely get ADC readings below 20. When the laser hits the eye directly, values of 800 and above are normal. Given that, I built a threshold of 500 into the software.

Prototype B

cleaner prototype sitting on desk

With the concept successfully proven, it was time to move on to plan Prototype B. The first round was on the Arduino UNO “proper”. This next iteration of development needed to verify the following pieces that were destined for the production model:

  • Adafruit Trinket 5v controller - Fewer i/o lines and some other limitations when compared to the UNO (on the plus side, way smaller and less costly).

  • I2C 20x4 LCD - The A model used the Hitachi interface which requires too many pins, so this guy will use I2C and only 2 pins. Plus more character rows and columns.

  • Battery Power - Production is going to run off of a LiPo battery, so time to test it out in Proto B.

  • Battery Monitor - All out of i/o pins on the microcontroller, but I still want to protect my battery from death by low voltage. Enter a spare LM393 analog comparator, left over from a 10 year old Sandwich.


Getting the LiquidCrystal_I2C and TinyWire libraries to compile was a “treat”, but a little elbow grease and a handful of #ifdef directives and she compiled. And came in at 110% of available program memory! The Arduino UNO has 32K flash, but my little Trinket has only 8K. Inspecting the program, I was frivolous with my use of sprintf to zero-pad minutes, seconds, and hundredths of seconds. Replaced it with an ugly but compact series of if statements to manually pad out the values. Removing sprintf() bought me ~3K just by itself, and I now have memory to spare, in case I think of some new features.

On to the Production Model

silkscreen of component side of PCB

With all of the production components tested during Prototype B, it was time to get serious.

I designed the PCB using Robot Room Copper Connection (sadly does not exist anymore). With some experience using CC for Crabby and my UV exposure unit Bronzer, this was golden. A relatively simple circuit, however some notable things about this board:

  • Mounting Holes - The production model will have the LCD mounted directly above the PCB using standoffs. The LCD has pre-existing holes manufactured into it, so I took some care to line up mounting holes on the PCB to match.

  • Reset Button - The Adafruit Trinket requires a manual reset to enter programming mode. She has a built-in reset button, however in my final configuration it would be difficult to press with my oversized fingers. Instead, I added my own reset button and soldered it to the bottom side, where it would be more easy to reach once installed in the assembled unit. The way the little tactile spider buttons are, very easy to do a layout with it on the top layer, but then swap it during soldering time.

pcb, battery, and LCD with no enclosure
  • Reserved Space - To keep things compact in the final unit, I needed to allow for the I2C breakout board that is on the bottom of the LCD unit. The big rectangle area in the upper left ensured I did not put any bulky components where they would obstruct and thereby require larger standoffs and a taller final assembly.

  • Lots o’ Connectors - Such a small project, and yet 7 connectors were used. I wanted the final face plate to be removable for whatever reason (inspection, repairs, showing off to spectators, etc), so all the peripherals like LEDs, buttons and switches all use headers/connectors. Overkill, but I’m happy with how it worked out.

  • Large Traces and Pads - Breaking from my tradition of trying to make traces and pads as small as possible, I went big this time. Manually enlarged all pads and traces, used a large clearance for the copper pour. This allowed the etching and drilling process to be very relaxed. Soldering onto large pads was splendid.


masked and cut front panel before adding components

The PCB is designed, printed on transparency, UV exposed, developed, etched, cleaned, silkscreened, drilled, populated, soldered, and tested. Life is good, if only I could hold all these peripheral components together. Rather than a traditional enclosure, I went with a faceplate, some standoffs and a baseplate.

The faceplate was one of the more technically challenging parts (for me). I used some leftover plywood from Crabby’s body.

  • Coated it in masking tape so I could write all over it without fear of marring the final product.

  • Started with the LCD rectangle. A t-square and ruler got me the basic shape. A drill and a coping saw removed the rough interior. A file and a dremel finished things off.

masked panel test fitting the LCD
  • Totally messed up the measurement for the push button and drilled a giant hole for it. Oops. Quick thinking, the power and laser switches can make use of a hole that large, so I rearranged things and was back in business. Saved me from nibbling a rectangle for the switches, which I was not looking forward to.

Side view shows some beautiful (IMO) use of heat shrink. I only melted one fingernail while heating those. One day I’ll learn to use a tool to hold the target of focused heat.

In the bottom picture, you can see the main UI components:

  • Laser Lock Indicator - Green LED lights up green when ADC reads >500, meaning laser is hitting the CdS.

  • Low Battery Indicator - Red LED lights up red when battery drops below 6.7v. My LiPo battery has high capacity, so it’ll be a while before I can test this with real values. And by “test” I mean “encounter for the first time in the production model”. I did test it with some dummy resistor values that measure close to full charge, but didn’t have a battery discharged enough to test the 6.7v cutoff. When I flip the power switch off, the comparator chip enables the LED for a brief moment (likely due to switch causing perceived battery voltage to instantly hit zero, while the 5v reference on the Trinket has some capacitors so it lags in its drop to zero) so I know it is wired correctly.

side view of the open edges of the enclosure
  • Power Switch - A DPST switch (well, technically DPDT, but I’m only using one of the “throws”) between the battery and the rest. Allows me to completely disconnect the battery for charging without physically removing it from the enclosure.

  • Laser Switch - SPST switch, not really necessary, but she’s a power switch for the laser. I figured that would be good Range Safety Officer feature to include, allowing the laser to be enabled only when safely aimed away from human and k9 eyes.

  • Mode Button - Momentary pushbutton (debounced in software) to arm the system after manual laser alignment is complete, and to reset the timers in between trials or robots or when one of the dogs steps in the beam and invalidates the current test :-) not that that ever happens.

On the LCD you can see:

front view of the user interface panel
  • AVG - Average time for the recorded laps.
  • LAP - Time for the most recent completed lap.
  • RUN - Running time for current lap. You can see some blurriness in the hundredths, its updating on the fly.
  • LAPS - count of how many laps since reset.
  • LASER - the ADC reading on the photocell voltage divider. Anything over 500 is considered “unobstructed”, and less than 500 means a robot is passing by.
  • X - The lower right is a mode indicator. In the pic it reads “X” for executing. Other values are “I” for Idle or “A” for Armed.

There’s an empty void in the upper right of the LCD, I really need to put a funny or a smiley (or are the kids calling those emojies now?) or something there. Maybe I can fit “San Dimas High School Football Rules!”?