페이지

2026년 1월 17일 토요일

4.3.3. 스마트 자동문 만들기

스마트 자동문 만들기 (PIR 센서 + 서보 모터)

안녕하세요! 여러분의 AI-IT 멘토, '파이컴'입니다. 😊

지난 시간에는 서보 모터를 이용해 원하는 각도로 팔을 움직여보는 실습을 했었죠. 오늘은 여기서 한 단계 더 나아가, 아두이노에 '눈'을 달아주려고 해요. 바로 PIR 센서라는 부품인데요. 이 센서로 주변의 움직임을 감지해서, 사람이 다가오면 저절로 문이 열리는 '스마트 자동문'을 만들어 볼 거예요. 아두이노가 스스로 보고, 판단하고, 행동하게 만드는 아주 재미있는 프로젝트랍니다!

자, 그럼 저와 함께 차근차근 시작해볼까요?

Slide 1 & 2: 프로젝트 개요 - 스마트 자동문 만들기

이번 프로젝트의 목표는 아주 명확해요.

  • 입력: PIR 센서가 사람의 움직임을 감지해요. (눈의 역할)
  • 판단: 아두이노가 센서 값을 보고 문을 열지 말지 결정해요. (뇌의 역할)
  • 출력: 서보 모터가 아두이노의 명령에 따라 문을 열고 닫아요. (팔의 역할)

이 세 가지 과정을 통해 우리는 마트나 건물 입구에서 흔히 볼 수 있는 자동문의 기본 원리를 직접 구현하게 될 거예요.

✅ 준비물 체크!

  • 아두이노 우노
  • PIR 인체 감지 센서
  • 서보 모터 (SG90)
  • 작은 브레드보드와 점퍼선

준비물이 모두 갖춰졌다면, 이제 회로를 구성하러 가볼게요!

Slide 3: 스마트 자동문 회로 구성

이번에는 센서와 모터, 두 개의 부품을 동시에 연결해야 해요. 여러 부품에 전원(5V)과 접지(GND)를 연결해야 할 때는 브레드보드의 빨간색(+) 라인과 파란색(-) 라인을 활용하면 아주 편리하답니다.

아래 순서대로 차근차근 연결해보세요.

1. 서보 모터 연결 (디지털 8번 핀)

서보 모터는 3개의 선을 가지고 있어요.

  • 갈색 선 ➡️ 아두이노 GND (또는 브레드보드 '-' 라인)
  • 빨간 선 ➡️ 아두이노 5V (또는 브레드보드 '+' 라인)
  • 주황색 선(신호선) ➡️ 아두이노 디지털 8번 핀

2. PIR 센서 연결 (디지털 2번 핀)

PIR 센서도 3개의 핀을 가지고 있어요. 핀 옆에 VCC, GND, OUT 이라고 친절하게 적혀 있을 거예요.

  • VCC ➡️ 아두이노 5V (또는 브레드보드 '+' 라인)
  • GND ➡️ 아두이노 GND (또는 브레드보드 '-' 라인)
  • OUT(신호선) ➡️ 아두이노 디지털 2번 핀

회로 연결이 끝났다면, 이제 아두이노에 똑똑한 지능을 심어줄 코드를 작성할 차례예요!

Slide 4: 스마트 자동문 소스 코드 (1) - 준비 단계(setup)

모든 아두이노 코드는 setup()loop() 함수로 이루어져 있죠. setup() 함수는 아두이노에 전원이 켜졌을 때 딱 한 번만 실행되는 '준비' 단계예요. 우리 자동문이 동작하기 위해 어떤 준비가 필요한지 코드를 살펴볼게요.

CODE 4.1 | 준비 단계(setup)
01#include <Servo.h> // 서보 모터 라이브러리(도구함) 불러오기
02
03Servo myServo; // 'myServo'라는 이름으로 서보 모터 객체 생성
04
05void setup() {
06 myServo.attach(8); // myServo는 8번 핀에 연결되어 있다고 선언
07 pinMode(2, INPUT); // 2번 핀(PIR 센서)은 신호를 입력받는 용도로 설정
08 Serial.begin(9600); // 센서 값 확인을 위한 시리얼 통신 시작
09}
  • #include <Servo.h>: 서보 모터를 쉽고 편리하게 제어할 수 있도록 도와주는 '도구함(라이브러리)'을 가져오는 명령어예요.
  • Servo myServo;: 앞으로 코드에서 서보 모터를 'myServo'라는 이름으로 부르겠다고 별명을 지어주는 거예요.
  • myServo.attach(8);: 아두이노에게 'myServo'라는 이름의 모터는 디지털 8번 핀에 연결되어 있으니 기억하라고 알려주는 부분이에요.
  • pinMode(2, INPUT);: PIR 센서가 연결된 디지털 2번 핀은 외부의 신호를 받아들이는 '입력(INPUT)' 모드로 사용하겠다고 설정해요.
  • Serial.begin(9600);: PIR 센서가 움직임을 제대로 감지하는지 우리 눈으로 확인하기 위해, 컴퓨터와 통신을 시작하는 명령어예요.

준비가 끝났으니, 이제 계속해서 반복적으로 실행될 핵심 동작을 코딩해볼까요?

Slide 5: 스마트 자동문 소스 코드 (2) - 반복 동작(loop)

loop() 함수는 setup()이 끝난 후 무한히 반복 실행되는 부분이에요. 바로 여기에 '스스로 판단하고 행동하는' 자동문의 핵심 로직이 들어갑니다.

CODE 5.1 | 반복 동작(loop)
01void loop() {
02 // 1. 센서 값 읽기
03 int sensorValue = digitalRead(2); // 2번 핀에서 센서 값을 읽어옴 (0 또는 1)
04 Serial.println(sensorValue); // 읽어온 값을 시리얼 모니터에 출력
05
06 // 2. 조건 판단 및 동작
07 if (sensorValue == HIGH) { // 만약 움직임이 감지되었다면 (값이 1이라면)
08 myServo.write(90); // 문 열기 (서보 모터를 90도로 이동)
09 }
10 else { // 그렇지 않다면 (움직임이 없다면, 값이 0이라면)
11 myServo.write(0); // 문 닫기 (서보 모터를 0도로 이동)
12 }
13
14 delay(1000); // 1초 동안 잠시 대기
15}

코드가 어떻게 동작하는지 자세히 뜯어볼게요.

  • digitalRead(2): 2번 핀에 연결된 PIR 센서의 상태를 읽어와요. 움직임이 감지되면 1(HIGH), 감지되지 않으면 0(LOW) 값을 반환합니다. 이 값을 sensorValue라는 변수에 저장해요.
  • Serial.println(sensorValue): 방금 읽은 센서 값을 컴퓨터 화면(시리얼 모니터)에 보여줘서 우리가 현재 상태를 알 수 있게 해줘요.
  • if (sensorValue == HIGH): "만약 움직임이 감지되었다면?" 이라고 아두이노에게 묻는 조건문이에요. 여기서 아두이노의 '판단'이 시작되죠.
  • myServo.write(90);: 위 조건이 참(True)일 때, 즉 움직임이 감지되었을 때 서보 모터를 90도 위치로 움직여 문을 열어줍니다.
  • else: "그렇지 않다면?" 이라는 뜻이에요. 즉, 움직임이 감지되지 않았을 때를 의미해요.
  • myServo.write(0);: else에 해당할 경우, 서보 모터를 0도 위치로 움직여 문을 닫습니다.
  • delay(1000): 각 동작이 끝난 후 1초(1000밀리초) 동안 잠시 기다려요. 이 코드가 없으면 문이 너무 정신없이 열리고 닫힐 수 있겠죠?

Slide 6: 스마트 자동문 실행 결과

자, 이제 코드를 모두 작성하고 아두이노에 업로드해 보세요! 그리고 아두이노 IDE의 오른쪽 위 돋보기 모양 아이콘을 눌러 '시리얼 모니터' 창을 열어주세요. 이제 마법 같은 일이 벌어질 거예요.

1. 평소 상태 (움직임 없음)

  • 시리얼 모니터에는 계속해서 0이 출력될 거예요.
  • 서보 모터는 0도 위치를 유지하며 얌전히 문을 닫고 있어요.

2. 움직임 감지 시

  • PIR 센서 앞에서 손을 흔들거나 몸을 움직여 보세요.
  • 시리얼 모니터의 숫자가 1로 바뀌는 순간!
  • 서보 모터가 "징~" 하는 소리와 함께 90도로 휙 돌아가며 문을 활짝 열어줄 거예요.

3. 움직임 멈춤 시

  • 센서 앞에서 움직임을 멈추고 가만히 있어 보세요.
  • 잠시 후 시리얼 모니터의 숫자가 다시 0으로 바뀌고, 서보 모터도 스르륵 0도로 돌아와 문을 닫습니다.

어때요? 우리가 직접 만든 스마트 자동문이 멋지게 작동하나요? 축하합니다! 여러분은 방금 '입력 → 판단 → 출력'이라는 자동 제어 시스템의 핵심 원리를 완벽하게 구현해냈어요!

오늘은 PIR 센서와 서보 모터를 결합해 주변 상황에 반응하는 스마트 자동문을 만들어 보았어요. 단순히 명령한 대로만 움직이는 것을 넘어, 센서로 외부 정보를 받아들이고 if-else 조건문으로 스스로 판단하여 행동하게 만드는 것, 이것이 바로 피지컬 컴퓨팅의 진정한 매력이랍니다!

오늘 배운 내용은 자동문뿐만 아니라 침입 경보기, 스마트 조명 등 정말 다양한 곳에 응용될 수 있어요. 여러분만의 멋진 아이디어를 더해 새로운 프로젝트에 도전해보는 건 어떨까요?

궁금한 점이 있다면 언제든지 댓글로 질문해주세요! 그럼 다음 시간에 더 재미있는 프로젝트로 다시 만나요! 👋

이 포스팅의 내용은 교재 [주니어 공학교실 아두이노의 기초] **-** 페이지에 수록된 내용입니다.

2026년 1월 16일 금요일

4.3.2. 서보 모터 회로 구성하기

안녕하세요! 여러분의 AI-IT 멘토, '파이컴'입니다. 😊

오늘은 아두이노를 이용해서 '움직임'을 만들어보는 아주 흥미로운 시간을 가져보려고 해요. 바로 서보 모터를 내 마음대로 제어하는 방법을 배울 건데요, 복잡한 이론은 잠시 접어두고 직접 회로를 만들고 코드를 실행하면서 움직임을 눈으로 확인해 보겠습니다. "0도! 90도! 180도!" 우리가 내리는 명령에 따라 정확하게 움직이는 모터를 보면 정말 신기할 거예요.

자, 그럼 함께 시작해볼까요?

Slide 1: 서보 모터 회로 구성하기 (시작)

이번 시간에는 '주니어 공학 교실: 아두이노의 기초' 교재의 4장 '화면과 움직임으로 표현하기' 내용 중 서보 모터를 직접 다뤄보는 실습을 진행할 거예요. 이론은 충분히 익혔으니, 이제 직접 손으로 만들어보며 원리를 체득할 시간입니다!

Slide 2: 서보 모터 회로 구성

가장 먼저 할 일은 아두이노와 서보 모터를 연결하는 회로 구성이에요. 준비물은 아주 간단합니다!

준비물

  • 아두이노 UNO
  • 서보 모터 (SG90 모델)

회로 연결 방법

서보 모터는 3개의 선을 가지고 있는데, 색깔만 잘 구분해서 꽂으면 정말 쉬워요. 아래 '선 색깔 규칙'을 꼭 기억해주세요!

  • 갈색 선 (GND) ➡️ 아두이노 GND 핀에 연결합니다.
    • GND는 'Ground'의 약자로, 회로의 기준이 되는 '-'극이라고 생각하면 돼요.
  • 빨간색 선 (VCC) ➡️ 아두이노 5V 핀에 연결합니다.
    • 모터가 움직이는 데 필요한 전원을 공급하는 선이에요.
  • 주황색 선 (신호, Signal) ➡️ 아두이노 디지털 8번 핀에 연결합니다.
    • 가장 중요한 선이에요! 바로 이 신호선을 통해 아두이노가 모터에게 "몇 도로 움직여!"라고 명령을 내리게 됩니다.

슬라이드에 있는 그림을 참고해서 점퍼선을 이용해 똑같이 연결해보세요. 정말 간단하죠?

Slide 3: 서보 모터 각도 제어 코드 (1)

이제 하드웨어 연결이 끝났으니, 모터를 움직일 소프트웨어, 즉 코드를 작성할 차례입니다. 코드는 크게 세 부분으로 나눌 수 있어요.

1️⃣ 라이브러리 포함

CODE 3.1 | 라이브러리 포함
01#include <Servo.h> // 1. 서보 모터 라이브러리를 가져옵니다.

서보 모터를 제어하려면 아주 정밀한 신호를 보내야 하는데, 이걸 우리가 직접 만들려면 너무 복잡해요. 다행히 아두이노에는 Servo.h라는 멋진 라이브러리(필수 도구함)가 있어서, 이 한 줄만 추가하면 복잡한 과정 없이 쉽게 모터를 제어할 수 있답니다.

2️⃣ 객체 생성

CODE 3.2 | 서보 객체 생성
01Servo myServo; // 2. 내가 부릴 하인(모터)의 이름을 'myServo'라고 지어줍니다.

라이브러리를 가져온 다음에는 우리가 제어할 모터에게 '이름'을 지어줘야 해요. Servo라는 설계도를 이용해서 myServo라는 이름의 실제 모터(객체)를 하나 만드는 과정이에요. 마치 "이제부터 내가 제어할 서보 모터의 이름은 'myServo'야!"라고 선언하는 것과 같아요.

3️⃣ setup() 함수 설정

CODE 3.3 | setup() 함수
01void setup() {
02 myServo.attach(8); // 3. 8번 핀에 모터가 연결되었다고 알려줍니다.
03}

setup() 함수는 코드가 시작될 때 딱 한 번만 실행되는 부분이죠? 여기서 myServo.attach(8); 이라는 명령을 통해 우리가 만든 myServo라는 모터가 실제 아두이노 8번 핀에 연결되어 있다는 사실을 알려주는 거예요. 이제 아두이노는 'myServo'에게 내리는 모든 명령을 8번 핀으로 보내게 됩니다.

Slide 4: 서보 모터 각도 제어 코드 (2)

이제 실제로 모터를 움직이는 명령을 내릴 시간입니다. 이 코드는 loop() 함수 안에 작성해서 계속 반복 실행되도록 할 거예요.

CODE 4.1 | loop() 함수
01void loop() {
02 // 0도로 이동!
03 myServo.write(0);
04 delay(2000); // 2초 동안 기다리기
05
06 // 90도로 이동!
07 myServo.write(90);
08 delay(2000); // 2초 동안 기다리기
09
10 // 180도로 이동!
11 myServo.write(180);
12 delay(2000); // 2초 동안 기다리기
13}

코드가 정말 직관적이죠?

  1. myServo.write(0);: 'myServo'야, 0도 위치로 움직여!
  2. delay(2000);: 그 위치에서 2초(2000밀리초) 동안 잠시 멈춰.
  3. myServo.write(90);: 이번엔 90도 위치로 움직여!
  4. delay(2000);: 또 2초간 멈추고.
  5. myServo.write(180);: 마지막으로 180도 위치로 움직여!
  6. delay(2000);: 다시 2초간 멈춰.

loop() 함수 안에 있기 때문에 이 동작은 0도 → 90도 → 180도 → 0도 → ... 순서로 무한히 반복됩니다.

Slide 5: 서보 모터 제어 실행 결과

코드를 모두 작성하고 아두이노에 업로드했다면, 어떤 결과가 보일까요?

동작 확인

  • 모터가 "징~" 하는 작은 소리와 함께 움직이기 시작할 거예요.
  • 0도 → 90도 → 180도 순서로 차례대로 움직입니다.
  • 각 각도에 도달하면 2초씩 멈췄다가 다음 각도로 이동해요.
  • 마치 로봇 팔처럼 딱딱 끊어지면서도 아주 정밀하게 원하는 각도로 움직이는 모습을 관찰할 수 있습니다.

직접 만든 회로와 코드로 물체가 움직이는 것을 보면 정말 뿌듯하실 거예요!

Slide 6: 서보 라이브러리 핵심 문법 (1)

방금 사용한 코드의 핵심 문법을 다시 한번 정리해볼게요.

🎯 Servo.h 라이브러리의 역할

복잡한 PWM 신호를 직접 만들 필요 없이, write(각도)라는 아주 간단한 명령어로 모터를 제어할 수 있게 해주는 마법 같은 도구함이에요.

🎯 객체 만들기: 하인의 이름 짓기

이 개념이 처음에는 조금 낯설 수 있어요. 서보 모터를 '우리가 부릴 수 있는 하인'이라고 비유해볼게요.

  • 형식: Servo 모터이름;
  • Servo: "나는 이제 서보 모터라는 종류의 하인을 고용할 거야!"라고 선언하는 거예요.
  • 모터이름: 우리가 고용한 하인에게 붙여주는 이름이에요. 예시에서는 myServo라고 지었죠. 여러분이 원하는 다른 이름(예: motor1)으로 지어도 괜찮아요!

Slide 7: 서보 라이브러리 핵심 문법 (2)

이어서 모터를 제어하는 핵심 함수 두 가지를 정리해봅시다.

🎯 attach() 함수: 일터 지정

하인을 고용했으면 어디서 일할지 알려줘야겠죠? attach() 함수가 바로 그 역할을 해요.

  • 형식: 모터이름.attach(핀번호);
  • 의미: "myServo야, 너의 일터는 8번 핀이야. 여기서 내가 내리는 명령을 기다리고 있어!" 라는 뜻이에요.
  • setup() 함수에서 딱 한 번만 지정해주면 됩니다.

🎯 write() 함수: 각도 명령

일터에 대기 중인 하인에게 실제 임무를 주는 명령어입니다.

  • 형식: 모터이름.write(각도);
  • 의미: "myServo야, 지금 당장 90도 위치로 움직여!" 처럼 구체적인 각도를 명령해요.
  • 각도: 보통 0부터 180 사이의 정수 값을 사용합니다.

⚠️ 주의! 대부분의 서보 모터는 0~180도까지만 움직일 수 있어요. 만약 200도나 -10도 같은 범위를 벗어난 값을 명령하면, 모터가 "드르륵" 소리를 내며 무리하다가 고장 날 수 있으니 꼭 범위를 지켜주세요!

Slide 8: [특별 코너] 객체(Object)란 무엇일까요?

코딩을 하다 보면 '객체'라는 단어 때문에 머리가 아파오는 분들이 계실 거예요. 오늘 나온 myServo가 바로 객체인데요, 아주 쉬운 비유 두 가지로 설명해 드릴게요!

🍞 붕어빵 틀(클래스) vs 붕어빵(객체)

  • Servo (클래스): 붕어빵을 만드는 '틀' 또는 '설계도'예요. 틀 자체는 먹을 수 없죠? 그냥 "이런 모양을 만들 수 있다"는 약속일 뿐이에요.
  • myServo (객체): 그 틀로 찍어낸 따끈따끈한 '실제 붕어빵'이에요. 우리는 이 진짜 붕어빵을 먹을 수도 있고(사용), 친구에게 줄 수도 있죠. 코드에서 실제로 일을 하는 실체랍니다.

🤵 직업(클래스) vs 실제 사람(객체)

  • Servo (클래스): '집사'라는 '직업'이에요. 세상에는 집사가 많지만, 그냥 "어이, 집사!"라고 부르면 누가 대답해야 할지 알 수 없어요.
  • myServo (객체): '철수'라는 이름을 가진 '특정 집사'예요. "철수(myServo)야, 물 좀 가져와(write)!" 라고 콕 집어 명령해야 일을 처리할 수 있죠.

결론적으로 Servo myServo; 라는 코드는 "Servo라는 설계도를 사용해서, myServo라는 이름의 실제 일꾼(객체)을 하나 만들어줘!" 라는 의미랍니다. 이제 '객체'라는 개념이 조금은 친숙해지셨나요?

오늘은 서보 모터를 직접 연결하고 코딩해서 원하는 각도로 정밀하게 움직여보는 실습을 진행했습니다. 어떠셨나요? 생각보다 훨씬 간단하죠? Servo.h 라이브러리 덕분에 우리는 단 몇 줄의 코드로 복잡한 움직임을 만들어낼 수 있었습니다.

이제 여러분은 아두이노로 물리적인 세상을 제어하는 강력한 무기 하나를 손에 넣으신 거예요! 오늘 배운 내용을 응용해서 각도를 바꿔보거나, 멈추는 시간을 다르게 설정해보는 등 다양한 실험을 해보세요.

다음 포스팅에서는 더욱 흥미로운 주제로 여러분을 찾아뵙겠습니다. 그때까지 즐거운 코딩 하세요! 👋

이 포스팅의 내용은 교재 [주니어 공학교실 아두이노의 기초] **-** 페이지에 수록된 내용입니다.

2026년 1월 15일 목요일

4.3.1. 서보 모터 알아보기

안녕하세요! 여러분의 AI-IT 멘토, '파이컴'입니다. 😊

오늘은 아두이노 프로젝트의 단골손님, 바로 '움직임'을 책임지는 아주 똑똑한 부품, 서보 모터(Servo Motor)에 대해 알아보려고 해요. 선풍기처럼 마냥 뱅글뱅글 돌기만 하는 모터와는 차원이 다른, 정밀한 움직임을 만들어내는 서보 모터의 비밀을 함께 파헤쳐 볼까요?

자, 그럼 오늘의 강의 노트를 시작합니다!

Slide 1: 서보 모터 알아보기

이번 4장 '화면과 움직임으로 표현하기'의 세 번째 주제는 바로 '서보 모터'입니다. 우리가 만드는 작품에 생동감 넘치는 움직임을 불어넣어 줄 아주 중요한 부품이죠. 지금부터 서보 모터가 무엇인지, 그 기본 개념부터 차근차근 알아보겠습니다!

Slide 2: 서보 모터 알아보기 (DC 모터와 차이점)

모터라고 하면 어떤 이미지가 떠오르시나요? 아마 선풍기 날개처럼 전기를 꽂으면 멈추라고 할 때까지 미친 듯이 뱅글뱅글 도는 모습을 상상하실 거예요. 이런 모터를 DC 모터라고 해요. 단순하고 힘차게 계속 회전하는 게 특징이죠.

하지만 로봇 팔이나 자동차 와이퍼, 주차장 차단기를 생각해보세요. 이 친구들은 어떤가요? 정확하게 원하는 위치까지만 딱 움직이고 멈추죠. 심지어 반대 방향으로 돌아오기도 하고요.

이렇게 우리가 원하는 '각도(Angle)' 만큼만 정밀하게 움직이고, 그 자세를 계속 유지할 수 있는 똑똑한 모터를 바로 서보 모터(Servo Motor)라고 부른답니다.

Slide 3: 서보 모터의 어원과 원리

서보(Servo)라는 이름은 어디서 왔을까요? 바로 '하인(Servant)'이라는 단어에서 유래했어요. 정말 재미있죠? 주인이 "90도로 움직여!" 하고 명령하면, 충실한 하인처럼 정확히 그 위치로 움직여서 다음 명령을 기다리는 모습과 똑 닮았기 때문이에요.

이 작은 파란색 상자(SG90 모델) 안에는 사실 엄청난 비밀이 숨어있어요. 뚜껑을 열어보면 마치 정밀한 시계처럼 수많은 부품이 오밀조밀하게 구성되어 있답니다. 이 작은 몸집에서 어떻게 그런 정확한 움직임이 나오는지, 그 내부 구조를 살짝 들여다볼까요?

Slide 4: 서보 모터의 내부 구조 (1)

서보 모터의 정밀한 제어는 바로 이 두 가지 핵심 부품 덕분이에요.

⚙️ 기어: "힘을 키워라!"

사실 모터 자체는 힘(토크)이 약하고 속도만 빨라요. 그래서 이 약한 힘을 키우기 위해 내부에 여러 개의 톱니바퀴(기어)를 연결해 놨어요. 기어들이 맞물려 돌아가면서 속도는 줄어드는 대신, 힘(토크)은 엄청나게 강해지는 원리랍니다. 작아도 힘이 장사인 이유가 바로 여기에 있죠!

👀 가변 저항: "내 위치를 파악해!"

어? 예전에 배운 가변 저항이 왜 여기 들어있을까요? 서보 모터는 이 가변 저항을 마치 자신의 '눈'처럼 사용해요. 모터의 축이 돌아갈 때마다 가변 저항의 저항값이 변하는데, 이 값을 읽어서 "아, 내가 지금 45도쯤 와있구나!" 하고 스스로의 현재 위치(각도)를 정확히 파악하는 거죠.

Slide 5: 서보 모터의 내부 구조 (2)

기어와 가변 저항만으로는 부족하죠. 이 모든 상황을 총괄하는 사령관이 필요해요!

🧠 제어 회로: "명령을 수행해!"

제어 회로는 서보 모터의 '뇌' 역할을 담당해요. 우리가 아두이노를 통해 내린 명령("90도로 가!")과 가변 저항이 알려주는 현재 위치("지금 45도야!")를 끊임없이 비교하죠. 그리고 목표 각도에 도달하려면 모터를 얼마나 더 돌려야 할지, 어느 방향으로 돌려야 할지를 계산해서 모터에 최종 명령을 내립니다. 정말 똑똑하지 않나요?

Slide 6: 서보 모터 연결 방법

서보 모터를 아두이노에 연결하는 건 아주 간단해요. 하지만 3가닥 전선의 색깔을 꼭! 구별해서 연결해야 해요. 잘못 연결하면 모터가 뜨겁게 달아오르거나 고장 날 수 있으니 주의하세요!

✅ 전선 색깔별 연결 방법

  • 갈색 또는 검정 (GND): 땅(Ground)이나 그림자 색깔이죠? 이 선은 아두이노의 GND에 연결해주세요.
  • 빨간색 (VCC): 에너지가 느껴지는 빨간색 선은 전원을 공급하는 선이에요. 아두이노의 5V에 연결하면 됩니다.
  • 주황색 또는 노란색 (신호선): 개나리색을 닮은 이 선이 바로 우리가 보낸 명령("90도로 가!")을 듣는 '귀' 역할을 해요. 아두이노의 디지털 핀 중 하나에 연결해주세요.

※ 주의: 꼭 색깔 규칙을 지켜서 연결해주세요!

Slide 7: 서보 모터 제어 범위

우리가 흔히 사용하는 보급형 서보 모터(SG90)는 움직일 수 있는 범위가 정해져 있어요.

✅ 회전 범위: 0도 ~ 180도

마치 사람이 고개를 뒤로 360도 꺾을 수 없는 것처럼, 이 서보 모터도 0도에서 180도 사이에서만 움직일 수 있답니다. 그 이상의 각도를 명령하면 모터가 고장 날 수 있으니 조심해야 해요.

✅ 코딩 방법: Servo.h 라이브러리

다행히 코딩은 아주 쉬워요. 아두이노에서 기본으로 제공하는 Servo.h 라는 라이브러리(미리 만들어진 코드 모음)를 사용하면 되거든요. 예를 들어 myservo.write(90); 이렇게 단 한 줄만 쓰면, 서보 모터가 알아서 90도 위치로 '착!' 하고 이동한답니다. 정말 편리하죠?

Slide 8: 180도 VS 360도 서보 모터 (1)

"어? 선생님, 제 모터는 180도에서 멈추지 않고 선풍기처럼 계속 돌아요!"

혹시 이런 경험을 하셨다면, 여러분은 아주 특별한 친구를 만난 거예요. 바로 '360도 연속 회전 서보 모터'랍니다. 겉모습은 180도 서보 모터와 쌍둥이처럼 똑같이 생겨서 헷갈리기 쉬운데요, 이름표를 잘 보면 구별할 수 있어요.

✅ 180도 서보 모터 (일반형)

  • 가장 흔한 파란색 '국민 모터'예요.
  • 모델명이 보통 SG90, MG90S처럼 숫자 뒤에 아무것도 없거나 'S'가 붙어 있어요.

✅ 360도 서보 모터 (무한 회전형)

  • 모델명 숫자 뒤에 'R'이 붙는 경우가 많아요. (예: FS90R) 여기서 'R'은 회전(Rotation)을 의미해요.
  • 스티커나 포장지에 "Continuous(연속)" 또는 "360"이라는 글자가 적혀 있답니다.

부품을 구매하거나 사용할 때, 내가 원하는 기능이 '각도 제어'인지 '연속 회전'인지에 따라 잘 확인하고 선택해야 해요!

Slide 9: 180도 VS 360도 서보 모터 (2)

두 모터는 겉모습뿐만 아니라, write() 명령에 대한 반응도 완전히 달라요. 이게 정말 중요한 포인트예요!

✅ 180도 서보 모터: '위치(각도)'를 제어해요

  • write(90) → "90도 각도로 이동해서 멈춰!"
  • 로봇 팔, 차단기처럼 특정 위치로 움직여야 할 때 사용해요.

✅ 360도 서보 모터: '속도'를 제어해요

  • write(180) → "앞으로! 전속력으로 계속 회전!"
  • write(90) → "정지! (속도 0)"
  • write(0) → "뒤로! 전속력으로 계속 회전!"
  • RC카 바퀴처럼 계속 굴러가야 할 때 사용해요.

똑같은 write(90) 명령인데, 한쪽은 90도로 이동하고 다른 한쪽은 멈추다니, 정말 다르죠? 이 차이점을 꼭 기억해주세요!

Slide 10: 서보 모터 이상 소리 원인 (1)

모터를 작동시켰는데 "지지직... 드르르륵..." 하고 떨리면서 이상한 소리가 날 때가 있나요? 그건 서보 모터가 "살려줘!" 하고 보내는 비명 소리일 수 있어요. 주요 원인들을 알아볼게요.

⚠️ 원인 1: 무리한 각도 명령

서보 모터는 0도~180도까지만 갈 수 있다고 했죠? 그런데 코드에서 190도나 -10도처럼 갈 수 없는 각도를 명령하면 어떻게 될까요? 모터는 명령에 따르려고 힘을 쓰지만, 물리적인 한계(벽)에 막혀 더는 갈 수 없어요. 그런데도 계속 가려고 힘을 주다 보니 내부의 플라스틱 기어가 갈리면서 "드르륵" 소리를 내는 거랍니다.

Slide 11: 서보 모터 이상 소리 원인 (2)

무리한 명령 외에도 다른 원인들이 있어요.

⚠️ 원인 2: 손으로 강제 회전

전원이 연결되지 않았을 때 "어? 이거 돌아가네?" 하면서 손으로 모터의 날개(혼)를 억지로 윙윙 돌리는 친구들이 있어요. 절대 안 돼요! 안쪽의 약한 플라스틱 기어 이빨이 다 부러질 수 있답니다. 모터는 오직 코드로만! 부드럽게! 돌려주는 거예요.

⚠️ 원인 3: 전기 부족

서보 모터는 힘이 센 만큼 밥(전기)도 많이 먹는 대식가예요. 만약 건전지의 힘이 약하면 배가 고파서 덜덜 떨리는 현상이 나타날 수 있답니다. 모터가 힘없이 떨기만 한다면, 새 건전지로 바꿔주세요!

오늘은 정밀한 움직임의 대가, 서보 모터에 대해 깊이 있게 알아봤어요. 단순한 회전을 넘어 우리가 원하는 각도로 정확하게 움직이는 원리부터, 180도 모터와 360도 모터의 결정적인 차이, 그리고 고장 시 대처법까지! 이제 여러분은 서보 모터를 자신 있게 다룰 수 있는 기본기를 갖추게 되셨습니다.

다음 시간에는 이 서보 모터를 직접 제어하는 실습을 통해, 나만의 움직이는 작품을 만들어 볼게요. 궁금한 점이 있다면 언제든 댓글로 질문해주세요!

오늘도 정말 수고 많으셨습니다! 👍

이 포스팅의 내용은 교재 [주니어 공학교실 아두이노의 기초]에 수록된 내용입니다.

2026년 1월 14일 수요일

4.2.3. 거리 측정 표시기 만들기

안녕하세요! 여러분의 AI-IT 멘토, '파이컴'입니다. 😊

지난 시간에는 LCD 화면에 "Hello"를 띄우며 아두이노와 디스플레이가 처음으로 대화하는 법을 배웠어요. 하지만 정적인 글자만으로는 조금 심심하셨죠? 그래서 오늘은 한 단계 더 나아가, 이전에 다뤘던 초음파 센서와 LCD를 결합해 보려고 합니다!

컴퓨터의 시리얼 모니터를 켜지 않고도, LCD 화면만으로 거리를 바로 확인할 수 있는 '나만의 휴대용 거리 측정기' 만들기! 지금 바로 시작해 볼까요?

Slide 1: 03. 거리 측정 표시기 만들기

초음파 센서와 LCD를 이용한 거리 측정기 프로젝트 소개

이번 프로젝트의 목표는 명확해요. 초음파 센서로 측정한 거리 값을 I2C LCD 화면에 실시간으로 표시하는 것이죠. 이 두 가지 부품을 함께 사용하면 아두이노가 주변 환경과 상호작용하고 그 결과를 시각적으로 보여주는, 훨씬 더 완성도 높은 작품을 만들 수 있답니다.

Slide 2: 거리 측정 표시기 회로

아두이노, 초음파 센서, I2C LCD를 연결한 회로도

이번 회로는 초음파 센서와 I2C LCD를 동시에 연결해야 해서 조금 복잡해 보일 수 있어요. 하지만 걱정 마세요! 전원(VCC, GND)을 브레드보드의 전원 레일(빨간색 +, 파란색 -)에 먼저 연결해두고 사용하면 아주 깔끔하게 정리할 수 있답니다.

✅ 준비물

  • 아두이노 우노
  • 초음파 센서 (HC-SR04)
  • I2C LCD
  • 브레드보드

✅ 회로 연결 방법

  1. 전원 공급 설정
    • 아두이노 5V → 브레드보드 빨간색 줄(+)
    • 아두이노 GND → 브레드보드 파란색 줄(-)
  2. I2C LCD 연결 (지난 시간과 동일해요!)
    • VCC → 브레드보드 빨간색 줄(+)
    • GND → 브레드보드 파란색 줄(-)
    • SDA → 아두이노 A4
    • SCL → 아두이노 A5
  3. 초음파 센서 연결 (새롭게 추가!)
    • VCC → 브레드보드 빨간색 줄(+)
    • GND → 브레드보드 파란색 줄(-)
    • TRIG → 아두이노 디지털 4번 핀
    • ECHO → 아두이노 디지털 3번 핀

슬라이드 그림처럼 각 부품의 VCC와 GND를 브레드보드 전원 라인에 연결하면, 여러 부품을 사용하더라도 선이 엉키지 않고 깔끔하게 회로를 구성할 수 있어요.

Slide 3: 거리 측정 코드 (1) - 핀 정의 및 초기화

거리 측정기 아두이노 코드의 초기 설정 부분

이제 코드를 살펴볼 시간이에요! 코드는 크게 '초기 설정' 부분과 '무한 반복' 부분으로 나뉩니다. 이번 슬라이드는 프로그램을 시작하기 전에 필요한 약속과 준비를 하는 초기 설정 부분이에요.

CODE 3.1 | 핀 정의 및 초기화
01// 01~04행: 핀 번호 정의 및 라이브러리 포함
02#define ECHO 3
03#define TRIG 4
04#include <Wire.h>
05#include <LiquidCrystal_I2C.h>
06
07// 08행: LCD 객체 생성
08LiquidCrystal_I2C lcd(0x20, 16, 2);
09
10// 10~16행: setup() 함수 - 초기 설정
11void setup() {
12 pinMode(TRIG, OUTPUT); // 초음파 발사 핀 (출력)
13 pinMode(ECHO, INPUT); // 초음파 수신 핀 (입력)
14
15 lcd.init(); // LCD 초기화
16 lcd.backlight(); // 백라이트 켜기
17}
  • #define: 초음파 센서의 ECHO 핀은 3번, TRIG 핀은 4번에 연결했다고 코드에 이름을 붙여주는 거예요. 이렇게 하면 나중에 핀 번호를 헷갈리지 않고 ECHO, TRIG라는 이름으로 편하게 사용할 수 있어요.
  • #include: I2C 통신에 필요한 Wire.h 라이브러리와 I2C LCD를 제어하기 위한 LiquidCrystal_I2C.h 라이브러리를 불러옵니다.
  • LiquidCrystal_I2C lcd(0x20, 16, 2);: 우리가 사용할 LCD의 정보를 알려주는 부분이에요. 주소는 0x20(만약 화면이 안 나오면 0x27로 바꿔보세요!), 가로 16글자, 세로 2줄짜리 LCD라고 선언하는 거죠.
  • setup() 함수: 아두이노에 전원이 켜지면 딱 한 번 실행되는 부분이에요.
    • pinMode(): TRIG 핀은 초음파를 '쏘는' 역할이므로 OUTPUT(출력), ECHO 핀은 돌아온 초음파를 '받는' 역할이므로 INPUT(입력)으로 설정해요.
    • lcd.init()lcd.backlight(): LCD를 사용하기 위해 초기화하고, 화면을 밝혀줍니다.

Slide 4: 거리 측정 코드 (2) - 핵심 로직

거리 측정기 아두이노 코드의 loop() 함수 핵심 로직 부분

이제 실제 거리 측정이 이루어지는 loop() 함수, 즉 핵심 로직 부분을 살펴볼게요. 이 코드는 전원이 꺼질 때까지 계속해서 반복 실행됩니다.

CODE 4.1 | 핵심 로직 (loop)
18// 18~41행: loop() 함수 - 무한 반복
19void loop() {
20 // 1. 초음파 발사!
21 digitalWrite(TRIG, LOW);
22 delayMicroseconds(2);
23 digitalWrite(TRIG, HIGH); // 10마이크로초 동안 초음파 발사
24 delayMicroseconds(10);
25 digitalWrite(TRIG, LOW);
26
27 // 2. 돌아온 시간 측정 및 거리 계산
28 float dist = pulseIn(ECHO, HIGH) / 58.2;
29
30 // 3. LCD 화면 갱신 (이전 글자 지우기)
31 lcd.setCursor(0, 0);
32 lcd.print(" "); // 공백 16개로 덮어쓰기
33
34 // 4. 거리 정보 출력
35 lcd.setCursor(0, 0); // 커서를 첫째 줄 맨 앞으로
36 lcd.print("Dist : ");
37 lcd.print(dist, 1); // 거리 값을 소수점 1자리까지 출력
38 lcd.print(" cm");
39
40 delay(1000); // 1초마다 갱신
41}

이 코드는 크게 4단계로 동작해요.

  1. 초음파 발사 (19~24행): TRIG 핀에 아주 짧은 시간(10마이크로초) 동안 HIGH 신호를 보내 '삑!'하고 초음파를 발사시킵니다.
  2. 거리 계산 (27행): pulseIn(ECHO, HIGH) 함수를 이용해 초음파가 발사된 후 다시 돌아올 때까지 걸린 시간을 측정해요. 이 시간을 58.2로 나누면 우리가 원하는 cm 단위의 거리가 계산됩니다. 소수점까지 정밀하게 계산하기 위해 float (실수형) 변수를 사용했어요.
  3. 화면 지우기 (31~32행): 새로운 값을 출력하기 전에 이전 값을 지워줘야 해요. lcd.print(" "); 처럼 공백 16개를 출력해서 첫 번째 줄을 깨끗하게 덮어쓰는 방식을 사용했답니다. 이 코드가 없으면 숫자가 겹쳐서 이상하게 보일 수 있어요.
  4. 거리 정보 출력 (35~38행): lcd.setCursor(0, 0)으로 커서를 맨 앞으로 옮기고, "Dist : ", 계산된 거리 값, " cm" 단위를 차례대로 출력합니다. lcd.print(dist, 1)에서 숫자 1은 소수점 첫째 자리까지만 보여달라는 의미예요.
  5. 1초 대기 (40행): delay(1000)을 통해 이 모든 과정을 1초에 한 번씩 반복하도록 속도를 조절합니다.

Slide 5: 초음파 센서 측정 범위와 주의사항

초음파 센서의 측정 범위와 사각지대에 대한 설명

프로젝트를 테스트하다 보면 신기한 현상을 발견할 수 있어요. 물체를 센서 코앞에 가져갔는데 "0cm"가 아니라 갑자기 300cm가 넘는 엉뚱한 값이 나오지 않던가요? 고장이 아니니 안심하세요! 이건 초음파 센서가 가진 '측정 한계' 또는 '눈앞의 사각지대' 때문이에요.

마치 산에서 "야호~!"하고 외쳤는데, 바로 앞 절벽에 소리가 부딪혀 메아리가 돌아오면 내 외침과 메아리가 겹쳐서 제대로 들을 수 없는 것과 같아요. 센서도 소리를 발사하고 수신하는 시간이 너무 짧으면 신호가 엉켜서 거리를 제대로 인식하지 못하는 거죠.

✅ 초음파 센서(HC-SR04) 측정 범위

  • 정상 측정 범위: 약 2cm ~ 400cm
  • 측정 불가 영역: 0cm ~ 2cm
    • 이 영역에서는 너무 가까워서 인식을 못 하거나, 최대 거리 값 같은 오류를 출력해요.
    • 우리가 사용하는 틴커캐드 시뮬레이터도 이런 물리적 한계를 똑같이 재현해 놓았답니다. 정말 대단하죠?

💡 핵심 권장 사항

거리를 측정할 때는 항상 센서와 물체 사이에 최소 2~3cm (손가락 두 마디 정도)의 거리를 유지해 주세요! 그래야 정확한 값을 얻을 수 있습니다.

오늘은 초음파 센서와 LCD를 결합하여 컴퓨터 없이도 스스로 작동하는 '휴대용 거리 측정기'를 만들어 보았어요. 이제 여러분은 아두이노가 주변 환경을 감지하고, 그 결과를 사용자에게 직접 보여주는 멋진 장치를 만들 수 있게 되었습니다!

이 원리를 응용하면 자동차 후방 감지 센서, 스마트 휴지통, 액체의 높이를 재는 수위 측정기 등 정말 무궁무진한 프로젝트로 발전시킬 수 있답니다.

오늘 배운 내용 중 궁금한 점이 있다면 언제든지 댓글로 질문해주세요. 그럼 다음 시간에도 더욱 재미있고 유익한 프로젝트로 다시 만나요! 👋

이 포스팅의 내용은 교재 [주니어 공학교실 아두이노의 기초]에 수록된 내용입니다.

2026년 1월 13일 화요일

4.2.2. I2C LCD 회로 구성하기

안녕하세요! 여러분의 AI-IT 멘토, '파이컴'입니다. 😊

오늘은 아두이노 프로젝트의 꽃이라고 할 수 있는 'I2C LCD' 사용법에 대해 알아보려고 해요. 복잡한 회로 연결 없이 단 4개의 핀만으로 원하는 글자를 화면에 딱! 하고 띄울 수 있어서 정말 매력적인 부품이죠. 센서 값을 확인하거나, 멋진 나만의 메시지를 표시하고 싶을 때 아주 유용하답니다.

이전 시간에 I2C 통신이 무엇인지, 그리고 내 LCD의 고유 주소를 찾는 방법까지 알아봤다면, 이제 모든 준비는 끝났어요. 저와 함께 차근차근 회로를 구성하고 코드를 작성해서 "Hello, World!"를 화면에 띄워볼까요?

Slide 1: 02. I2C LCD 회로 구성하기

자, 드디어 4장 '화면과 움직임으로 표현하기'의 두 번째 주제, I2C LCD를 직접 다뤄볼 시간이에요. 우리는 이미 LCD와 대화하기 위한 모든 준비를 마쳤어요. 통역사 역할을 해줄 라이브러리도 설치했고, LCD의 집 주소인 I2C 주소도 알아냈죠.

이제 아두이노에게 명령을 내려서, 우리가 원하는 멋진 인사말을 LCD 화면에 띄워보는 일만 남았습니다. 정말 기대되지 않나요? 그럼 바로 시작해 볼게요!

Slide 2: I2C LCD 회로 구성하기

가장 먼저 할 일은 아두이노와 I2C LCD를 연결하는 회로 구성이에요. 하지만 걱정 마세요. I2C LCD의 가장 큰 장점은 연결이 정말 정말 간단하다는 점이랍니다!

✅ 준비물

  • 아두이노 우노
  • I2C LCD (1602)

✅ 연결 방법

슬라이드의 회로도처럼 딱 4개의 핀만 연결하면 끝나요. LCD 모듈 뒷면을 보면 각 핀의 이름이 적혀 있으니 그대로 따라 연결해주세요.

  • GND 핀 ↔️ 아두이노 GND
  • VCC 핀 ↔️ 아두이노 5V
  • SDA 핀 ↔️ 아두이노 A4
  • SCL 핀 ↔️ 아두이노 A5

여기서 가장 중요한 포인트는 SDA와 SCL 핀이에요! 이 두 핀은 I2C 통신을 위한 약속된 자리라서 다른 핀에 연결하면 작동하지 않아요. SDA는 아날로그 4번(A4), SCL은 아날로그 5번(A5) 핀에 정확하게 연결하는 것, 잊지 마세요!

Slide 3: "Hello, World!" 텍스트 출력 코드 살펴보기

회로 연결이 끝났다면 이제 코드를 작성할 차례예요. 아래 코드를 아두이노 스케치에 입력하고 업로드하면, LCD 화면에 파란 불이 들어오면서 "Hello, World!"와 "Arduino I2C LCD"라는 글자가 나타날 거예요.

CODE 4.2 | Hello, World! 텍스트 출력
01// 1. 필요한 도구함(라이브러리)을 불러옵니다.
02#include <Wire.h>
03#include <LiquidCrystal_I2C.h>
04 
05// 2. LCD 설정 (주소, 가로칸수, 세로줄수)
06// 만약 스캐너로 찾은 주소가 0x27이라면 0x20 대신 0x27을 적으세요!
07LiquidCrystal_I2C lcd(0x20, 16, 2);
08 
09void setup() {
10  // 3. LCD 깨우기
11  lcd.init();        // LCD야, 일어날 시간이야! (초기화)
12  lcd.backlight();   // 불을 켜줘! (백라이트 켜기)
13}
14 
15void loop() {
16  // 4. 첫 번째 줄에 글자 쓰기
17  lcd.setCursor(0, 0); // 커서를 0번째 칸, 0번째 줄(첫째 줄)로 이동
18  lcd.print("Hello, World!");
19 
20  // 5. 두 번째 줄에 글자 쓰기
21  lcd.setCursor(0, 1); // 커서를 0번째 칸, 1번째 줄(둘째 줄)로 이동
22  lcd.print("Arduino I2C LCD");
23}

✅ 코드 구조 이해하기

코드가 조금 길어 보이지만, 구조는 아주 간단해요. 크게 '라이브러리 및 설정', '초기화', '텍스트 출력' 세 부분으로 나눌 수 있어요.

1. 라이브러리 및 설정 (1~7줄)

  • #include <Wire.h> : I2C 통신을 위한 필수 라이브러리예요.
  • #include <LiquidCrystal_I2C.h> : I2C LCD를 쉽게 제어하게 해주는 라이브러리죠.
  • LiquidCrystal_I2C lcd(0x20, 16, 2); : 우리가 사용할 LCD의 정보를 아두이노에게 알려주는 부분이에요. "주소는 0x20이고, 가로 16칸, 세로 2줄짜리 LCD를 앞으로 lcd라고 부를게!"라고 이름표를 붙여주는 것과 같아요. (만약 여러분의 LCD 주소가 0x27이라면 0x20 대신 0x27을 적어주셔야 해요!)

2. 초기화 (9~13줄, setup() 함수)

  • lcd.init(); : LCD의 기능을 본격적으로 사용하기 위해 깨워주는(초기화하는) 명령어예요.
  • lcd.backlight(); : LCD 화면 뒤쪽의 조명(백라이트)을 켜주는 명령어예요. 이게 없으면 글씨가 표시되어도 너무 어두워서 보이지 않는답니다.

3. 텍스트 출력 (15~23줄, loop() 함수)

  • lcd.setCursor(0, 0); : 글자를 어디에 쓸지 위치(커서)를 정해주는 아주 중요한 명령어예요. (0, 0)은 '0번째 줄(첫째 줄)의 0번째 칸(맨 왼쪽)'을 의미해요.
  • lcd.print("Hello, World!"); : 정해진 위치에 "Hello, World!"라는 글자를 출력해요.
  • lcd.setCursor(0, 1); : 이번엔 커서를 '1번째 줄(둘째 줄)의 0번째 칸(맨 왼쪽)'으로 옮겨요.
  • lcd.print("Arduino I2C LCD"); : 그 위치에 "Arduino I2C LCD"를 출력하죠.

Slide 4: LCD 제어 핵심 함수 4가지

방금 살펴본 코드에 나왔던 핵심 함수들을 다시 한번 정리해 볼게요. 이 4가지만 알면 LCD를 자유자재로 다룰 수 있답니다!

1. lcd.init() : "일어날 시간이야!" (초기화)

LCD를 사용하기 위해 가장 먼저 실행해야 하는 함수예요. 아두이노와 LCD가 서로 통신할 준비를 마치는 과정이라고 생각하면 쉬워요. setup() 함수 안에서 딱 한 번만 실행해주면 됩니다.

2. lcd.backlight() : "조명을 켜줘!"

LCD는 스스로 빛을 내지 못해요. 그래서 뒤에서 조명을 비춰줘야 글씨가 선명하게 보이죠. 이 함수는 그 조명을 켜주는 역할을 해요. lcd.init()과 함께 setup()에서 실행해주는 것이 일반적이에요.

3. lcd.setCursor(가로, 세로) : "여기부터 쓸게요!" (가장 중요!)

LCD 문법 중 가장 헷갈리면서도 가장 중요한 함수예요. 글자를 쓰기 시작할 커서의 위치를 정해줍니다. 마치 극장에서 내 좌석을 찾는 것과 같아요.

  • lcd.setCursor(0, 0); → 첫 번째 줄, 맨 왼쪽 칸
  • lcd.setCursor(5, 1); → 두 번째 줄, 여섯 번째 칸
⚠️ 여기서 잠깐! 아주 중요한 주의사항!
컴퓨터는 숫자를 0부터 세기 시작해요.
  • 첫 번째 줄0번, 두 번째 줄1번이에요.
  • 첫 번째 칸0번, 열여섯 번째 칸15번이랍니다. 꼭 기억해주세요!

4. lcd.print() : "글자를 보여줘!"

setCursor()로 위치를 잡았다면, print() 함수로 원하는 글자나 숫자를 화면에 출력할 수 있어요.

  • 문자 출력: lcd.print("Hello");
    따옴표 안의 내용을 그대로 출력해요. (아쉽게도 한글은 깨져서 나와요 😥)
  • 숫자(변수) 출력: lcd.print(sensorValue);
    센서 값이나 계산 결과가 저장된 변수의 값을 출력해요.
  • 소수점 자리수 제어: lcd.print(3.141592, 2);3.14 출력
    숫자 뒤에 콤마(,)와 함께 원하는 자릿수를 적어주면 소수점을 깔끔하게 잘라서 보여주는 아주 유용한 기능도 있답니다!

어떠셨나요? 생각보다 정말 간단하죠? 이제 여러분은 I2C LCD에 원하는 어떤 메시지든 자유롭게 띄울 수 있게 되었어요! 오늘 배운 내용을 바탕으로 온도 센서의 값을 출력해보거나, 초시계를 만들어보는 등 다양하게 응용해보세요. 상상하는 모든 것을 이 작은 화면에 표현할 수 있답니다.

앞으로 진행될 프로젝트에서도 LCD는 계속해서 사용될 예정이니, 오늘 배운 핵심 함수 4가지는 꼭 기억해주세요! 궁금한 점이 있다면 언제든지 댓글로 질문 남겨주시고요.

그럼 다음 시간에 더 재미있는 주제로 다시 만나요! 👋

이 포스팅의 내용은 교재 [주니어 공학교실 아두이노의 기초]에 수록된 내용입니다.