/esp-idf-can2http

CANbus to http bridge using esp32

Primary LanguageCMIT LicenseMIT

esp-idf-can2http

CANbus to http bridge using esp32.
It's purpose is to be a bridge between a CAN-Bus and a HTTP-Server.

slide0001 slide0002 slide0003

Software requirement

ESP-IDF V4.4/V5.x.
ESP-IDF V5.1 is required when using ESP32C6.

Hardware requirements

  • SN65HVD23x CAN-BUS Transceiver

  • Termination resistance
    I used 150 ohms.

Wireing

SN65HVD23x ESP32 ESP32-S2/S3 ESP32-C3/C6
D(CTX) -- GPIO21 GPIO17 GPIO0 (*1)
GND -- GND GND GND
Vcc -- 3.3V 3.3V 3.3V
R(CRX) -- GPIO22 GPIO18 GPIO1 (*1)
Vref -- N/C N/C N/C
CANL -- To CAN Bus
CANH -- To CAN Bus
RS -- GND GND GND (*2)

(*1) You can change using menuconfig. But it may not work with other GPIOs.

(*2) N/C for SN65HVD232

Test Circuit

   +-----------+   +-----------+   +-----------+ 
   | Atmega328 |   | Atmega328 |   |   ESP32   | 
   |           |   |           |   |           | 
   | Transmit  |   | Receive   |   | 21    22  | 
   +-----------+   +-----------+   +-----------+ 
     |       |      |        |       |       |   
   +-----------+   +-----------+     |       |   
   |           |   |           |     |       |   
   |  MCP2515  |   |  MCP2515  |     |       |   
   |           |   |           |     |       |   
   +-----------+   +-----------+     |       |   
     |      |        |      |        |       |   
   +-----------+   +-----------+   +-----------+ 
   |           |   |           |   | D       R | 
   |  MCP2551  |   |  MCP2551  |   |   VP230   | 
   | H      L  |   | H      L  |   | H       L | 
   +-----------+   +-----------+   +-----------+ 
     |       |       |       |       |       |   
     +--^^^--+       |       |       +--^^^--+
     |   R1  |       |       |       |   R2  |   
 |---+-------|-------+-------|-------+-------|---| BackBorn H
             |               |               |
             |               |               |
             |               |               |
 |-----------+---------------+---------------+---| BackBorn L

      +--^^^--+:Terminaror register
      R1:120 ohms
      R2:150 ohms(Not working at 120 ohms)

NOTE
3V CAN Trasnceviers like VP230 are fully interoperable with 5V CAN trasnceviers like MCP2551.
Check here.

Installation

git clone https://github.com/nopnop2002/esp-idf-can2http
cd esp-idf-can2http
idf.py set-target {esp32/esp32s2/esp32s3/esp32c3/esp32c6}
idf.py menuconfig
idf.py flash

Configuration

config-main config-app

CAN Setting

config-can

WiFi Setting

config-wifi-1

You can use static IP.
config-wifi-2

You can connect using mDNS.
config-wifi-3

External HTTP Server Setting

The External HTTP Server receives CAN Bus received data.
config-http

Note
The Built-in HTTP Server receives CAN Bus transmittion data.

Definition from CANbus to HTTP

When CANbus data is received, it is sent by HTTP POST according to csv/can2http.csv.
The file can2http.csv has three columns.
In the first column you need to specify the CAN Frame type.
The CAN frame type is either S(Standard frame) or E(Extended frame).
In the second column you have to specify the CAN-ID as a hexdecimal number.
In the last column you have to specify the HTTP-POST-Path of external HTTP server.
Each CAN-ID is allowed to appear only once in the whole file.

S,101,/post
E,101,/post
S,103,/post
E,103,/post

When a CAN frame with ID 0x101 is received, POST with the 'canid':257.
When a CAN frame with ID 0x103 is received, POST with the 'canid':259.

POST Parameter Example:
CAN-ID is a decimal number, not a hexadecimal number.

{"canid":257, "frame": "standard", "data": [16, 17, 18]}
{"canid":257, "frame": "extended", "data": [16, 17, 18]}
{"canid":259, "frame": "standard", "data": [16, 17, 18]}
{"canid":259, "frame": "extended", "data": [16, 17, 18]}

CAN messages not registered in csv/can2http.csv are discarded and not POSTed to HTTP.

Definition from HTTP to CANbus

Not exist.
You can send any CAN-ID.

Send CANBus frame using curl

CAN-ID is specified in decimal number.

$ curl -X POST -H "Content-Type: application/json" -d '{"canid": 513, "frame": "standard", "data": [16, 17, 18]}' http://esp32-server.local:8000/api/twai/send
twai send successfully

$ curl -X POST -H "Content-Type: application/json" -d '{"canid": 513, "frame": "extended", "data": [16, 17, 18]}' http://esp32-server.local:8000/api/twai/send
twai send successfully

CANBus reception using UNO.

send_standard

send_extended


HTTP Server Using Tornado

cd $HOME
sudo apt install python3-pip python3-setuptools
python3 -m pip install -U pip
python3 -m pip install -U wheel
python3 -m pip install tornado
git clone https://github.com/nopnop2002/esp-idf-can2http
cd esp-idf-can2http
cd tornado
python3 can.py

You can specify the number of lines to display and the port number.
The default port number is 8000 and the default number of display lines is 20.
Redisplay every 5 seconds.
can2http-tornado

HTTP Server Using Flask

cd $HOME
sudo apt install python3-pip python3-setuptools
python3 -m pip install -U pip
python3 -m pip install -U wheel
python3 -m pip install -U Werkzeug
python3 -m pip install flask
git clone https://github.com/nopnop2002/esp-idf-can2http
cd esp-idf-can2http
cd flask
python3 can.py

You can specify the number of lines to display and the port number.
The default port number is 8000 and the default number of display lines is 20.
Redisplay every 5 seconds.
can2http-flask

Brows received data Using Tornado/Flask

Open your browser and put the Server's IP in the address bar.

can2http-browser

Visualize CAN-Frame

Using python

There is a lot of information on the internet about the Python + visualization library.

Using node.js

There is a lot of information on the internet about the node.js + real time visualization library.

Troubleshooting

There is a module of SN65HVD230 like this.
SN65HVD230-1

There is a 120 ohms terminating resistor on the left side.
SN65HVD230-22

I have removed the terminating resistor.
And I used a external resistance of 150 ohms.
A transmission fail is fixed.
SN65HVD230-33

If the transmission fails, these are the possible causes.

  • There is no receiving app on CanBus.
  • The speed does not match the receiver.
  • There is no terminating resistor on the CanBus.
  • There are three terminating resistors on the CanBus.
  • The resistance value of the terminating resistor is incorrect.
  • Stub length in CAN bus is too long. See here.

Reference

https://github.com/nopnop2002/esp-idf-candump

https://github.com/nopnop2002/esp-idf-can2mqtt

https://github.com/nopnop2002/esp-idf-can2usb

https://github.com/nopnop2002/esp-idf-can2websocket

https://github.com/nopnop2002/esp-idf-CANBus-Monitor