A friend of mine asked me recently if I could build for him and his swimmers a timing device. Sure OMEGA TIMING panels are great but they are also extremely expensive and they just can't afford them. There are many approaches I took some more successful than others including accelerometers, IR buttons, magnet straps around their wrists and ankles, but the ultimate solution for precise timing would be to use big 0,5m x 0,5m touch panels. The goal is to detect the moment when swimmer touches the panel. I do not care where and how strongly it was touched I just want to know that they made either a flip or open turn and touched it. Obviously it needs to work under water.
Since I am not good at analog circuits I though maybe some of you guys could help me with designing a prototype. I was thinking about a mechanical/optical solution where the panel would be composed of two layers separated by a small gap < 2mm with mirrors on both sides and a laser beam so the light goes like this:
[attachment=0]
Now when the swimmer touches it the light path would be obstructed and I could detect it by a change in the intensity level. There is no problem to ask swimmers to touch hard. For flip turns this is not a problem as they time is counted when they touch it with their feet. For open turns this shouldn't be a problem either as most of them will swim pretty fast anyway. Unfortunately this is pretty complicated to build.
Do capacitive panels have a chance of working under water ?
interesting!
lasers under water disperse energy much faster than in air, another solution would be to use a giant thin capacitor with a compressible dielectric, could be easily created with 2 brass plates and a piece of 3mm foam between them.
I did a project with a qprox capacitive touch switch a few years back... All that was needed was a single small chip, a couple of caps and some board real estate. There was some tweakage required - mine had to operate with everything from a single bare thumb to a gloved little finger, but it worked just fine.
You might try looking on the Atmel site at the AT42QT1010 or similar.
Other than the IC, a few support parts, and tweakage, all that is required is an appropriately sized PCB, and waterproofing.
Good luck!
Thanks for your comments, I will give the capacitive panels a try as they will be the best if they work of course :) If not, I'll try something else. I've just brought two 5L bottles chlorine rich water from my local swimming pool for testing, now I gotta get those chips for testing.
you can use a 555 as a capacitance meter.
Splashes or swimming near a capacitor will change the capacitance some, you will have to filter the output from the 555.
Here is something i have done in the past. it will not compile with SDCC v3.0 due to some major changes since i wrote the code.
//-----------------------------------------------------------------------------
// RGB computer mod by Sheldon Bailey is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
// compiled using SDCC V2.8 2008
//-----------------------------------------------------------------------
#include "c8051f300.h"
//-----------------------------------------------------------------------
// Application Constants
#define reload 64923
// sys_tic every 0.1mS reload = (65535- ((SYSCLK/pll divide) /rate)) /4 pll timer0
#define button_period 10000
// button counter timing
#define pw_sw P0_6
#define hd_on P0_4
enum {a,b,c,d,e,f};
//-----------------------------------------------------------------------------
// Application System Definitions
//-----------------------------------------------------------------------------
#define SYSCLK 24500000 // SYSCLK frequency in Hz
//-----------------------------------------------------------------------------
// Function Prototypes
//-----------------------------------------------------------------------------
void Init_Device(void); // found in config.c
//-----------------------------------------------------------------------------
// External Variables
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Global Variables
//-----------------------------------------------------------------------------
static unsigned int count;
static unsigned int red;
static unsigned int blue;
static unsigned int green;
static unsigned int min_speed;
static unsigned int max_speed;
static unsigned int speed;
static unsigned int min_brite;
static unsigned int max_brite;
static unsigned int button_reading[5];
static unsigned int reading_number;
static unsigned int button;
bit sys_tic;
int colors;
static int tic_change;
//-----------------------------------------------------------------------
// C-startup
//-----------------------------------------------------------------------
unsigned char _sdcc_external_startup ()
{
PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer enable)
return 0;
}
//-----------------------------------------------------------------------------
// main() Routine
//-----------------------------------------------------------------------------
void main (void)
{
red = 65535;
blue = 65535;
green = 65535;
max_brite = 64535;
min_brite =65535;
max_speed = 7;
min_speed = 1;
pw_sw = 1;
colors = f;
sys_tic = 0;
speed = 1;
Init_Device();
EA =1;
while (1)
{
if (sys_tic == 1)
{
sys_tic = 0;
for (count=1; count<=speed; count++)
{
switch (colors)
{
case f:
if (red > max_brite) red--;
else colors = a;
break;
case c:
if (red < min_brite) red++;
else colors = d;
break;
case b:
if (blue > max_brite) blue--;
else colors = c;
break;
case e:
if (blue < min_brite) blue++;
else colors = f;
break;
case d:
if (green > max_brite) green--;
else colors = e;
break;
case a:
if (green < min_brite) green++;
else colors = b;
break;
}
}
}
}
} // end main()
//-----------------------------------------------------------------------------
// Interrupt Service Routines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// timer 2 interupt----power switch
//-----------------------------------------------------------------------------
void Timer2_ISR( void ) interrupt INTERRUPT_TIMER2 reentrant
{
TF2=0;
if (reading_number < 4) reading_number++;
else reading_number = 0;
TMR2 = button_period;
button_reading[reading_number]=TMR1;
TL1 = 0;
TH1 = 0;
button = button_reading[0]+button_reading[1]+button_reading[2]+button_reading[3]+button_reading[4];
if (button < 1700)
{
if (button > 1600) pw_sw = 0;
}
else pw_sw = 1;
}
//-----------------------------------------------------------------------------
// timer 0 interupt----led timing
//-----------------------------------------------------------------------------
void Timer0_ISR( void ) interrupt INTERRUPT_TIMER0 reentrant
{
TMR0 = reload;
if(hd_on == 0) //hd on
{
sys_tic = 1;
if (speed < max_speed) speed++;
if (max_brite > 0) max_brite--;
}
else //hd off
{
tic_change++;
if (speed > min_speed) speed--;
if (max_brite < 45000) max_brite++;
{
if (tic_change == 20) // *0.1 ms
{
sys_tic = 1;
tic_change = 0;
}
else sys_tic = 0;
}
}
}
//-----------------------------------------------------------------------------
// Programmable Counter Array interrupt
//-----------------------------------------------------------------------------
void PCA_INTERRUPT( void ) interrupt INTERRUPT_PCA0 reentrant
{
CF = 0; // clear interrupt request
PCA0CPL0 = green;
PCA0CPH0 = green >> 8;
PCA0CPL2 = blue;
PCA0CPH2 = blue >> 8;
PCA0CPL1 = red;
PCA0CPH1 = red >> 8;
}
//-----------------------------------------------------------------------------
// End Of File
The input was taken from a 555, timer2 counts the input and filters it by averaging, this input was used for the power switch on my PC for a few years, the rgb leds cycled like a multi-color mac power light, that got faster when hard drive is in use.
Just remember that for capacitive methods, humans aren't much different in dielectric constant than water, so you'll want to use a pressure-based switch. I'd just space two thin sheets (20mil) of Al with some foam and plastic. Ground the pool side, hook the wall side to another cap of about the same magnitude as the resting sheet. Tie the other end of that cap to your +5 supply (or +12 or whatever). Put the midpoint into the input of a comparator and a resistor divider that makes the time constant on the order of a few 10ms. Compare against mid-rails. When the swimmer hits the panel, the squish will increase capacitance which will cause the voltage jump. Your comparator will detect this, send a pulse, which you can use for whatever timing you want.
Thanks for your input. I am now waiting for a few parts to arrive and as soon as they do I will make some small-scale experiments.
I've done some little scale testing with the AVR QTouch AT42QT1010 chip and a olympic sized pool:

Unfortunately it does not work the way I want it. It triggers the output whenever I put my finger inside. I tried powering it up with my fingers inside the 'pool' but it didn't make any difference. (http://www.youtube.com/watch?v=KQKcnPevawM (http://www.youtube.com/watch?v=KQKcnPevawM)) It would be OFF until I took them out and in again, then it would return to the previously described behavior. It might be the insulation being too thin as this is just a self adhesive tape, but I am afraid touch sensors won't work as some of you have predicted.
It does, however, work pretty nice as a cat drinking water indicator which could be incorporated in my another project (viewtopic.php?f=19&t=1881 (http://dangerousprototypes.com/forum/viewtopic.php?f=19&t=1881)).
What happens if you ground the water?
Assuming you went with the last suggestion with a large homemade capacitor of two sheets and some foam.
i would assume that the pool will have some grounding,
how did you insulate the plates from the water, the chlorine in the water can mess with stuff.
Why not use pressure mats from intruder alarms? The ones I fitted years ago looked watertight, I'm probably wrong in all kinds of ways, but I had to mention them.
I'll post an update next week as I just got a with my final exam date and until then I need to revise what I have forgotten over the last 2 years so I can finally get my MSc degree :)
I'm finally done with my studies and officially got my MSc in Computer Science degree today :)
I have tested the touch sensor with the pool being grounded (different sizes of plates, etc) and it does not detect anything then so I guess capacitive touch sensors are not the way to go here. I will try to do some more work with accelerometers once I get my new lap counter working and properly sealed :)
It looks to me like your touch sensor isnt insulated from the water. is that correct? , what happens if you insulate it (stick it in a plastic bag) then then touch it?
It is insulated with self adhesive packing tape. I might try a plastic bag but I don't think it will be any different.
I'm finally done with my studies and officially got my MSc in Computer Science degree today :)
I know this is a little belated, but congratulations!
Thanks! :) I will finish the cat monitor and I'll get back to the timing device.