Control an Arduino With a Wristwatch (TI EZ430 Chronos)




About: So many things to learn and make, so little time! I like things that are cool, useful, efficient, well crafted.

The watch
The Texas Instruments eZ430 Chronos is a cool gadget. It has bidirectional radio communication, and a whole bunch of sensors: temperature, pressure, acceleration.

In fact, it is a development kit for the MSP 430 (a low-power microcontroller), that TI packaged as a watch (pure genius!), and delivered with plenty of tools. Its firmware can be modified to implement new features into the watch.

Even without developing anything on the watch, it is a terrific toy:
- the watch alone is pretty cool --and has the TI logo ;-),
- the default features allow for a wide range of cool experimentations and developments around it.

The RF communication has a quite short range, and quite low consumption. It is not Bluetooth, but SimpliciTI[TM]  or BlueRobin[TM].

Pretty much documentation about the watch (sample code, specifications, schematics) can be found on the Web. Google is your friend.

Watch to PC
The watch comes along with an access point (i.e. the peer device the watch can talk to) in the form of a dongle, incorporating a TI chip that can, on one side, talk to the watch via RF, and on the other side, talk to the PC via an USB slave interface.

When the access point is plugged into a PC, a PC application provided by TI can exploit it to communicate with the watch: graph sensors, set the watch time, calibrate sensors, send fitness data. The nice thing is that TI wrote it in a scripting language (venerable Tcl/Tk) to run on multiple OS-es.

It is very easy to write your own PC application, as shown by some examples written in Python. There are numerous such examples that can be found on the web.

Watch to Arduino
What about using an Arduino instead of a PC? You could make completely pocket-sized projects!

Surprisingly, I could not find any clue about it on the web.

I evaluated several USB host libraries, and finally found the right application source code to get started (ACM on CDC, for modem, by Circuits@Home,; Oleg, thanks for the library, examples, and for the help!).

It finally works, it's very simple, and that's what I'm covering with the present post.

Just basic Arduino knowledge is required. However, this post is not an Arduino tutorial.

Enough said, let's get to the point!

Teacher Notes

Teachers! Did you use this instructable in your classroom?
Add a Teacher Note to share how you incorporated it into your lesson.

Step 1: Needed Stuff

The watch
You can purchase the TI eZ430 Chronos watch from several resellers (e.g. Mouser, Farnell, or Amazon). It will come along with:
  • software and doc on a CDROM,
  • an USB dongle that is an RF access point,
  • an USB dongle to reprogram the watch, (we won't use it here),
  • a screwdriver to open the watch (we won't use it either * )
(*) but hey, when did you last get a screwdriver with a watch, and a manual explaining how --and encouraging to-- open it?

The Arduino
Any more or less standard Arduino will do, and the most important thing is to have USB host capability.

For this, the following configurations are among the possible ones:
  • Arduino (mine is Duemilanove) and an USB host shield (mine is from Circuits@Home)
        - or -
  • Arduino Mega ADK (important: must be ADK variant! it has USB host on board)

Step 2: The Arduino Sketch

Have USB host library, v2.0
Install this library into your Arduino system:
  • Important: use this 2.0 version of the library
  • On Linux, the library files will have to reside in
Customize the USB host library for your board
  • Edit the library file avrpins.h
    (on Linux: /usr/share/arduino/libraries/USB_Host_Shield_2_0/avrpins.h)
  • and uncomment one of the lines #define BOARD_MEGA_ADK or #define BOARD_TEENSY if your board is one of these. For say Uno or Duemilanove, leave them commented out.
This is pretty annoying, especially if you have some of each boards, because you must remember to check/tweak the library after changing of board and before compiling... I wish the #define could reside in the sketch file.

Create the Arduino sketch
Create an Arduino sketch from the file attached in this step. Compile, upload and run.

How it works
The initialization is done by instantiating these objects:
  USB Usb;                   // instantiate USB
  ACMAsyncOper AsyncOper;    // Create CDC
  ACM Acm(&Usb, &AsyncOper); // Create ACM and bind CDC to USB

Then, in the loop(), one shall call this to let the USB stack run:

To exchange data with the USB device:
  Acm.SndData(frame_len, frame_to_send);
  Acm.RcvData(&len, receive_buffer); // init len w/ buffer size, will be updated with len received

We need to send two different frames, one to turn the dongle's RF on, and one to request data from the watch. Then we will need to receive and decode one frame, containing the watch response (or absence thereof).

Step 3: Using This Demo

This demo application initializes the RF access point in SimpliciTI[TM] mode, then keeps on sending accelerometer queries to the watch, gets the response from the watch, filters out, interprets and displays the result.
The access point returns responses by such frames:
  0xFF 0x06 0x07 KK XX YY ZZ

  KK = 0xFF when there is no response (no watch in range or sending, or frame lost)
  KK = 0x01 when no buttons is pressed,
  KK = other values depending on buttons
  XX, YY, ZZ = when KK is not 0xFF: value of X resp. Y and Z acceleration, as 8 bit signed int

The Arduino uses its slave interface connected to a PC to get its power from the PC, and send result messages to a terminal.

On the picture, you can see the output while I moved the watch and pressed on the #, * and up buttons. Note that the watch does not debounce the buttons, so one press can generate several events. If this is an issue, debouncing has to be implemented on the Arduino side.

Step 4: Next Steps

Very next steps
It is easy to modify the sketch in order to control LEDs, servos, relays, etc. by using the ACC or PPt modes of the watch. Arduino-based home automation and robotics can now get controlled by the watch.

In the PPt mode, the X, Y and Z acceleration values are all zero, and KK = 0x12, 0x32, 0x22 upon button presses.

Further steps
There are other features that are easy to use in SimpliciTI[TM] mode (getting sensor, time and date data, calibrating sensors), by slightly modifying this sketch, and setting the watch in the Sync mode.

Also, in the BlueRobin[TM] mode, one can send fitness measurement data to the watch: the Arduino can become a sport sensor.

Even Further steps
Then, by modifying the watch firmware itself, one can create brand new modes, displays and functions on the watch. I did not explore this area yet, but examples can be found on the web. It requires slightly more advanced knowledge (C, MSP430, and IAR toolchain).

I hope this post was useful.
Now, get a watch, an Arduino with USB host, and make and post an awesome project!

Pocket Sized Contest

Participated in the
Pocket Sized Contest

Be the First to Share


    • Made with Math Contest

      Made with Math Contest
    • Multi-Discipline Contest

      Multi-Discipline Contest
    • Robotics Contest

      Robotics Contest

    25 Discussions


    2 years ago

    I am only able to get one set of X Y Z values and then it stops.

    It is not displaying continuously as shown in step 3.

    Please help

    1 reply

    Reply 2 years ago

    I have the same problem, were you able to figure it out?

    Thank you!


    3 years ago

    Awesome work ! This thing runs thanks a ton.


    3 years ago

    I m using arduino uno board and whil running the code , im getting this error-

    In file included from C:\Users\sonal\Documents\Arduino\libraries\USB_Host_Shield_2.0-master/Usb.h:27:0,

    from C:\Users\sonal\Documents\Arduino\libraries\USB_Host_Shield_2.0-master/cdcacm.h:20,

    from eZ430_basic.ino:18:

    C:\Users\sonal\Documents\Arduino\libraries\USB_Host_Shield_2.0-master/settings.h:139:176: fatal error: SPI.h: No such file or directory

    #include <SPI.h> // Use the Arduino SPI library for the Arduino Due, RedBearLab nRF51822, Intel Galileo 1 & 2, Intel Edison or if the SPI library with transaction is available

    compilation terminated.

    Error compiling.

    please help me in resolving this problem.


    3 years ago

    good job my friend , helped me a lot. now I try to replicate the example blink

    Thank you

    5 years ago

    Here can I find the file Cannot find any attached file...


    5 years ago on Introduction

    can you give me the description of the code because there are many commands that i don't understand pleaseeeeeeeeeeeeeeeeeeeeeeee ?

    i need it for my project :(


    5 years ago on Introduction

    Hello, i just recieved my arduino and it works! Buy i need some help to changue the program for activate LED's. What's the name that you have for the X value when you receive that?. I dont know what variable can i use for activate LED's, than you. Pdt: what pinouts are better to use?

    1 reply

    Reply 5 years ago on Introduction

    To control an LED, please study the "Blink" example (File -> Examples -> 01.Basics -> Blink). Then if you still have questions, feel free to ask.


    5 years ago on Introduction

    Hi! I want to connect my RF with a PIC, do you know if this PID/VID is the same that the arduino? (The PIC that i want to use is pic18f4550, it have USB port). When i connect my RF to the pic, it lights for a moment and then off. I think that the problem is the PID/VID. Thank you!


    5 years ago on Introduction

    Hello!. Can you say me what is the VID/PID of the RF module for connect with an Arduino board? We have problems with the connect. Thank you very much!

    1 reply

    Reply 5 years ago on Introduction

    VID=0451 (Texas Instruments, Inc.)
    PID=16a6 (BM-USBD1 BlueRobin RF heart rate sensor receiver)


    6 years ago on Introduction

    So, I am running the host shield with the Uno (model R3). When I looked at the step for update library, I understood that I didn't need to do anything with this part and that I should leave those segments commented out. Is that incorrect? Any other ideas? Thank you, by the way, for responding so quickly.


    6 years ago on Step 2

    This community needs more eZ430 Chronos projects!!!!


    6 years ago on Introduction

    Hello - Thanks for putting this together. I have a question with running the program I am hoping you can help me with. Running the program is very finnicky. Sometimes it runs fine for several seconds before stopping, and other times I see on the Arduino Com screen that the program is starting but it quickly stops with various progress ending with lines such as "OnInit:", "Start", or "OSCOKIRQ failed to assert". Restarting my computer usually results in getting it to work a little more consistently, but it never lasts long. Is this something you can help with. I appreciate any help you might be able to give. Thank you.

    1 reply

    Reply 6 years ago on Introduction

    Did you customize the USB host library for your board?
    Please check step2: Edit the library file avrpins.h


    6 years ago on Introduction

    Thank you very much! That fixed it. Great instructable by the way.


    6 years ago on Introduction

    When I try to run this I encounter the following error:

    eZ430_basic.ino: In function 'void print_frame(char*, uint16_t, uint8_t*, char*)':
    eZ430_basic:133: error: no matching function for call to 'PrintHex(unsigned char&)'

    How is this fixed?

    1 reply

    Reply 6 years ago on Introduction

    OK, there has been an update of USB host library. I will need to update my project archive, but in the mean tiime, please replace lines 41 to 54 of my code by:
    #if DEBUG
    #define DPRINT       Serial.print
    #define DPRINTLN     Serial.println
    #define DPRINTHEX(x) PrintHex(x, 0x80)
    #define DPRINT       if(0) Serial.print
    #define DPRINTLN     if(0) Serial.println
    #define DPRINTHEX(x) if(0) PrintHex(x, 0x80)
    // Regular messages over serial console
    #define PRINT       Serial.print
    #define PRINTLN     Serial.println
    #define PRINTHEX(x) PrintHex(x, 0x80)

    6 years ago on Introduction

    Holy crap I just got this watch thinking I was going to have to spend quite a bit of time figuring out how to interface it with the arduino. I guess now I can go straight into programming the arduino! Thanks so much!