Hello C++ Experts
It took me a few days to get my setup working with the example files. But the setup is done.
Im using one iPower Motor GM3506 with AS5048 encoder on a Arduino Nano ESP32 and SimpleFOC Mini. With one 12V power supply for the Arduino and FOC mini.
Pins in the sketch are mixed mode. SPI and Motor EN pin are configured as Arduino pins and IN1, 2 and 3 as ESP32 GPIO Pins.
I will 3D Print a mount for the motor and a mount for the webcam to the motor.
But my problem is C++ I can make a LED blink on the Arduino, thatâs about is.
And that is where I need help please!!!
I think the angle Sketch works the best for what I would like to do.
Step 1. Get the motor to move 270 degrees in a loop, so move from 0 135 degrees then -135 degrees and back 135 degrees ec.
It will have to move slow, so that the webcam can pickup the image, but I would like to have maximum torque on the motor. Can anyone please help me with this if and if then if whahahaha
Step 2. But this has no prior, I would like to add Bluetooth and be able to change the angle and speed of the motor movement, without having to take it down and load new code.
My sketch im testing with at the moment.
#include <SimpleFOC.h>
// magnetic sensor instance - SPI
MagneticSensorSPI sensor = MagneticSensorSPI(AS5048_SPI, 10); //(CS - Arduino Port)
// BLDCMotor(pole pair number, phase resistance [Ohms], KV rating [rpm/V])
BLDCMotor motor = BLDCMotor(11); //5.8ohm
BLDCDriver3PWM driver = BLDCDriver3PWM(18, 8, 9, 8); //(IN1 - GPIO Port, IN2 - GPIO Port, IN3 - GPIO Port, EN - Arduino Port)
// angle set point variable
float target_angle = 0;
// instantiate the commander
Commander command = Commander(Serial);
void doTarget(char* cmd) { command.scalar(&target_angle, cmd); }
void setup() {
// initialise magnetic sensor hardware
sensor.init();
// link the motor to the sensor
motor.linkSensor(&sensor);
// driver config
// power supply voltage [V]
driver.voltage_power_supply = 12;
driver.init();
// link the motor and the driver
motor.linkDriver(&driver);
// choose FOC modulation (optional)
motor.foc_modulation = FOCModulationType::SpaceVectorPWM;
// set motion control loop to be used
motor.controller = MotionControlType::angle;
// contoller configuration
// default parameters in defaults.h
// velocity PI controller parameters
motor.PID_velocity.P = 0.2f;
motor.PID_velocity.I = 20;
motor.PID_velocity.D = 0;
// maximal voltage to be set to the motor
motor.voltage_limit = 6;
// velocity low pass filtering time constant
// the lower the less filtered
motor.LPF_velocity.Tf = 0.01f;
// angle P controller
motor.P_angle.P = 20;
// maximal velocity of the position control
motor.velocity_limit = 2;
// use monitoring with serial
Serial.begin(115200);
// comment out if not needed
motor.useMonitoring(Serial);
// initialize motor
motor.init();
// align sensor and start FOC
motor.initFOC();
// add target command T
command.add('T', doTarget, "target angle");
Serial.println(F("Motor ready."));
Serial.println(F("Set the target angle using serial terminal:"));
_delay(1000);
}
void loop() {
// main FOC algorithm function
// the faster you run this function the better
// Arduino UNO loop ~1kHz
// Bluepill loop ~10kHz
motor.loopFOC();
// Motion control function
// velocity, position or voltage (defined in motor.controller)
// this function can be run at much lower frequency than loopFOC() function
// You can also use motor.move() and set the motor.target in the code
motor.move(target_angle);
// function intended to be used with serial plotter to monitor motor variables
// significantly slowing the execution down!!!!
// motor.monitor();
// user communication
command.run();
}
Im thankful for any help or feedback!