PSoC5 Grbl with Native USB

I added native USB support to my PS0C5 port of Grbl. The PSoC has USB capability on the chip. It also has a component for using it as a USB UART (CDC Interface). This means it looks like a serial port to the connected PC and uses the standard CDC interface driver that most OS have.

I am currently only using this on the PSoC5 development board so I am comfortable using their VID and PID values. If I make some custom hardware and distribute it, I will need to get my own.


  • Low Cost – You don’t need to buy a separate USB/TTL chip
  • Faster – It should be able to run a lot faster. You can select any baud rate you want. It never converts to TTL I think the rate is meaningless. I am not sure if it translates to actual fast jobs, but it might on data heavy laser type jobs where the laser power level is changing a lot.
  • Compatibility – It still looks like a UART to senders, so you can use all existing senders.
  • Future Features – It might be possible to have the USB look like multiple features like a memory device, to make file transfers possible.

The Code

I put it in a separate repo from my last code. I started with a more recent version of Grbl, plus I removed the LCD code. I typically don’t use the LCD and prefer a serial/bluetooth remote. It could be easily added back in from the original port.

To do list?

  1. The USB is checked for incoming data in the protocol_main_loop(). Is there a way to do this with an interrupt?
  2. Arduinos have a DTR triggered reboot. Some senders expect this. Can we emulate this behavior?
  3. I want to add SD card support to Grbl
    • Then try to make that accessible as a USB drive.


If you want to help, just let me know via comments below or on the GitHub page.


If you want to be notified of future blog posts, please subscribe.


Share and Enjoy:
  • Print
  • Digg
  • StumbleUpon
  • Facebook
  • Yahoo! Buzz
  • Twitter
  • Google Bookmarks

2 Responses to “PSoC5 Grbl with Native USB”

  1. Evgeniy

    Thanks for the project!
    the program define incorrect CMD_RESET = ‘^’ (0x5E)
    I had to specify the code otherwise in the config.h file, line 52:
    52 #define CMD_RESET 0x18 // ‘^’ // 0x18 // ctrl-x.
    Now it works.

  2. bdring

    Thanks, I think I accidentally left that as a type-able character. I’ll fix that soon.