diff --git a/main/CSS/control.css b/main/CSS/control.css index 936b41d..20f9626 100644 --- a/main/CSS/control.css +++ b/main/CSS/control.css @@ -91,6 +91,46 @@ color: white; } +.btn-left { + background-color: #2196F3; + color: white; +} + +.btn-right { + background-color: #FF9800; + color: white; +} + +.btn-rotate-left { + background-color: #9C27B0; + color: white; +} + +.btn-rotate-right { + background-color: #607D8B; + color: white; +} + +.btn-forward-left { + background-color: #4CAF50; + color: white; +} + +.btn-forward-right { + background-color: #4CAF50; + color: white; +} + +.btn-backward-left { + background-color: #f44336; + color: white; +} + +.btn-backward-right { + background-color: #f44336; + color: white; +} + .btn:hover { transform: translateY(-3px); box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15); diff --git a/main/Javascript/control.js b/main/Javascript/control.js index f307d4c..b1da833 100644 --- a/main/Javascript/control.js +++ b/main/Javascript/control.js @@ -1,6 +1,14 @@ // 获取按钮和状态元素 const forwardBtn = document.getElementById('forwardBtn'); const backwardBtn = document.getElementById('backwardBtn'); +const leftBtn = document.getElementById('leftBtn'); +const rightBtn = document.getElementById('rightBtn'); +const rotateLeftBtn = document.getElementById('rotateLeftBtn'); +const rotateRightBtn = document.getElementById('rotateRightBtn'); +const forwardLeftBtn = document.getElementById('forwardLeftBtn'); +const forwardRightBtn = document.getElementById('forwardRightBtn'); +const backwardLeftBtn = document.getElementById('backwardLeftBtn'); +const backwardRightBtn = document.getElementById('backwardRightBtn'); const status = document.getElementById('status'); // 实际控制函数 @@ -9,7 +17,21 @@ function controlMotor(direction) { if (direction === 'stop') { status.innerHTML = `

正在停止...

`; } else { - status.innerHTML = `

正在${direction === 'forward' ? '前进' : '后退'}...

`; + let actionText = ''; + switch (direction) { + case 'forward': actionText = '前进'; break; + case 'backward': actionText = '后退'; break; + case 'left': actionText = '左移'; break; + case 'right': actionText = '右移'; break; + case 'rotate_left': actionText = '左旋转'; break; + case 'rotate_right': actionText = '右旋转'; break; + case 'forward_left': actionText = '左前移动'; break; + case 'forward_right': actionText = '右前移动'; break; + case 'backward_left': actionText = '左后移动'; break; + case 'backward_right': actionText = '右后移动'; break; + default: actionText = '移动'; break; + } + status.innerHTML = `

正在${actionText}...

`; } // 记录操作(如果正在录制) @@ -114,6 +136,287 @@ backwardBtn.addEventListener('touchcancel', (e) => { stopMotor(); }); +// 左移按钮 - 支持鼠标和触摸事件 +leftBtn.addEventListener('mousedown', () => { + // 发送左移请求 + controlMotor('left'); +}); + +leftBtn.addEventListener('mouseup', () => { + // 停止电机 + stopMotor(); +}); + +leftBtn.addEventListener('mouseleave', () => { + // 鼠标离开按钮时也停止 + stopMotor(); +}); + +// 左移按钮 - 触摸事件 +leftBtn.addEventListener('touchstart', (e) => { + e.preventDefault(); // 防止默认行为 + // 发送左移请求 + controlMotor('left'); +}); + +leftBtn.addEventListener('touchend', (e) => { + e.preventDefault(); // 防止默认行为 + // 停止电机 + stopMotor(); +}); + +leftBtn.addEventListener('touchcancel', (e) => { + e.preventDefault(); // 防止默认行为 + // 触摸被取消时停止电机 + stopMotor(); +}); + +// 右移按钮 - 支持鼠标和触摸事件 +rightBtn.addEventListener('mousedown', () => { + // 发送右移请求 + controlMotor('right'); +}); + +rightBtn.addEventListener('mouseup', () => { + // 停止电机 + stopMotor(); +}); + +rightBtn.addEventListener('mouseleave', () => { + // 鼠标离开按钮时也停止 + stopMotor(); +}); + +// 右移按钮 - 触摸事件 +rightBtn.addEventListener('touchstart', (e) => { + e.preventDefault(); // 防止默认行为 + // 发送右移请求 + controlMotor('right'); +}); + +rightBtn.addEventListener('touchend', (e) => { + e.preventDefault(); // 防止默认行为 + // 停止电机 + stopMotor(); +}); + +rightBtn.addEventListener('touchcancel', (e) => { + e.preventDefault(); // 防止默认行为 + // 触摸被取消时停止电机 + stopMotor(); +}); + +// 左旋转按钮 - 支持鼠标和触摸事件 +rotateLeftBtn.addEventListener('mousedown', () => { + // 发送左旋转请求 + controlMotor('rotate_left'); +}); + +rotateLeftBtn.addEventListener('mouseup', () => { + // 停止电机 + stopMotor(); +}); + +rotateLeftBtn.addEventListener('mouseleave', () => { + // 鼠标离开按钮时也停止 + stopMotor(); +}); + +// 左旋转按钮 - 触摸事件 +rotateLeftBtn.addEventListener('touchstart', (e) => { + e.preventDefault(); // 防止默认行为 + // 发送左旋转请求 + controlMotor('rotate_left'); +}); + +rotateLeftBtn.addEventListener('touchend', (e) => { + e.preventDefault(); // 防止默认行为 + // 停止电机 + stopMotor(); +}); + +rotateLeftBtn.addEventListener('touchcancel', (e) => { + e.preventDefault(); // 防止默认行为 + // 触摸被取消时停止电机 + stopMotor(); +}); + +// 右旋转按钮 - 支持鼠标和触摸事件 +rotateRightBtn.addEventListener('mousedown', () => { + // 发送右旋转请求 + controlMotor('rotate_right'); +}); + +rotateRightBtn.addEventListener('mouseup', () => { + // 停止电机 + stopMotor(); +}); + +rotateRightBtn.addEventListener('mouseleave', () => { + // 鼠标离开按钮时也停止 + stopMotor(); +}); + +// 右旋转按钮 - 触摸事件 +rotateRightBtn.addEventListener('touchstart', (e) => { + e.preventDefault(); // 防止默认行为 + // 发送右旋转请求 + controlMotor('rotate_right'); +}); + +rotateRightBtn.addEventListener('touchend', (e) => { + e.preventDefault(); // 防止默认行为 + // 停止电机 + stopMotor(); +}); + +// 右旋转按钮 - 触摸事件 +rotateRightBtn.addEventListener('touchcancel', (e) => { + e.preventDefault(); // 防止默认行为 + // 触摸被取消时停止电机 + stopMotor(); +}); + +// 左前按钮 - 支持鼠标和触摸事件 +forwardLeftBtn.addEventListener('mousedown', () => { + // 发送左前移动请求 + controlMotor('forward_left'); +}); + +forwardLeftBtn.addEventListener('mouseup', () => { + // 停止电机 + stopMotor(); +}); + +forwardLeftBtn.addEventListener('mouseleave', () => { + // 鼠标离开按钮时也停止 + stopMotor(); +}); + +// 左前按钮 - 触摸事件 +forwardLeftBtn.addEventListener('touchstart', (e) => { + e.preventDefault(); // 防止默认行为 + // 发送左前移动请求 + controlMotor('forward_left'); +}); + +forwardLeftBtn.addEventListener('touchend', (e) => { + e.preventDefault(); // 防止默认行为 + // 停止电机 + stopMotor(); +}); + +forwardLeftBtn.addEventListener('touchcancel', (e) => { + e.preventDefault(); // 防止默认行为 + // 触摸被取消时停止电机 + stopMotor(); +}); + +// 右前按钮 - 支持鼠标和触摸事件 +forwardRightBtn.addEventListener('mousedown', () => { + // 发送右前移动请求 + controlMotor('forward_right'); +}); + +forwardRightBtn.addEventListener('mouseup', () => { + // 停止电机 + stopMotor(); +}); + +forwardRightBtn.addEventListener('mouseleave', () => { + // 鼠标离开按钮时也停止 + stopMotor(); +}); + +// 右前按钮 - 触摸事件 +forwardRightBtn.addEventListener('touchstart', (e) => { + e.preventDefault(); // 防止默认行为 + // 发送右前移动请求 + controlMotor('forward_right'); +}); + +forwardRightBtn.addEventListener('touchend', (e) => { + e.preventDefault(); // 防止默认行为 + // 停止电机 + stopMotor(); +}); + +forwardRightBtn.addEventListener('touchcancel', (e) => { + e.preventDefault(); // 防止默认行为 + // 触摸被取消时停止电机 + stopMotor(); +}); + +// 左后按钮 - 支持鼠标和触摸事件 +backwardLeftBtn.addEventListener('mousedown', () => { + // 发送左后移动请求 + controlMotor('backward_left'); +}); + +backwardLeftBtn.addEventListener('mouseup', () => { + // 停止电机 + stopMotor(); +}); + +backwardLeftBtn.addEventListener('mouseleave', () => { + // 鼠标离开按钮时也停止 + stopMotor(); +}); + +// 左后按钮 - 触摸事件 +backwardLeftBtn.addEventListener('touchstart', (e) => { + e.preventDefault(); // 防止默认行为 + // 发送左后移动请求 + controlMotor('backward_left'); +}); + +backwardLeftBtn.addEventListener('touchend', (e) => { + e.preventDefault(); // 防止默认行为 + // 停止电机 + stopMotor(); +}); + +backwardLeftBtn.addEventListener('touchcancel', (e) => { + e.preventDefault(); // 防止默认行为 + // 触摸被取消时停止电机 + stopMotor(); +}); + +// 右后按钮 - 支持鼠标和触摸事件 +backwardRightBtn.addEventListener('mousedown', () => { + // 发送右后移动请求 + controlMotor('backward_right'); +}); + +backwardRightBtn.addEventListener('mouseup', () => { + // 停止电机 + stopMotor(); +}); + +backwardRightBtn.addEventListener('mouseleave', () => { + // 鼠标离开按钮时也停止 + stopMotor(); +}); + +// 右后按钮 - 触摸事件 +backwardRightBtn.addEventListener('touchstart', (e) => { + e.preventDefault(); // 防止默认行为 + // 发送右后移动请求 + controlMotor('backward_right'); +}); + +backwardRightBtn.addEventListener('touchend', (e) => { + e.preventDefault(); // 防止默认行为 + // 停止电机 + stopMotor(); +}); + +backwardRightBtn.addEventListener('touchcancel', (e) => { + e.preventDefault(); // 防止默认行为 + // 触摸被取消时停止电机 + stopMotor(); +}); + // 停止电机函数 function stopMotor() { // 记录操作(如果正在录制) diff --git a/main/index.html b/main/index.html index 05b6029..fd85fd4 100644 --- a/main/index.html +++ b/main/index.html @@ -16,10 +16,20 @@
+ +
+ + +
+
+ + + +
diff --git a/main/motor.py b/main/motor.py index ee67c7a..bf7ef06 100644 --- a/main/motor.py +++ b/main/motor.py @@ -19,35 +19,28 @@ signal.signal(signal.SIGINT, signal_handler) bus = SMBus(1) addr = 0x60 -MODE1 = 0x00 -PRESCALE = 0xFE - -bus.write_byte_data(addr, MODE1, 0x00) -bus.write_byte_data(addr, PRESCALE, 60) +bus.write_byte_data(addr, 0x00, 0x00) +bus.write_byte_data(addr, 0xFE, 60) # ====================== -# 电机通道映射(每个电机 IN1 / IN2) +# 电机定义 # ====================== MOTOR = { - "M1": (0, 1), # 前左 - "M2": (2, 3), # 前右 - "M3": (4, 5), # 后左 - "M4": (6, 7), # 后右 + "M1": (0, 1), + "M2": (2, 3), + "M3": (4, 5), + "M4": (6, 7), } -# ====================== -# 方向修正(麦克纳姆关键) -# 根据你 / \ + \ / 结构校正 -# ====================== DIR = { "M1": 1, - "M2": -1, - "M3": -1, + "M2": 1, + "M3": 1, "M4": 1, } # ====================== -# PWM输出函数 +# PWM输出 # ====================== def set_pwm(ch, value): value = max(0, min(4095, value)) @@ -58,7 +51,6 @@ def set_pwm(ch, value): # ====================== # 单电机控制 -# speed: -1 ~ 1 # ====================== def motor_drive(name, speed): in1, in2 = MOTOR[name] @@ -69,34 +61,29 @@ def motor_drive(name, speed): if speed > 0: set_pwm(in1, pwm) set_pwm(in2, 0) - elif speed < 0: set_pwm(in1, 0) set_pwm(in2, pwm) - else: - # 刹车(关键,不是0!) + # 刹车 set_pwm(in1, 4095) set_pwm(in2, 4095) # ====================== -# 基础运动控制 +# 基础移动 # ====================== def forward(speed=0.6): - motor_drive("M1", speed) - motor_drive("M2", speed) + motor_drive("M1", -speed) + motor_drive("M2", -speed) motor_drive("M3", speed) motor_drive("M4", speed) def backward(speed=0.6): - motor_drive("M1", -speed) - motor_drive("M2", -speed) + motor_drive("M1", speed) + motor_drive("M2", speed) motor_drive("M3", -speed) motor_drive("M4", -speed) -# ====================== -# 麦克纳姆左右移动 -# ====================== def move_left(speed=0.6): motor_drive("M1", -speed) motor_drive("M2", speed) @@ -110,7 +97,49 @@ def move_right(speed=0.6): motor_drive("M4", speed) # ====================== -# 停止(刹车模式) +# 旋转 +# ====================== +def rotate_left(speed=0.6): + motor_drive("M1", -speed) + motor_drive("M2", -speed) + motor_drive("M3", -speed) + motor_drive("M4", -speed) + +def rotate_right(speed=0.6): + motor_drive("M1", speed) + motor_drive("M2", speed) + motor_drive("M3", speed) + motor_drive("M4", speed) + +# ====================== +# 斜向移动 +# ====================== +def move_left_forward(speed=0.6): + motor_drive("M1", 0) + motor_drive("M2", speed) + motor_drive("M3", 0) + motor_drive("M4", -speed) + +def move_right_forward(speed=0.6): + motor_drive("M1", speed) + motor_drive("M2", 0) + motor_drive("M3", -speed) + motor_drive("M4", 0) + +def move_left_backward(speed=0.6): + motor_drive("M1", -speed) + motor_drive("M2", 0) + motor_drive("M3", speed) + motor_drive("M4", 0) + +def move_right_backward(speed=0.6): + motor_drive("M1", 0) + motor_drive("M2", -speed) + motor_drive("M3", 0) + motor_drive("M4", speed) + +# ====================== +# 停止 # ====================== def stop(): motor_drive("M1", 0) @@ -123,21 +152,24 @@ def stop(): # ====================== if __name__ == "__main__": - print("前进") - forward(0.5) - time.sleep(1) + actions = [ + ("前进", forward), + ("后退", backward), + ("左移", move_left), + ("右移", move_right), + ("左前", move_left_forward), + ("右前", move_right_forward), + ("左后", move_left_backward), + ("右后", move_right_backward), + ("左旋", rotate_left), + ("右旋", rotate_right), + ] - print("停止") - stop() - time.sleep(1) + for name, func in actions: + print(name) + func() + time.sleep(1) + stop() + time.sleep(2) - print("后退") - backward(0.5) - time.sleep(1) - - print("停止") - stop() - time.sleep(1) - - print("停止") - stop() + print("完成") diff --git a/main/motor_test.py b/main/motor_test.py index 4e7f65b..2097957 100644 --- a/main/motor_test.py +++ b/main/motor_test.py @@ -26,13 +26,12 @@ bus.write_byte_data(addr, 0xFE, 60) # 电机定义 # ====================== MOTOR = { - "M1": (0, 1), # 前左(Y轴) - "M2": (2, 3), # 前右(Y轴) - "M3": (4, 5), # 后左(X轴) - "M4": (6, 7), # 后右(X轴) + "M1": (0, 1), + "M2": (2, 3), + "M3": (4, 5), + "M4": (6, 7), } -# ⚠️ 需要你微调方向(如果反了就改 ±1) DIR = { "M1": 1, "M2": 1, @@ -71,46 +70,77 @@ def motor_drive(name, speed): set_pwm(in2, 4095) # ====================== -# ⭐ 全向轮核心控制(重点) -# vx: 左右 (-1~1) -# vy: 前后 (-1~1) -# w : 旋转 (-1~1) -# ====================== -def move(vx, vy, w): - m1 = vy + w - m2 = vy - w - m3 = vx + w - m4 = vx - w - - # 归一化(防止超限) - max_val = max(abs(m1), abs(m2), abs(m3), abs(m4), 1) - - motor_drive("M1", m1 / max_val) - motor_drive("M2", m2 / max_val) - motor_drive("M3", m3 / max_val) - motor_drive("M4", m4 / max_val) - -# ====================== -# 基础动作(封装) +# 基础移动 # ====================== def forward(speed=0.6): - move(0, speed, 0) + motor_drive("M1", speed) + motor_drive("M2", speed) + motor_drive("M3", -speed) + motor_drive("M4", -speed) def backward(speed=0.6): - move(0, -speed, 0) + motor_drive("M1", -speed) + motor_drive("M2", -speed) + motor_drive("M3", speed) + motor_drive("M4", speed) -def left(speed=0.6): - move(-speed, 0, 0) +def move_left(speed=0.6): + motor_drive("M1", -speed) + motor_drive("M2", speed) + motor_drive("M3", speed) + motor_drive("M4", -speed) -def right(speed=0.6): - move(speed, 0, 0) +def move_right(speed=0.6): + motor_drive("M1", speed) + motor_drive("M2", -speed) + motor_drive("M3", -speed) + motor_drive("M4", speed) +# ====================== +# ⭐ 旋转 +# ====================== def rotate_left(speed=0.6): - move(0, 0, speed) + motor_drive("M1", -speed) + motor_drive("M2", -speed) + motor_drive("M3", -speed) + motor_drive("M4", -speed) def rotate_right(speed=0.6): - move(0, 0, -speed) + motor_drive("M1", speed) + motor_drive("M2", speed) + motor_drive("M3", speed) + motor_drive("M4", speed) +# ====================== +# ⭐ 斜向移动(新增) +# ====================== +def move_left_forward(speed=0.6): + motor_drive("M1", 0) + motor_drive("M2", speed) + motor_drive("M3", 0) + motor_drive("M4", -speed) + +def move_right_forward(speed=0.6): + motor_drive("M1", speed) + motor_drive("M2", 0) + motor_drive("M3", -speed) + motor_drive("M4", 0) + +def move_left_backward(speed=0.6): + motor_drive("M1", -speed) + motor_drive("M2", 0) + motor_drive("M3", speed) + motor_drive("M4", 0) + +def move_right_backward(speed=0.6): + motor_drive("M1", 0) + motor_drive("M2", -speed) + motor_drive("M3", 0) + motor_drive("M4", speed) + +# ====================== +# 停止 +# ====================== def stop(): motor_drive("M1", 0) motor_drive("M2", 0) @@ -122,25 +152,24 @@ def stop(): # ====================== if __name__ == "__main__": - print("前进") - forward() - time.sleep(1) + actions = [ + ("前进", forward), + ("后退", backward), + ("左移", move_left), + ("右移", move_right), + ("左前", move_left_forward), + ("右前", move_right_forward), + ("左后", move_left_backward), + ("右后", move_right_backward), + ("左旋", rotate_left), + ("右旋", rotate_right), + ] - print("后退") - backward() - time.sleep(1) + for name, func in actions: + print(name) + func() + time.sleep(1) + stop() + time.sleep(2) - print("左移") - left() - time.sleep(1) - - print("右移") - right() - time.sleep(1) - - print("左旋转") - rotate_left() - time.sleep(1) - - print("停止") - stop() \ No newline at end of file + print("完成") \ No newline at end of file diff --git a/main/server.py b/main/server.py index 5f486d3..ffd4ffb 100644 --- a/main/server.py +++ b/main/server.py @@ -37,6 +37,46 @@ def control(): motor.forward(speed=0.6) # 不使用time.sleep,让电机持续运行 return jsonify({'status': 'success', 'message': '后退中'}) + elif direction == 'left': + print("控制垃圾桶左移") + motor.move_left(speed=0.6) + # 不使用time.sleep,让电机持续运行 + return jsonify({'status': 'success', 'message': '左移中'}) + elif direction == 'right': + print("控制垃圾桶右移") + motor.move_right(speed=0.6) + # 不使用time.sleep,让电机持续运行 + return jsonify({'status': 'success', 'message': '右移中'}) + elif direction == 'rotate_left': + print("控制垃圾桶左旋转") + motor.rotate_left(speed=0.6) + # 不使用time.sleep,让电机持续运行 + return jsonify({'status': 'success', 'message': '左旋转中'}) + elif direction == 'rotate_right': + print("控制垃圾桶右旋转") + motor.rotate_right(speed=0.6) + # 不使用time.sleep,让电机持续运行 + return jsonify({'status': 'success', 'message': '右旋转中'}) + elif direction == 'forward_left': + print("控制垃圾桶左前移动") + motor.move_left_forward(speed=0.6) + # 不使用time.sleep,让电机持续运行 + return jsonify({'status': 'success', 'message': '左前移动中'}) + elif direction == 'forward_right': + print("控制垃圾桶右前移动") + motor.move_right_forward(speed=0.6) + # 不使用time.sleep,让电机持续运行 + return jsonify({'status': 'success', 'message': '右前移动中'}) + elif direction == 'backward_left': + print("控制垃圾桶左后移动") + motor.move_left_backward(speed=0.6) + # 不使用time.sleep,让电机持续运行 + return jsonify({'status': 'success', 'message': '左后移动中'}) + elif direction == 'backward_right': + print("控制垃圾桶右后移动") + motor.move_right_backward(speed=0.6) + # 不使用time.sleep,让电机持续运行 + return jsonify({'status': 'success', 'message': '右后移动中'}) elif direction == 'stop': print("停止垃圾桶") motor.stop()