Bow testing station

I’m thinking completely fun garage-hack here…wonder if it would work…

To record your arrow speed, wrap your arrow shaft with many loops of fine copper wire at some certain set spacing. Put an electric guitar pickup in front of your apparatus so the arrow will pass close by the pickup when fired. Plug it into an amp with long reverb.

Then record the sound frequency from the amp (with either a tuner or recording software) when you fire the arrow past the pickup, and do the arithmetic based on the frequency vs the wire spacing on the shaft. When calibrated and tweaked, you could know that Bb = 200 fps, F# = 350 fps, etc.

Silly, but I’ve been restoring a guitar and it seems to me a completely accidental highly accurate measurement device.

I got a laugh out of that! I’ve written a pitch-detection algorithm, and I doubt it would work on what’s more or less a “1-shot” (and reverb would confuse it rather than help). But I’m confident that there’s a far simpler algorithm to determine the speed given that kind of input signal (skip the amp).

Second, you couldn’t use copper wire. It’d have to have magnetic properties like a guitar string.

OK, I’ll start with the easy one: Lowpass filter. I’ll do this in C but avoid any tricky C-stuff, so it should be easy enough to translate to Basic or whatever. It’s been far too long since I did Basic.

For this to work, we need the following function to run periodically. How that’s done depends on what system you’re running the code in. For example, it could be run whenever a periodic timer fires. By “periodic” I mean that the time interval between successive runs has to be constant. The important aspect here is that the samples have to be collected periodically. It’s OK to collect the data and filter it later, but I’ll write this as though it’s running in real-time.



float last_val = 0.0;
float lp_filt(float cur_val, float k) {
  float output = last_val + (cur_val - last_val) / k;
}


Call this function for each sampled value and the output is low-pass filtered just like an analog RC filter. There is a relationship between K, the period, and the cutoff frequency but I’ll miss the edit deadline.

I did this using floating point values. In my experience it’s generally been done using fixed-point values, and rather than dividing, we shift the (cur - last) right by some number of bits, for efficiency. Fixed point has more considerations, and float is simpler.

What I am hoping is that existing devices that just need calibration along with inserting formulas into excel should give me what I want. The speed I imagine a basic chronograph would be the easiest fastet way as long as it is excel compatable. The strain gage just needs to be triggered to read every 1" and then aligned with the distance it was read at on excel. I may be over simplifieng as I am pretty much computer illiterate. I don’t think it will be a full program to write.

Next, PID controller. I doubt you’ll really want to go here, unless you like to fiddle. If you like to fiddle, it’s a fiddler’s dream, if you can set up the real-time programming environment to where you can run the algorithm. (That’s usually the hard part, but no doubt today there are systems set up to make this easy.)

First, the setup:

The goal is to move an actuator to a desired position. You have one input, which is the current location. Ideally, this is linear – that is, it’s in inches or centimeters etc. If it’s not, the controller can still work sometimes, but less optimally. In any case, this is not an optimal controller, it’s just a simple, effective, and fairly robust one.

You also have an output that controls a force. Again, ideally the force is proportional to the output value. (One way to do that, closely enough, is a duty-cycle controller, which would be ‘downstream’ of the PID’s output and feeding the actuator motor’s control circuit. It’s beyond the scope of the course today.)

The setup requires (like the LP filter above) that you have a real-time OS that allows you to schedule a function to get run periodically (say, 1000 times a second, or even just 100 times a second).

The motor controls the position of the actuator, but acts against some force, which varies. A PID controller works well as long as the “counter force” is not strongly periodic. If it is strongly periodic, you can work around that by tweaking the sample/control period and the three tweak constants which I’ll describe below. But for any apparently well-tweaked controller, there are periodic counterforces that’ll totally mess it up. With a strong and fast enough motor, though, it shouldn’t be a serious problem.

Theory: You need to output a force that matches the current counter-force, AND puts you at the right location. We arrive at this force by applying three component forces, each for a different purpose.

First, if you’re below the target, you need to increase the force. If you’re above it, decrease the force. To keep it simple and also get where you want to be as fast as possible, just apply a force in the correct direction that’s PROPORTIONAL to the distance you need to go:



// current is where we are; target is where we want to be
output_force = K1 * (target - current);

Simple enough, right? If there were no force and the actuator were massless, eventually target and current would be zero, and we’d be right at the sweet spot! K1 is just a tweak constant. The higher it is, the faster we get where we’re going (up to the limits of the actuator motor.) No, infinity is not best. :slight_smile: Think of K1 as “gain”.

But remember there’s some unknown force pushing against us (which could be going in either direction, pushing down or up … no matter!) Let’s say that force is pushing down and it’s constant. We’d stabilize where K1 * (target - current) matches the external force. To correct for this, we add an INTEGRAL term:



accumulator = accumulator + (target - current);
output_force = output_force + K2 * accumulator;

As with “last_val” above, “accumulator” has to be a value that is retained between different calls to the function. Every time the function is called, if we’re below the target, the accumulator value grows, increasing the force we apply. Eventually, this force matches the external force, and the actuator is in the target location.

So, we’re done, right? Oops, not quite. One problem with the above is that when we hit the target, the accumulator is nonzero, so we overshoot. Then it starts to grow negative, and we move down, and hit the target, but again the accumulator is nonzero (negative) so we overshoot. That is, we oscillate. We’d also oscillate if the actuator has significant inertia (e.g., mass).

To fix that, we add a DIFFERENTIAL component, providing damping:



diff = current_loc - last_loc;
output_force = output_force - K3 * diff;
last_loc = current_loc;

Again, “last_loc” is a variable that keeps its value between function calls. K3 is the “damping factor”. I forget the usual name for K2, but it’s essentially the “external force compensation” factor.

Notice that this time, we’re subtracting the term. This slows down the movement: the faster we’re going up, the less force we want to apply. (Likewise, the faster we’re going down, the more force we want to apply.)

Digital friction. Gotta love it. And that’s it! We’re done!

Here’s the lot, arranged a bit differently, in a function intended to be called periodically to compute the output force. As before, I’m using floats, even though inputs and outputs are usually integers. Using integers, you have to take care to avoid losing precision in intermediates, though you can often just gloss over that, since this controller is more like a Ford Model A engine than a Ferrari.



float last_loc;
float accumulator;

float K1, K2, K3;  // set these tweak constants from outside: set-and-forget

// called periodically.  Returns the force for the actuator motor

float pid(float target_loc, float current_loc)
{
    float p, i, d;

    float discrepancy = target_loc - current_loc;
    float delta_loc = current_loc - last_loc;

    accumulator = accumulator + discrepancy;
    last_loc = current_loc;

    p = K1 * discrepancy;
    i = K2 * accumulator;
    d = K3 * delta;

    return (p + i - d);
}


Note that I’d use “static” for last_loc, etc., but I’m trying to avoid anything that would complicate translating to another language for someone who’s not C-literate.

Someone who’s a better engineer than I am could probably describe the tweak constants in engineering terms, with units, conversions, etc., and based on the polling period. I just fiddle them until they work well. :slight_smile: IIRC, good starting values are 1.0, 0.1, and 0.1, respectively.

If you try to implement this with fixed point, you need to rescale some intermediates (especially the accumulator calculation) to avoid losing precision. Unless you have a good reason to need to use integers, or you’re familiar with fixed-point coding, I recommend sticking with floating point. In the bad ol’ days we needed integer math to get the sample rates high (and our processors didn’t have FPUs.)

I agree 100%. The only model where this makes sense is where it’s more fun to work out an interesting automated solution than to simply do the measurements. Of course, with an automated system you’ll get lots of additional benefits, such as more repeatable/reliable results, being able to run the test repeatedly on the same bow to verify accuracy with little manual effort (ideally), etc. (Even if it involves a manual crank – if the recordkeeping is automated, that’s the tedious and error-prone part).

If it can be easily assembled using off-the-shelf parts, rather than selling it, post it on a suitable forum and share it, and you’ll get the benefits of community sharing, which can be substantial and far more likely to be rewarding than any for-profit venture in a case like this.

Beware pneumatics: they bounce.

And I was going to say Mecmesin.
HoneyBadgerDC, if you ever get this project going, contact me for the load cells and instrumentation. I can probably help.

Thats great! I will be in touch.

At present I do all the measurements by hand which is very time consuming, Once a year we hold an event where custom bow builders from all over the U.S. wil send in their bows for a speed test. We prefer to give a full report on the bow with efficiency and other stats that denote quality and design achievements. With 50 bows to test it just isn’t practical to do all the measurements we need to take besides the raw speed. Not looking to make a business out of it all. But would be happy to recoup some of my development costs. My hope is that a few archery shops may want one for their store.

There are about a million types of load cells and no doubt you’ll be able to find something that will work. It comes down to mounting, capacity and dimensional constrictions.
Many meters have a peak hold function and what are called setpoints to alert when a certain weight or force is reached/exceeded. Personally, I’d probably go used for the meter since you can get some nice ones for a bargain.
Like so many other projects, it is one of those things you can spend as MUCH as you like and get very fancy and high resolution. On the low end for cells, there’s a lot of Asian imports that will probably work fine. For example.

That looks real similar to the one I had purchased last time. I had a slightly more expensive model. The reader I bought had 4 stations which I thin would be sufficient. I may be able to get them back if the current owner has abondon the project as well.

I’m just curious HoneyBadger, does the bow need to be vertically oriented for these tests for any reason? Or could it be horizontal, or in either mode does it have to have the arrow release horizontally or could it be straight up and down or at an angle?

The angle really would not matter except down, if shot down the nock would have to be tight enough to hold the arrow on the string and this will slightly affect the velocity. They are looking at 1 fps difference when competing. Straight up might haver a slight affect but not much, the arrow weighs a bit over an ounce.

HBDC, I have been thinking this over for a while and wonder if a Hydraulic Ram might be the ticket for you. You can tell force by the fluid pressure and this info is easily computerized, very consistent pull or push (you could set it up either way). All you need after that is some kind of quick release and a baseball type radar gun.

Did I miss something?

Interesting project

Link below to sales site as an example

http://www.grainger.com/Grainger/hydraulic-cylinder/hydraulic-system-components/hydraulics/ecatalog/N-c7dZ1z03kda?Ndr=basedimid10071&dojo.preventCache=1383433647270&sst=subset

Capt Kirk

This comes with the electronics and software if you can figure out how to integrate it mechanically.

http://www.grainger.com/Grainger/SHIMPO-Digital-Force-Gauge-4TLD3?cm_sp=IO-_-IDP-_-RR_VTV70300505&cm_vc=IDPRRZ1

I do like the idea of the softwear being built in. Something I noticed on my scale when drawing a bow back it goes slightly over the peak when drawing until I stop the draw, So I might get a peak preading say of 40.5# if drawing slowly and when I stop it will settle to 40.0. I will need to take up to about 24 readings on each bow as I draw it so would somehow have to have it not take the reading until the drawing came to a stop. I am thinking about a 1/2 second pause at each 1" increment for a reading to be taken. The pause could be mechanicaly built into a drum used for drawing the bow, The drawing mechanism could maintain a constant speed and detents in the gear would just allow for no mvement of the drawing cable at pause points.

It appears the hardware is capable of taking a thousand data samples per second you simply need to select the display intervals you desire. One advantage of a lot of data points is that you could draw a fairly precise force curve/plot for the changing draw weights for compound bows.

You’re the customer but if I’m visualizing this thing properly, I think that you won’t want to do the pausing thing. It will complicate the mechanical portion of the system and, worse, potentially alter the data. It seems to me that you want to grab the data points while the string draw is smoothly and consistently in motion. On preview, what Astro said.

There are some pretty sophisticated scale controllers out there which have digital and analog I/O which really have nothing to do with weighing and much more closely resemble standalone programmable logic controllers (PLC). You can do things like press Start and the controller signals to the motor to activate. Then, using, say, a timer or electric switches/contacts @one inch steps along the draw path, log the 24 data points to variables in the controller memory. A 25th switch tells the scale to stop the motor at the end of the draw. After the test is complete, send the 24 load values to a printer and/or spreadsheet or whatever.

The scale controller I have in mind (GSE 60-series*) even have database capabilities so you could do a series of tests while retaining the data internally for later upload. It might be useful to log the time & date and prompt the operator to key in a test number or bow ID, too.

*4mb PDF of the large (620 pages) Technical Reference manual

As long as the pull was steady and not too fast any acceleration type forces being registered might be small. I was thinking the same thing as you are suggesting about a detent that would activate an “enter” switch at 1" intervals. I would by far prefer no pauses.

Being able to collect the 24 load values is really the only important part of the machine. Everything else such as arrow weight, and velocity could easily be entered by hand and then used in the formulas excel or whatever was set up to compute.