248 lines
8.7 KiB
Markdown
248 lines
8.7 KiB
Markdown
# 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.
|
|
|
|

|
|

|
|

|
|
|
|
|
|
# Software requirement
|
|
esp-idf v4.2-dev-2243 or later.
|
|
Use twai(Two-Wire Automotive Interface) driver instead of can driver.
|
|
|
|
# Hardware requirements
|
|
1. SN65HVD23x CAN-BUS Transceiver
|
|
|
|
|SN65HVD23x||ESP32|ESP32-S2|ESP32-C3||
|
|
|:-:|:-:|:-:|:-:|:-:|:-:|
|
|
|D(CTX)|--|GPIO21|GPIO17|GPIO9|(*1)|
|
|
|GND|--|GND|GND|GND||
|
|
|Vcc|--|3.3V|3.3V|3.3V||
|
|
|R(CRX)|--|GPIO22|GPIO18|GPIO10|(*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
|
|
|
|
2. Termination resistance
|
|
I used 150 ohms.
|
|
|
|
|
|
# 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](http://www.ti.com/lit/an/slla337/slla337.pdf).
|
|
|
|
|
|
# Installation for ESP32
|
|
```
|
|
git clone https://github.com/nopnop2002/esp-idf-can2http
|
|
cd esp-idf-can2http
|
|
idf.py set-target esp32
|
|
idf.py menuconfig
|
|
idf.py flash
|
|
```
|
|
|
|
# Installation for ESP32-S2
|
|
```
|
|
git clone https://github.com/nopnop2002/esp-idf-can2http
|
|
cd esp-idf-can2http
|
|
idf.py set-target esp32s2
|
|
idf.py menuconfig
|
|
idf.py flash
|
|
```
|
|
|
|
# Installation for ESP32-C3
|
|
```
|
|
git clone https://github.com/nopnop2002/esp-idf-can2http
|
|
cd esp-idf-can2http
|
|
idf.py set-target esp32c3
|
|
idf.py menuconfig
|
|
idf.py flash
|
|
```
|
|
|
|
# Configuration
|
|

|
|

|
|
|
|
## CAN Setting
|
|

|
|
|
|
## WiFi Setting
|
|

|
|
|
|
You can use static IP.
|
|

|
|
|
|
You can connect using mDNS.
|
|

|
|
|
|
## External HTTP Server Setting
|
|
The External HTTP Server receives CAN Bus received data.
|
|

|
|
|
|
__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]}
|
|
```
|
|
|
|
# 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.
|
|
|
|

|
|
|
|

|
|
|
|
|
|
---
|
|
|
|
# HTTP Server Using Tornado
|
|
```
|
|
sudo apt install python3-pip python3-setuptools
|
|
python -m pip install -U pip
|
|
python -m pip install -U wheel
|
|
python -m pip install tornado
|
|
cd tornado
|
|
python can.py
|
|
```
|
|

|
|
|
|
|
|
# HTTP Server Using Flask
|
|
```
|
|
sudo apt install python3-pip python3-setuptools
|
|
python -m pip install -U pip
|
|
python -m pip install -U wheel
|
|
python -m pip install -U Werkzeug
|
|
python -m pip install flask
|
|
cd flask
|
|
python can.py
|
|
```
|
|
|
|

|
|
|
|
|
|
# Brows received data Using Tornado/Flask
|
|
Open your browser and put the Server's IP in the address bar.
|
|
|
|

|
|
|
|
# Visualize CAN-Frame
|
|
|
|
## Using python
|
|
There is a lot of information on the internet about the Python + visualization library.
|
|
- [matplotlib](https://matplotlib.org/)
|
|
- [seaborn](https://seaborn.pydata.org/index.html)
|
|
- [bokeh](https://bokeh.org/)
|
|
- [plotly](https://plotly.com/python/)
|
|
|
|
## Using node.js
|
|
There is a lot of information on the internet about the node.js + __real time__ visualization library.
|
|
- [epoch](https://epochjs.github.io/epoch/real-time/)
|
|
- [plotly](https://plotly.com/javascript/streaming/)
|
|
- [chartjs-plugin-streaming](https://nagix.github.io/chartjs-plugin-streaming/1.9.0/)
|
|
|
|
# Troubleshooting
|
|
There is a module of SN65HVD230 like this.
|
|

|
|
|
|
There is a __120 ohms__ terminating resistor on the left side.
|
|

|
|
|
|
I have removed the terminating resistor.
|
|
And I used a external resistance of __150 ohms__.
|
|
A transmission fail is fixed.
|
|

|
|
|
|
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](https://e2e.ti.com/support/interface-group/interface/f/interface-forum/378932/iso1050-can-bus-stub-length).
|
|
|
|
# Reference
|
|
|
|
https://github.com/nopnop2002/esp-idf-can2mqtt
|
|
|
|
https://github.com/nopnop2002/esp-idf-CANBus-Monitor
|