This project emulates a simple service remote for LANC enabled camcorders on a PC using an Arduino Nano Every to translate between a LANC device and the Arduino's USB-serial interface as well as a simple GUI resembling the functions of a service remote for status monitoring and control.
As magnetic tape video media and recording/playback devices from the last millennium and early 2000s are becoming increasingly obscure historic artefacts, the issue of long-term conservation before those tapes turn into dust is now more pressing than ever. Functioning hardware from that era is becoming rare and professional service tools are collecting dust in some retired VCR technicians' basements never to be seen or used again. Sony's ancient LANC protocol enables professional functions such as automation, monitoring and low-level service mode access on most of their camcorders, which is a valuable tool for any professional or even enthusiast hobbyist conservation efforts, giving the old hardware one last and very important purpose before it can be retired to the museum forever. Although the tech has been long forgotten and only remnants of closed-source Windows 95 "apps" using the parallel port are haunting the internet archives, enough documentation is preserved to rebuild the necessary tools from scratch with modern inexpensive parts and, more importantly, make it open source.
This project uses an Arduino Nano Every (ATMega4809) since it is currently the cheapest Arduino with an onbaord USB interface. The previous-generation Nano 3.x (ATmega328) should also work with the code but requires adjusting the register names for the digital read/write pins.
This simple wiring diagram is used in most 5V microcontroller-based LANC implementations. Note that the Arduino is USB-powered. The 5.1V Zener diode protects the Arduino because the LANC supply/signaling voltage can go to up to +8V as per spec and can be omitted (at your own risk!) if your camera uses not more than +5V. An even simpler 1-wire implementation (LANC line directly to a digital pin) is also possible with a 5V device, but generally the LANC supply voltage should be used for signaling (via the transistor) and the code uses dedicated input and output pins (though it can be easily adapted for 1-wire communication).
Example wiring:
Use the Arduino IDE to compile and deploy the sketch arduino_lanc_nano-every.ino
to the Arduino Nano Every. Make sure you select the Nano Every board and use native ATMega4809 registers, not ATmega328 register emulation (Tools menu). The correct USB serial port driver should be automatically installed through the IDE. By default, pin 3 is LANC in and pin 4 is LANC out (as in the schematic), which can be changed in the #define section in the code (see the Arduino Nano Every documentation for port assignments of the pins). Pin 13 (parallel to the onboard LED) is high during a LANC frame and can be used as a trigger/sync.
The code follows the protocol documentation and is loosely based on the Arduino Nano LANC implementation by L. Rosén with some important changes:
- The original code only returned a single LANC frame after a command has been sent. The new code reads every LANC frame (at 50Hz for PAL or 60Hz for NTSC) and sends it as raw data (8 bytes followed by a line feed) to the serial port. The terminal program has to convert the code into hex characters to be human readable if required. The data is sent over the serial port at 115.2kbps as soon as one byte is received from the LANC line.
- The background functions provided by the Arduino transparently to the user (such as timers) make use of interrupts and introduce unpredictable ~10µs jitter a few percent of the time. Interrupts are disabled in the new code during the critical bit-banging period, elimitating all timing jitter.
- The LANC command from the user is read over the serial port between the LANC frames. A command consists of 2 bytes formatted as hex characters (i.e., 4 ASCII characters representing hex digits) followed by a line feed.
The GUI software Sony LANC remote.vi
mimics some basic functions of a wired remote (such as the RM-95) including EEPROM read/write functions of a service remote and monitoring of camera status and time codes. The implementation follows roughly the available documentation and advanced commands can be sent through the drop-down menu or a command code can be entered manually as 4 hexadecimal characters (2 bytes). The LANC interface (including EEPROM functions) is completely exposed, so use at your own risk! More functions can be explicitly implemented in the future if the documentation becomes available.
The GUI software is written in National Instruments Labview 2023, which requires the development environment (including NI-VISA or NI-Serial) to view and edit the source code. A compiled executable is available for Windows (under Releases), which requires the free Labview Runtime Engine 2023 and NI-Serial Runtime 23.3 or later.
Run the .vi or the compiled executable with the Arduino connected to the PC and the (active) LANC device. Select the Arduino's COM port in the prompt at startup and click Ok. Once the GUI is connected and showing the camera status, you can send commands with the buttons, from the drop-down menu or as manual hexadecimal input. Note that the forward/rewind buttons can be used for forward/backward seek when held down during playback.