Skip to content

Using SimpleFOC library with arduino

BOM

Item
GM3506 Gimbal Motor Datasheet
SimpleFOCMini V1.0

Wiring

alt text

mini pin EN IN3 IN2 IN1 GND
Uno pin 4 5 6 9 GND

Code

src/main.cpp
#include <Arduino.h>
#include <SimpleFOC.h>

// Define motor driver pins
#define PWM_A 9
#define PWM_B 6
#define PWM_C 5
#define ENABLE_PIN 4

// Create the BLDC driver object
BLDCDriver3PWM driver(PWM_A, PWM_B, PWM_C, ENABLE_PIN);

// Create the BLDC motor object
BLDCMotor motor = BLDCMotor(11); // 7 pole pairs (estimate for GM3506)

// Create an open-loop velocity control
void setup()
{
  Serial.begin(9600);

  // Initialize driver
  driver.voltage_power_supply = 12; // Set to your supply voltage
  driver.init();

  // Link driver to motor
  motor.linkDriver(&driver);

  // Open-loop velocity mode
  motor.voltage_limit = 6; // Limit voltage to half supply
  motor.controller = MotionControlType::velocity_openloop;

  // Initialize motor
  motor.init();
  Serial.println("Motor Ready!");
}

void loop()
{
  motor.move(1);
  motor.loopFOC();
}

Note

In velocity_openloop mode the speed depends on supply voltage and motor parameters.

platformio.ini
1
2
3
4
5
[env:uno]
platform = atmelavr
board = uno
framework = arduino
lib_deps = askuric/Simple FOC@^2.2

Add encoder

Wiring

color desc uno pin
black CSN (chip select) D10 (any gpio)
purple CLK D13 (SCK)
yellow MOSI (master out slave in) D11 (COPI)
green MISO (master in slave out) D12 (CIPO)
red 5/3.3
white GND

Code

Using FOC library with encoder

src/main.cpp
#include <Arduino.h>
#include <SimpleFOC.h>

// Define motor driver pins
#define PWM_A 9
#define PWM_B 6
#define PWM_C 5
#define ENABLE_PIN 4

// Create the BLDC driver object
BLDCDriver3PWM driver(PWM_A, PWM_B, PWM_C, ENABLE_PIN);

// Create the BLDC motor object
BLDCMotor motor = BLDCMotor(11); // 7 pole pairs (estimate for GM3506)
MagneticSensorSPI as5047u = MagneticSensorSPI(10, 14, 0x3FFF);
// Create an open-loop velocity control
void setup()
{
  Serial.begin(115200);
  as5047u.init();
  Serial.println("as5047u ready");
  // Initialize driver
  driver.voltage_power_supply = 12; // Set to your supply voltage
  driver.init();

  // Link driver to motor
  motor.linkDriver(&driver);

  // Open-loop velocity mode
  motor.voltage_limit = 6; // Limit voltage to half supply
  motor.controller = MotionControlType::velocity_openloop;

  // Initialize motor
  motor.init();
  Serial.println("Motor Ready!");
}

void loop()
{
  motor.move(1);
  motor.loopFOC();
  as5047u.update();
  // display the angle and the angular velocity to the terminal
  Serial.print(as5047u.getAngle());
  Serial.print("\t");
  Serial.println(as5047u.getVelocity());
}