키보드 조종 / RC 조종 / E-stop
초등 주변 — Bluetooth 미니 키보드 기본 · ELRS RC transmitter optional
Cite as: mecha4wd control v26.06a · wiki/control
1. 컨트롤 모드 3가지
| 모드 | 입력 디바이스 | 적용 |
|---|---|---|
| BT 키보드 (기본) | Bluetooth mini keyboard (Rii i8 등) | 교실 안 안전 plays |
| RF RC transmitter | ExpressLRS 2.4 GHz 333 Hz + Matek R24-P6 RX | 교실 밖 야외 시연 |
| Block-code 자동 | 필요 없음 | 학생이 upload한 코드 자동 실행 |
2. BT 키보드 — wasd mapping
W전진 (0.4 m/s)
S후진 (0.4 m/s)
A좌회전 (-1.0 rad/s)
D우회전 (1.0 rad/s)
QStop
EE-stop
RReset zero
FFront flip
SpaceSpeed burst 0.8 m/s
TabToggle block-mode
3. ELRS RC transmitter 채널 매핑
| Channel | 전송기 입력 | 의미 | 코드 매핑 |
|---|---|---|---|
| 1 | 좌측 스틱 Y | vx | -1 ~ +1 m/s |
| 2 | 좌측 스틱 X | vy (streafe, 미지원 4WD) | 0 또는 효과 없음 |
| 4 | 우측 스틱 X | yaw rate ω | -3.0 ~ +3.0 rad/s |
| 5 | SA 3단 (전 mode/gait) | Mode 0: BT 키보드, 1: 속도 약, 2: 속도 강 | 0..2 |
| 6 | SB 2단 (E-stop) | OFF=정지 | force_stop() |
| 7 | SC 다얼· | LED 색상 4개 | led.color(red/orange/teal/green) |
| 8 | SD 다얼· | Block-code auto / manual | boolean |
4. E-stop / failsafe
- BT 링크 단절 > 1초 → 자동 정지
- RC 링크 단절 > 0.5초 → 안전 자세 정지 (ELRS default link lost 동작)
- SB E-stop 스위치 OFF → 즉시 전 모터 PWM 0
- 저배터리 < 3.0 V/cell → 정지 + 부저 경고
- IMU 기울기 > 60° 필요·Y-block (구분이 어려우면 즉시 정지, 그게 아니면 pass)
5. 키보드 → ROS2 node 구현
# file: mecha4wd_control/keyboard_control.py
import rclpy, asyncio, evdev
from rclpy.node import Node
from geometry_msgs.msg import Twist
class KeyboardCtrl(Node):
def __init__(self):
super().__init__('mecha4wd_keyboard')
self.pub = self.create_publisher(Twist, '/cmd_vel_in', 10)
self.last_cmd = None
self.kb_handle = self.find_kb()
asyncio.ensure_future(self.watch_keyboard())
def find_kb(self):
from evdev import list_devices, InputDevice
for path in list_devices():
dev = InputDevice(path)
if 'Keyboard' in dev.name or 'BT' in dev.name:
self.get_logger().info('Found keyboard: ' + dev.name)
return dev
return None
async def watch_keyboard(self):
if self.kb_handle is None: return
from evdev import categorize, ecodes
while True:
async for event in self.kb_handle.async_read_loop():
if event.type != ecodes.EV_KEY or event.value != 1:
continue
key = ecodes.KEY[event.code]
cmd = Twist()
if key == 'KEY_W': cmd.linear.x = 0.4
elif key == 'KEY_S': cmd.linear.x = -0.4
elif key == 'KEY_A': cmd.angular.z = 1.0
elif key == 'KEY_D': cmd.angular.z = -1.0
elif key == 'KEY_Q':
cmd.linear.x = 0.0; cmd.angular.z = 0.0
elif key == 'KEY_E': self.publish_emergency_stop()
self.pub.publish(cmd)
def publish_emergency_stop(self):
# E-stop
pass
rclpy.init()
rclpy.spin(KeyboardCtrl())
6. ELRS CRSF 파서 (mechadog와 동일 첫 부분)
# file: mecha4wd_control/crsf_bridge.py
# (mechadog와 동일 · CH1=vx, CH2=vy無効, CH4=ω, CH5=mode, CH6=E-stop)
7. 안전 시 권장 흐름
- USB 전원으로 먼저 Boot (LiPo 없이) →
i2cdetect로 ToF/BNO055 확인 - LiPo 연결·테스트·Drive 0.1 m/s force
- BT 키보드 연결·메뉴 안전 BT-Pair (just work)
- Race 교탁 위 empty box 안에서부터 시작
- BT 또는 RC 한 단어 명령· 실제 automotive pecific release 후 0.1 m/s→ real play
- 차별: 학생은 block-coding 평가 feed
⚠ 안전 유의 자동차 깨끗 시 주의면 부터 이 시키 위·empty·empty공간 그래야·동하는·우통·동자 + 그 어디 부·보 대해서지다 옆세요·턱소 함께 보 여 호 . 시와 부에서와 일자 의 학습·때·야습니다어· 시 ‘우결고가 으 개발 위 'as입니다