mirror of
https://github.com/SlimeVR/SlimeVR-Tracker-ESP.git
synced 2026-04-06 02:01:57 +02:00
ESP32-C3 integration (#178)
This commit is contained in:
@@ -48,6 +48,13 @@ Firmware can work with both ESP8266 and ESP32. Please edit `defines.h` and set y
|
||||
* LED will turn off when calibration is complete
|
||||
* You don't have to calibrate next time you power it off, calibration values will be saved for the next use
|
||||
|
||||
## Infos about ESP32-C3 with direct connection to USB
|
||||
|
||||
The ESP32-C3 has two ways to connect the serial port. One is directly via the onboard USB CDC or via the onboard UART.
|
||||
When the chip is connected to the USB CDC, the serial port shows as `USB Serial Port` in Device Manager. The SlimeVR server will currently not connect to this port.
|
||||
If you want to set your WiFi credentials, you can use the PlatformIO serial console.
|
||||
There you have to enter the following: `SET WIFI "SSID" "PASSWORD"`
|
||||
|
||||
## Uploading On Linux
|
||||
|
||||
Follow the instructions in this link [Platformio](https://docs.platformio.org/en/latest//faq.html#platformio-udev-rules), this should solve any permission denied errors
|
||||
|
||||
32
ci/build.py
32
ci/build.py
@@ -16,6 +16,8 @@ COLOR_GRAY = f'{COLOR_ESC}30;1m'
|
||||
class Board(Enum):
|
||||
SLIMEVR = "BOARD_SLIMEVR"
|
||||
WROOM32 = "BOARD_WROOM32"
|
||||
LOLIN_C3_MINI = "BOARD_LOLIN_C3_MINI"
|
||||
ES32C3DEVKITM1 = "BOARD_ES32C3DEVKITM1"
|
||||
|
||||
|
||||
class DeviceConfiguration:
|
||||
@@ -25,10 +27,20 @@ class DeviceConfiguration:
|
||||
self.platformio_board = platformio_board
|
||||
|
||||
def get_platformio_section(self) -> str:
|
||||
section = dedent(f"""
|
||||
[env:{self.platformio_board}]
|
||||
platform = {self.platform}
|
||||
board = {self.platformio_board}""")
|
||||
section = f"[env:{self.platformio_board}]\n"
|
||||
section += f"platform = {self.platform}\n"
|
||||
section += f"board = {self.platformio_board}\n"
|
||||
|
||||
if self.board == Board.LOLIN_C3_MINI:
|
||||
section += "build_flags = \n"
|
||||
section += " ${env.build_flags}\n"
|
||||
section += " -DESP32C3\n"
|
||||
|
||||
if self.board == Board.ES32C3DEVKITM1:
|
||||
section += "build_flags = \n"
|
||||
section += " ${env.build_flags}\n"
|
||||
section += " -DESP32C3\n"
|
||||
|
||||
return section
|
||||
|
||||
def filename(self) -> str:
|
||||
@@ -56,6 +68,18 @@ class DeviceConfiguration:
|
||||
imu_int = "23"
|
||||
imu_int2 = "25"
|
||||
battery_level = "36"
|
||||
elif self.board == Board.LOLIN_C3_MINI:
|
||||
sda = "5"
|
||||
scl = "4"
|
||||
imu_int = "6"
|
||||
imu_int2 = "8"
|
||||
battery_level = "3"
|
||||
elif self.board == Board.ES32C3DEVKITM1:
|
||||
sda = "5"
|
||||
scl = "4"
|
||||
imu_int = "6"
|
||||
imu_int2 = "7"
|
||||
battery_level = "3"
|
||||
else:
|
||||
raise Exception(f"Unknown board: {self.board.value}")
|
||||
|
||||
|
||||
@@ -5,13 +5,18 @@
|
||||
"board": "SLIMEVR"
|
||||
},
|
||||
{
|
||||
"platform": "espressif32 @ 4.4.0",
|
||||
"platform": "espressif32 @ 5.1.1",
|
||||
"platformio_board": "esp32dev",
|
||||
"board": "WROOM32"
|
||||
},
|
||||
{
|
||||
"platform": "espressif32 @ 4.4.0",
|
||||
"platform": "espressif32 @ 5.1.1",
|
||||
"platformio_board": "lolin_c3_mini",
|
||||
"board": "SLIMEVR"
|
||||
"board": "LOLIN_C3_MINI"
|
||||
},
|
||||
{
|
||||
"platform": "espressif32 @ 5.1.1",
|
||||
"platformio_board": "esp32-c3-devkitm-1",
|
||||
"board": "ES32C3DEVKITM1"
|
||||
}
|
||||
]
|
||||
|
||||
@@ -1,11 +1,19 @@
|
||||
#include "i2cscan.h"
|
||||
#include "../../src/globals.h"
|
||||
|
||||
#ifdef ESP8266
|
||||
uint8_t portArray[] = {16, 5, 4, 2, 14, 12, 13};
|
||||
uint8_t portExclude[] = {LED_PIN};
|
||||
String portMap[] = {"D0", "D1", "D2", "D4", "D5", "D6", "D7"};
|
||||
// ESP32C3 has not as many ports as the ESP32
|
||||
#elif defined(ESP32C3)
|
||||
uint8_t portArray[] = {2, 3, 4, 5, 6, 7, 8, 9, 10};
|
||||
uint8_t portExclude[] = {18, 19, 20, 21, LED_PIN};
|
||||
String portMap[] = {"2", "3", "4", "5", "6", "7", "8", "9", "10"};
|
||||
#elif defined(ESP32)
|
||||
uint8_t portArray[] = {4, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 25, 26, 27, 32, 33};
|
||||
String portMap[] = {"4", "13", "14", "15", "16", "17", "18", "19", "21", "22", "23", "25", "26", "27", "32", "33"};
|
||||
uint8_t portExclude[] = {LED_PIN};
|
||||
#endif
|
||||
|
||||
namespace I2CSCAN
|
||||
@@ -33,7 +41,7 @@ namespace I2CSCAN
|
||||
{
|
||||
for (uint8_t j = 0; j < sizeof(portArray); j++)
|
||||
{
|
||||
if (i != j)
|
||||
if ((i != j) && !inArray(portArray[i], portExclude, sizeof(portExclude)) && !inArray(portArray[j], portExclude, sizeof(portExclude)))
|
||||
{
|
||||
if(checkI2C(i, j))
|
||||
found = true;
|
||||
@@ -43,12 +51,38 @@ namespace I2CSCAN
|
||||
if(!found) {
|
||||
Serial.println("[ERR] I2C: No I2C devices found");
|
||||
}
|
||||
|
||||
#if ESP32
|
||||
Wire.end();
|
||||
#endif
|
||||
|
||||
// Reset the I2C interface back to it's original values
|
||||
Wire.begin(static_cast<int>(PIN_IMU_SDA), static_cast<int>(PIN_IMU_SCL));
|
||||
}
|
||||
|
||||
bool inArray(uint8_t value, uint8_t* array, size_t arraySize)
|
||||
{
|
||||
for (size_t i = 0; i < arraySize; i++)
|
||||
{
|
||||
if (value == array[i])
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool checkI2C(uint8_t i, uint8_t j)
|
||||
{
|
||||
bool found = false;
|
||||
Wire.begin(portArray[i], portArray[j]);
|
||||
|
||||
#if ESP32
|
||||
Wire.end();
|
||||
#endif
|
||||
|
||||
Wire.begin((int)portArray[i], (int)portArray[j]);
|
||||
|
||||
byte error, address;
|
||||
int nDevices;
|
||||
nDevices = 0;
|
||||
@@ -62,23 +96,15 @@ namespace I2CSCAN
|
||||
|
||||
if (error == 0)
|
||||
{
|
||||
Serial.print("[DBG] I2C (@ " + portMap[i] + " : " + portMap[j] + "): ");
|
||||
Serial.print("I2C device found at address 0x");
|
||||
if (address < 16)
|
||||
Serial.print("0");
|
||||
Serial.print(address, HEX);
|
||||
Serial.println(" !");
|
||||
|
||||
Serial.printf("[DBG] I2C (@ %s(%d) : %s(%d)): I2C device found at address 0x%02x !\n",
|
||||
portMap[i].c_str(), portArray[i], portMap[j].c_str(), portArray[j], address);
|
||||
nDevices++;
|
||||
found = true;
|
||||
}
|
||||
else if (error == 4)
|
||||
{
|
||||
Serial.print("[ERR] I2C (@ " + portMap[i] + " : " + portMap[j] + "): ");
|
||||
Serial.print("Unknow error at address 0x");
|
||||
if (address < 16)
|
||||
Serial.print("0");
|
||||
Serial.println(address, HEX);
|
||||
Serial.printf("[ERR] I2C (@ %s(%d) : %s(%d)): Unknow error at address 0x%02x\n",
|
||||
portMap[i].c_str(), portArray[i], portMap[j].c_str(), portArray[j], address);
|
||||
}
|
||||
}
|
||||
return found;
|
||||
|
||||
@@ -10,6 +10,7 @@ namespace I2CSCAN {
|
||||
bool isI2CExist(uint8_t addr);
|
||||
uint8_t pickDevice(uint8_t addr1, uint8_t addr2, bool scanIfNotFound);
|
||||
int clearBus(uint8_t SDA, uint8_t SCL);
|
||||
boolean inArray(uint8_t value, uint8_t* arr, size_t arrSize);
|
||||
}
|
||||
|
||||
#endif // _I2CSCAN_H_
|
||||
@@ -36,5 +36,22 @@ platform = espressif32@4.4.0
|
||||
board = esp32dev
|
||||
|
||||
[env:BOARD_LOLIN_C3_MINI]
|
||||
platform = espressif32@4.4.0
|
||||
platform = espressif32@5.1.1
|
||||
build_flags =
|
||||
${env.build_flags}
|
||||
-DESP32C3
|
||||
board = lolin_c3_mini
|
||||
|
||||
[env:BOARD_BEETLE32C3]
|
||||
platform = espressif32@5.1.1
|
||||
build_flags =
|
||||
${env.build_flags}
|
||||
-DESP32C3
|
||||
board = dfrobot_beetle_esp32c3
|
||||
|
||||
[env:BOARD_ES32C3DEVKITM1]
|
||||
platform = espressif32 @5.1.1
|
||||
build_flags =
|
||||
${env.build_flags}
|
||||
-DESP32C3
|
||||
board = esp32-c3-devkitm-1
|
||||
|
||||
@@ -56,13 +56,25 @@ upload_speed = 921600
|
||||
|
||||
; Uncomment below if you want to build for esp32
|
||||
; Check your board name at https://docs.platformio.org/en/latest/platforms/espressif32.html#boards
|
||||
; [env:esp32]
|
||||
; platform = espressif32 @ 4.4.0
|
||||
; board = esp32dev
|
||||
;[env:esp32]
|
||||
;platform = espressif32 @ 5.1.1
|
||||
;board = esp32dev
|
||||
; Comment out this line below if you have any trouble uploading the firmware - and if it has a CP2102 on it (a square chip next to the usb port): change to 3000000 (3 million) for even faster upload speed
|
||||
; upload_speed = 921600
|
||||
;upload_speed = 921600
|
||||
|
||||
; If you want to use a ESP32C3, you can use this (experimental)
|
||||
; Check your board name at https://docs.platformio.org/en/latest/platforms/espressif32.html#boards
|
||||
; There are 2 main Boardtypes:
|
||||
; 1. Boards that use a USB 2 Serial Chipset ( esp32-c3-devkitm-1, ttgo-t-oi-plus )
|
||||
; 2. Boards that relay on the USB interface of the ESP32C3 ( lolin_c3_mini , dfrobot_beetle_esp32c3)
|
||||
; On this board there are 2 type some of them need to have set the build flag (menuconfig)
|
||||
; -DARDUINO_USB_MODE=1
|
||||
; -DARDUINO_USB_CDC_ON_BOOT=1
|
||||
|
||||
; If you want to use a esp32c3, you can use this (experimental)
|
||||
;[env:esp32c3]
|
||||
;platform = espressif32 @ 4.4.0
|
||||
;platform = espressif32 @ 5.1.1
|
||||
;build_flags =
|
||||
; ${env.build_flags}
|
||||
; -DESP32C3
|
||||
;board = lolin_c3_mini
|
||||
|
||||
|
||||
@@ -44,6 +44,8 @@
|
||||
#define BOARD_ESP01 8
|
||||
#define BOARD_SLIMEVR 9
|
||||
#define BOARD_LOLIN_C3_MINI 10
|
||||
#define BOARD_BEETLE32C3 11
|
||||
#define BOARD_ES32C3DEVKITM1 12
|
||||
|
||||
#define BAT_EXTERNAL 1
|
||||
#define BAT_INTERNAL 2
|
||||
|
||||
@@ -111,11 +111,27 @@
|
||||
// #define LED_PIN 2
|
||||
// #define LED_INVERTED false
|
||||
#elif BOARD == BOARD_LOLIN_C3_MINI
|
||||
#define PIN_IMU_SDA 10
|
||||
#define PIN_IMU_SCL 8
|
||||
#define PIN_IMU_SDA 5
|
||||
#define PIN_IMU_SCL 4
|
||||
#define PIN_IMU_INT 6
|
||||
#define PIN_IMU_INT_2 8
|
||||
#define PIN_BATTERY_LEVEL 3
|
||||
#define LED_PIN 7
|
||||
// #define LED_INVERTED false
|
||||
#elif BOARD == BOARD_BEETLE32C3
|
||||
#define PIN_IMU_SDA 8
|
||||
#define PIN_IMU_SCL 9
|
||||
#define PIN_IMU_INT 6
|
||||
#define PIN_IMU_INT_2 7
|
||||
#define PIN_BATTERY_LEVEL 3
|
||||
// #define LED_PIN 2
|
||||
#define LED_PIN 10
|
||||
#define LED_INVERTED false
|
||||
#elif BOARD == BOARD_ES32C3DEVKITM1
|
||||
#define PIN_IMU_SDA 5
|
||||
#define PIN_IMU_SCL 4
|
||||
#define PIN_IMU_INT 6
|
||||
#define PIN_IMU_INT_2 7
|
||||
#define PIN_BATTERY_LEVEL 3
|
||||
#define LED_PIN LED_OFF // RGB LED Protocol would need to be implementetet did not brother for the test, because the board ideal for tracker ifself
|
||||
// #define LED_INVERTED false
|
||||
#endif
|
||||
|
||||
18
src/main.cpp
18
src/main.cpp
@@ -51,14 +51,18 @@ BatteryMonitor battery;
|
||||
void setup()
|
||||
{
|
||||
Serial.begin(serialBaudRate);
|
||||
|
||||
#ifdef ESP32C3
|
||||
// Wait for the Computer to be able to connect.
|
||||
delay(2000);
|
||||
#endif
|
||||
|
||||
Serial.println();
|
||||
Serial.println();
|
||||
Serial.println();
|
||||
|
||||
logger.info("SlimeVR v" FIRMWARE_VERSION " starting up...");
|
||||
|
||||
//wifi_set_sleep_type(NONE_SLEEP_T);
|
||||
|
||||
statusManager.setStatus(SlimeVR::Status::LOADING, true);
|
||||
|
||||
ledManager.setup();
|
||||
@@ -71,7 +75,15 @@ void setup()
|
||||
// Do it only for MPU, cause reaction of BNO to this is not investigated yet
|
||||
#endif
|
||||
// join I2C bus
|
||||
Wire.begin(PIN_IMU_SDA, PIN_IMU_SCL);
|
||||
|
||||
#if ESP32
|
||||
// For some unknown reason the I2C seem to be open on ESP32-C3 by default. Let's just close it before opening it again. (The ESP32-C3 only has 1 I2C.)
|
||||
Wire.end();
|
||||
#endif
|
||||
|
||||
// using `static_cast` here seems to be better, because there are 2 similar function signatures
|
||||
Wire.begin(static_cast<int>(PIN_IMU_SDA), static_cast<int>(PIN_IMU_SCL));
|
||||
|
||||
#ifdef ESP8266
|
||||
Wire.setClockStretchLimit(150000L); // Default stretch limit 150mS
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user