Decoding the Disneyland Monorail Remote

boBQuincy

<font color=green>I am not carrying three pods<br>
Joined
Nov 26, 2002
Decoding the Disneyland Monorail Remote Control

The Disneyland monorail set is the remote control version with FWD, REV, STOP, and SOUND. FWD and REV are either on or off, full speed or stop. Not that full speed is much to talk about, the DL monorail took 29 seconds to go around a circle, more than any other monorail I have tested.

The remote is infrared, not radio. The "beacon" on the roof of the powered cab is an infrared receiver. The controller has an infrared transmitter behind the piece of blue plastic at one end. The carrier frequency is 38 KHz and the controls send out a pulsed signal to activate the various functions.

The protocol is simpler than expected, 6 pulses define the various outputs depending on the position of a longer than usual space between the pulses. This is known as Pulse Position Modulation, PPM. The pulse train is repeated about 10 times to ensure the receiver gets the message, in case of interference from sunlight, fluorescent lights, etc

The messages are:
FWD 1 pulse, space, 5 pulses
REV 2 pulses, space, 4 pulses
STOP 3 pulses, space, 3 pulses
SOUND 4 pulses, space, 2 pulses

This leaves at least one message for expansion (5 -s -1) that does not appear to be used for now.

Hacking: can more functions be added or can speed control be implemented? Yep. An auxiliary infrared transmitter can send new signals over the same frequency. The infrared receiver output can be ported to a secondary decoder to decode and act on the new signals. The black glob on the circuit board is the microcontroller that decodes the signals, it would ignore any "foreign" signals. A microcontroller ($2) can be programmed to decode the new signals, in this way we can add more functions to the monorail.

The motor speed can be controlled by increasing the speed each time the FWD button is pressed, 8 steps may be enough to get realistic operation (the real monorail has 8 steps as I recall). The lights could be controlled separately and lights could be added to the rear cab. Btw, the green LEDs can't be easily swapped out for more realistic white ones, white LEDs will not work with the low voltage provided by 2 AA batteries.

Is all this easier than just changing to radio control? Probably not although it would cost a lot less. Plus I like to have a flashing roof beacon like the real ones, that is difficult to do with an infrared receiver taking up the spot where the beacon should go.
 
Is all this easier than just changing to radio control? Probably not.

Having installed radio control, the answer IMHO after reading your excellent walk-through is definitely not.

A few other key points: RC doesn't require the remote control to have direct line of sight to the front car like infrared does. That is a critical benefit, given the tight and often obstructed quarters many if not most monorail layouts are set up in, particularly the common holiday-display-around-the-Christmas-tree variety. Also, it is easier to get full range, realistic speed control with RC, vs. the toy like "step" infrared version.

Bottom line: Disney went with infrared for their remote control version because it's cheaper, not because it's better. Can one hack it to make improvements? Certainly, as you have shown. But is it worth the effort, given the end result still can't do everthing that your prior RC approach can?

2011_1227Christmas2011cam0497.jpg
 
Last edited:
Having installed radio control, the answer IMHO after reading your excellent walk-through is definitely not.

A few other key points: RC doesn't require the remote control to have direct line of sight to the front car like infrared does. That is a critical benefit, given the tight and often obstructed quarters many if not most monorail layouts are set up in, particularly the common holiday-display-around-the-Christmas-tree variety. Also, it is easier to get full range, realistic speed control with RC, vs. the toy like "step" infrared version.

Bottom line: Disney went with infrared for their remote control version because it's cheaper, not because it's better. Can one hack it to make improvements? Certainly, as you have shown. But is it worth the effort, given the end result still can't do everthing that your prior RC approach can?

Disney went for cheaper? How can you say (write) such a thing?! ;) ;)

I agree, all my own models get fully proportional radio control because the speed control is so much better. And the newer radios have so many options, like a sound board that can play up to 11 sound clips in high fidelity! https://www.adafruit.com/product/2210

Btw, LOVE the TP Cat, had to download it!
 
Decoding the Disneyland Monorail Remote Control

The Disneyland monorail set is the remote control version with FWD, REV, STOP, and SOUND. FWD and REV are either on or off, full speed or stop. Not that full speed is much to talk about, the DL monorail took 29 seconds to go around a circle, more than any other monorail I have tested.

The remote is infrared, not radio. The "beacon" on the roof of the powered cab is an infrared receiver. The controller has an infrared transmitter behind the piece of blue plastic at one end. The carrier frequency is 38 KHz and the controls send out a pulsed signal to activate the various functions.

The protocol is simpler than expected, 6 pulses define the various outputs depending on the position of a longer than usual space between the pulses. This is known as Pulse Position Modulation, PPM. The pulse train is repeated about 10 times to ensure the receiver gets the message, in case of interference from sunlight, fluorescent lights, etc

The messages are:
FWD 1 pulse, space, 5 pulses
REV 2 pulses, space, 4 pulses
STOP 3 pulses, space, 3 pulses
SOUND 4 pulses, space, 2 pulses

This leaves at least one message for expansion (5 -s -1) that does not appear to be used for now.

Hacking: can more functions be added or can speed control be implemented? Yep. An auxiliary infrared transmitter can send new signals over the same frequency. The infrared receiver output can be ported to a secondary decoder to decode and act on the new signals. The black glob on the circuit board is the microcontroller that decodes the signals, it would ignore any "foreign" signals. A microcontroller ($2) can be programmed to decode the new signals, in this way we can add more functions to the monorail.

The motor speed can be controlled by increasing the speed each time the FWD button is pressed, 8 steps may be enough to get realistic operation (the real monorail has 8 steps as I recall). The lights could be controlled separately and lights could be added to the rear cab. Btw, the green LEDs can't be easily swapped out for more realistic white ones, white LEDs will not work with the low voltage provided by 2 AA batteries.

Is all this easier than just changing to radio control? Probably not although it would cost a lot less. Plus I like to have a flashing roof beacon like the real ones, that is difficult to do with an infrared receiver taking up the spot where the beacon should go.


By chance do you have a decode of the pulses?

I recently purchased one of these, the remote does not work. I have a way to send the IR, but have no way to decode it... If you have a way to decode or have the raw that would be Awesome! I know this is an old thread, but one can hope.
 


I have been working on a PIC program to decode the pulses, mostly so we can add remote to our WDW monorails (figuring most of us have a DL remote). It is not as easy as generating the pulses but I have it about 75% done, then our move to FL got in the way and I have not found time to work on monorails since December. With any luck I will be working on monorails again by autumn and maybe can work on the decode program during the summer when it is too hot to do much outside.

If your remote does not work it may be worthwhile testing the IR receiver first, by connecting an oscilloscope to the output pin and triggering the transmitter. Look for some pulses about 1 mS wide, I will add a waveform jpg later today.
 
I can confirm that the IR LED is not lighting up on the remote. I have also tested the IR led on its own, it works. the train seems to be working.
I have ordered another one off of the disney store. I also have an arduino based decoder and sender. again the problem is I dont have a working remote.
Once I get this working one I will be keeping a public repo with all of my information and documentation.
If only I knew someone who had one in Melbourne FL.
 
Dinolounger, it has been awhile, one of my more recent upgrades to the Mark VII was to add a circuit to control soft starts/stops. It is still a lot less work/$$ than RC but adds a lot to the realism. The acceleration of this one is still a bit fast but it is easily changed in software.

 


Website is back up, here is the waveform for Reverse:
20150126-0001_rev.jpg


2 ms INIT
; wait 3.7 Ms
; read 600 uS pulse
; wait 1.2 mS
; read next 600 uS pulse
; read 7 more data pulses
; first pulse must be a 1, last pulse must be a 0

The only valid combinations are the ones noted in my first post.
 
Last edited:
Will, looks like you are making a lot of progress. Your Arduino code sure is shorter than my assembly! ;) I am interested in what you will use for more sounds, I have not found many audio boards that fit in the monorail. Some noise suppression can be had by lining the plastic shell with DynaMat or similar, after that the gearbox and the hard plastic wheels need to go.
 
so, you dont actually need a sound board. you can hook the existing speaker up to an arduino. It can play mp3's at a 8 bit quality, more than good enough for me. with SD reader and an arduino nano, they can stuff in without any modification.

We have a Disney World monorail and it is WAY quieter than the Land monorail. I am thinking about doing a direct drive and not a geared drive, we will see.

Currently working on designing some 3d printed track. Next will be a switch to allow changing of tracks. Then I will get to the motor.
 
The Mark VII gearbox is a significant design change from the WDW gearbox, some improvements but mostly more noise. I designed a belt drive to reduce the noise, direct drive could be even better.

One modeler sells 3D printed beam on eBay, the challenge is to get the angle and width exact and consistent. My solution is to go with rectangular beam, looks better and is easier to make to close tolerance (+/- 0.15 mm).
 
Hi I'm not a programmer, but I'm trying to get my three toy Disneyland monorails to work with a BBC Micro:Bit. My plan is to use some 4x readswitchs and 4x IR transmitter on different pins so I make Block Sections to have them run automatically. But the Makecode Makerbit code is only NEC HEX code, what is the the monorails Hex codes. Are they NEC or some other protocol. Can someone help or witre a bit of code for Makecode or Mircoblocks which is an Arduino based block Programmer?

Tim
 
Hi I'm not a programmer, but I'm trying to get my three toy Disneyland monorails to work with a BBC Micro:Bit. My plan is to use some 4x readswitchs and 4x IR transmitter on different pins so I make Block Sections to have them run automatically. But the Makecode Makerbit code is only NEC HEX code, what is the the monorails Hex codes. Are they NEC or some other protocol. Can someone help or witre a bit of code for Makecode or Mircoblocks which is an Arduino based block Programmer?

Tim
The monorails have their own code/protocol, very different from NEC and other common TV types. It is a simple code, sync bit and 7 or 8 data bits. Mark VII and 50th Anniversary are similar but different enough not to cross over to each other.
Attached is a scope trace of the pulse train for a Mark VII.

I am not familiar with MicroBit, here is a snippet of code for 50th on an Arduino:

*** see post of 6/15/2023 for a link to the full program***


Disney 50th Anniversary specifications are

~ Carrier Frequency is 38kHz

* Logical '0' – a 500 µs space followed by a 1500 µs space
* Logical '1' – a 1500 µs pulse burst followed by a 500 us space
 

Attachments

  • mk7_fwd2_20220315-0002_08.jpg
    mk7_fwd2_20220315-0002_08.jpg
    36.4 KB · Views: 1
Last edited:
Thanks for this, I have attempted to translate this into MakeCode Blocks for the Micro:bit
But I will have to do a fair bit of work with it I think, if I want it to work on the Micro:bit.
Would it be possible to obtain a copy of the full code for the Arduino, so that I can see if I can get it to work?
I tried connecting to your website to see if I could find a copy there, but the link does not go to anywhere of monorail significance?

I can't seem to be able to attach a copy or a screen capture of the MakeCode, so unfortunately I can't show what this looks like.

I am not sure what a Blocking Program is either, but on the railway a Block Section is a bit of Track that only one Train can be in at a time.
The monorails have their own code/protocol, very different from NEC and other common TV types. It is a simple code, sync bit and 7 or 8 data bits. Mark VII and 50th Anniversary are similar but different enough not to cross over to each other.
Attached is a scope trace of the pulse train for a Mark VII.

I am not familiar with MicroBit, here is a snippet of code for 50th on an Arduino:

Disney 50th Anniversary specifications are

~ Carrier Frequency is 38kHz

* Logical '0' – a 500 µs space followed by a 1500 µs space
* Logical '1' – a 1500 µs pulse burst followed by a 500 us space

- a 6ms leading pulse burst (x times the pulse burst length used for a logical data bit)
- a 500 us space
- the 7 bit data for the receiving device (600 uS on, 600 off)
- a 1500 uS pulse follwed by a 500 uS pulse
- or a 500 uS pulse follwed by a 1500 uS pulse
- repeat for a total of 7 data pulses
- a 500 uS end-of-data pulse
- all data pulses are in one burst

- PortD is set for 2,3,4,5,6 outputs (0,1 inputs)
- LEDs have 150 ohm res for ~ 30 mA each
- four LEDs are used to produce a stronger signal

I am not a programmer so this program may contain lines that do not make sense
THIS PROGRAM IS A BLOCKING PROGRAM (whatever that means, that was in the original)
*/

#define IR 2
#define IR3 3
#define IR4 4
#define IR5 5
#define IR6 6
#define CarrierFreqInterval 13

void setup() {
DDRD = DDRD | B11111100; // this sets pins 2 to 7 as outputs
// without changing the value of pins 0 & 1, which are RX & TXpinMode(IR, OUTPUT);

PORTD = B00000000; // sets all digital pins LOW

}

void loop() {
// transmits Fwd - Stop - Rev - Stop in sequence, 3 second delay between
// unsigned long start = micros();


// transmit();

// unsigned long ends = micros();
// unsigned long delta = ends - start;
// Serial.println(delta);

transmit_stop();
delay(10000);
transmit_fwd();
delay(10000);
transmit_stop();
delay(10000);
transmit_rev();
delay(10000);
transmit_stop();
delay(10000);
}





void transmit_fwd() {
//Function for transmiting the data 1100 1110

//uint8_t bitcount = 0x0;

for (int t = 0; t < 1; t++) {

// 6ms pulse burst
for (int i = 0; i < 240; i++) {
PORTD = B00111100; // sets digital pins 5,4,3,2 HIGH

delayMicroseconds(CarrierFreqInterval);
PORTD = B00000000; // sets digital pins 5,4,3,2 LOW

delayMicroseconds(CarrierFreqInterval);
}


// 500 us space
delayMicroseconds(500);

// 1500 uS pulse burst 1
for (int i = 0; i < 60; i++) {
PORTD = B00111100; // sets digital pins 6,5,4,3 HIGH

delayMicroseconds(CarrierFreqInterval);
PORTD = B00000000; // sets digital pins 6,5,4,3 LOW

delayMicroseconds(CarrierFreqInterval);
}

// 500 us space 1
delayMicroseconds(500);



// 1500 uS pulse burst 2
for (int i = 0; i < 60; i++) {
PORTD = B00111100; // sets digital pins 6,5,4,3 HIGH

delayMicroseconds(CarrierFreqInterval);
PORTD = B00000000; // sets digital pins 6,5,4,3 LOW

delayMicroseconds(CarrierFreqInterval);
}

// 500 us space 2
delayMicroseconds(500);


// 500 uS pulse burst 3
for (int i = 0; i < 20; i++) {
PORTD = B00111100; // sets digital pins 6,5,4,3 HIGH

delayMicroseconds(CarrierFreqInterval);
PORTD = B00000000; // sets digital pins 6,5,4,3 LOW

delayMicroseconds(CarrierFreqInterval);
}

// 1500 us space 3
delayMicroseconds(1500);

// 500 uS pulse burst 4
for (int i = 0; i < 20; i++) {
PORTD = B00111100; // sets digital pins 6,5,4,3 HIGH

delayMicroseconds(CarrierFreqInterval);
PORTD = B00000000; // sets digital pins 6,5,4,3 LOW

delayMicroseconds(CarrierFreqInterval);
}

// 1500 us space 4
delayMicroseconds(1500);

// 1500 uS pulse burst 5
for (int i = 0; i < 60; i++) {
PORTD = B00111100; // sets digital pins 6,5,4,3 HIGH

delayMicroseconds(CarrierFreqInterval);
PORTD = B00000000; // sets digital pins 6,5,4,3 LOW

delayMicroseconds(CarrierFreqInterval);
}

// 500 us space 5
delayMicroseconds(500);

// 1500 uS pulse burst 6
for (int i = 0; i < 60; i++) {
PORTD = B00111100; // sets digital pins 6,5,4,3 HIGH

delayMicroseconds(CarrierFreqInterval);
PORTD = B00000000; // sets digital pins 6,5,4,3 LOW

delayMicroseconds(CarrierFreqInterval);
}

// 500 us space 6
delayMicroseconds(500);

// 1500 uS pulse burst 7
for (int i = 0; i < 60; i++) {
PORTD = B00111100; // sets digital pins 6,5,4,3 HIGH

delayMicroseconds(CarrierFreqInterval);
PORTD = B00000000; // sets digital pins 6,5,4,3 LOW

delayMicroseconds(CarrierFreqInterval);
}

// 500 us space 7
delayMicroseconds(500);

// 500 uS pulse burst final
for (int i = 0; i < 20; i++) {
PORTD = B00111100; // sets digital pins 6,5,4,3 HIGH

delayMicroseconds(CarrierFreqInterval);
PORTD = B00000000; // sets digital pins 6,5,4,3 LOW

delayMicroseconds(CarrierFreqInterval);
}





}
}
 
Thanks for this, I have attempted to translate this into MakeCode Blocks for the Micro:bit
But I will have to do a fair bit of work with it I think, if I want it to work on the Micro:bit.
Would it be possible to obtain a copy of the full code for the Arduino, so that I can see if I can get it to work?
I tried connecting to your website to see if I could find a copy there, but the link does not go to anywhere of monorail significance?

I can't seem to be able to attach a copy or a screen capture of the MakeCode, so unfortunately I can't show what this looks like.

I am not sure what a Blocking Program is either, but on the railway a Block Section is a bit of Track that only one Train can be in at a time.
My website is temporarily broken as I switch hosting services. I am xertain that a blocking program has nothing to do with model trains as I modified the program from one that controls televisions. Here is the full Arduino code:

Update 6/16/2023
To not clog up this thread with a long program I have uploaded the Arduino file to my website (which is mostly running again). monorail.suzieandbob.com/sketch_50th_inprogress_3.ino

Here is a snippet of the code:

/*
2/14/2023 - Works: FWD; STOP; REV
This is a code for Disney 50th Anniversary Infrared Transmission Protocol Transmitter

Disney 50th Anniversary specifications are

~ Carrier Frequency is 38kHz

* Logical '0' – a 500 µs space followed by a 1500 µs space
* Logical '1' – a 1500 µs pulse burst followed by a 500 us space

...etc
 
Last edited:

GET A DISNEY VACATION QUOTE

Dreams Unlimited Travel is committed to providing you with the very best vacation planning experience possible. Our Vacation Planners are experts and will share their honest advice to help you have a magical vacation.

Let us help you with your next Disney Vacation!





Top