UV irradiation system for enhanced photo-activation in living cells
To make the experience fit your profile, pick a username and tell us what interests you.
We found and based on your interests.
uven2-mk3_v177.pdfAdobe Portable Document Format - 3.13 MB - 11/30/2025 at 15:56 |
|
|
chamber_front.stepstep - 42.08 kB - 11/30/2025 at 15:56 |
|
|
exhaust_shield.stepstep - 3.57 MB - 11/02/2025 at 17:28 |
|
|
display_mount_bottom.stepstep - 1.22 MB - 11/02/2025 at 17:28 |
|
|
left_lower.stepstep - 84.76 kB - 11/02/2025 at 17:28 |
|
|
I forgot to order the front lid, so I machined it in my workshop








































Heat sink holes and threading:
All parts arrived and it was time to test.
All boards had mistakes :( . But all could be fixed on the PCBs.
After the initial light test, I assembled one SBT-10X LED to the copper core PCB. It turned out, I had wired the driver edge connector incorrectly. Luckily the LED footprint is symmetric, so I could simply assemble the LED 180 deg rotated. I burned only two LEDs until I realized the mistake.
The driver PCB had another mistake that was more subtle and took a while to figure out. The mistake was to drive the CTRL pin of the led driver IC using 12V. That pin has a max voltage of 3.3V and driving it with higher voltage can damage the IC. So I removed the mosfet and pulled the CTRL pin low.
There are two mistakes on the main-board. They are both very dumb, but luckily could be fixed on the main board PCB.
The first mistake was to wire the EPAD pin of the 12V->5V and 12->3.3V DCDC converters to GND. For the fixed voltage version I assembled, this pin needs to be floating and serves as thermal heat sink. I simply cut the pins and added an external heat sink.
The second mistake was not having checked the datasheet of the heat sink fans. Turns out they draw 4A@12V, which immediately annihilated the MOSFET I had planned for them.
All mistakes are fixed in the latest version on github.
I fixed all drivers and tested all channels of each driver.
Next I assembled the full LED panel (with the LEDs rotated 180deg)
For testing the full panel I needed to assemble the rest of the lamp.
We decided it was a good idea to make the chamber front loadable as well. With all the final mechanical details the lamp is ready for order:
With the main PCBs ready it was time to finalize the mechanical design. The following pictures show renderings of the front and the back of the lamp:
And here is a size comparison with the previous version mk2:
For the 25x driver PCB I decided to control all drivers simultaneously using the CTRL pin of the AL8843. By default all drivers should be off, even if no MCU is actively controlling the board.
To achieve this I'm using an N-MOSFET that is default conducting, pulling all CTRL pins low. If the MCU is connected, it can drive the CTRL_IN pin accordingly. Because the MCU will run at 3.3V, I use a voltage divider to set the gate voltage to 3.3V default.
The finished driver looks like this:
Top:
Inner1:
Inner2:
Bottom:
The default track width is 0.5mm. With 2oz copper for inner and outer copper layers, this should be enough for conducting the LED currents safely.
For each LED panel with 100 LEDs we plug 2 of these 25x driver boards on either side of the panel. The full lamp is starting to take form:
Next I designed the LED panel. We chose 100x LEDs for this version. The spacing is as uniform as possible. Unfortunately EasyEDA doesn't seem to have any way of positioning components in a programmatic way, so for this PCB I'm using KiCAD again. KiCAD has a python scripting console and I used the following script to place all the components automatically.
import math
import pcbnew
board = pcbnew.GetBoard()
# Ring configuration
rings = {
0: 1,
1: 8,
2: 14,
3: 20,
4: 26,
5: 31
}
ring_spacing_mm = 12
cap_spacing_mm_1 = 3.5
cap_spacing_mm_2 = 2.6
center_x_mm = 100
center_y_mm = 111
ref_offset_mm = 1.5 # tangential offset
def mm_to_nm(val):
return int(val * 1_000_000)
center = pcbnew.VECTOR2I(mm_to_nm(center_x_mm), mm_to_nm(center_y_mm))
ref_counter = 1
for ring_index, led_count in rings.items():
radius_mm = ring_index * ring_spacing_mm
for i in range(led_count):
angle_rad = -2 * math.pi * i / led_count
angle_deg = -math.degrees(angle_rad)
dx = math.cos(angle_rad)
dy = math.sin(angle_rad)
tangent_dx = -dy
tangent_dy = dx
# LED
led_ref = f"D{ref_counter}"
r_led = radius_mm
led_pos = pcbnew.VECTOR2I(
center.x + mm_to_nm(r_led * dx),
center.y + mm_to_nm(r_led * dy)
)
led_fp = board.FindFootprintByReference(led_ref)
if led_fp:
led_fp.SetPosition(led_pos)
led_fp.SetOrientationDegrees(angle_deg - 90)
c1_txt = c1_fp.Reference()
c1_txt.SetVisible(True)
c1_txt.SetTextAngleDegrees(0)
c1_txt.SetPosition(pcbnew.VECTOR2I(
c1_pos.x + mm_to_nm(0),
c1_pos.y + mm_to_nm(0)
))
# Capacitor 1
c1_ref = f"C{2 * (ref_counter - 1) + 1}"
r_c1 = r_led + cap_spacing_mm_1
c1_pos = pcbnew.VECTOR2I(
center.x + mm_to_nm(r_c1 * dx),
center.y + mm_to_nm(r_c1 * dy)
)
c1_fp = board.FindFootprintByReference(c1_ref)
if c1_fp:
c1_fp.SetPosition(c1_pos)
c1_fp.SetOrientationDegrees(angle_deg + 90)
c1_txt = c1_fp.Reference()
c1_txt.SetVisible(True)
c1_txt.SetTextAngleDegrees(0)
c1_txt.SetPosition(pcbnew.VECTOR2I(
c1_pos.x + mm_to_nm(0),
c1_pos.y + mm_to_nm(0)
))
# Capacitor 2
c2_ref = f"C{2 * (ref_counter - 1) + 2}"
r_c2 = r_c1 + cap_spacing_mm_2
c2_pos = pcbnew.VECTOR2I(
center.x + mm_to_nm(r_c2 * dx),
center.y + mm_to_nm(r_c2 * dy)
)
c2_fp = board.FindFootprintByReference(c2_ref)
if c2_fp:
c2_fp.SetPosition(c2_pos)
c2_fp.SetOrientationDegrees(angle_deg + 90)
c2_txt = c2_fp.Reference()
c2_txt.SetVisible(True)
c2_txt.SetTextAngleDegrees(0)
c2_txt.SetPosition(pcbnew.VECTOR2I(
c2_pos.x + mm_to_nm(0),
c2_pos.y + mm_to_nm(0)
))
ref_counter += 1
pcbnew.Refresh()
board.Save(board.GetFileName())
print("✅ Components and reference labels updated with tangential offsets.")
Routing was a bit tricky, because for a copper base board you can only route on the top of the board. I included 4 NTC thermistors as well, so we can get feedback on the LED temperature.
The LED driver boards will be connected on either side of the LED panel using the 2.54mm pin headers.
Driving the SBT-10X LED with maximum power requires a constant current driver that can deliver 2A.
We build a constant current driver around the LM3409 high power led driver.
Nothing but trouble with this version. I couldn't get it to work. The LM3409 just wouldn't drive the pgate.
No idea what's the problem, anyone?
Dropping this idea for now. We found a much simpler and cheaper IC that hopefully does the job, AL8843.
I'm sticking close to the eval board layout, so hopefully no bad surprises this time.
PCBs arrived:
In addition to the driver boards, I ordered an LED copper base PCB. It's a simple PCB with two caps close to the LED and a connector. The copper base will help dissipate excess heat. Since JLCPCB did not have this LED in stock, I assembled it using a PCB oven.
Using a 12V power supply the LED lights up.
I directly measured the current using a TLI4971 current sensor, it averages around 2.1A.
Probing the voltage across the LED, showed a nominal voltage of 3.68V and voltage spikes up to 6.68V. These spikes are very short 10-100MHz so hopefully wont damage the LED.
Using a UV power meter, the max emission directly measured on the LED was 8.57Watt/cm^2
Next I tested for endurance. I cooled the LED using an aluminum heat sink with fan and inspected with thermal camera.
While the LED is pretty hot on the top, the copper base PCB together with the heat sink seem to cool the LED sufficiently. But the driver got very hot. Specifically the current sense resistor. And I noticed I had made a mistake and assembled a 250mW rated resistor. Should be at least 1W..
For now I just added cooling to the drive aswell. In future designs this needs to be changed. Also probably a good idea to cool the drivers in the final lamp aswell.
I kept the setup running for over 12 hours now, without any signs of failure. I think we are good :)
One last check, I wanted to see how far away the cc-driver can be placed from the LED. The cable is approx. 70cm long which gives us plenty of room for placing the drivers.
Preliminary
Create an account to leave a comment. Already have an account? Log In.
Become a member to follow this project and never miss any updates
Voja Antonic
Mile
Mirko
Michael Gardi