Skip to content

0. Choose the right platform

Nathan zhou edited this page Jul 11, 2025 · 1 revision

Depends on what you want to do with your device, you need to choose the right microcontroller platform to development with.

When choosing the development board, you should consider whether your platform:

  1. Provide enough IO and processing power to handle the peripheral (sensor, display, LCD, digital output, high speed counter, etc) you want to connect to it.
  2. Had adequate software library support for your peripheral.
  3. Be able to communicate with CAN network. To facilitate this, your microcontroller need a CAN controller and a CAN transceiver.
  4. Be able to handle the power supply on the robot. This is done by adding a buck converter.

Do I need a module? Which one do I need?

Most likely, yes.

Some microcontroller will have a built-in CAN controller so only a transceiver like TJA1050 is needed. Others require an external controller like MCP2515. Pretty much all of the microcontroller on the market does not have built in transceiver.

image

(Image Source)

Microcontroller Built-in controller Built-in transceiver Module to use
Arduino UNO No No MCP2515+TJA1050
Arduino Mega No No MCP2515+TJA1050
ESP32 Yes No TJA1050
Raspberry Pi No No MCP2515+TJA1050 or CANAble
STM32 Depends on model No Depends on model
PC No No CANAble

MCP2515 + TJA1050

image

This is a combo module with MCP2515 being the CAN controller and TJA1050 being the CAN transceiver.

Be aware of the crystal oscillator value on your MCP2515 module! Your software needs to match the value on your actual module to work!

TJA1050

image

This is just the CAN transceiver. Even it says Tx and Tx it is not UART. When connecting wires, it is Tx to Tx and Rx to Rx. It is meant to be connected to a CAN controller. Usually buying these standalone transceiver module Means your micro controller has built in CAN controller.

CANAble

image

The CANable 2.0 is a small low-cost open source USB to CAN adapter. This is especially useful if you want to connect Linux based co-processor.

Some example platform

Arduino UNO

image image

These are cheap, everywhere and reliable. However, they don't come with built-in controller and transceiver. Therefore an external module is needed. Usually the go to choice is a MCP2515 + TJA1050 combo module.

Arduino Mega

image image

These provide a bit more IO. External controller (MCP2515) is needed.

Espressif ESP32

image image

ESP32 provide way more processing power than Atmel. Also, most ESP32 have built-in CAN controller named Two-Wire Automotive Interface (TWAI). Therefore, only an external transceiver (TJA1050) is needed.

Raspberry Pi

image

Now these run Linux. However, they do need external CAN controller. This could be done by adding a SPI based CAN Hat or a USB CAN adaptor like CANAble.

STMicroelectronics STM32

image image

There is no standardized from factor of STM32. Depends on the exact choice of the model, some STM32 have built in CAN controller. However most would need external transceiver.

PC based co-processor

image image

While you could also use Networktables, nobody would stop you from doing this. A USB CAN adaptor like CANAble will be needed. This might be especially useful if you want to use CTRE Phoenix on your co-processor.

Note: if you are using a CANivore on roboRIO and you want your co-processor to talk to CANivore Bus, the only way to do this is to have a second CANivore connected to your co-processor. If your CTRE devices is on roboRIO bus, you could use CANAble on roboRIO bus. Using CTRE devices with Linux is out of scope of this documentation that you should refer to CTRE presentation about it.

Clone this wiki locally