I am looking to 'automate' my Christmas Post War trains this year. I plan on using a TPC 300, 135w powerhouse and an Arduino/Raspberry Pi as the controller. I think I have it figured out sending commands, except for how to set the TR number of the TPC unit for the first time. I know I set the switch to program and send it 'something' over the serial line. All the TMCC commands use the TR address as the second byte, but since none has been set, not sure how to address the TPC unit to set it. I am not using the remote so I need the binary/hex string used to address the TPC 300 for the first time. ( i.e. 0xFE, 0x11, 0x2b ).

Thanks in Advance

Original Post

Wouldn't the set train address or Set TMCC Address command have to be broadcast type commands? Interested in how this turns out.


Generally I've had more luck using ENG instead of TR with TPC 300's and 400's but my understanding is that they can be programmed as either.

I have my TPC 300 programmed to ENG 13, but I believe it came from the factory set to ENG 1, just like locomotives do when they come from the factory.  (Somebody might correct me if I'm wrong on this).

Is yours new or NOS, or did you buy it used?  If its new or NOS I suggest that you assume it's already set to ENG 1, and try that over the serial connection instead of using TR.  It's worth a shot if you don't have a CAB 1 handy.




I took Mellow's advice and assumed the TPC unit was ENG 1 and tried to run a few commands.... I got nada.  Before my frustration forced me to reach out to you the experts, I threw all sorts of garbage at it on PRG mode.  So I went back to PRG mode and set it to, or what I thought was, ENG 1.  I got a long blink from the unit signaling that it was set.  Went back to RUN mode and ran the set momentum low which should signal the unit to switch to command mode.  The track light started slowly blinking. (First time I have gotten this far).  I then ran the Boost command to send power to the track and the track light started blinking fast showing there was power to the track...and there was. 

Thanks for the input from everyone!!

On to conventional mode.


byte set[] = {0xFE, 0x00, 0xAB}; // Set Engine Address to 1 in PRG mode
gtSerial.write(set, sizeof(set));

byte low[] = {0xFE, 0x00, 0xA8}; // (Low Momentum / Command Mode) RUN mode
gtSerial.write(low, sizeof(low));

byte boost[] = {0xFE, 0x00, 0x84}; // Boost (Powers up Track) RUN mode
gtSerial.write(boost, sizeof(boost));

Last edited by Roger Williams


Your request took me back in time.  At one point I was considering undertaking the same kind of thing.  Time flies, and I set it aside.  That was about 15 years ago.

I was using a laptop though.  The Arduino would make it a nice tiny package.

Keep us up to date on how it turns out.



Add Reply

OGR Publishing, Inc., 1310 Eastside Centre Ct, Suite 6, Mountain Home, AR 72653

Link copied to your clipboard.