onsdag den 27. januar 2016

Analyzing Sony's new Multiport protocol

Hi there!

Been some time since the last post, but there was a lot to do and a lot of new ideas to follow.
As you might suspect with a multicopter like the DJI s900 I wanted to carry a bit of weight with the setup and try to hunt for some nice photos and videos. For this there is a decent camera required and at the moment I'm following the path to use my Sony A6000 (well we will see what my wife will be thinking of that ;) ). But for the time being this is the plan.
Just carrying this camera with a copter like the s900 would be quite easy. But I also would like to trigger and control the camera functionalities (zoom, video, focus, trigger) from the ground. So there is a remote control for the A6000 required.
One special thing about newer Sony video and photo cameras is the new 'Multiport'. It is looking like a micro USB-interface. But there are not only 5 USB pins built in, it also has 10 additional pins furhter back within the camera jack. These pins are more easier to recognize when you look at the plug of this "Multi"-style connector. There you have a hard time recognizing USB pins, but the 10 additional "Multi" pins are easy to see:

Sony has not also some fancy new connectors, but there was also a serial protocol called "LANC" with which you could control Sony equipment over years and years. This LANC protocol is known to hobby sites around the web. And LANC gives you a multitude of possibilities at Sony's photo cameras, video cameras and even studio equipment (VTRs, ...).
Two of the best sources for the serial LANC protocol with its inverted 5V logic levels ('1' = 0V; '0' = 5V) and a baud rate of 9600 are:

Camera remote pinout lists

'control your camera' blog

My first guess after some research was, that Sony's A6000 is also using the regular LANC protocol. And there are several projects for Arduino compatible uC-boards to make us of this documented and quite easy to address communication interface (just use your favorite search engine to look things up).
So situation seems very nice on the first glance, but my estimation for A6000 + LANC was a bit to optimistic. It turns out: A6000 does NOT make use of the older LANC protocol. It is using an new (let's call it) "Multi" style serial communication. I recognized this, after I hab tinkered a Multi plug adapter and hooked up my DSO scope to the signal lines.

But first things first before talking about the protocol. At the beginning of my journey, I had to built my Multi plug. And I want to show you first how you can achieve a quite cheap adapter cable yourself:

You will needed a Multi type connector to access the several signals of your cameras Multi port. Possibilities here are:

1. buying a comercial Multi port connector cable and introduce it to some of your knifes and pliers

2. buying a Multi port connector with a (more or less) finished brakeout PCB from this site: Link

I was hovering my mouse already above the buying button from option 2, but the connector is delivered from Slovenia (as much as I know). So delivery would have taken quite some time and my tinkering weekend was near. Sorry to the shop, but in the end I decided to order an AV video cable with the sepcific Sony connector from a big commercial plattform. It looks like in the picture below and is from a company called JJC. This cable was delivered next day.

I'm very sorry for the nice owner of the shop from option 2!
(He seems quite nice and always leaves kind and open minded  comments in some forums).

But going on, I dissected the AV cable next. The steps are as follows:

1. Cut the AV cables some centimeters behind the Multi plug (OK, i did this later on, but I think now, that it would be easier to cut the cable first)

2. Remove the plug's cable bend protection rings behind the connector (gives easier access to the rest of the housing)

3. Gently cut into the side wall of the rubber/plastic housing. You only need to cut about 3mm deep. Be careful and don't damage the PCB and connector within the rubber/plastic to much!

4. Gently spread the housing open and cut along the cables embedded at the end of rubber housing. Don't pull to much at the connectors PCB. If you pull too much you will rip off some of the PCB's pads. And you really LIKE these pads later!

5. When you have freed the connector and its PCB from the nasty housing, you can take your soldering iron and remove the small cable bits left on the pads. I also used some solder wick and scrubbed the PCB pads clean of remaining solder.

And there it is, your perfect 5 + 10 pin "Multi"-style Sony connector with a nice breakout PCB for at least some of the very narrow pitched connector pins.

With this connector and a pin layout from this side here, I soldered a connection cable for the A6000's Multi port with which you can access all necessary signal lines. Here you have to be careful: the pin numbering printed on the PCB is inverted to the numbering from the great camera pinout website I mentioned. (At first I did solder the wire with matching numbering of the pins on the PCB and the website. But meassuring the pins with a multimeter when plugged into my camera I recognized the inverted pin order.)

The final (cable fitted) connector looks like this:

Layout according to the pin numbering on the PCB of the sourced Mulit connector is:

VBUS (+5V, max 2A)

+3.3V (MULTI_DC)
"UART_TX" / "LANC_SIG" (At A6000 it seems to be UART; No LANC!)
"UART_RX" / "BOOT_IN" (At A6000 it seems to be UART; No Bootloader/Debug)
SELECT (resistor against M01 or M09 for selecting Multiport functionalitites/protocol)
Audio R out / activate camera / focussing (focus with direct trigger cable)
Audio L out / release shutter (shutter with direct trigger cable)
Maybe composite video out (no AV-out at A6000 known to me!)
GND (identical to GND_USB)
Power_On/Off (short to GND)

(This pinout was updated via the pin listing at the end of this post)

Now equipped with this cable, I was ready to set off to investigate the communication capabilities of my camera. But before poking at random lines on and switching random signals, I investigated in the dark deeps of the web if there are already some more documentations available.

On my search, I uncovered some other people who already have tackled the A6000 successfully. But sadly none who wanted to share a bit of documentation for the Multi protocol.
There are quite a number of commercial possibilites available via the web. I am quite sure my listing below is not absolutely complete, but it gives an overview about the recent sold possibilities:

Product   ->

Features \/
Seagull Rec
Stratosnapper 2
GentWire Multi
RC Shutter

Price (€)
107 (incl. cable/shipping/tax)
59 + 16=75 (+X for shipping/tax)
68+44=112 (+X for shipping/tax)
100€ (+X for shipping/tax)
~ 107€ (incl shipping & Paypal)
91€ (+X for shipping/tax)
(Sorry for the bad table layout. I am not that good at html. :)  )

So with this overview you can see where the pricing is tended: Too expensive for an Arduino style controller the is just pumping out some inverted serial commands via a proprietary connector. (At least this was the first thought with false knowledge and the conviction that A6000 is using the LANC communication)

With my false knowledge, I set sail for having a try with LANC protocol. As I still have some uC boards available at home (Arduino and Teensy). I pulled up my Teensy, gathered some code and libraries and had a try...

With Teensy connected to the camera and digging out my DSO scope again for investigating the back and forth on the signal lines I discovered the first difference between the regular LANC protocol and the newer (past 2014) Sony cameras:

Sony A6000 has a logic level on its communication line (Pin 3 "MULTI_com") of 3.3V instead of 5V at regular LANC! 

The MULTI_com line was permanent 3.3V. So the camera is not putting out any data on the MULTI_com signal line at all without any external stimulation. Even when switching the camera on or off, there is no communication on the MULTI_com line.

Now when digging in the documentation of the regular LANC protocol, there is a resistor with 180kOhm mentioned. This resistor is to be introduced between the SELECT line and ground or LANC_DC (in our case MULTI_DC). I decided to connect the resistor first to ground as a more save bet for the health of the camera. And voila! The MULTI_con signal line twitched several times and ended at permanent high (3.3V) again.
The communication from the camera looks like below:

On the above screen you can see a "zoomed out" signal trace. The Camera is trying 11 times to reach a counterpart for serial communication.

One frame of this communication is in total 5.56ms in duration

This is a com frame with a little more zoom from start to end

Distance between the beginning of the com frames which the camera is waiting for a retry is 60ms

Gained knowledge:

A6000 is trying to communicate via MULTI_com signal line when SELECT line is pulled to ground via a 'x' kOhm resistor. Number of communication attempts is 11 times and we know the timing of the frames and between the attempts.

Why am I writing 'x' kOhm instead of the prior mentioned 180kOhm in LANC protocol? I recognized the following in my reengineering:

A6000 is answering more reliably on a 100kOhm resistor between SELECT line and Ground instead when using a 180kOhm.

Is it save to lower the resistor value for the camera?
Let's tackle the numbers a bit. SELECT line has also about 3.3V.
At 100 kOhm you will have a resulting current between SELECT and ground of 33 microamps (3.3V / 100kOhm). With a 180kOhm resistor the resulting current will be 18 microamps (3.3V / 180kOhm).
I'm guessing I have a tough camera that will handle this difference with ease! ;)

As my scope is equiped with a serial analyzer, I just tried my luck on told the scope to interpret the communication bits and bytes. As LANC has a 9600 baud 8N1 protocol with inverted logic, my scope delivered the following results:

Looking at the first picture above from my scope, you will see a more detailed view of one communication attempt from the camera. The transmitted data can be decoded via serial RS232 protocol with inverted logic into the following data (in hex):

[6D], [EE], [EE], [6E]

When we use the bit timing of LANC and 9600baud for the MULTI protocol, we can trace down the first byte of the first com block into the following bits:

What have we learned from the scoping above?

A6000 is most probably using inverted serial protocol at 9600 baud data rate

A6000 has a bit length of about 104 microseconds to 106 microseconds

A6000 is most probably using a serial layout of 8N1 (8 data bits, no parity, 1 stop bit)?

New finding: A6000 is most probably using a serial layout of 8E2 (1 start bit '0V', 8 data bits, 'even' parity bit, 2 stop bits '3.3V') LINK

But for the last one I am not that sure.
Maybe there are some interested people out there that have some additional knowledge of serial protocols and can support in decrypting the A6000 communication.

So what have we achieved in the end?
We gained some knowledge about differences between the already known Sony LANC protocol and the somewhat "new Sony 'MULTI'-style protocol".

And we know the new communication differs from the "old" LANC protocol in some ways!

There are no sync triggers sent from the camera when a connector is plugged in (= 100kOhm resistor connected between SELECT and ground).

(On the LANC protocol pages linked above, you can read that with LANC, the camera is always triggering communication with a start bit)

I also tried to confront the camera with a "Record video" LANC command in a 25ms pattern with the help of the following code, but with no luck. The camera din't answer or perform any actions in response.

I guess the next step is either buying one of the cheap cable remotes that mimic Sony's "RM-VPR1" remote (which can control the A6000), or just buy one of the quite "heavy on the pocket" commercial RC remotes mentioned in the first table of this article.

If someone else already has some knowledge about the new "MULTI"-style Sony protocol (which is incompatible to the already known "old" LANC protocol) I would be very glad to cooperate with other people who are interested to avoid quite expensive commercial products.

Don't get me wrong here: I would be willing to pay for a good and already functioning product some guys have invested quite some time and effort into. But my limit here would be something like 60 Euros. 100 Euro is definetly too much for my taste, when you are buying a product where the hardware is maybe something 20€ in total (PCB, ATMEGA328p, SMD birdseed and some connectors). --> :/

I will be posting any new knowledge about controlling the A6000 as soon I have more time to tinker on the camera and maybe a cheap rebuild "RM-VPR1" remote.

All the best!

Have discovered a forum post (only in german, sorry) where someone has found the official Sony names for the pinout of Sony MULTI port plug:

  • 1: "VBUS" - 5V-Eingangsspannung vom USB-Host
  • 2: "D-" - USB-Datenleitung (negativ)
  • 3: "D+" - USB-Datenleitung (positiv)
  • 4: "USB_ID" - für USB-OnTheGo
  • 5: "GND" - in der Kamera mit Pin 14 ("AV_GND") verbunden
  • 6: "D_3.1V" / "LANC_DC" - Ausgang für 3.1 bis 3.3V Spannung
  • 7: "XRESET_REQ" - Eingang für Reset-Anfrage
  • 8: "UART_TX" / "LANC_SIG" - optionaler Ausgang für serielle Schnittstelle (Debug) oder LANC
  • 9: "UART_RX" / "BOOT_IN" - optionaler Eingang für serielle Schnittstelle (Debug) und Bootloader
  • 10: "AD_JACK_IN" - Analoger Eingang für Widerstand zur Erkennung des angeschlossenen Kabel-/Zubehörtyps
  • 11: "LINEOUT_R" / "XAE_LOCK_SW" - optionaler Audioausgang (rechts, in der Kamera über Kondensator entkoppelt) und/oder Eingang für Auslöser (1. Stufe) im Fotomodus der Kamera (und mit richtigem Widerstand an AD_JACK_IN)
  • 12: "LINEOUT_L" / "XSHUT_SW" - optionaler Audioausgang (links, in der Kamera über Kondensator entkoppelt) und/oder Eingang für Auslöser (2. Stufe) im Fotomodus der Kamera (und mit richtigem Widerstand an AD_JACK_IN)
  • 13: "VIDEO" - optionaler Composite-Video-Ausgang
  • 14: "AV_GND" - in der Kamera mit Pin 5 ("GND") verbunden
  • 15: "XPWR_ON" - Eingang für externen ON/OFF-Taster (gegen GND)
Big THANKS! to those guys on the german forum!
Attention! Pin numbering differs through the web for this plug.