빵판놀이1

1) 하드웨어 구성 이해

  • 브레드보드(빵판) 기본 구조와 전원 레일(+/–) 개념을 확인함.
  • MB102 계열 브레드보드 전원모듈을 사용했고,
    • 입력은 보통 DC 7~12V(VIN) 범위(예: 9V/12V)로 넣을 수 있으며,
    • 출력은 점퍼로 3.3V / 5V를 선택해 브레드보드 레일로 공급함.
  • USB 포트/외부 전원 동시 연결 등 역류/발열/안전 이슈가 있을 수 있음을 학습함(전원은 한쪽 기준으로 단순하게 운용하는 것이 안전).

2) LED 기본 회로(가장 중요한 실습)

  • LED는 극성이 있음:
    • 긴 다리 = +, 짧은 다리 = –(GND 쪽)
  • LED에는 반드시 저항을 직렬로 넣어야 함(과전류로 LED 손상 방지).
  • 저항 위치는 +쪽이든 –쪽이든 상관없고, 핵심은 직렬 연결임.
  • 3.3V에서 저항 값에 따라 밝기가 달라짐:
    • 1kΩ는 안전하지만 어두울 수 있음, 값이 너무 크면 거의 안 보일 수 있음.

3) Arduino IDE 및 보드 업로드 흐름

  • Arduino IDE 설치/실행 과정에서 보안/드라이버/보드 인식 문제를 해결함.
  • COM 포트 인식, 보드 선택(코어 설치 등) 문제를 단계적으로 해결함.
  • 예제 스케치(내장 LED Blink)를 업로드하고,
    • 컴파일/라이브러리 인덱스 다운로드 등 “처음 환경 셋업” 과정이 오래 걸릴 수 있음을 경험함.
    • 업로드 완료 후 LED 동작을 확인하며 개발 흐름을 익힘.

4) Beetle Leonardo(ATmega32U4) 핀 사용법

  • 보드에 “D4”처럼 표기가 없더라도, 실제로는 보드에 인쇄된 핀명(D9/D10/D11/A0/A1/A2 등)을 코드에서 사용 가능함.
  • D9를 사용해 외부 LED를 제어하는 회로를 구성함.

5) GPIO 제어 핵심(출력/입력)

출력(LED 제어)

  • pinMode(pin, OUTPUT)digitalWrite(pin, HIGH/LOW)로 LED를 켜고 끔.
  • delay() 또는 millis() 기반으로 깜빡임/패턴을 만들 수 있음.

입력(버튼)

  • 버튼은 INPUT_PULLUP 방식으로 간단하고 안정적으로 연결:
    • 버튼 한쪽은 GND, 다른 쪽은 입력 핀
    • 평소 HIGH, 누르면 LOW로 읽힘
  • 버튼 입력은 물리적 튐(바운스)이 있으므로 디바운스가 필요함.

6) 동작 구현(오늘 만든 기능들)

  • 버튼 1개로 LED 깜빡임 속도 토글
    • 한 번 누를 때마다 1초 ↔ 0.1초로 번갈아 바뀌게 구현함.
  • 버튼 이벤트 확장 가능성 확인
    • 더블클릭/싱글클릭 같은 “시간 규칙”을 추가하면
      • 예: 천천히 1번 = 0, 빠르게 2번 = 1 같은 입력 해석이 가능함.
  • “핀 개수”와 “전류 한계” 때문에, 연결 가능한 LED/버튼 수가 제한되며,
    • 핀 6개면 기본적으로 LED/버튼 합쳐 독립 제어는 대략 6개 수준이라는 감을 잡음.
    • 더 많아지면 시프트 레지스터/확장칩/직렬 전송 등으로 확장 가능함.

7) 확장 방향(다음 단계로 이어지는 개념)

  • 모터는 보드 핀에서 직접 구동하지 않고, 드라이버/별도 전원과 조합해 “신호(PWM/펄스)”로 제어한다는 큰 그림을 이해함.
  • “각도 제어”가 필요하면 서보모터(가장 쉬움) 또는 **스테퍼(정밀 제어)**가 적합하다는 점을 정리함.



    코드예제
  • 코드1 요약: LED 기본 깜빡이기(Blink)

목적

  • D9에 연결된 LED를 0.5초 간격으로 켜고/끄기
  • 가장 기본적인 GPIO 출력 실습

필요한 배선

  • D9 → 저항(1kΩ) → LED 긴다리(+)
  • LED 짧은다리(-) → GND

코드 핵심

  • pinMode(LED_PIN, OUTPUT)로 D9을 출력으로 설정
  • digitalWrite(HIGH/LOW)로 전압을 내보내 LED를 켜고 끔
  • delay(500)으로 0.5초 대기 (이 동안 CPU는 다른 일을 못 함: “블로킹”)

코드2 요약: 버튼으로 깜빡임 속도 토글(1초 ↔ 0.1초)

목적

  • LED는 계속 깜빡이되,
  • 버튼(D10)을 한 번 누를 때마다 깜빡임 속도를
    1000ms(1초)100ms(0.1초) 로 번갈아 변경

필요한 배선

LED (코드1과 동일)

  • D9 → 저항(1kΩ) → LED 긴다리(+)
  • LED 짧은다리(-) → GND

버튼(스위치)

  • 버튼 한쪽 → GND
  • 버튼 반대쪽 → D10
  • 코드에서 INPUT_PULLUP을 쓰므로 외부 저항 필요 없음

즉 버튼 회로는:

  • 평소: D10 = HIGH(내부 풀업)
  • 누름: D10 = LOW(GND로 연결)

코드 핵심 개념 3가지

  1. INPUT_PULLUP
    • 버튼 입력을 안정적으로 처리
    • “눌렀을 때 LOW”라는 논리로 동작
  2. 디바운스(debounce)
    • 버튼은 물리적으로 튕겨서 한 번 눌러도 여러 번 눌린 것처럼 보일 수 있음
    • 변화가 생기면 시간을 기록하고(lastDebounceAt), 일정 시간(debounceMs=30ms) 안정되면 “진짜 변화”로 인정
  3. 논블로킹(Non-blocking) LED 깜빡임
    • delay() 대신 millis()로 시간 비교
    • 깜빡임 중에도 버튼 입력을 계속 읽을 수 있음
    • 즉, “LED 깜빡임 + 버튼 처리”를 동시에 굴릴 수 있는 기본 패턴

동작 흐름(한 줄 요약)

  • 버튼 입력을 디바운스해서 “눌림 이벤트”를 잡고 → blinkMs를 1000 ↔ 100으로 토글
  • millis() 타이머로 LED 상태를 주기적으로 반전시켜 깜빡임 유지

오늘 실습에서 얻은 핵심 포인트(코드1/2 공통)

  • 핀 출력 제어(OUTPUT + digitalWrite)
  • 버튼 입력 처리(INPUT_PULLUP)
  • 디바운스 필요성
  • delay() 방식(간단) vs millis() 방식(확장성 좋음)

원하시면, 위 두 코드를 “연습용 프로젝트 폴더/스케치 제목”까지 포함해서

  • 01_blink.ino
  • 02_button_toggle_blink.ino
    형태로 정리해드리고, 다음 단계(버튼 더블클릭/롱프레스/LED 4개 시퀀스)로 확장하는 템플릿도 같이 드리겠습니다.

01_blink.ino const int LED_PIN = 9; void setup() { pinMode(LED_PIN, OUTPUT); } void loop() { digitalWrite(LED_PIN, HIGH); delay(500); digitalWrite(LED_PIN, LOW); delay(500); } 02_button_toggle_blink.ino const int LED_PIN = 9; // LED: D9 const int BUTTON_PIN = 10; // 버튼: D10 (버튼 누르면 GND로 연결) unsigned long blinkMs = 1000; // 1초 시작 bool ledState = false; unsigned long lastBlinkAt = 0; // 디바운스용 bool lastButtonReading = HIGH; // INPUT_PULLUP이므로 기본 HIGH bool debouncedButtonState = HIGH; unsigned long lastDebounceAt = 0; const unsigned long debounceMs = 30; void setup() { pinMode(LED_PIN, OUTPUT); pinMode(BUTTON_PIN, INPUT_PULLUP); // 내부 풀업 사용 (외부 저항 불필요) } void loop() { // 1) 버튼 읽기 + 디바운스 bool reading = digitalRead(BUTTON_PIN); if (reading != lastButtonReading) { lastDebounceAt = millis(); lastButtonReading = reading; } if (millis() - lastDebounceAt > debounceMs) { // 상태가 안정되었을 때만 반영 if (reading != debouncedButtonState) { debouncedButtonState = reading; // 버튼이 "눌렸을 때"(HIGH -> LOW)만 토글 if (debouncedButtonState == LOW) { blinkMs = (blinkMs == 1000) ? 100 : 1000; // 1초 <-> 0.1초 토글 } } } // 2) LED 깜빡이기(논블로킹 방식) if (millis() - lastBlinkAt >= blinkMs) { lastBlinkAt = millis(); ledState = !ledState; digitalWrite(LED_PIN, ledState ? HIGH : LOW); } }

코드에대한 하드웨어 연결

코드1 하드웨어 연결 (D9 LED 깜빡이기)

준비물

  • Beetle Leonardo(ATmega32U4)
  • 브레드보드
  • LED 1개
  • 저항 1개 (1kΩ 권장)
  • 점퍼선 2~3개

전원

  • Beetle을 USB로 PC에 연결 (보드 전원 공급)
  • 별도 브레드보드 전원모듈은 없어도 됨(LED 1개는 보드로 충분)

배선(표준 방식)

  1. Beetle GND → 브레드보드 GND 레일(파란 줄)
  2. LED를 브레드보드에 꽂기
    • LED **긴 다리(+)**와 **짧은 다리(-)**가 서로 다른 줄(다른 행)에 들어가게
  3. **LED 짧은 다리(-)**가 있는 줄 → GND 레일(파란 줄) 로 연결
  4. **Beetle D9 → 저항(1kΩ) → LED 긴 다리(+)**가 있는 줄로 연결
    • 저항은 D9 쪽에 있어도 되고 LED 쪽에 있어도 됨(중요: 직렬)

최종 연결 형태(한 줄)

D9 → 저항(1k) → LED(+) → LED(-) → GND


코드2 하드웨어 연결 (D9 LED + D10 버튼으로 속도 토글)

준비물

  • 코드1 준비물 전부 +
  • 버튼(택트 스위치) 1개
  • 점퍼선 2개 추가(버튼용)

전원

  • Beetle을 USB로 PC에 연결해서 전원 공급

LED 배선

  • 코드1과 완전히 동일
  1. Beetle GND → 브레드보드 GND 레일
  2. D9 → 저항(1k) → LED(+)
  3. LED(-) → GND 레일

버튼 배선(INPUT_PULLUP 방식, 외부 저항 없음)

버튼(택트 스위치 4핀)은 보통 같은 쪽 2핀끼리 내부적으로 연결되어 있습니다.
그래서 브레드보드에 꽂을 때는 반드시:

버튼 꽂는 법

  • 버튼을 브레드보드 가운데 홈(중앙 절연 홈)을 가로질러 꽂습니다.
    (즉, 버튼의 네 다리가 좌우로 나뉘어 다른 영역에 꽂히게)

버튼 연결

  1. 버튼의 한쪽(한 편) 핀(또는 그쪽과 연결된 행) → GND 레일
  2. 버튼의 반대쪽(반대 편) 핀(또는 그쪽과 연결된 행) → Beetle D10

최종 버튼 연결 형태(한 줄)

D10 —(버튼 누르면 연결)— GND

(평소에는 내부 풀업 때문에 D10이 HIGH, 누르면 LOW가 됨)


전체 회로 요약(코드2 기준)

  • LED: D9 → 저항 → LED → GND
  • 버튼: D10 ↔ 버튼 ↔ GND
  • 공통: Beetle GND는 브레드보드 GND 레일과 반드시 연결

자주 발생하는 실수 체크(특히 버튼)

  • 버튼을 브레드보드에 “같은 영역”에만 꽂으면 내부적으로 같은 쪽이 이미 연결이라 동작이 이상해질 수 있음
    → 반드시 중앙 홈을 가로질러 꽂기
  • D10과 GND를 버튼의 “같은 쪽 2핀”에 연결하면 항상 연결된 것처럼 보일 수 있음
    서로 반대편에 연결하기