mirror of
https://github.com/m5stack/M5Stack.git
synced 2026-05-20 10:06:46 -07:00
104 lines
3.0 KiB
Arduino
104 lines
3.0 KiB
Arduino
/*
|
|
* SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD
|
|
*
|
|
* SPDX-License-Identifier: MIT
|
|
*/
|
|
/*
|
|
* @Hardwares: M5Core + Module13.2 ODrive
|
|
* @Platform Version: Arduino M5Stack Board Manager v2.1.3
|
|
* @Dependent Library:
|
|
* M5Stack@^0.4.6: https://github.com/m5stack/M5Stack
|
|
*/
|
|
|
|
#include "M5Stack.h"
|
|
#include "odrive.h"
|
|
|
|
// Description:
|
|
// This case uses the ODrive module to control the high-speed and precise
|
|
// rotation of the servo motor Press button C to calibrate (do not touch the
|
|
// motor shaft during this period), long press and short button A to control the
|
|
// motor rotation. Note: The motor parameter configuration in this case is only
|
|
// applicable to the motor model matched with the M5 Odrive kit. When driving
|
|
// other types of motors, please configure the parameters according to the motor
|
|
// used.
|
|
|
|
ODrive odrive(Serial1);
|
|
TFT_eSprite canvas = TFT_eSprite(&M5.Lcd);
|
|
|
|
void showStringCenter(const char* str, uint16_t color)
|
|
{
|
|
canvas.fillScreen(TFT_BLACK);
|
|
canvas.setTextColor(color);
|
|
canvas.drawString(str, 160, 120, 4);
|
|
canvas.pushSprite(0, 0);
|
|
}
|
|
|
|
void setup()
|
|
{
|
|
M5.begin(true, false, true, true);
|
|
canvas.setColorDepth(1);
|
|
canvas.createSprite(320, 240);
|
|
Serial1.begin(115200, SERIAL_8N1, 13, 5);
|
|
|
|
canvas.setTextDatum(MC_DATUM);
|
|
showStringCenter("ODrive", TFT_GREEN);
|
|
}
|
|
|
|
void loop()
|
|
{
|
|
M5.update();
|
|
if (M5.BtnA.wasReleased()) {
|
|
odrive.setPosition(10);
|
|
}
|
|
|
|
if (M5.BtnA.wasReleasefor(800)) {
|
|
odrive.setPosition(0);
|
|
}
|
|
|
|
if (M5.BtnB.wasReleased()) {
|
|
showStringCenter("Save default config", TFT_GREEN);
|
|
odrive.setDefaultConfig();
|
|
odrive.reboot();
|
|
}
|
|
|
|
if (M5.BtnB.wasReleasefor(800)) {
|
|
showStringCenter("Clear config", TFT_GREEN);
|
|
odrive.eraseConfig();
|
|
}
|
|
|
|
if (M5.BtnC.wasReleased()) {
|
|
showStringCenter("Motor CALIBRATION", TFT_WHITE);
|
|
odrive.runState(odrive.AXIS_STATE_MOTOR_CALIBRATION, 10000);
|
|
if (odrive.checkError()) {
|
|
showStringCenter("Motor CALIBRATION", TFT_RED);
|
|
return;
|
|
}
|
|
|
|
showStringCenter("Encoder CALIBRATION", TFT_WHITE);
|
|
odrive.runState(odrive.AXIS_STATE_ENCODER_INDEX_SEARCH, 10000);
|
|
if (odrive.checkError()) {
|
|
showStringCenter("Encoder Failed", TFT_RED);
|
|
return;
|
|
}
|
|
|
|
showStringCenter("Offset CALIBRATION", TFT_WHITE);
|
|
odrive.runState(odrive.AXIS_STATE_ENCODER_OFFSET_CALIBRATION, 10000);
|
|
if (odrive.checkError()) {
|
|
showStringCenter("Offset Failed", TFT_RED);
|
|
return;
|
|
}
|
|
|
|
odrive.setGain(211.0, 0.0225, 0.01125);
|
|
odrive.setControlMode(odrive.CONTROL_MODE_POSITION_CONTROL);
|
|
odrive.runState(odrive.AXIS_STATE_CLOSED_LOOP_CONTROL, 2000);
|
|
|
|
showStringCenter("Finish", TFT_GREEN);
|
|
}
|
|
|
|
char data_show[100];
|
|
sprintf(data_show, "%f, %d, %d\r\n", odrive.getVbusVoltage(), odrive.getEncoderShadowCount(), odrive.checkError());
|
|
showStringCenter(data_show, TFT_WHITE);
|
|
Serial.printf(data_show);
|
|
delay(20);
|
|
}
|