Simple FOC

To make a robot like Navbot-EN01, Simple FOC is needed.

Arduino Library: Simple FOC (SimpleFOClibrary - Simple Field Oriented Control (FOC) library)

This library support STM32, ESP32, I compiled the sample angle_control.ino, compilation errors:

In file included from /home/rkuo/Arduino/libraries/Simple_FOC/src/SimpleFOC.h:116,
from /tmp/.arduinoIDE-unsaved2026221-45696-177nkm5.blyh/angle_control/angle_control.ino:22:
/home/rkuo/Arduino/libraries/Simple_FOC/src/sensors/MagneticSensorSPI.h:38:5: warning: “/*” within comment [-Wcomment]
38 | /**
|
In file included from /home/rkuo/.arduino15/packages/realtek/hardware/AmebaPro2/4.1.1-build20260320/system/component/soc/8735b/cmsis/rtl8735b/include/cmsis.h:35,
from /home/rkuo/.arduino15/packages/realtek/hardware/AmebaPro2/4.1.1-build20260320/system/component/mbed/targets/hal/rtl8735b/PinNames.h:32,
from /home/rkuo/.arduino15/packages/realtek/hardware/AmebaPro2/4.1.1-build20260320/variants/ameba_amb82-mini/variant.h:27,
from /home/rkuo/.arduino15/packages/realtek/hardware/AmebaPro2/4.1.1-build20260320/variants/ameba_amb82-mini/pins_arduino.h:20,
from /home/rkuo/.arduino15/packages/realtek/hardware/AmebaPro2/4.1.1-build20260320/cores/ambpro2/Arduino.h:185,
from /home/rkuo/.cache/arduino/sketches/265838927EC2F47C0A45A0FCB4E41887/sketch/angle_control.ino.cpp:1:
/home/rkuo/.arduino15/packages/realtek/hardware/AmebaPro2/4.1.1-build20260320/system/component/soc/8735b/cmsis/rtl8735b/include/basic_types.h:160:21: error: expected identifier before numeric constant
160 | #define ON 1
| ^
/home/rkuo/Arduino/libraries/Simple_FOC/src/sensors/Encoder.h:14:3: note: in expansion of macro ‘ON’
14 | ON = 0x00, //!< Enable quadrature mode CPR = 4xPPR
| ^~
/home/rkuo/.arduino15/packages/realtek/hardware/AmebaPro2/4.1.1-build20260320/system/component/soc/8735b/cmsis/rtl8735b/include/basic_types.h:160:21: error: expected ‘}’ before numeric constant
160 | #define ON 1
| ^
/home/rkuo/Arduino/libraries/Simple_FOC/src/sensors/Encoder.h:14:3: note: in expansion of macro ‘ON’
14 | ON = 0x00, //!< Enable quadrature mode CPR = 4xPPR
| ^~
In file included from /home/rkuo/Arduino/libraries/Simple_FOC/src/SimpleFOC.h:115,
from /tmp/.arduinoIDE-unsaved2026221-45696-177nkm5.blyh/angle_control/angle_control.ino:22:
/home/rkuo/Arduino/libraries/Simple_FOC/src/sensors/Encoder.h:13:27: note: to match this ‘{’
13 | enum Quadrature : uint8_t {
| ^
In file included from /home/rkuo/.arduino15/packages/realtek/hardware/AmebaPro2/4.1.1-build20260320/system/component/soc/8735b/cmsis/rtl8735b/include/cmsis.h:35,
from /home/rkuo/.arduino15/packages/realtek/hardware/AmebaPro2/4.1.1-build20260320/system/component/mbed/targets/hal/rtl8735b/PinNames.h:32,
from /home/rkuo/.arduino15/packages/realtek/hardware/AmebaPro2/4.1.1-build20260320/variants/ameba_amb82-mini/variant.h:27,
from /home/rkuo/.arduino15/packages/realtek/hardware/AmebaPro2/4.1.1-build20260320/variants/ameba_amb82-mini/pins_arduino.h:20,
from /home/rkuo/.arduino15/packages/realtek/hardware/AmebaPro2/4.1.1-build20260320/cores/ambpro2/Arduino.h:185,
from /home/rkuo/.cache/arduino/sketches/265838927EC2F47C0A45A0FCB4E41887/sketch/angle_control.ino.cpp:1:
/home/rkuo/.arduino15/packages/realtek/hardware/AmebaPro2/4.1.1-build20260320/system/component/soc/8735b/cmsis/rtl8735b/include/basic_types.h:160:21: error: expected unqualified-id before numeric constant
160 | #define ON 1
| ^
/home/rkuo/Arduino/libraries/Simple_FOC/src/sensors/Encoder.h:14:3: note: in expansion of macro ‘ON’
14 | ON = 0x00, //!< Enable quadrature mode CPR = 4xPPR
| ^~
In file included from /home/rkuo/Arduino/libraries/Simple_FOC/src/SimpleFOC.h:115,
from /tmp/.arduinoIDE-unsaved2026221-45696-177nkm5.blyh/angle_control/angle_control.ino:22:
/home/rkuo/Arduino/libraries/Simple_FOC/src/sensors/Encoder.h:16:1: error: expected declaration before ‘}’ token
16 | };
| ^
exit status 1

Compilation error: exit status 1

gemini said this:

This is a classic case of a macro naming collision.

The Realtek AmebaPro2 board headers are defining a global macro #define ON 1, but the SimpleFOC library is trying to use the word ON as a name inside an enumeration (enum Quadrature). Because the preprocessor runs first, it replaces the word ON in SimpleFOC with the number 1, resulting in the compiler seeing 1 = 0x00, which makes no sense to it.

Here is how to fix it without having to dig into the library files.

The Fix: Undefine the Macro

In your Arduino sketch (angle_control.ino), you need to tell the compiler to “forget” the Realtek definition of ON right before you include the SimpleFOC library.

Modify the top of your code to look like this:


// Keep your other includes here
#include <Arduino.h>

// 1. Undefine the conflicting macros from the Realtek core
#ifdef ON
#undef ON
#endif
#ifdef OFF
#undef OFF
#endif

// 2. Now include SimpleFOC
#include <SimpleFOC.h>

void setup() {
// … rest of your code
}
1 Like
#ifdef ON
#undef ON
#endif
#ifdef OFF
#undef OFF
#endif

Thanks ! That fix the ON define conflict

In file included from /home/rkuo/Arduino/libraries/Simple_FOC/src/SimpleFOC.h:116,
from /tmp/.arduinoIDE-unsaved2026226-8845-18nj5fp.lhdr/angle_control/angle_control.ino:33:
/home/rkuo/Arduino/libraries/Simple_FOC/src/sensors/MagneticSensorSPI.h:38:5: warning: "/" within comment [-Wcomment]
38 | /**
|
/home/rkuo/Arduino/libraries/Simple_FOC/src/common/base_classes/CurrentSense.cpp: In member function 'int CurrentSense::alignHybridDriver(float, BLDCDriver
, bool)':
/home/rkuo/Arduino/libraries/Simple_FOC/src/common/base_classes/CurrentSense.cpp:628:11: warning: unused variable ‘ca’ [-Wunused-variable]
628 | float ca[3] = {fabs(c.a), fabs(c.b), fabs(c.c)};
| ^~
/home/rkuo/Arduino/libraries/Simple_FOC/src/common/base_classes/CurrentSense.cpp:701:11: warning: unused variable ‘cb’ [-Wunused-variable]
701 | float cb[3] = {fabs(c.a), fabs(c.b), fabs(c.c)};
| ^~
/home/rkuo/Arduino/libraries/Simple_FOC/src/communication/Commander.cpp: In member function ‘void Commander::target(FOCMotor*, char*, char*)’:
/home/rkuo/Arduino/libraries/Simple_FOC/src/communication/Commander.cpp:579:9: warning: enumeration value ‘custom’ not handled in switch [-Wswitch]
579 | switch(motor->controller){
| ^
In file included from /home/rkuo/.arduino15/packages/realtek/hardware/AmebaPro2/4.1.1-build20260320/system/component/soc/8735b/cmsis/rtl8735b/include/cmsis.h:66,
from /home/rkuo/.arduino15/packages/realtek/hardware/AmebaPro2/4.1.1-build20260320/system/component/mbed/targets/hal/rtl8735b/PinNames.h:32,
from /home/rkuo/.arduino15/packages/realtek/hardware/AmebaPro2/4.1.1-build20260320/variants/ameba_amb82-mini/variant.h:27,
from /home/rkuo/.arduino15/packages/realtek/hardware/AmebaPro2/4.1.1-build20260320/variants/ameba_amb82-mini/pins_arduino.h:20,
from /home/rkuo/.arduino15/packages/realtek/hardware/AmebaPro2/4.1.1-build20260320/cores/ambpro2/Arduino.h:185,
from /home/rkuo/Arduino/libraries/Simple_FOC/src/current_sense/hardware_specific/stm32/stm32l4/../stm32_adc_utils.h:4,
from /home/rkuo/Arduino/libraries/Simple_FOC/src/current_sense/hardware_specific/stm32/stm32l4/stm32l4_utils.cpp:1:
/home/rkuo/.arduino15/packages/realtek/hardware/AmebaPro2/4.1.1-build20260320/system/component/soc/8735b/fwlib/rtl8735b/include/rtl8735b_pwm.h:625:1: internal compiler error: Segmentation fault
625 | hal_status_t hal_rtl_pwm_auto_duty_loop(hal_pwm_adapter_t *ppwm_adp, u32 ini_duty_us, u8 ini_dir, u32 loop_cnt);
| ^~~~~~~~~~~~
0x7cdde264532f ???
./signal/../sysdeps/unix/sysv/linux/x86_64/libc_sigaction.c:0
0x7cdde262a1c9 __libc_start_call_main
../sysdeps/x86/libc-start.c:58
0x7cdde262a28a __libc_start_main_impl
../sysdeps/nptl/libc_start_call_main.h:360
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See https://gcc.gnu.org/bugs/ for instructions.
exit status 1

Compilation error: exit status 1