Introduction: Reaction Training Dummy
As a request from an athlete friend to build cheap yet effective device to improve reaction training I came up with this!
The idea was to crate a set of LED devices that users have to deactivate by proximity sensing. Upon deactivation devices randomly activate each other (one at a time) by lighting up LED's. It's up to the user to deactivate LED's as fast as possible not knowing what device will light up next.
In this instructable I'll be showing how you can make your own set of reaction training dummies - from design process to sourcing parts, soldering and programming. Not only will you improve your reaction training but also your hardware and electronic knowledge!
Stick on and let's move forward!
Supplies
- 3D printer,
- Soldering equipment.
Step 1: Overview
The wireless, high-brightness LED lights are used as targets for the user to deactivate. Controlled independently and randomly.
The deactivation of the lights can be achieved through full contact or close proximity–waving, running past, swiping, etc. you may also deactivate the lights with different body parts such as your head, hands, feet, or exercise equipment.
They can be easily mounted to walls, poles, and other training equipment. Or, they can be strategically placed on the ground for specific training.
Now let's get technical!
We will go as noted.
- Device Requirements,
- PCB - Schematics and Layout,
- Ordering parts,
- Burning the bootloader,
- Soldering and assembly,
- Programming microcontroller,
- 3D printing,
- Final notes.
Step 2: Device Requirements
An overview over what components and tools were used in this build.
For User interface side we have
Reaction lights or simply LED's that have to be bright, easily visible in daylight and from all angles. Quick search shows that RED LED require the lowest voltage while still providing high CD (candela) values which is great for battery powered devices. Standard 5 mm TH LED's will be great as they are bright, cheap, easy to solder and it's optical dome nicely spread the light around the 3D printed ring. There will be 16 LED's with 4 in pair switched by a transistor and controlled with microcontroller.
We also need a way to detect a object in close proximity, detection has to be fast and reliable. Ultrasonic sensors are bulky and slow, while laser detection or TOF sensors like VL53l0X are small, expensive and hard to protect from dust. My choice is this popular tcrt5000 sensor, really fast, cheap, easy to use... To make sure we catch every movement I placed a pair on each side of PCB/device.
https://www.vishay.com/docs/83760/tcrt5000.pdf
Communication
A wireless connection between our devices is a must. For that I picked a NRF24L01+ SMD module, low cost, easy to use. It uses the 2.4 GHz band and it can operate with baud rates from 250 kbps up to 2 Mbps. If used in open space and with lower baud rate its range can reach up to 100 meters.
Here are some useful links that will give you better idea what NRF24l01+ is:
https://lastminuteengineers.com/nrf24l01-arduino-wireless-communication/
Power
For power requirements, our devices have to be battery powered, which means we have to implement the basics of BMS.
First in the list is battery, I picked a fairly standard 503450 3.7v 1000mAh LiPo cell that should give us 5-6 hours of continuous training.
Integrated charging and protection circuit are from TP4056 module - keeping this project cheap and reliable.
Boosting the circuit voltage is done by MT3608 and regulating the 3.3V for NRF24L01+ is done by simple LM1117S-3.3 LDO.
Processing
Devices of this kind have to be programmed, so for that reason we are utilizing a common microcontroller ATmega328 in TQFP-32 package.
Misc
0603 size resistors
0603 size capacitors
TH (trough-hole) side slide switch for powering the device
SMD led's (green, red) for charging info and one blue led for users to know device is powered.
Micro-B USB for charging
Step 3: PCB - Schematics and Layout
I will be using Autodesk Eagle to create a PCB,
First we start with schematics, importing part libraries, looking trough datasheets and determining the right and logical connections. After the circuit (schematics) I designed the PCB layout and generated the Gerber and Drill files.
Then upload a Zip or RAR file containing all the gerbers and drill files to JLCPCB and have the PCB fabricated for 2$ + shipping cost in any color (at the time of making this instructable).
Gerber_Athlete.zip contains GERBER files for manufacturer.
iO Athlete_rev1_eagle.zip contains Eagle .sch .brd files for assembly and component placement.
Step 4: Ordering Parts
In This spread sheet (Standard BOM document) all electronic parts for 4 devices are listed as well as tools for programming and burning the bootloader to ATmega 328/168/88 microcontroller.
BOM also includes
- Prices
- MOQ
- Links
- Parts info
Step 5: Burning the Bootloader
If you have a new ATmega328 (or ATmega168/88), you'll need to burn the bootloader onto it.
The microcontroller can't interpret Arduino instructions without initial code. It first needs a bootloader, which acts somewhat like the BIOS on your computer.
More info:
- https://www.arduino.cc/en/Tutorial/ArduinoToBreadboard
- https://www.electronoobs.com/eng_arduino_tut6.php
Bootloader has to be burned before soldering to iO Athlete PCB board!
Follow this tutorialand burn the microcontoller with this options.
Board: ATmega328
Bootlader: Yes
Clock: 16 MHz external
Compiler LTO: Disabled
Variant: 328P / 328PA
BOD: 1.8V
Once your ATmega328p has the Arduino bootloader on it, you can upload programs to it using the USB-to-serial convertor (FTDI chip) on an Arduino board.
Step 6: Soldering and Assembly
Once everything arrives, it's time to solder the components - start by looking at the PCB for potential manufacturing errors and check that you received every component!
If it's your first time soldering I definitely recommend checking some tutorials, soldering larger components first (LED's etc) will prepare you for smaller components.
Open eagle file, locate the component - see what the value is and solder it.
If you're experienced in soldering I recommend starting around power section first in this order
- Protection circuit
- Charging circuit
- Boosting circuit
- Regulating 3.3V
- ...
Repeat this process up to 5 times.
Step 7: Programming
When the bootloader is burned to the microcontroller, an FTDI converter can be used to upload the actual Arduino code.
To connect the FTDI, use female headers and connect as shown in the picture above
To upload the code first open the sketch for device one I've attached here. Connect an USB FTDI adapter to the serial programming points. Once again, these connections can either be pressed onto the PCB or connected by soldering the pins or female headers that have to be desoldered later.
I soldered male headers, and before mounting the casing shortened them 2-3 mm.
When uploading make sure you keep the same exact board settings used for burning the bootloader.
Repeat this process depending on your device quantity.
This code works only when every one of the devices is powered, placed maximum 1 m away one from another and in order from 1-2-3-4-5. At the start, device number 1 is available for deactivation.
Code can be significantly upgraded and here are few ideas
- Track time it takes to deactivate the devices,
- Optimize the working distance,
- Optimize the wireless network,
- ...
Attachments
Step 8: 3D Printing
I used the following settings in Cura for my prints:
- 3D Printer - CR10s PRO
- Material: PLA
- Layer Height - 0.2 mm
- Shell Thickness - 0.8 mm (Nozzle: 0.4 - 2 Shells)
- Top and Bottom Thickness - 0.8mm
- Fill Density - 100%
- Filament - 1.75mm
- Support Type - Everywhere
- Platform adhesion Type - Skirt
All STL files and STEP files can be found here.
- First you print the LED ring holder, try and fit it around LED's - NOTE: LED placement is not simetrical so don't use force. Rotate it, and it should easily slide in. Print it with white or transparent material to increase viewing angle. Transparent or milky white will diffuse the light and create a nice ring like effect.
- Print the bottom part,
- Print the top part,
- Mount bottom, top and LED part,
- Print top1 part, mount and glue to LED part,
- Print top2 part (in accent color - I used red), mount and glue to top1 part,
Pictures on thingieverse demonstrate how I positioned model before 3D printing.
Print the rest of models and clean the support.
Step 9: Final Notes
At this point, everything should work in order.
If you have any questions or uncertainties, leave it down in the comments below and I will clarify asap.
A special thanks to Ino for helping with photography and videography.

Judges Prize in the
Sensors Contest
1 Person Made This Project!
- Danny21 made it!
16 Comments
Question 5 weeks ago
Hey, I was wondering if there was a version I can use of the schematic to open it on proteus?
Question 2 years ago on Step 9
Hi, your project is great!
I have just a note, I noticed that in the .brd file the J2 connector is missing, while it is present in the Gerber files?
Is this because the programming can be done also through J1?
Thanks
Question 2 years ago
Hi I’m looking forward to do this project but I will like it to have a feature where you can delay the time between one light and the next one so that it can adapt to different training speeds. as I’m very recent to this kind of Projects I’m unaware of how problematic this may be, do you have any advice, I’m mainly concerned about the PCB as I’m afraid to include a potentiometer won’t be easy. Do you have any advice on how to do this ?
Question 3 years ago
How do you increase the operating range of the tcrt5000 sensor from 0.2 mm to 12 mm? In my experiments, the hand or foot or body should be very close. I want him to detect it from 10 cm.
3 years ago
Good job! It looks great! :D
Reply 3 years ago
Thanks Igor!
3 years ago
This is fun, and an even great instructable!
Reply 3 years ago
Thanks jagmeet_hanspal!
3 years ago
Love this!
However, you're hard-coding the idents in to the software though which means you've multiple builds and a limit on the number of nodes without reprogramming - which is a pain because you can't do it in-circuit.
Try this:
On start-up have the node (with a max ID) send a config message to node 0. If it's the first on to power-up then there will be silence back. If there's silence, then have this one set it's ID to zero and start listening out for config messages.
Node zero should respond MAX ID to power-on config messages with a message containing it's assigned ID - incrementing for each new node. At the same time it should send a message to all other configured nodes telling them of the new maximum number of nodes.
You'll have a little more complexity in sorting the messages but you should still be able to encode them in to a single byte (use high bits for message type and low bits for data) very quickly.
Reply 3 years ago
This! Thank you for sorting this out for me - a must code updated without a doubt.
I’m a bit rusty when it comes to software so I decided to upload this without a “proper” software update ..
I will definitely update it soon.
Question 3 years ago
Why are you programming the AtMega off-PCB, and do not include an ICSP connector (like you did for the serial connection)?
Answer 3 years ago
Yea, I don't have a simple answer. At the time I was building this PCB I also designed a smaller board with little to no space for connectors so I ignored it here ... Will definitely look to include it in upcoming designs, providing there is enough board space :).
3 years ago
Great idea and so well executed! Fantastic first ible. :)
Reply 3 years ago
Thank you jessyratfink!
3 years ago
I plan on entering on of my projects for the very same contest, but this is just too nicely done to not vote for you. Wish you best of luck :)
Reply 3 years ago
Thank you nqtronix!