라벨이 아두이노 AI 코딩인 게시물 표시

아들과 함께 만들어보는 인공지능(LLM) 로봇 만들기 프로젝트 — EP 2. AI 임베디드 코딩 첫 실험, 컨텍스트 전략이 코드 품질을 갈랐다

아들과 함께 만들어보는 인공지능(LLM) 로봇 만들기 프로젝트 — EP 2. AI 임베디드 코딩 첫 실험, 컨텍스트 전략이 코드 품질을 갈랐다 아들이 처음으로 AI에게 직접 코딩 명령을 내린 날이었다. 노트북 앞에 앉아서 잠시 뭘 써야 하나 생각하더니, 이렇게 입력했다. "앞에 뭔가 있으면 멈추게 해줘" Claude Code가 코드를 내놨다. 아들이 쭉 훑어봤다. 뭔지 잘 모르겠다는 표정이었다. "올려봐도 돼?" 해서 Arduino IDE에서 업로드했다. 로봇 앞에 손을 뻗었다. 안 멈췄다. "왜 안 돼?" 그때 코드를 보니 Claude가 HC-SR04 Trig 핀을 2번으로 잡고 있었다. 우리 배선은 4번이다. CLAUDE.md에 명시해뒀던 핀맵이 그 대화에서 로드되지 않은 상태였다. 아들이 새 Claude Code 세션을 열었고, 그 세션에는 CLAUDE.md 컨텍스트가 없었다. 이 에피소드 하나가 이번 편에서 하고 싶은 얘기 전부다. 컨텍스트 없이 AI에게 임베디드 코드를 짜달라고 하면 HC-SR04는 꽤 유명한 초음파 거리 센서라 Claude가 기본 동작 원리는 안다. pulseIn()으로 에코 시간 재고, 340m/s로 나누고, 2로 나누면 거리가 나온다는 것도 안다. 그래서 이렇게만 물어봐도 어느 정도 작동하는 코드가 나온다. "HC-SR04로 거리 재는 아두이노 코드 짜줘" 나온 코드: #define TRIG_PIN 2 #define ECHO_PIN 3 void setup () { Serial.begin( 9600 ); pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); } void loop () { digitalWrite(TRIG_PIN, LOW); delayMicroseconds( 2 ); digitalWrite(TRIG_PIN, HIGH); delayMi...

아들과 함께 만들어보는 인공지능(LLM) 로봇 만들기 프로젝트 — EP 1. AI 코딩 에이전트 하네스 설계, 12살도 쓸 수 있게

아들과 함께 만들어보는 인공지능(LLM) 로봇 만들기 프로젝트 — EP 1. AI 코딩 에이전트 하네스 설계, 12살도 쓸 수 있게 처음으로 Claude Code에게 로봇 코드를 짜달라고 했던 날이 있었다. "L298N 모터 드라이버로 DC 모터 2개를 PWM으로 속도 제어하는 아두이노 코드 짜줘. IN1은 핀 8, IN2는 핀 9, ENA는 핀 10. IN3은 핀 11, IN4는 핀 12, ENB는 핀 13." 코드가 나왔다. 깔끔했다. 그런데 테스트해보니 모터가 이상하게 작동했다. ENA 핀을 10번으로 지정했는데 코드 내부에서 Timer1을 건드리고 있었고, 그게 서보 라이브러리와 충돌하고 있었다. 에러 메시지가 애매하게 나와서 원인을 찾는 데만 두 시간이 걸렸다. Claude는 내가 서보 라이브러리를 같이 쓰고 있다는 걸 몰랐다. 핀 10번과 Timer1의 관계도 내 세팅 맥락에서 따로 고려하지 않았다. 범용 코드로서는 나쁘지 않았다. 그냥 내 프로젝트를 몰랐던 것뿐이다. 그 에러 하나가 "범용 AI 코딩 도구를 그냥 쓰면 안 된다"는 결론으로 이어졌다. Claude Code를 기본 세팅으로 쓰면 생기는 문제 Claude Code든, Cursor든, Aider든 — 범용 AI 코딩 도구는 기본적으로 코드를 잘 짠다. 언어 문법 이해하고, 라이브러리 사용법 알고, 버그도 잘 잡는다. 일반적인 웹 서비스나 스크립트를 만들 때는 큰 문제가 없다. 임베디드 로봇 프로젝트는 다르다. 내 프로젝트에는 고유한 제약이 있다. 내가 사용하는 부품 목록이 있고, 그 부품들의 핀맵이 있다. L298N 모터 드라이버에서 IN1은 8번 핀, ENA는 10번 핀. HC-SR04 초음파 센서는 Trig가 4번, Echo가 5번. 이걸 Claude가 모른다. 매번 알려줘야 한다. 라이브러리 선택 이유도 있다. 나는 모터 드라이버에 AFMotor 라이브러리를 쓰지 않기로 했다. Timer1, Timer2를 너무 많이 점유해서, ...