|
|
@@ -20,12 +20,12 @@ class ContrlService {
|
|
|
s2: 3
|
|
|
}
|
|
|
// prio init
|
|
|
- //RPIO.init({ mapping: "gpio" });
|
|
|
+ RPIO.init({ mapping: "gpio" });
|
|
|
// 继电器解锁
|
|
|
- //RPIO.open(6, RPIO.OUTPUT, RPIO.HIGH);
|
|
|
- //RPIO.open(13, RPIO.OUTPUT, RPIO.HIGH);
|
|
|
+ RPIO.open(22, RPIO.OUTPUT, RPIO.HIGH);
|
|
|
+ RPIO.open(23, RPIO.OUTPUT, RPIO.HIGH);
|
|
|
// 开灯
|
|
|
- //RPIO.open(19, RPIO.OUTPUT, RPIO.HIGH);
|
|
|
+ RPIO.open(22, RPIO.OUTPUT, RPIO.HIGH);
|
|
|
// init PWM
|
|
|
this.PWM = new Pca9685Driver(this.pwmOption, er => {
|
|
|
if (er) {
|
|
|
@@ -36,55 +36,45 @@ class ContrlService {
|
|
|
this.Snum = 0
|
|
|
// 解锁状态
|
|
|
this.enable = false
|
|
|
- // 摇杆解锁
|
|
|
- this.contrlEnable = false
|
|
|
- // 摇杆中立值110-120
|
|
|
- this.centerNum = 120
|
|
|
}
|
|
|
// 设置pwm
|
|
|
- async changPWM(params) {
|
|
|
+ async changPWM (params) {
|
|
|
const { v0, v1, v2, v3 } = params
|
|
|
if (typeof (v0) == 'number' || typeof (v3) == 'number') {
|
|
|
- // 内八解锁
|
|
|
if (this.enable) {
|
|
|
- //中位值
|
|
|
- if (!this.contrlEnable) {
|
|
|
- this.PWM.setPulseLength(this.MoAndSero.m1, this.Motor2pwm(Math.abs(this.centerNum)));
|
|
|
- this.PWM.setPulseLength(this.MoAndSero.m2, this.Motor2pwm(Math.abs(this.centerNum)));
|
|
|
- }
|
|
|
- //上推解锁
|
|
|
- if (!this.contrlEnable && +v3 > 200) this.contrlEnable = true
|
|
|
- // PWM操作
|
|
|
- if (this.contrlEnable) {
|
|
|
- // 注意中位误差
|
|
|
- if (Math.abs(+v2 - this.centerNum) < 20) {
|
|
|
- this.PWM.setPulseLength(this.MoAndSero.m1, this.Motor2pwm(Math.abs(+v3 - 255)));
|
|
|
- this.PWM.setPulseLength(this.MoAndSero.m2, this.Motor2pwm(Math.abs(+v3 - 255)));
|
|
|
+ // 解锁之后需要2秒给电调中立值
|
|
|
+ if (this.Snum >= 50 && this.Snum <= 61) this.Snum++
|
|
|
+ if (this.Snum >= 60) {
|
|
|
+ if (Math.abs(+v2 - 128) < 20) {
|
|
|
+ console.log('前后', v3)
|
|
|
+ this.PWM.setPulseLength(this.MoAndSero.m1, this.Motor2pwm(Math.abs(+v3 - 256)));
|
|
|
+ this.PWM.setPulseLength(this.MoAndSero.m2, this.Motor2pwm(Math.abs(+v3 - 256)));
|
|
|
} else {
|
|
|
- // 分左右 注意左右误差
|
|
|
- if ((+v2 - this.centerNum) > 20) {
|
|
|
+ // 分左右
|
|
|
+ if ((+v2 - 128) > 20) {
|
|
|
// 右
|
|
|
- const a = this.centerNum - (+v2 - this.centerNum)
|
|
|
- const b = this.centerNum + (+v2 - this.centerNum)
|
|
|
+ console.log('右', +v2);
|
|
|
+ const a = 128 - (+v2 - 128)
|
|
|
+ const b = 128 + (+v2 - 128)
|
|
|
this.PWM.setPulseLength(this.MoAndSero.m1, this.Motor2pwm(+a));
|
|
|
this.PWM.setPulseLength(this.MoAndSero.m2, this.Motor2pwm(+b));
|
|
|
- } else if (+v2 - this.centerNum < -20) {
|
|
|
+ } else if (+v2 - 128 < -20) {
|
|
|
// 左
|
|
|
- const a = this.centerNum - (+v2 - this.centerNum)
|
|
|
- const b = this.centerNum + (+v2 - this.centerNum)
|
|
|
+ console.log('左', +v2);
|
|
|
+ const a = 128 - (+v2 - 128)
|
|
|
+ const b = 128 + (+v2 - 128)
|
|
|
this.PWM.setPulseLength(this.MoAndSero.m1, this.Motor2pwm(+a));
|
|
|
this.PWM.setPulseLength(this.MoAndSero.m2, this.Motor2pwm(+b));
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- }
|
|
|
- //云台
|
|
|
- if (v0 || v1) {
|
|
|
- const a = +v1 > 200 ? 200 : +v1
|
|
|
- this.PWM.setPulseLength(this.MoAndSero.s1, this.Servo2pwm(+v0));
|
|
|
- this.PWM.setPulseLength(this.MoAndSero.s2, this.Servo2pwm(+a));
|
|
|
+ //云台
|
|
|
+ if (v0 || v1) {
|
|
|
+ console.log('云台', v0, v1)
|
|
|
+ const a = +v1 > 200 ? 200 : +v1
|
|
|
+ this.PWM.setPulseLength(this.MoAndSero.s1, this.Servo2pwm(+v0));
|
|
|
+ this.PWM.setPulseLength(this.MoAndSero.s2, this.Servo2pwm(+a));
|
|
|
+ }
|
|
|
}
|
|
|
- console.log('前后', v3, '左右', v2, '云台', v0, v1)
|
|
|
} else {
|
|
|
this.unLOCK(v0, v1, v2, v3)
|
|
|
}
|
|
|
@@ -101,8 +91,8 @@ class ContrlService {
|
|
|
* @param {*} v2
|
|
|
* @param {*} v3
|
|
|
*/
|
|
|
- unLOCK(v0, v1, v2, v3) {
|
|
|
- // 未解锁=>进行解锁:发送端的频率是0.05S,0.05*60 = 3S
|
|
|
+ unLOCK (v0, v1, v2, v3) {
|
|
|
+ // 未解锁=>进行解锁:发送端的频率是0.04S,0.05*60 = 3S
|
|
|
// 内八 :v0<50,v1>200,v2>200,v3<50
|
|
|
if (+v0 <= 60 && +v1 >= 190 && +v3 >= 190 && +v2 <= 60) {
|
|
|
if (this.Snum >= 0 && this.Snum <= 51) this.Snum++
|
|
|
@@ -110,31 +100,48 @@ class ContrlService {
|
|
|
this.Snum = 0
|
|
|
}
|
|
|
if (this.Snum == 50) {
|
|
|
- // RPIO.open(19, RPIO.OUTPUT, RPIO.HIGH);
|
|
|
+ RPIO.open(23, RPIO.OUTPUT, RPIO.HIGH);
|
|
|
this.enable = true
|
|
|
}
|
|
|
console.log('解锁中', v0, v1, v2, v3)
|
|
|
}
|
|
|
/**
|
|
|
- * 电调换算比例:摇杆范围0-255,PWM范围500~1500~2500
|
|
|
+ * 电调换算比例:摇杆范围0-256,PWM范围500~1500~2500
|
|
|
* @param {number} v
|
|
|
* @returns
|
|
|
*/
|
|
|
- Motor2pwm(v) {
|
|
|
- if (v === 0) {
|
|
|
- return parseInt(10 / (256 / 1000)) + 1000
|
|
|
- } else if (v >= 200) {
|
|
|
- return parseInt(200 / (256 / 1000)) + 1000
|
|
|
+ Motor2pwm (v) {
|
|
|
+ // 分为6挡位,中值128,步进256/6
|
|
|
+ const num = parseInt(256 / 6)
|
|
|
+ // 方向调换
|
|
|
+ const dirc = Math.abs(v - 256)
|
|
|
+ // 真实值
|
|
|
+ let value = 128
|
|
|
+ // 步进取中间值
|
|
|
+ if (dirc > 0 && dirc < num) {
|
|
|
+ value = num / 2
|
|
|
+ } else if (dirc > num && dirc <= num * 2) {
|
|
|
+ value = num + (num / 2)
|
|
|
+ } else if (dirc > num * 2 && dirc < 128) {
|
|
|
+ value = 128 - (num / 2)
|
|
|
+ } else if (dirc > 128 && dirc <= (128 + num)) {
|
|
|
+ value = 128 + (num / 2)
|
|
|
+ } else if (dirc > (128 + num) && dirc <= (128 + num * 2)) {
|
|
|
+ value = 128 + num + (num / 2)
|
|
|
+ } else if (dirc > (128 + num * 2) && dirc <= 256) {
|
|
|
+ value = 256 - (num / 2)
|
|
|
} else {
|
|
|
- return parseInt((v - 5) / (256 / 1000)) + 1000
|
|
|
+ value = 128
|
|
|
}
|
|
|
+
|
|
|
+ return parseInt(value / (256 / 2000)) + 500
|
|
|
}
|
|
|
/**
|
|
|
* 舵机换算比例:摇杆范围0-256,PWM范围1000~1500~2000
|
|
|
* @param {number} v
|
|
|
* @returns
|
|
|
*/
|
|
|
- Servo2pwm(v) {
|
|
|
+ Servo2pwm (v) {
|
|
|
return parseInt(v / (256 / 1000)) + 1000
|
|
|
}
|
|
|
}
|