1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- /*
- 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.
- */
- #include "M5Stack.h"
- #include "odrive.h"
- 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);
- }
|