SimpleFOC GUI Configuration/ Tunning tool

I have created a GIU to configure and manage SimpleFOC devices.

Currently it only allows configuring parameters and displaying variables in real time. I plan to add more functionality as the project for which I am going to use SimpleFOC progresses.It si developed using Python.

I leave a link here in case it could be useful to someone else



WOW! Just this week we were talking about the steps to do something like this. I’m impressed with your work, thanks for sharing! Hopefully I’ll give it a try soon :slight_smile:

@Owen_Williams was starting to experiment on a similar tool based on node/vue. I’m sure he would be very interested in checking out your work.

One question: Do you have to do something in particular on the arduino side of things? Like use motor.monitor() or something like that?

At the Arduino side I have the " Motor commands" sketch with a lsmall modification to limit the amount of data that is sent via serial port since is not needed more than 25 samples per second in order to obtain an animated plot.

Captura de pantalla 2021-01-17 a las 22.51.09

The node / value approximation is the one used by the Moteus configuration application.

My intention is to use SimpleFOC to develop my own board and using STM32 as MCU and instead of communicating using the serial port create an interface based on CAN bus, which makes it easier to have several devices connected.

If my project goes as planed my intentios is to evolve the application towards something similar to what Moteus controller: an interface based on a tree view whith all detected devices and nodes/leafs to configure each device.

Genial proyecto Jorge! Please do share with us as you work along.

I’m definitely going to use your tool for now with my ESP32 Brushless controller - Dagor (work in progress)

That’s amazing, and I must try it out tomorrow!

1 Like

I’ve been doing something similar with OSC and pD:

I’ll upload the example to the OSC examples soon.

Your GUI looks way nicer, but I like the flexibility in pD to add some “code” just by connecting some more boxes. That’s what I did at the top of the screenshot there: after getting the basic set-point setting and display working, I added some controls to set the speed in RPM, m/s or move a certain distance in m (based on input wheel radius)…

It’s working quite well. Note that most of the numbers displayed are actually also inputs, where you can type a new value or “scroll” the value with the mouse. The red things are “Stop” buttons.

1 Like

+1 from me. I’ll be giving this a try, too! You are a lot further than me with my node/vue tool.

Are you open to collaboration?

1 Like

De lujo !!! @David_Gonzalez

Do not hesitate to ask if you have any questions or find any problem using the application … it is an initial version and it may have some bug.

I know your project. When I started the project, the first thing I did was look for projects similar to what I wanted to achieve that already existed in order to learn from them and see what functionalities each offered. This is the list I made I made. Some of them are full opensorce, some partially and some are poorly documented

What I pretend to do is a “mix” between O-Tres, Dragor and Betzdrive. Use a STM32 as MCU, SimpleFOC for the software, and CAN to make the external control interface as well as adding an IMU which I think may be interesting for later uses of the controller. … I am just starting.


In fact I saw the part of the OSC example but I don’t have much knowledge of that language and I decided to take the idea and make a GUI in Python that I know a little bit more :slight_smile: OSC look very interesting … if i am not wrong you could use your SimpleFOC device move a lasers in a amuses related application :slight_smile:

Yes, totally open @Owen_Williams

In fact, my idea is to evolve this tool to a node / vaule tool, since it is friendlier when you have multiple nodes and it is more flexible when you want to make modifications on the parameters to configure in each node.

I pretend to develop a PCB to make a simpl FOC based controller with CAN interface and to be able to connect each controller to the computer to configure and sending motion commands.

This is an idea of what I intend to achieve where module (1) is the network explorer and node configurator, module (2) is a command line interface module (3) is the display area of variable graphs.

Captura de pantalla 2021-01-18 a las 1.48.45

Instead of adding a tab for each SimpleFOC node it will be possible to add tabs to create other tools that take advantage of the existing configuration functionality, so anyone can create its own tool meeting their requeieriments. It is a modular and extensible tool.


A tool like this would be a great help for people like me! Thanks Jorge

1 Like

@JorgeMaker - I’ve a few problems installing your tool on Ubuntu 20.04 and python 3.7.5.


pip install -r requirements.txt
    ERROR: Command errored out with exit status 1:
     command: /home/williao/.pyenv/versions/3.7.5/bin/python3.7 /home/williao/.pyenv/versions/3.7.5/lib/python3.7/site-packages/pip/_vendor/pep517/ prepare_metadata_for_build_wheel /tmp/tmpq63va3bm

This was fixed with:

pip install --upgrade pip setuptools

I then ran:

williao@williao-G3-3579:~/dev/python/SimpleFOCStudio$ python
Traceback (most recent call last):
  File "", line 8, in <module>
    from gui.mainWindow import UserInteractionMainWindow
ModuleNotFoundError: No module named 'gui'

So I tried:
export PYTHONPATH=$PWD/src
which then gave:

williao@williao-G3-3579:~/dev/python/SimpleFOCStudio$ python
Traceback (most recent call last):
  File "", line 8, in <module>
    from gui.mainWindow import UserInteractionMainWindow
  File "/home/williao/dev/python/SimpleFOCStudio/src/gui/", line 5, in <module>
    from gui.devicesTabbedWidget import DevicesTabbedWidget
  File "/home/williao/dev/python/SimpleFOCStudio/src/gui/", line 5, in <module>
    from gui.deviceConfigTool import DeviceConfigurationWidget
  File "/home/williao/dev/python/SimpleFOCStudio/src/gui/", line 6, in <module>
    from gui.generalSettingsWidget import GeneralSettingsGroupBox
  File "/home/williao/dev/python/SimpleFOCStudio/src/gui/", line 4, in <module>
    from sharedcomponets import ConfigQLineEdit
ModuleNotFoundError: No module named 'sharedcomponets'

I again changed the PYTHONPATH again
export PYTHONPATH=$PWD/src:$PYTHONPATH/src/gui

But that didn’t work. I suspect I’m on the wrong path (pun intended!). Any suggestions?

1 Like

I’m not sure, it seems like Python has some trouble trying to find the different files. I didn’t realize that since I had never run the application from the command line interface, always using PyCham. … let me do my research to see how to fix the problem.

PD: As workarround you add run it from PyCharm or any other Ide adding gui folder as “folder with aources”

I’m having the exact same issue running from atom with Script package.

Hi @David_Gonzalez @Owen_Williams

Hi, I have done a workaround that solved the problem by moving all the files to the same folder. It is not the most elegant solution but it should work after running: python

Let me know if this solves the issue :slight_smile:

I made a worarraond

EDIT: Fixed, it should work without problems as it is in the repository.

That’s better. I got some plots out of it.
The UI looks well thought out.

It runs a bit hot on my i7 at faster baud rates but, to be fair, so does platformio serial monitor (which is also python).

The only thing I could set was target. All other ‘sets’ ended up with a response of Target: 0 which suggests the value sent was changed to 0 somehow.

Hi @Owen_Williams

In theory using buttons you can set each parameter and using command line interface you can send any command as if you where typing on the serial console. i just run a test to verify it and it seems to work for meGrabación de pantalla 2021-01-20 a las 22.33.33

This version is working perfectly for me :slight_smile: Awesome tool!

Two observations though:
Default bit rate is set to 11520 instead of 115200. Couldn’t find why it wouldn’t work until I saw this :stuck_out_tongue:

Would be nice to see more than two decimal places, sometimes I set my P to 0.002 or less.

Edit: forgot to mention, had an issue with my windows machine, but I found the fix here: This Windows version (6.3.9600) does not support the required bluetooth API. · GIS4WRF/gis4wrf (

Hi @David_Gonzalez

Nice to hear the you like it :slight_smile: The limitation on the number os decimals comes from SimpleFOC library I do not trim the nunber of decimals neither when sending or receiving , I just take the string and sent it via serial port to the device. I guess that the limitation comes from here:

Captura de pantalla 2021-01-21 a las 3.26.06

It could be easy solved adding a new monitoring function with a an extra parameter, something like this:

void FOCMotor::useMonitoring(Print &print, int numerOfDecimals);

… but this is out of the scope of my application.

1 Like

Hey @JorgeMaker,
This is a great tool, I did not have time to thank you yet. :smiley:
We have already looked into developing a tool like this and you have made our life a lot easier now!

I will resolve this issue of decimal point for the next release, its noted in my todos. Basically print function receives the number of decimal points already.

monitoring_port->print(value, 4); // for 4 decimal places

I would actually like to advise you not to use the monitoring function motor.monitor() but to use the motor commands using commands V1, V2 and V3. It is async but then you can decide your own sampling rate and more time for the motor to do its focing :smiley:
But downsampling works well as well!

Also for the next release I’ll introduce the “verbose” option to the motor commands so that we can avoid the textual outputs.

Finally, based on your interest on node/value interface for simplefoc I have some ideas and I think it would be interesting to discuss more thoroughly in the new thread. Let me create it and explain my vision for the simplefoc and I would love to hear what you think.


1 Like