📄 프로토콜 정의 파일: serial-protocol-seat-ascii.json (Lite) · serial-protocol-seat-anzdF.json (Advanced) — 문서의 원본(SOT)입니다.
같은 보드에 어느 펌웨어를 굽느냐에 따라 나오는 것이 완전히 달라집니다.
13
이 문서는 Lite를 다룹니다. → Advanced 문서
14
웹 페이지의 수신 데이터(ASCII) 패널. 한 줄에 값 32개가 콤마로 구분되어 초당 50번 들어옵니다.
숫자가 그대로 보이므로 센서가 살아 있는지 바로 압니다.
15
여기가 핵심입니다. 값의 순서가 곧 방석 위의 자리입니다. 인덱스만 알면 좌표표를 찾아볼 필요가 없습니다.
16
[0]~[9] 뒷줄 — 왼쪽에서 오른쪽으로 10개[10]~[23] 가운뎃줄 — 14개[24]~[31] 앞줄 — 8개위 예시는 왼쪽 뒤로 무게가 실린 상태입니다. 가운뎃줄 왼쪽이 2000 근처로 가장 높고, 앞줄 오른쪽 두 개는 아무것도 안 눌려 0입니다.
줄 하나가 그 순간 방석 전체입니다. 그게 초당 50번 옵니다.
값이 20보다 작으면 장치가 0으로 바꿔서 내보냅니다. 아무도 안 앉았을 때 미세하게 흔들리는 값을 잘라내기 위한 노이즈 게이트입니다. 32개 값을 다 더한 합이 200 이하이면 "아무도 안 앉음"으로 보면 됩니다.
들어오는 데이터는 줄 단위로 딱 맞게 오지 않습니다. 조각으로 오므로 버퍼에 모았다가 줄바꿈을 만날 때마다 잘라 씁니다.
const port = await navigator.serial.requestPort();
await port.open({ baudRate: 2000000 });
const reader = port.readable
.pipeThrough(new TextDecoderStream())
.getReader();
let buffer = '';
while (true) {
const { value, done } = await reader.read();
if (done) break;
buffer += value;
const lines = buffer.split('\n');
buffer = lines.pop(); // 마지막 조각은 아직 안 끝난 줄
for (const line of lines) {
const v = line.trim().split(',').map(Number);
if (v.length !== 32) continue; // 잘린 줄은 버린다
if (v.some(Number.isNaN)) continue; // 깨진 줄도 버린다
onFrame(v);
}
}
연결 직후 첫 줄은 거의 항상 중간부터 잘려 들어옵니다. 값 개수를 세서 버리세요.
값을 다 받았으면 이렇게 씁니다.
function onFrame(v) {
const sum = v.reduce((a, b) => a + b, 0);
if (sum <= 200) return; // 아무도 안 앉음
const maxIdx = v.indexOf(Math.max(...v)); // 가장 세게 눌린 자리
const left = v.filter((_, i) => isLeft(i)).reduce((a, b) => a + b, 0);
const right = sum - left; // 좌우 무게 비교
}
17
시리얼(USB) 통신은 1개 기기당 1개 SW와 연결됩니다. 만일 아두이노의 시리얼 모니터 창이 열려있다면 닫으셔야 웹브라우저 연결이 가능해집니다.
18
실습 페이지 상단의 입력 패널 · USB 케이블로 연결하려면 Serial, 무선이면 BLE · 하드웨어가 없으면 Demo 로 동작을 볼 수 있다
Arduino IDE로 열고 Tools 설정을 맞춘 뒤 업로드합니다. 노란색으로 표시된 5개가 필수 항목입니다.
19
화면을 따라가며 하고 싶다면 방석센서 그래프 페이지에 단계별 안내가 있습니다.
브라우저에서 바로 업데이트하는 기능: [내용 없음]