Micro Maestro on Linux?

I’m interested in using the Micro Maestro 6-channel USB Servo Controller on a Linux OS and wanted to find out more about the USB virtual com port. What is the USB<->UART chip being used and is it supported by standard drivers or does this require special drivers? I’m running an embedded PC running a Debian 2.6.21 kernel, and wanted to make sure that this device works.

Thanks for the info.


Hello Aaron,

The Micro Maestro (as well as our AVR Programmer, jrk and Orangutan SVP) use a microcontroller with custom firmware to talk USB. There is no USB-UART chip on the board, and our devices are more advanced: they appear as composite devices with two CDC/ACM interfaces, causing both COM ports to be automatically recognized by the linux cdc_acm module and connected to devices named like /dev/ttyACM0, no driver or configuration necessary. We have tested this on various linux machines, including virtual machines, and as far as we know, this works just as well as USB-UART chips like the CP2102. (All USB-serial devices we have tried under VirtualBox virtual machines are only be able to be used once, then they need to be reset, but this is probably an issue with VirtualBox.) We have not tested non-Intel versions of linux, if that matters for your application, but I would bet that as long as your distribution includes cdc-acm.ko it will work.

We are committed to providing linux support, mostly because it is so easy - we pretty much just follow the CDC/ACM class specification, and it works. Also, if our customers find versions of the kernel where our devices do not work, we have the ability to release a firmware upgrade or write a custom driver.

Finally, we will be releasing source code in the next few days, for Windows and Linux, that will allow you to communicate with the device over our custom USB interface, completely bypassing the COM port. Our example code is in C#, but it will be relatively easy to reimplement in C or C++ if you want something more lightweight. This is what we will recommend for applications that require reliability, since using real USB commands allows you to handle problems like temporary disconnections much more smoothly than a COM port.

I would be very interested to hear how this works in your embedded linux application! What board are you using?


Thanks for your detailed reply Paul.

The embedded Linux system that i am using is a Technologic Systems TS-7800. I posted a reply to another thread as I have used the serial version of the same servo controller with a CP2102 based UART to USB bridge in the past. The module showed up as /dev/ttyUSB0 and I was able to communicate to the servo controller via the MiniSSC II mode without any problems.

I’ll have to check to see if it has the appropriate CDC/ACM modules installed but this looks like a more compact solution that using an external UART to USB bridge. Am I correct in understanding that I could use the same python drivers running in MiniSSC II mode to talk to the /dev/ttyACM0 port in the same manner?

Also I’m curious about your “custom USB interface”. How will the device appear to the system? Under linux, I’d assume it would still mount to some device under /dev/ ? I haven’t experience any “temporary disconnects” yet but the added reliability sounds promising. What would be causing “temporary disconnects”? I’ve only seen this in appliactions where the bus voltage suddenly dropped or where the USB clock timing wasn’t operating to spec. At the very least I am looking forward to what you come up with.


Okay, that board is based on an ARM, so I would like to hear how it works for you, but I do not expect any trouble. I think that checking to see that you have the cdc-acm module is a good idea, and if it is available, the board should work with the Maestro just fine. The /dev/ttyACM0 port works just like the /dev/ttyUSB0 port, and your python script should work without any modifications.

For most applications, serial is probably good enough, but even just when testing, what I find with serial devices is that if you unplug a cable with the device file open, then plug it back in, it might end up on a different device number, so my code has to be smart enough to detect the disconnect and find the new port. Actually, just having multiple USB serial devices connected at the same time will require you to address this issue, since you do not know which one will get which number! The point of the custom USB interface is that it gives you more direct access to the device - you select the device by serial number, use an API to call specific commands, and you know when your commands have been received and processed. Multiple programs can access the same device at the same time without any problem, and disconnects can be handled a little more smoothly. There is actually no need to use a device file - linux’s libusb allows you to do all of this quite easily. It is obviously going to be a lot more complicated than MiniSSC II mode, but you can keep this option in mind in case you ever want to move on to something more advanced! You can take a look at the libusb documentation if you want to see what is involved.

By the way, the Maestro is not just “the same servo controller” as our other boards - it is a completely new device, and a lot of things are done differently, especially the configuration. I think the Maestro is better in every way except number of channels, but please be prepared to read the manual when you get it!


I am using a LinuxStamp, I tried:
mknod /dev/ttyACM0 c 166 0
chown root:dialout /dev/ttyACM0
chmod 660 /dev/ttyACM0
And I still can’t open the serial port!

lsusb and lsmod shows that the USB device is detected and the driver cdc-acm.ko is loaded. However, something else is wrong :frowning:

Some steps from:

By the way, it works well in my Ubuntu PC.

Wow, that is ambitious, but it really should be possible. Can you post the relevant dmesg output in case there is a hint there?