Well here we are in 2020, remote work is finally here and after decades of marketing by every major telecommunication company, my mum knows how to make a video call. Unfortunately this sudden enthusiasm caused unprecedented shortages of webcams. We can't let this slow us down as there are important calls to be made and I have the solution. Introducing the Mitsubishi VisiTel!
Well it has taken almost 30 years and a global pandemic, but we finally have accepted the inevitable fact that we are going to have to take a shower before talking to our colleagues on the phone. Video telephony is here in force.
I am not the first person to think there is something specially kitsch about the VisiTel. People have been tinkering around with these for a while and despite not having motion video, it is one of those products which was clearly a feat of engineering and massively ahead of its time.
Japhy Riddle's video is what got me really interested in the VisiTel. He pointed out that by slowing down or speeding up the recording of an image sent to the VisiTel the image skewed on the screen. Immediately I knew this meant the device used a simple AM modulation scheme. With that knowledge in hand, I jumped on eBay and picked up a unit to play with. My goal: to make this glorious time capsule of late 80s tech work with 2020's work from home platform of choice, Zoom, so I can chat with my colleagues. Moreover I want to do this without modifying the hardware because these things are just too cool to butcher.
Step 1: Electrical interfacing
The VisiTel is extremely easy to set up. On the back of the device is one long cable with a Y joint near the end (more on this in a minute) and two plugs. One plug is a 2.1mm DC barrel jack with which the device is powered. It expects 15 volts center positive. Oddly they chose to write the number 15 on the device in a font that makes it appear to read "IS Voltage". The second plug is an RJ11 connector with two of the pins populated. This is the standard layout for a telephone handset. If you remember corded phones you might also remember that the receiver was connected to the dialy bit (technical term) by means of an RJ9 connector and the dialer to the wall with an RJ11 connecter. The intent being that you could plug other accessories into your dialer, or replace the receiver | cable if something went wrong. Not that the latter problem would happen often because telephone handsets used a special kind of wire which is extra flexy.
Returning to the back of the VisiTel, along with the cable there is also a RJ11 socket. After scratching my head for a while the obvious dawned on me. The VisiTel is designed to man in the middle your telephone so that it can listen or transmit whilst you make calls. That leads to an obvious problem, as the VisiTel unit is sharing the wiring in parallel with the telephone the user is going to hear images being received and transmitted. Well the engineers at Mitsubishi thought of that and whenever you receive an image or transmit one there is a loud click from the device as a relay disconnects the handset. For our application we aren't interested in listening to the audio signal, so we aren't going to plug anything into that RJ11 socket on the back of the device. This makes the isolation relay superfluous meaning it could be removed for clickless image sending.
So how do we communicate with this device? My computer for one doesn't have an
RJ11 socket on it.
No worries, apparently there is a market for
adaptors to connect your RJ9 telephone handsets to smartphones.
Or you can simply snip off the RJ11 connector and solder on a mono 3.5mm jack.
Note: I originally thought the VisiTel had an RJ9 connector not an
With your 3.5mm jack in place connecting couldn't be simpler. Get a USB sound adaptor with separate microphone and headphone output jacks (not TRRS) and plug the VisiTel into the appropriate socket.
I said that I'd get back to the Y joint on that cable. On my device the wires in that joint had failed, not a nice solid "it's broken" failure, but one of those nasty types of failure where everything works when you go to bed and the next morning it doesn't. If only the VisiTel team had used some of that special extra flexible wire. This intermittent failure cost me days of staring blankly at screens, fruitlessly looking for thermal issues, and triple checking my sound card settings. Eventually I discovered the failure when in frustration I picked the device up during a test and saw a crackle of static on my recording. If there is a lesson about old hardware to be learned here it might be to perform a "jostle" test once you have everything working and see if anything suddenly doesn't.
Step 2: Understand the protocol
As you can see above I wanted to validate my understanding of how data was encoded, so I sent some very simple sample images from the VisiTel. These were made by holding colored pieces of card in front of the camera one piece black and one piece white.
warning loud 1750Hz tone
As you can see, there appears to be some kind of initialization / header / preamble at the beginning of each image @17.55 to @17.80 in this example. This allows the receiving device to detect that an image is about to be sent and determine the maximum amplitude of the signal. This maximum amplitude is then used as a scale factor during image decoding so that a lossy quiet phone line doesn't make the images being transferred lose contrast or brightness. Note: the signal you can see before @17.55 is simply noise on the line and isn't important for the operation of the VisiTel protocol.
Carrier wave --> "Silence" --> Carrier wave
In order to find these I implemented a simple FFT based detector and a finite state machine. First the waveform is transformed into the frequency domain. The detector then inspects each block of audio until it finds the carrier a strong signal at 1747Hz. Blocks are then inspected until the signal disappears and returns again. At this point the start of a transmission has been found. From here a simple static offset is used to find the beginning of the image data and the image decoding routines already discussed are utilized. Once an image has been decoded it is displayed and the finite state machine is reset in order to listen for the next transmission.
Step 3: Present the device as a webcam
. .(., , )
and whenever a new frame is available :
With that simple addition to the decoding program success. Zoom can now receive images from the VisiTel and we can video chat like it's 1988.
Going forward I'd love to setup a linux Direct Rendering Manager driver for this so that I can output images onto the VisiTel screen as well as receiving them. For now having the video capture setup and working in Zoom is enough for me to call this project a success.
I hope you enjoyed that write up. Check out the code on GitHub and please
let me know if you setup your own VisiTel webcam https://github.com/Bostwickenator/VisiTel