블록 코딩

Blockly 호환 UI — A사·Scratch 채택 학생이 그대로 사용 가능
Cite as: mecha4wd block-coding v26.06a · wiki/block-coding

1. Blockly — 왜 선택

한국 초등·중등 정보 교육 시장에서 가장 폭넓게 사용되는 엔트리(entry.co.kr)스크래치(Scratch 3.0)는 Google Blockly를 진화시킨 UI입니다. mecha4wd의 블록코딩 UI는 다음을 직접 활용:

[Blockly 기반 워크스페이스 — 모션·센서·조건 블록이 보이고 우측에 Python 자동이 보이는 모습]
그림 6 — mecha4wd Blockly 워크스페이스 미리보기

2. 블록 라이브러리 카테고리 (초등 대상 7+ 카테고리)

모션

  • 전진 (거리 / 시간)
  • 후진 (거리 / 시간)
  • 좌회전 (각도)
  • 우회전 (각도)
  • 정지
  • 속도 설정 (m/s)

센서

  • ToF 거리 읽기 (전/후/좌/우)
  • 거리 < N cm
  • 카메라 라인 offset
  • YOLO 검출 (사람/상자)
  • IMU 기울기 (roll·pitch)
  • 버튼 클릭 감지

제어

  • 시작 (when flag clicked)
  • Forever / Repeat / Wait
  • If / If-Else
  • 멈춤 (all)
  • 문자열 표시 (LCD)

논리

  • AND / OR / NOT
  • =, <, >, ≤, ≥
  • True / False

수학

  • +, -, ×, ÷
  • random(0..9)
  • 소수점 절삭
  • 거리 → 거리 계산

변수

  • 변수 set / change
  • 변수 표시

출력·표시

  • RGB ring 색상 (8개 LED)
  • 부저 on / off
  • LCD print
  • Status LED 변경 (4-color)

3. 예제 — 사각 경로

학생이 블록으로 구성

[Start ▸ when ▶ clicked]
   Forever:
      [전진 1초]  [좌회전 90°]
      [전진 1초]  [좌회전 90°]
      [전진 1초]  [좌회전 90°]
      [전진 1초]  [좌회전 90°]
      [RGB ring: 신나게]

자동 생성된 Python

import asyncio
from mecha4wd import robot, sensors, led

async def main():
    await robot.start()
    while True:
        for _ in range(4):
            await robot.go_forward_for(1.0)   # 1초 전진 @ 0.4 m/s
            await robot.rotate_degrees(90)
        await led.ring_set(0x00ff00)   # green
        await asyncio.sleep(0.5)
        await led.ring_set(0xff00ff)   # magenta

asyncio.run(main())

4. 예제 — 라인 트레이서

잔잔히 라인 두 개 사이를 따라가는 0-line 카메라. 학습용 교과서에서 가장 자주 사용되는 클래스입니다.

[Start]
   Forever:
      off = 카메라.lane_offset()      # cm
      If off > 5:
         [좌회전 5°]
      Else if off < -5:
         [우회전 5°]
      Else:
         [전진 1초]    [RGB ring: 🌊]

5. 예제 — YOLO 내 '사람' 찾으면 멈춤

[Start]
   Forever:
      found = YOLO.detect("person")
      If found:
         [정지]
         [부저 on]
         [LCD print "STOP"]
         [RGB ring: 빨간색]
         Wait until: not YOLO.detect("person")

6. 코드 자동 생성기 · backend 구조

블록 XML 정의 → JavaScript로 즉시 Python 텍스트도 함께 생성. 전체는 mecha4wd-ui/blockly_to_python.js에 있음:

// Blockly generator · JavaScript
Blockly.Python['forward_for'] = function(block) {
  const secs = Blockly.Python.valueToCode(block, 'SECS', Blockly.Python.ORDER_NONE) || '1.0';
  return 'await robot.go_forward_for(' + secs + ')\n';
};

Blockly.Python['tof_distance'] = function(block) {
  const dir = block.getFieldValue('DIR');
  return ['sensors.tof_' + dir + '.distance_cm()', Blockly.Python.ORDER_ATOMIC];
};

// 사용자 Python 코드는 .transpiled.py로 저장 → SCP 전송
fetch('/api/compile', {
  method: 'POST',
  body: generated_python_text
}).then(r => alert('Uploaded to robot'))

7. 업로드 → Robot 실행

  1. 학생이 브라우저에서 코드 완성
  2. 'Compile + Upload' 버튼 클릭 → .transpiled.py 생성
  3. ROS2 서비스 /mecha4wd/code_upload로 전송 (USB-CDC 또는 Wi-Fi)
  4. Rock 5C의 code_runner 노드가 python3 ./.transpiled.py 실행
  5. 실행 중 RGB ring 색상이 teal(전진)/orange(회전)/red(error)로 변경

8. 교사 처음 사용 가이드

✔ 학생 Operation — 블록 자동 생성 Python 학습 부산물·성고한 학생은 코드를 열어 Python을 이해하는 자연스러운 통로. 쉬운 자연가 thickening.

다음 단계