1
\$\begingroup\$

I have a need for a large amount of serial I/O from a desktop computer in a robotics application. I considered using all off the shelf parts with a large set of USB hubs and usb to serial adapters, but off the shelf solutions were too large.

I need about 26ish, maybe more channels running anywhere from 9600 to 115200baud. To fit in the tight space I was considering getting some USB hub controllers, and putting them on a circuit board with the usb to serial ASICs.

The host computer is a mini itx intel based machine.

My current concept involves this 4 channel USB 3 hub controller: 4 Port USB 3 Hub And several 7 port USB 2 hub chips: 7 Port USB 2 Hub concept The 7 port hubs would be connected to the super speed 4 port hub ports, thus giving all the USB endpoints I need. The USB to serial ASICs (FTDI or similar product) would be directly connected to each 7 port hub controller port. I know that FTDI for instance offers multi channel usb to serial devices, but I don't know if each USB channel enumerates as a separate device in linux (as in a seperate /dev/usbttyx device)

My questions is, how difficult is this hardware to implement? I've done some differential signal design before, but never USB speed fast. I was also considering having separate control of the power to each hub controller so they could be separately reset if needed.

Are there any traps I need to watch out for specific to working with these USB chips? This will be my first board design that has USB on it.

Thanks!

\$\endgroup\$
  • 1
    \$\begingroup\$ This is usually solved not with USB but with a "fieldbus", this is why things like CAN were developed. A straightforward solution is RS485 with a single master, which you can daisy chain no problem (just respect termination), there is no reason to use 28 seperate serial host controllers \$\endgroup\$ – crasic Feb 18 '16 at 23:54
  • \$\begingroup\$ If you want to use, USB, what you propose should work. AFAIK, USB has a limit of 127 devices, including hubs, so you should be within the limit. Each should instantiate as a /dev/ttyUSB device, though you may not have any control on which device is which number. In fact, this may change from power-up to power-up! \$\endgroup\$ – DoxyLover Feb 19 '16 at 0:04
  • 1
    \$\begingroup\$ @DoxyLover no problem to assign the same tty number based on serial id (if it is provided) or alternatively based on physical port number using UDev \$\endgroup\$ – crasic Feb 19 '16 at 0:07
  • \$\begingroup\$ @crasic The devices all use different types of serial interface. Not something I have control over. Some are RS485, 422, 232, and TTL. Although having a bunch of CAN devices sounds significantly less terrible. Part of what pushed me away from CAN is the cost of the interface devices is somewhat higher...But if it's simpler it might be worth it. Also, how would I go about assigning the tty numbers to overcome the issue DoxyLover pointed out? \$\endgroup\$ – alphasierra Feb 19 '16 at 1:36
  • \$\begingroup\$ @alphasierra any field bus will require something equivalent to your FTDI chip for USB, CAN is heavier on peripherals, but there are other systems to choose from (ethernet based ones for instance). USB will absolutely work, but you may have requirements that it will not satisfy, deterministic response time and network polling for instance. \$\endgroup\$ – crasic Feb 19 '16 at 2:44
1
\$\begingroup\$

Not really an answer, I just can't comment...

Did you evaluate the option to use simple Arduino/AVR? With Atmega128 TQFP64 you should be able to get 26ish software serials, the hardware UARTs can go as fast as 2Mbps (to connect to PC host), Atmega128 has 2.

There is also STM32F103 series ARM with 72MHz clock.

On the PC host side, if you really need 26 separate COMs, there is possibility to use virtual COM ports...some software will be needed to "aggregate" data of these 26 ports into real 1. Or edit your PC software. Creating some custom protocol (similar to Modbus) to address each serial port shouldn't be hard. Same on MCU side.

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.