Jump to content
Brian Enos's Forums... Maku mozo!
Doug G

Arduino based Wired Remote for ProChrono Digital - How To

Recommended Posts

I've seen a few other threads on here about remotely controlling a ProChrono Digital chronograph. We have a wireless remote option as well as a do-it-yourself wired version that uses a laptop computer. As a personal learning challenge, I decided to try making a wired remote based on the Arduino platform using info I gleaned from the other threads. The remote I designed is quite basic but provides the same 5 button functionality found on the front of the ProChrono Digital. It doesn't require a laptop or a smartphone for use; it runs off a 9v battery and connects to the ProChrono with a long 3.5mm "male to male" cable, the same one used to connect the chronograph to a laptop.

Depending on where you buy the parts the cost for this remote should be somewhere between $35 and $45. While this seems a bit high, consider that the "official" remote control from Competition Electronics retails at $90-$120. Of course, theirs comes with a warranty and a printing feature that my home grown design doesn't include.

The attached PDF and Arduino sketch should provide enough info info for most do-it-yourselfers to build the remote. While I'm happy to answer questions, I'm no expert. In fact, this was my first shot at an Arduino project. I realize this isn't an electronics forum, so I'm not going to post a bunch of tech specs and such now. I think I've included everything in the attachments, but I'll update them as necessary. If anyone finds any problems or can make any improvements to this project, by all means please make them known. I'm hoping that by sharing this info others might find ways to improve upon what I've done.

Thanks to M852, BenOz, w0fms, and the many others on here for their work and shared contributions to the ProChrono Remote projects.

-Doug

Edit: I uploaded a YouTube video of the prototype remote in action: http://youtu.be/_YYv5aHdFIU

Arduino Based Wired Remote Control for ProChrono.pdf

sketch_ProChrono_Serial_v0.10.txt

Edited by Doug G

Share this post


Link to post
Share on other sites

Awesome job, Doug! Love the video with the prototype demo. Wish I had time to do something similar for the wireless option.

Share this post


Link to post
Share on other sites

I very much appreciate the work that has been done to interface to the Prochrono digital. I have been very happy with it and a couple of my friends have the same one.

I want to continue the work that has been done with the arduino interface, however I wanted to make sure I am using the latest sketch before I dive as to not waste time or repeat work that has been done by others.

So first off is this the latest sketch?

/*
Arduino Compatible Wired Remote Control for ProChrono Digital version 0.01
Designed and Programmed by Douglas Good, November 2013.
WORKING SO FAR:
- String Change Command
- Delete String Command
- Delete Shot Command
- Review Shot Command
- Redisplay Command
- Checksum validation for data sent and received to/from ProChrono
The circuit:
* TX on pin 12 (middle "ring" section of 3.5mm plug) for data going out to ProChrono from Arduino
* RX on pin 11 (tip of 3.5mm plug) for data coming INTO Arduino from ProChrono
* ProChrono Ground to Arduino Ground (base of 3.5mm plug)
* 10K ohm Resistor from ground to RX pin 11 *VERY IMPORTANT* data won't be received without this!
* Review shot button connecting Pin 6 to ground
* Delete Shot button connecting Pin 7 to ground
* Delete String button connecting Pin 8 to ground
* Next String (aka String Change) button connecting Pin 9 to ground
* Redisplay button connecting Pin 10 to ground
Not yet implemented:
* Clear All Strings button (must press and hold for 4 seconds) on pin X
* LCD readout to duplicate the chronograph display on the remote
Note:
Pin 11 was chosen for RX as it should be compatible with the Mega and Leonardo as
well as the UNO. Not all pins on the Mega and Leonardo can be used to receive serial data.
*/
// define SerialMonitor in order to send debug messages to the computer.
// If using as a standalone remote, undefine this to save memory.
#define SerialMonitor
#include <SoftwareSerial.h>
int reviewPin = 6; // Review Shot button, switched to ground
int delshotPin = 7; // Delete shot button pin, switched to ground
int delstringPin = 8; // Delete string button pin, switched to ground
int nextstringPin = 9; // Next string button pin, switched to ground
int redisplayPin = 10; // Redisplay button pin, switched to ground
int rxpin = 11; // Incoming Data from ProChrono is recieved on this pin
// NOTE: RX pin must be tied to ground with a 10K ohm resistor!
int txpin = 12; // Data going out to ProChrono is transmitted on this pin
int ledpin = 13; // Serial Indicator LED, completely optional
int BadDataTimeout = 900; // Milliseconds after which data is assumed to be bad and Rx string is cleared
long lastRxtime = 0; // Records the start of the last data recieve time as a timeout for bad data
char aChar=0x00; // used to read incoming serial data
String Incoming = ""; // used to collect incoming data from the serial port
// ProChrono Command Packets
// These command strings tell the ProChrono to perform specific functions. All 5 buttons on the front of the
// unit are duplicated here. In order to be understood by the ProChrono, a 2 character (1 hex byte) checksum
// must be appended to these commands using the AppendChecksum function.
// Note that the ProChrono protocol documentation is a bit confusing in the way functions are named, so
// I've named some of them differently here to better describe what they do.
String ReviewString = ":00000004"; //Same as hitting the "Review" button on ProChrono
String DeleteShot = ":00000006"; //Same as hitting "Delete Shot" button on ProChrono
String DeleteString = ":00000007"; //Same as hitting "Delete String" button on ProChrono
String NextString = ":00000005"; //Same as hitting "String Change" button on ProChrono
String GoToFirstVelocity = ":00000008"; //Jumps to the most recent shot in the string
String GoToFirstStatistic = ":00000009"; //Jumps to the "HI" statistic
String RedisplayString = ":0000000E"; //Same as hitting the "Redisplay" button on ProChrono
// The following are not yet implemented and/or used in this version of this code
String GetVelocity = ":00000003"; // Not yet implemented
String RequestVelocityData = ":0200000101"; // last byte is the string number to send data for
SoftwareSerial ProChrono(rxpin, txpin); // RX, TX for ProChrono
void setup()
{
pinMode(ledpin,OUTPUT); // set up the built in LED indicator (on the Uno)
digitalWrite(ledpin,LOW); // turn off the LED
pinMode(rxpin, INPUT); // the pin that receives data coming into the Arduino (must use 10k pulldown resistor!)
pinMode(txpin, OUTPUT); // the pin that sends data from the Arduino
digitalWrite(txpin, LOW);
pinMode(delshotPin, INPUT); // create a pin for the Delete Shot button
digitalWrite(delshotPin, HIGH); // and set the pullup resistor on
pinMode(delstringPin, INPUT); // create a pin for the Delete String button
digitalWrite(delstringPin, HIGH); // and set the pullup resistor on
pinMode(nextstringPin, INPUT); // create a pin for the Next String button
digitalWrite(nextstringPin, HIGH); // and set the pullup resistor on
pinMode(redisplayPin, INPUT); // create a pin for the Redisplay button
digitalWrite(redisplayPin, HIGH); // and set the pullup resistor on
pinMode(reviewPin, INPUT); // create a pin for the Review button
digitalWrite(reviewPin, HIGH); // and set the pullup resistor on
#ifdef SerialMonitor
// Open serial communications with PC and wait for port to open:
Serial.begin(1200);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.println("Arduino ProChrono Remote connected");
#endif
ProChrono.begin(1200); // set the data rate for the ProChrono Serial port at 1200 baud
}
void loop()
{
if (ProChrono.available()){
digitalWrite(ledpin,HIGH);
lastRxtime = millis(); // reset our incoming data timeout counter
aChar = ProChrono.read(); // grab the character
Serial.write(aChar); // display it in the monitor
Incoming += aChar; // add it to our receive string
if ((Incoming.length() >= 8) && VerifyChecksum(Incoming)){
#ifdef SerialMonitor
Serial.println();
Serial.println(Incoming+" is a valid packet");
#endif
digitalWrite(ledpin,LOW);
// This is where we would process the incoming data... to be coded in a future version.
Incoming = ""; // clear our receive buffer string
lastRxtime = 0; // zero out our timeout counter
}
}
// This is a simplistic check for bad serial data. If a valid packet isn't received within
// the timeout period, we assume it's bad data, throw it away and reset our variables.
// This should be coded to be a smarter, more in-depth check.
if (((millis() - lastRxtime) >= BadDataTimeout) && (lastRxtime > 0)){
#ifdef SerialMonitor
Serial.println(Incoming+" appears to be invalid data.");
#endif
Incoming = "";
lastRxtime = 0;
digitalWrite(ledpin,LOW);
}
// The functions below are called when buttons on the remote are pushed
if (digitalRead(nextstringPin) == LOW){ // We have a button press
delay(75); // wait for a fraction of a second so we don't repeat too fast
if (digitalRead(nextstringPin) == LOW){ // if button is still down then
SendPacket(NextString); // send the Next string command
}
}
if (digitalRead(redisplayPin) == LOW){ // We have a button press
delay(75); // wait for a fraction of a second so we don't repeat too fast
if (digitalRead(redisplayPin) == LOW){ // if button is still down then
SendPacket(RedisplayString); // send the Next string command
}
}
if (digitalRead(delshotPin) == LOW){ // We have a button press
delay(150); // wait for a bit so we don't repeat too fast
if (digitalRead(delshotPin) == LOW){
SendPacket(DeleteShot);
}
}
if (digitalRead(delstringPin) == LOW){ // We have a button press
delay(1000); // wait for one second; we don't want to accidentally delete a string!
if (digitalRead(delstringPin) == LOW){ // if button is still down then
SendPacket(DeleteString); // send Delete Shot command
}
}
if (digitalRead(reviewPin) == LOW){ // We have a button press
delay(75); // wait for a fraction of a second
if (digitalRead(reviewPin) == LOW){ // if button is still down then
SendPacket(ReviewString); // send Delete Shot command
}
}
} // end loop
void SendPacket(String PacketData){
digitalWrite(ledpin,HIGH);
ProChrono.print(AppendChecksum(PacketData));
#ifdef SerialMonitor
Serial.println("Sending "+AppendChecksum(PacketData));
#endif
delay(400); // pause a bit in case button is held down
digitalWrite(ledpin,LOW);
}
String AppendChecksum(String strCommand){
// Appends the correct ProChrono checksum value to a given string
return strCommand + GetChecksumStr(strCommand);
}
String GetChecksumStr(String strCommand){
// calculates the checksum of a string and returns it as a 2 digit hex string.
String hexNumber = "";
int nChecksum = 0;
for(int x = 1; x < strCommand.length(); x++)
nChecksum += (int)strCommand.charAt(x); // add the characters in the string
nChecksum = (256 - (nChecksum % 256)); // Calculate the checksum
hexNumber = String(nChecksum, HEX); // Convert to a hex string
hexNumber.toUpperCase(); // ProChrono talks in all caps, so we must too
return hexNumber;
}
bool VerifyChecksum(String strCommand){
// Returns TRUE if the given string contains a valid checksum, and FALSE if not
String tempstr = strCommand.substring(0,strCommand.length()-2); // get all but the last 2 characters
tempstr = GetChecksumStr(tempstr); // get the checksum of the string
if (strCommand.endsWith(tempstr)) // test whether last 2 characters match the calculated checksum
return true;
else
return false;
}

Share this post


Link to post
Share on other sites

I am looking to take what you have started as far as interfacing the prochrono and Arduino and continue on with it.

I want to Wireless communication using Bluetooth something I can just leave in the chrony but works with all the existing software and such.

Bluetooth to usb computer to interface with their software download here http://www.competitionelectronics.com/product/prochrono-digital-usb/

Bluetooth to phone similar to this http://www.competitionelectronics.com/product/bluetooth-adapter/

But I would like a Bluetooth into Arduino to do

remote LCD to emulate display

Or to display better than display like 2.4”lcd with touchscreen.

Physical remote buttons (like in your prochrony.ino)

Or Lcd Touch screen buttons

Sd logging into a cvs spreadsheet so strings are never lost.

Log date and time.

Log all shot data

Log Temp humidity sensor using a dht11

Log barometric pressure using a sensor.

Maybe add an RFID reader to scan the gun I am using. Or something crazy to tie the gun and ammo to the shot.

Log anything else I can think of that could ever remotely be of use. :P

Share this post


Link to post
Share on other sites

I am looking to take what you have started as far as interfacing the prochrono and Arduino and continue on with it.

I want to Wireless communication using Bluetooth something I can just leave in the chrony but works with all the existing software and such.

Bluetooth to usb computer to interface with their software download here http://www.competitionelectronics.com/product/prochrono-digital-usb/

Bluetooth to phone similar to this http://www.competitionelectronics.com/product/bluetooth-adapter/

But I would like a Bluetooth into Arduino to do

remote LCD to emulate display

Or to display better than display like 2.4”lcd with touchscreen.

Physical remote buttons (like in your prochrony.ino)

Or Lcd Touch screen buttons

Sd logging into a cvs spreadsheet so strings are never lost.

Log date and time.

Log all shot data

Log Temp humidity sensor using a dht11

Log barometric pressure using a sensor.

Maybe add an RFID reader to scan the gun I am using. Or something crazy to tie the gun and ammo to the shot.

Log anything else I can think of that could ever remotely be of use. :P

I am working on a program that will import the velocities into an SQL data base, then match them against a reloading and firearm database. This is going to take a Loooooooooooong time.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...