32 changed files with 523 additions and 172 deletions
-
2src/main/java/com/iflytop/gd/app/service/DeviceParamConfigService.java
-
2src/main/java/com/iflytop/gd/hardware/command/handlers/AcidPumpHandler.java
-
1src/main/java/com/iflytop/gd/hardware/command/handlers/ClawHandler.java
-
4src/main/java/com/iflytop/gd/hardware/command/handlers/DoorHandler.java
-
2src/main/java/com/iflytop/gd/hardware/command/handlers/HBotHandler.java
-
2src/main/java/com/iflytop/gd/hardware/command/handlers/HeaterMotorHandler.java
-
2src/main/java/com/iflytop/gd/hardware/command/handlers/ShakeMotorHandler.java
-
2src/main/java/com/iflytop/gd/hardware/command/handlers/TrayMotorHandler.java
-
260src/main/java/com/iflytop/gd/hardware/config/StepMotorConfig.java
-
2src/main/java/com/iflytop/gd/hardware/constants/ActionOvertimeConstant.java
-
2src/main/java/com/iflytop/gd/hardware/controller/ServoController.java
-
4src/main/java/com/iflytop/gd/hardware/controller/StepMotorController.java
-
1src/main/java/com/iflytop/gd/hardware/drivers/MiniServoDriver/ClawDriver.java
-
1src/main/java/com/iflytop/gd/hardware/drivers/StepMotorDriver/AcidPumpDriver.java
-
1src/main/java/com/iflytop/gd/hardware/drivers/StepMotorDriver/DoorDriver.java
-
1src/main/java/com/iflytop/gd/hardware/drivers/StepMotorDriver/HBotDriver.java
-
1src/main/java/com/iflytop/gd/hardware/drivers/StepMotorDriver/HeaterMotorDriver.java
-
3src/main/java/com/iflytop/gd/hardware/drivers/StepMotorDriver/ShakeMotorDriver.java
-
3src/main/java/com/iflytop/gd/hardware/drivers/StepMotorDriver/StepMotorCtrlDriver.java
-
81src/main/java/com/iflytop/gd/hardware/drivers/StepMotorDriver/StepMotorHelper.java
-
1src/main/java/com/iflytop/gd/hardware/drivers/StepMotorDriver/TrayMotorDriver.java
-
1src/main/java/com/iflytop/gd/hardware/service/ServoService.java
-
4src/main/java/com/iflytop/gd/hardware/service/StepMotorService.java
-
11src/main/java/com/iflytop/gd/hardware/type/MId.java
-
2src/main/java/com/iflytop/gd/hardware/type/StepMotor/DeviceStepMotorId.java
-
3src/main/java/com/iflytop/gd/hardware/type/StepMotor/StepMotorMId.java
-
2src/main/java/com/iflytop/gd/hardware/type/StepMotor/StepMotorRegIndex.java
-
2src/main/java/com/iflytop/gd/hardware/type/StepMotor/StepMotorSpeedLevel.java
@ -0,0 +1,260 @@ |
|||
package com.iflytop.gd.hardware.config; |
|||
|
|||
import com.iflytop.gd.hardware.type.StepMotor.StepMotorMId; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
|
|||
import java.util.Map; |
|||
|
|||
@Slf4j |
|||
public class StepMotorConfig { |
|||
// 导程 配置 |
|||
private final static double DEFAULT_LEAD = 10.0; // mm |
|||
final static Map<StepMotorMId, Double> stepMotorLeadMap = Map.ofEntries( |
|||
Map.entry(StepMotorMId.HBOT_X_MOTOR_MID, 5.0), |
|||
Map.entry(StepMotorMId.HBOT_Y_MOTOR_MID, 4.0), |
|||
Map.entry(StepMotorMId.HBOT_Z_MOTOR_MID, 5.0) |
|||
); |
|||
// 电流配置 |
|||
final static int DEFAULT_CURRENT = 8; // [0-31] |
|||
final static int HEATER_MOTOR_DEFAULT_CURRENT = 20; |
|||
final static int ACID_PUMP_MOTOR_DEFAULT_CURRENT = 8; |
|||
final static Map<StepMotorMId, Integer> stepMotorCurrentMap = Map.ofEntries( |
|||
Map.entry(StepMotorMId.SHAKE_MOTOR_MID, 8), |
|||
Map.entry(StepMotorMId.HBOT_X_MOTOR_MID, 31), |
|||
Map.entry(StepMotorMId.HBOT_Y_MOTOR_MID, 31), |
|||
Map.entry(StepMotorMId.HBOT_Z_MOTOR_MID, 31), |
|||
Map.entry(StepMotorMId.HEATER_1_MOTOR_MID, HEATER_MOTOR_DEFAULT_CURRENT), |
|||
Map.entry(StepMotorMId.HEATER_2_MOTOR_MID, HEATER_MOTOR_DEFAULT_CURRENT), |
|||
Map.entry(StepMotorMId.HEATER_3_MOTOR_MID, HEATER_MOTOR_DEFAULT_CURRENT), |
|||
Map.entry(StepMotorMId.HEATER_4_MOTOR_MID, HEATER_MOTOR_DEFAULT_CURRENT), |
|||
Map.entry(StepMotorMId.HEATER_5_MOTOR_MID, HEATER_MOTOR_DEFAULT_CURRENT), |
|||
Map.entry(StepMotorMId.HEATER_6_MOTOR_MID, HEATER_MOTOR_DEFAULT_CURRENT), |
|||
Map.entry(StepMotorMId.ACID_PUMP_1_MOTOR_MID, ACID_PUMP_MOTOR_DEFAULT_CURRENT), |
|||
Map.entry(StepMotorMId.ACID_PUMP_2_MOTOR_MID, ACID_PUMP_MOTOR_DEFAULT_CURRENT), |
|||
Map.entry(StepMotorMId.ACID_PUMP_3_MOTOR_MID, ACID_PUMP_MOTOR_DEFAULT_CURRENT), |
|||
Map.entry(StepMotorMId.ACID_PUMP_4_MOTOR_MID, ACID_PUMP_MOTOR_DEFAULT_CURRENT), |
|||
Map.entry(StepMotorMId.ACID_PUMP_5_MOTOR_MID, ACID_PUMP_MOTOR_DEFAULT_CURRENT), |
|||
Map.entry(StepMotorMId.ACID_PUMP_6_MOTOR_MID, ACID_PUMP_MOTOR_DEFAULT_CURRENT), |
|||
Map.entry(StepMotorMId.ACID_PUMP_7_MOTOR_MID, ACID_PUMP_MOTOR_DEFAULT_CURRENT), |
|||
Map.entry(StepMotorMId.ACID_PUMP_8_MOTOR_MID, ACID_PUMP_MOTOR_DEFAULT_CURRENT) |
|||
); |
|||
|
|||
// 速度配置 |
|||
final static double DEFAULT_SPEED = 1.0; // mm/s |
|||
final static double HEATER_MOTOR_DEFAULT_SPEED = 1.0; |
|||
final static double ACID_PUMP_MOTOR_DEFAULT_SPEED = 1.0; |
|||
final static Map<StepMotorMId, Double> stepMotorSpeedMap = Map.ofEntries( |
|||
Map.entry(StepMotorMId.SHAKE_MOTOR_MID, 1.0), |
|||
Map.entry(StepMotorMId.HBOT_X_MOTOR_MID, 20.0), |
|||
Map.entry(StepMotorMId.HBOT_Y_MOTOR_MID, 20.0), |
|||
Map.entry(StepMotorMId.HBOT_Z_MOTOR_MID, 20.0), |
|||
Map.entry(StepMotorMId.HEATER_1_MOTOR_MID, HEATER_MOTOR_DEFAULT_SPEED), |
|||
Map.entry(StepMotorMId.HEATER_2_MOTOR_MID, HEATER_MOTOR_DEFAULT_SPEED), |
|||
Map.entry(StepMotorMId.HEATER_3_MOTOR_MID, HEATER_MOTOR_DEFAULT_SPEED), |
|||
Map.entry(StepMotorMId.HEATER_4_MOTOR_MID, HEATER_MOTOR_DEFAULT_SPEED), |
|||
Map.entry(StepMotorMId.HEATER_5_MOTOR_MID, HEATER_MOTOR_DEFAULT_SPEED), |
|||
Map.entry(StepMotorMId.HEATER_6_MOTOR_MID, HEATER_MOTOR_DEFAULT_SPEED), |
|||
Map.entry(StepMotorMId.ACID_PUMP_1_MOTOR_MID, ACID_PUMP_MOTOR_DEFAULT_SPEED), |
|||
Map.entry(StepMotorMId.ACID_PUMP_2_MOTOR_MID, ACID_PUMP_MOTOR_DEFAULT_SPEED), |
|||
Map.entry(StepMotorMId.ACID_PUMP_3_MOTOR_MID, ACID_PUMP_MOTOR_DEFAULT_SPEED), |
|||
Map.entry(StepMotorMId.ACID_PUMP_4_MOTOR_MID, ACID_PUMP_MOTOR_DEFAULT_SPEED), |
|||
Map.entry(StepMotorMId.ACID_PUMP_5_MOTOR_MID, ACID_PUMP_MOTOR_DEFAULT_SPEED), |
|||
Map.entry(StepMotorMId.ACID_PUMP_6_MOTOR_MID, ACID_PUMP_MOTOR_DEFAULT_SPEED), |
|||
Map.entry(StepMotorMId.ACID_PUMP_7_MOTOR_MID, ACID_PUMP_MOTOR_DEFAULT_SPEED), |
|||
Map.entry(StepMotorMId.ACID_PUMP_8_MOTOR_MID, ACID_PUMP_MOTOR_DEFAULT_SPEED) |
|||
); |
|||
|
|||
// 最小限位配置 |
|||
static final double DEFAULT_MIN_LIMIT = 0.0; // mm |
|||
static final double HEATER_MOTOR_DEFAULT_MIN_LIMIT = 0.0; |
|||
static final double ACID_PUMP_MOTOR_DEFAULT_MIN_LIMIT = 0.0; |
|||
final static Map<StepMotorMId, Double> stepMotorMinLimitMap = Map.ofEntries( |
|||
Map.entry(StepMotorMId.HBOT_X_MOTOR_MID, 0.0), |
|||
Map.entry(StepMotorMId.HBOT_Y_MOTOR_MID, 0.0), |
|||
Map.entry(StepMotorMId.HBOT_Z_MOTOR_MID, 0.0) |
|||
); |
|||
|
|||
// 最大限位配置 |
|||
static final double DEFAULT_MAX_LIMIT = 0.0; // mm |
|||
static final double HEATER_MOTOR_DEFAULT_MAX_LIMIT = 100.0; |
|||
static final double ACID_PUMP_MOTOR_DEFAULT_MAX_LIMIT = Double.MAX_VALUE; |
|||
final static Map<StepMotorMId, Double> stepMotorMaxLimitMap = Map.ofEntries( |
|||
Map.entry(StepMotorMId.HBOT_X_MOTOR_MID, 1500.0), |
|||
Map.entry(StepMotorMId.HBOT_Y_MOTOR_MID, 800.0), |
|||
Map.entry(StepMotorMId.HBOT_Z_MOTOR_MID, 300.0), |
|||
Map.entry(StepMotorMId.HEATER_1_MOTOR_MID, HEATER_MOTOR_DEFAULT_MAX_LIMIT), |
|||
Map.entry(StepMotorMId.HEATER_2_MOTOR_MID, HEATER_MOTOR_DEFAULT_MAX_LIMIT), |
|||
Map.entry(StepMotorMId.HEATER_3_MOTOR_MID, HEATER_MOTOR_DEFAULT_MAX_LIMIT), |
|||
Map.entry(StepMotorMId.HEATER_4_MOTOR_MID, HEATER_MOTOR_DEFAULT_MAX_LIMIT), |
|||
Map.entry(StepMotorMId.HEATER_5_MOTOR_MID, HEATER_MOTOR_DEFAULT_MAX_LIMIT), |
|||
Map.entry(StepMotorMId.HEATER_6_MOTOR_MID, HEATER_MOTOR_DEFAULT_MAX_LIMIT), |
|||
Map.entry(StepMotorMId.ACID_PUMP_1_MOTOR_MID, ACID_PUMP_MOTOR_DEFAULT_MAX_LIMIT), |
|||
Map.entry(StepMotorMId.ACID_PUMP_2_MOTOR_MID, ACID_PUMP_MOTOR_DEFAULT_MAX_LIMIT), |
|||
Map.entry(StepMotorMId.ACID_PUMP_3_MOTOR_MID, ACID_PUMP_MOTOR_DEFAULT_MAX_LIMIT), |
|||
Map.entry(StepMotorMId.ACID_PUMP_4_MOTOR_MID, ACID_PUMP_MOTOR_DEFAULT_MAX_LIMIT), |
|||
Map.entry(StepMotorMId.ACID_PUMP_5_MOTOR_MID, ACID_PUMP_MOTOR_DEFAULT_MAX_LIMIT), |
|||
Map.entry(StepMotorMId.ACID_PUMP_6_MOTOR_MID, ACID_PUMP_MOTOR_DEFAULT_MAX_LIMIT), |
|||
Map.entry(StepMotorMId.ACID_PUMP_7_MOTOR_MID, ACID_PUMP_MOTOR_DEFAULT_MAX_LIMIT), |
|||
Map.entry(StepMotorMId.ACID_PUMP_8_MOTOR_MID, ACID_PUMP_MOTOR_DEFAULT_MAX_LIMIT) |
|||
); |
|||
|
|||
// 是否安装编码器 |
|||
private final static boolean DEFAULT_ENCODER_INSTALLED = false; |
|||
static Map<StepMotorMId, Boolean> stepMotorEncoderMap = Map.ofEntries( |
|||
Map.entry(StepMotorMId.HBOT_X_MOTOR_MID, true), |
|||
Map.entry(StepMotorMId.HBOT_Y_MOTOR_MID, true), |
|||
Map.entry(StepMotorMId.HBOT_Z_MOTOR_MID, true) |
|||
); |
|||
|
|||
/* ******************** ******************** ******************** */ |
|||
/* ******************** 导程 ******************** */ |
|||
/* ******************** ******************** ******************** */ |
|||
|
|||
// 从数据库拉取导程信息 |
|||
private Double getLeadFromDB(StepMotorMId stepMotorId) |
|||
{ |
|||
// TODO: 从数据库中获取导程 |
|||
return null; |
|||
} |
|||
|
|||
// 从默认配置中获取导程信息 |
|||
private Double getLeadFromDefault(StepMotorMId stepMotorId) |
|||
{ |
|||
return stepMotorLeadMap.getOrDefault(stepMotorId, DEFAULT_LEAD); |
|||
} |
|||
|
|||
// 获取导程信息 |
|||
public double getLead(StepMotorMId stepMotorId) |
|||
{ |
|||
Double lead = getLeadFromDB(stepMotorId); |
|||
if (lead != null) { |
|||
return lead; |
|||
} else { |
|||
return getLeadFromDefault(stepMotorId); |
|||
} |
|||
} |
|||
|
|||
/* ******************** ******************** ******************** */ |
|||
/* ******************** 电流 ******************** */ |
|||
/* ******************** ******************** ******************** */ |
|||
// 从数据库拉取电流信息 |
|||
private Integer getCurrentFromDB(StepMotorMId stepMotorId) |
|||
{ |
|||
// TODO: 从数据库中获取电流 |
|||
return null; |
|||
} |
|||
|
|||
private Integer getCurrentFromDefault(StepMotorMId stepMotorId) |
|||
{ |
|||
return stepMotorCurrentMap.getOrDefault(stepMotorId, DEFAULT_CURRENT); |
|||
} |
|||
|
|||
public int getCurrent(StepMotorMId stepMotorId) |
|||
{ |
|||
Integer current = getCurrentFromDB(stepMotorId); |
|||
if (current != null) { |
|||
return current; |
|||
} else { |
|||
return getCurrentFromDefault(stepMotorId); |
|||
} |
|||
} |
|||
|
|||
/* ******************** ******************** ******************** */ |
|||
/* ******************** 速度 ******************** */ |
|||
/* ******************** ******************** ******************** */ |
|||
// 从数据库拉取速度信息 |
|||
private Double getSpeedFromDB(StepMotorMId stepMotorId) |
|||
{ |
|||
// TODO: 从数据库中获取速度 |
|||
return null; |
|||
} |
|||
private Double getSpeedFromDefault(StepMotorMId stepMotorId) |
|||
{ |
|||
return stepMotorSpeedMap.getOrDefault(stepMotorId, DEFAULT_SPEED); |
|||
} |
|||
|
|||
public double getSpeed(StepMotorMId stepMotorId) |
|||
{ |
|||
Double speed = getSpeedFromDB(stepMotorId); |
|||
if (speed != null) { |
|||
return speed; |
|||
} else { |
|||
return getSpeedFromDefault(stepMotorId); |
|||
} |
|||
} |
|||
|
|||
/* ******************** ******************** ******************** */ |
|||
/* ******************** 最小限位 ******************** */ |
|||
/* ******************** ******************** ******************** */ |
|||
// 从数据库拉取最小限位信息 |
|||
private Double getMinLimitFromDB(StepMotorMId stepMotorId) |
|||
{ |
|||
// TODO: 从数据库中获取最小限位 |
|||
return null; |
|||
} |
|||
|
|||
private Double getMinLimitFromDefault(StepMotorMId stepMotorId) |
|||
{ |
|||
return stepMotorMinLimitMap.getOrDefault(stepMotorId, DEFAULT_MIN_LIMIT); |
|||
} |
|||
|
|||
public double getMinLimit(StepMotorMId stepMotorId) |
|||
{ |
|||
Double minLimit = getMinLimitFromDB(stepMotorId); |
|||
if (minLimit != null) { |
|||
return minLimit; |
|||
} else { |
|||
return getMinLimitFromDefault(stepMotorId); |
|||
} |
|||
} |
|||
|
|||
/* ******************** ******************** ******************** */ |
|||
/* ******************** 最大限位 ******************** */ |
|||
/* ******************** ******************** ******************** */ |
|||
// 从数据库拉取最大限位信息 |
|||
private Double getMaxLimitFromDB(StepMotorMId stepMotorId) |
|||
{ |
|||
// TODO: 从数据库中获取最大限位 |
|||
return null; |
|||
} |
|||
|
|||
private Double getMaxLimitFromDefault(StepMotorMId stepMotorId) |
|||
{ |
|||
return stepMotorMaxLimitMap.getOrDefault(stepMotorId, DEFAULT_MAX_LIMIT); |
|||
} |
|||
|
|||
public double getMaxLimit(StepMotorMId stepMotorId) |
|||
{ |
|||
Double maxLimit = getMaxLimitFromDB(stepMotorId); |
|||
if (maxLimit != null) { |
|||
return maxLimit; |
|||
} else { |
|||
return getMaxLimitFromDefault(stepMotorId); |
|||
} |
|||
} |
|||
|
|||
/* ******************** ******************** ******************** */ |
|||
/* ******************** 编码器 ******************** */ |
|||
/* ******************** ******************** ******************** */ |
|||
// 从数据库拉取编码器信息 |
|||
private Boolean getEncoderFromDB(StepMotorMId stepMotorId) |
|||
{ |
|||
//TODO: 从数据库中获取编码器 |
|||
return null; |
|||
} |
|||
|
|||
private Boolean getEncoderFromDefault(StepMotorMId stepMotorId) |
|||
{ |
|||
return stepMotorEncoderMap.getOrDefault(stepMotorId, DEFAULT_ENCODER_INSTALLED); |
|||
} |
|||
|
|||
public boolean isEncoderInstalled(StepMotorMId stepMotorId) |
|||
{ |
|||
Boolean encoder = getEncoderFromDB(stepMotorId); |
|||
if (encoder != null) { |
|||
return encoder; |
|||
} else { |
|||
return getEncoderFromDefault(stepMotorId); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,81 @@ |
|||
package com.iflytop.gd.hardware.drivers.StepMotorDriver; |
|||
|
|||
/** |
|||
* @author iflytop |
|||
* @date 2023/10/12 |
|||
* @description 步进电机助手类 |
|||
* lead[S](导程): mm |
|||
* rps(转速): r/s |
|||
* rpm(转速): r/min |
|||
* r(转数): r |
|||
* |
|||
*/ |
|||
public class StepMotorHelper { |
|||
static private final double kScale = 10000.0; |
|||
|
|||
/* **** **** **** **** **** **** **** **** **** **** **** |
|||
* 位置转换 |
|||
* 1. 用户位置 X |
|||
* 2. 用户单位距离 unit_X |
|||
* 3. R = X * kScale / motor_scale * motor_lead |
|||
* 4. unit_X(1mm/1ml) = R / S = X * kScale / motor_scale * motor_lead / S |
|||
* 5. motor_scale == 10000.0 && motor_lead == S |
|||
* 6. unit_X(1mm/1ml) = X * kScale / motor_scale (X=1, 即 X = unit_X, 保证 kScale / motor_scale == 1) |
|||
* 7. kScale = motor_scale = 10000.0 |
|||
* |
|||
**** **** **** **** **** **** **** **** **** **** **** */ |
|||
|
|||
/** |
|||
* 用户设置位置转换为控制器需要的位置 |
|||
* @param position |
|||
* @return |
|||
*/ |
|||
static int toMotorPosition(double position) |
|||
{ |
|||
return (int)(position * kScale); |
|||
} |
|||
|
|||
/** |
|||
* 控制器位置转换为用户设置位置 |
|||
* @param motorPosition |
|||
* @return |
|||
*/ |
|||
static double toUserPosition(int motorPosition) |
|||
{ |
|||
return (double)motorPosition / kScale; |
|||
} |
|||
|
|||
/* **** **** **** **** **** **** **** **** **** **** **** |
|||
* 速度转换 |
|||
* 1. 用户速度 X/s |
|||
* 2. 电机速度 R/min |
|||
* 3. X/s = rps * S |
|||
* 4. rps = X/s / S |
|||
* 5. rps = rpm / 60.0 |
|||
* 6. rpm = X/s * 60.0 |
|||
* 7. rpm = X/s / S * 60.0 |
|||
* |
|||
**** **** **** **** **** **** **** **** **** **** **** */ |
|||
|
|||
/** |
|||
* 用户设置速度转换为控制器需要的速度 |
|||
* 用户速度 U_Speed xx/s |
|||
* 控制器速度 rpm |
|||
* S 导程 |
|||
*/ |
|||
static int toMotorSpeed(double speed, double S) |
|||
{ |
|||
return (int)(speed * 60.0 / S); |
|||
} |
|||
|
|||
/** |
|||
* 控制器速度转换为用户设置速度 |
|||
* 控制器速度 rpm |
|||
* 用户速度 U_Speed xx/s |
|||
* S 导程 |
|||
*/ |
|||
static double toUserSpeed(int motorSpeed, double S) |
|||
{ |
|||
return (double)motorSpeed * S / 60.0; |
|||
} |
|||
} |
@ -1,4 +1,4 @@ |
|||
package com.iflytop.gd.hardware.drivers.StepMotorDriver; |
|||
package com.iflytop.gd.hardware.type.StepMotor; |
|||
|
|||
|
|||
public enum DeviceStepMotorId { |
@ -1,7 +1,6 @@ |
|||
package com.iflytop.gd.hardware.drivers.StepMotorDriver; |
|||
package com.iflytop.gd.hardware.type.StepMotor; |
|||
|
|||
import com.iflytop.gd.hardware.type.MId; |
|||
import org.springframework.util.Assert; |
|||
|
|||
public enum StepMotorMId { |
|||
DOOR_MOTOR_MID(MId.DoorM), |
@ -1,4 +1,4 @@ |
|||
package com.iflytop.gd.hardware.drivers.StepMotorDriver; |
|||
package com.iflytop.gd.hardware.type.StepMotor; |
|||
|
|||
import com.iflytop.gd.hardware.type.RegIndex; |
|||
|
@ -1,4 +1,4 @@ |
|||
package com.iflytop.gd.hardware.drivers.StepMotorDriver; |
|||
package com.iflytop.gd.hardware.type.StepMotor; |
|||
|
|||
public enum StepMotorSpeedLevel { |
|||
DEFAULT, |
Write
Preview
Loading…
Cancel
Save
Reference in new issue