Making a DIY data cable for the Zoop Novo Diving Computer [Old Version]

Update 11/01/2020: New post with an updated version without an Arduino board can be found here

Update 09/01/2020: I found it easier to use ESP32 and get it working. You also don’t need resistors and it’s safer to use because the ESP32 working voltage is 3.3V.
The process is the same, the connections are different.
I used the Lolin32 Lite (which has a CH430 USB-SERIAL).
Modified drivers for the CH430 and connection diagram can be found on my gitlab.

Few months ago, I went diving and decided it’s time to get a my first diving computer.
A little research and I came into conclusion that the Suunto Zoop Novo is what I should buy.
It’s cheap (around $200 in Eilat, Israel), and have many positive reviews.

This diving computer has an option to sync it with your PC and watch the diving logs in Suunto DM5 app (or other open source apps), but unfortunately it sold without the data sync cable 🙁

If you wish to get an official cable from Suunto, you will have to pay around $84 on Amazon ! (with shipping it’s $100 to Israel )

A little googling and I found many DIY cables, but for the old generation of the Zoop Novo.

How hard can it be to make this diving computer to talk with my PC?
Well, not so hard if don’t care using other apps for syncing ,
and a little harder if you wish to use Suunto DM5 app.

Lets try to make it short

I will write in more details when I’ll have time (it took me 3 months to write this post :S)

The diving computer has a connector with 2 connection points and a ground.
After poking with it for a ‘few’ hours (I drained all my computer battery and had only 6 dives with it!!) I found that:

  • A voltage on the Enable pin makes the diving computer enter the Data Transfer mode.
  • The Data pin is a bi-directional line, using UART for communication.
  • All the metal around the pins is ‘ground’.

The Suunto DM5 application is looking for a communication port named ‘Suunto USB Serial Port’.
I used an Arduino Pro Micro, which has build in USB functions and can act as USB Serial COM device, and had to change the driver so it’s name will be ‘Suunto USB Serial Port’. It’s very easy but require to disable driving signing enforcement .

I can still sync the diving computer without doing this, but I have to use other apps like ‘Subsurface’.

Because there is only one data line, it was not possible to connect both RX and TX of the Arduino’s UART together as is.
I used the Arduino’s hardware UART to read the data from the diving computer, and used Software Serial to write to the diving computer. When not reading – I changed the TX line gpio to ‘Input Pullup’ so it’s won’t interfere with the reading operation.

A command that was sent from the Arduino, and a response from the diving computer (the lower voltage signal)

I used the 5V from the Arduino pins. I didn’t know it’s safe to use 5V here, so I used 330ohm resistors in series with for the ENABLE and the TX of the DATA. I found this value gives about 3.2V, but maybe using a higher value will work too and it will be even safer.

How it works:


DM5 app is sending data for the Diving Computer in a COM port called ‘Suunto Diving computer’, but it’s actually sending this data to the Arduino.
The Arduino receives is in it’s default serial that is connected to the usb, and forward it to the Diving Computer using SoftwareSerial on gpio 8.
When the DM5 app is not sending anymore data, the Arduino change gpio 8 to “Input Pullup”, and starts reading data from ‘Serial1’ (this is HW serial), and forward is on ‘Serial’ (which is connected thru USB to the computer)

Arduino Code

#include <SoftwareSerial.h>
#define SW_TX 8

SoftwareSerial mySerial(4, SW_TX); // RX, TX

void setup(){
  Serial.begin(115200);     // Between computer and Arduino
  Serial1.begin(115200);    // Between Arduino and Diving Computer
  mySerial.begin(115200);   // Between Arduino and Diving Computer
  
    while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  pinMode(SW_TX,INPUT_PULLUP);
}

void loop(){
  if(Serial.available() > 0) {
    pinMode(SW_TX,OUTPUT);  
    digitalWrite(SW_TX,HIGH); //UART lines should be HIGH on IDLE
  
      while(Serial.available()  > 0){
        mySerial.write(Serial.read());
      }
    pinMode(SW_TX,INPUT_PULLUP);
  }
  
  while(Serial1.available() > 0){
    Serial.write(Serial1.read());
  }
}

The Ugly Side

I didn’t find any novel way to connect with this connector.
I took a clamp and drilled holes in it, then pushed ‘pogo pins’ in such a way they will touch the connection points.
I need to think and make something more simple.

awwww..

And.. that’s it.
I can now sync my diving computer with my PC.

You can find the modified .inf file and the code in my gitlab:
https://gitlab.com/itaysp/suunto-data-cable

And you can download the full driver from Sparkfun’s website (just use my .inf file)

27 thoughts on “Making a DIY data cable for the Zoop Novo Diving Computer [Old Version]”

  1. Hi and thank you for the nice tutorial.
    I have still some problems also because I want to use an Arduino Nano and two SoftwareSerials.
    According to my observations the two pins for “Enable” and “Data” are swapped. My SUUNTO goes into data mode if I put 3.3 Volts at the first pin from left.

    1. Hi,
      I tried to use software serial too but it didn’t work back
      then and I didn’t spend time to investigate if it possible.

      You are right about the pins, I fixed it.

      Thanks

    2. High again, unfortunately i did not succeed. Not with an Arduino Nano, nor with a Mega (and thus two HW serial ports).
      If I send 0F00000F i get a nice answer from the dive computer.
      everything work ok.
      but DM5 and Subsurface do not recognize the dive computer.

      so bad !
      Any idea ?
      Thanx
      Marcello

      1. I suggest you try the new hardware setup
        http://itay.cc/?p=340

        It works much better then this old method.

        You can still use Arduino and use the old code with that method, but no Arduino is needed now when using a USB-SERIAL adaptor.

      1. I tried with a Maga. More or less with a code similar to yours. NO WAY.
        I had to play a little bit with pullups resistor values and DigitalWrites to get a very nice communication. The Suunto replies very nicely, but no way to get it wotking with the software DM5 or Subsurface.

        I nocided a CRITICTY: everything the computer sends to the Arduino ant thus the Arduino sends to the Suunto is also picked up from the receiving serial interface Suunto -> Arduino->Computer.

        It is a sort of echo going back to the computer.
        So if you send “15,0,0,15” our Suunto interface replies with the same “15,0,0,15” + “real anwer from Zoop”.

        Maybe this is the problem.
        Maybe this echo does not occour in your design for some timing reasons …

    1. It didn’t work for me with only one hardware serial.
      The mega have more than one, so it might be possible.

  2. i have tried adapting the code like so to the mega
    #include
    #define SW_TX 16

    //SoftwareSerial mySerial(4, SW_TX); // RX, TX

    void setup(){
    Serial.begin(115200); // Between computer and Arduino
    Serial2.begin(115200); // Between Arduino and Diving Computer
    Serial3.begin(115200); // Between Arduino and Diving Computer
    //mySerial.begin(115200); // Between Arduino and Diving Computer

    while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
    }

    pinMode(SW_TX,INPUT_PULLUP);
    }

    void loop(){
    if(Serial.available() > 0) {
    pinMode(SW_TX,OUTPUT);
    digitalWrite(SW_TX,HIGH); //UART lines should be HIGH on IDLE

    while(Serial.available() > 0){
    Serial3.write(Serial.read());
    }
    pinMode(SW_TX,INPUT_PULLUP);
    }

    while(Serial2.available() > 0){
    Serial.write(Serial2.read());

    }
    }
    but it still doesn’t work

    1. Did you modify the driver for the Arduino Mega to change its name to ‘Suunto USB Serial Port’ ?
      This step is crucial when working with Suunto DM5 app.

  3. Hello, thanks for the tutorial, I followed all the steps except the resistors and I cannot connect the dive computer to the pc. It enters on data transfer mode but nothing else, even on subsurface. I checked connections and seems all right. Also I tried with suunto driver, Itay´s driver and sparkfun driver, makes no diference. Anything else do I need to check??, thank you

  4. Just adding:
    RX led turns on with suunto driver, but TX does not light at any time.

  5. I like your post. Where are you from? I mean what nationality are you? May I ask you to contact us so that we can talk? Can I write to you directly?

  6. would anyone be willing to make a video tutorial for this? i’m completely new to this but would like to use this DIY cable as i refuse to pay $110 CAD for the cable.

    i will eventually study everything here and learn but a video would make the learning process faster for me. i also dont wand to do anything wrong :/

  7. Super post , does someone has more details of the pins or a tip to make them, because the position is very close to each-other just to make connection with the suunto or other suggestions to make this connections.

    Are there other standard connectors we could use and fine tune for this functionality ?

    I tried to use an arduino nano, but he had problems to compile ( error on serial1)..is it possible to use an arduino nano ? Anyone tried ?

    1. Arduino nano has only 1 serial so you get this error.
      I recommend trying with to an ESP32 which is very cheap (might even work with esp8266).

      Regarding to the pins, I didn’t find a clever way to to so yet.

  8. Question : Is it also possible to upgrade the firmware of your suunto novo with this cable ?

  9. I don’t understand why it won’t work if the pins are in the correct configuration. Why is that different than the regular cable from Suunto?

  10. I am using an ESP32 with Subsufrace (the esp32 has a different serial device, so I need different drivers than the ones you provided and I don’t know how to modify them, so I can’t use DM5)
    But every time I try to import dives – I get a “Dive import error” during the import
    It usually process about 1-3 dives before throwing that error (I have 20 dives on my computer)
    Any idea what can be the problem?

    1. I can try to help with the drivers for the ESP32.
      We need to know first but USB-UART module you have on your board.
      If this is a high quality one, you may have CP2102 or similar from silabs.

      If you have a some from Aliexpress, you probably have some version of CH340..

      I think the failure problems is caused because of some errors in the communication.
      Maybe the resistor values are not dialed correctly and some data is misinterpreted..
      My circuit needs some improvements I guess :/

      1. The ESP32 I have has a CP2102 USB-UART module

        As for the failures – I thought that using a ESP32 required no resistors?
        Where and what resistors should I add to the ESP32?
        Will using a FTDI board from your newer post solve the problems?

  11. Is it possible to do the same for older Suunto Zoop (not novo)? Looks like it has only two pins

    1. No, you can’t use this tutorial as is.
      I guess the idea is the same. Maybe you don’t need the enable pin, but I’m not sure

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.