Doug G Posted December 1, 2013 Share Posted December 1, 2013 (edited) 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 December 2, 2013 by Doug G Link to comment Share on other sites More sharing options...
M852 Posted December 2, 2013 Share Posted December 2, 2013 Awesome job, Doug! Love the video with the prototype demo. Wish I had time to do something similar for the wireless option. Link to comment Share on other sites More sharing options...
jasonr123 Posted March 4, 2015 Share Posted March 4, 2015 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.01Designed 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 ProChronoThe 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 groundNot 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 remoteNote:Pin 11 was chosen for RX as it should be compatible with the Mega and Leonardo aswell 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 groundint delshotPin = 7; // Delete shot button pin, switched to groundint delstringPin = 8; // Delete string button pin, switched to groundint nextstringPin = 9; // Next string button pin, switched to groundint redisplayPin = 10; // Redisplay button pin, switched to groundint 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 pinint ledpin = 13; // Serial Indicator LED, completely optionalint BadDataTimeout = 900; // Milliseconds after which data is assumed to be bad and Rx string is clearedlong lastRxtime = 0; // Records the start of the last data recieve time as a timeout for bad datachar aChar=0x00; // used to read incoming serial dataString 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 ProChronoString DeleteShot = ":00000006"; //Same as hitting "Delete Shot" button on ProChronoString DeleteString = ":00000007"; //Same as hitting "Delete String" button on ProChronoString NextString = ":00000005"; //Same as hitting "String Change" button on ProChronoString GoToFirstVelocity = ":00000008"; //Jumps to the most recent shot in the stringString GoToFirstStatistic = ":00000009"; //Jumps to the "HI" statisticString RedisplayString = ":0000000E"; //Same as hitting the "Redisplay" button on ProChrono// The following are not yet implemented and/or used in this version of this codeString GetVelocity = ":00000003"; // Not yet implementedString RequestVelocityData = ":0200000101"; // last byte is the string number to send data forSoftwareSerial ProChrono(rxpin, txpin); // RX, TX for ProChronovoid setup(){pinMode(ledpin,OUTPUT); // set up the built in LED indicator (on the Uno)digitalWrite(ledpin,LOW); // turn off the LEDpinMode(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 ArduinodigitalWrite(txpin, LOW);pinMode(delshotPin, INPUT); // create a pin for the Delete Shot buttondigitalWrite(delshotPin, HIGH); // and set the pullup resistor onpinMode(delstringPin, INPUT); // create a pin for the Delete String buttondigitalWrite(delstringPin, HIGH); // and set the pullup resistor onpinMode(nextstringPin, INPUT); // create a pin for the Next String buttondigitalWrite(nextstringPin, HIGH); // and set the pullup resistor onpinMode(redisplayPin, INPUT); // create a pin for the Redisplay buttondigitalWrite(redisplayPin, HIGH); // and set the pullup resistor onpinMode(reviewPin, INPUT); // create a pin for the Review buttondigitalWrite(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");#endifProChrono.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 counteraChar = ProChrono.read(); // grab the characterSerial.write(aChar); // display it in the monitorIncoming += aChar; // add it to our receive stringif ((Incoming.length() >= 8) && VerifyChecksum(Incoming)){#ifdef SerialMonitorSerial.println();Serial.println(Incoming+" is a valid packet");#endifdigitalWrite(ledpin,LOW);// This is where we would process the incoming data... to be coded in a future version.Incoming = ""; // clear our receive buffer stringlastRxtime = 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 SerialMonitorSerial.println(Incoming+" appears to be invalid data.");#endifIncoming = "";lastRxtime = 0;digitalWrite(ledpin,LOW);}// The functions below are called when buttons on the remote are pushedif (digitalRead(nextstringPin) == LOW){ // We have a button pressdelay(75); // wait for a fraction of a second so we don't repeat too fastif (digitalRead(nextstringPin) == LOW){ // if button is still down thenSendPacket(NextString); // send the Next string command}}if (digitalRead(redisplayPin) == LOW){ // We have a button pressdelay(75); // wait for a fraction of a second so we don't repeat too fastif (digitalRead(redisplayPin) == LOW){ // if button is still down thenSendPacket(RedisplayString); // send the Next string command}}if (digitalRead(delshotPin) == LOW){ // We have a button pressdelay(150); // wait for a bit so we don't repeat too fastif (digitalRead(delshotPin) == LOW){SendPacket(DeleteShot);}}if (digitalRead(delstringPin) == LOW){ // We have a button pressdelay(1000); // wait for one second; we don't want to accidentally delete a string!if (digitalRead(delstringPin) == LOW){ // if button is still down thenSendPacket(DeleteString); // send Delete Shot command}}if (digitalRead(reviewPin) == LOW){ // We have a button pressdelay(75); // wait for a fraction of a secondif (digitalRead(reviewPin) == LOW){ // if button is still down thenSendPacket(ReviewString); // send Delete Shot command}}} // end loopvoid SendPacket(String PacketData){digitalWrite(ledpin,HIGH);ProChrono.print(AppendChecksum(PacketData));#ifdef SerialMonitorSerial.println("Sending "+AppendChecksum(PacketData));#endifdelay(400); // pause a bit in case button is held downdigitalWrite(ledpin,LOW);}String AppendChecksum(String strCommand){// Appends the correct ProChrono checksum value to a given stringreturn 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 stringnChecksum = (256 - (nChecksum % 256)); // Calculate the checksumhexNumber = String(nChecksum, HEX); // Convert to a hex stringhexNumber.toUpperCase(); // ProChrono talks in all caps, so we must tooreturn hexNumber;}bool VerifyChecksum(String strCommand){// Returns TRUE if the given string contains a valid checksum, and FALSE if notString tempstr = strCommand.substring(0,strCommand.length()-2); // get all but the last 2 characterstempstr = GetChecksumStr(tempstr); // get the checksum of the stringif (strCommand.endsWith(tempstr)) // test whether last 2 characters match the calculated checksumreturn true;elsereturn false;} Link to comment Share on other sites More sharing options...
jasonr123 Posted March 4, 2015 Share Posted March 4, 2015 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. Link to comment Share on other sites More sharing options...
KernelPanic Posted March 12, 2015 Share Posted March 12, 2015 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. 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. Link to comment Share on other sites More sharing options...
jasonr123 Posted March 13, 2015 Share Posted March 13, 2015 so are you doing thing on arduino? or what platform? Link to comment Share on other sites More sharing options...
KernelPanic Posted April 14, 2015 Share Posted April 14, 2015 Too complicated for an Arduino. It will run on a Windows machine. I really like your Arduino controller idea though. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now