페이지

2026년 1월 12일 월요일

4.2.1. I2C LCD 알아보기

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

지난 시간까지 우리는 LED를 깜빡이며 아두이노와 간단한 신호를 주고받았죠. 하지만 반짝이는 불빛만으로는 아두이노가 하고 싶은 말을 모두 표현하기엔 조금 답답했을 거예요. 오늘은 아두이노에게 '입'을 달아주는 아주 특별한 부품, I2C LCD에 대해 완벽하게 알아보는 시간을 갖겠습니다. 이제 아두이노가 우리에게 글자와 숫자로 말을 거는 놀라운 경험을 하게 될 거예요!


Slide 1: 4장 2절. I2C LCD 알아보기

이번 시간에는 '화면과 움직임으로 표현하기'라는 큰 주제 아래, 두 번째 파트인 'I2C LCD'에 대해 집중적으로 배워볼 거예요. 아두이노 프로젝트의 결과물을 훨씬 더 다채롭고 직관적으로 만들어 줄 핵심 부품이니, 눈을 크게 뜨고 따라와 주세요!

Slide 2: I2C LCD의 개념

지금까지 우리는 아두이노와 대화할 때 주로 LED를 사용했어요.
하지만 LED는 "깜빡!" 하고 켜지는 것밖에 못 해서, 구체적인 말을 전달하기가 어려웠죠.

슬라이드 2번은 바로 이 답답함에서 시작해요. LED는 켜고 끄는 것만 가능해서 '작동 중'이라는 신호는 줄 수 있지만, "온도가 25.5도 입니다"나 "Hello World!" 같은 구체적인 정보를 보여줄 순 없었어요.

이럴 때 필요한 것이 바로 LCD(Liquid Crystal Display)입니다!

  • LCD의 필요성: 단순히 깜빡이는 것을 넘어, 문장과 숫자로 구체적인 정보를 표시하고 싶을 때 사용해요.
  • 실생활 사례: 사실 LCD는 우리 주변에 늘 함께하고 있답니다. 전자계산기의 숫자판, 전자시계의 시간 표시, 전자레인지의 남은 시간 창 등이 모두 LCD예요.
  • 아두이노의 게시판: 이처럼 LCD는 아두이노가 하고 싶은 말을 글과 숫자로 시원하게 보여주는 '게시판' 또는 '스케치북' 같은 역할을 해준답니다.

이제 우리도 아두이노로 "GOOD!", "MY LOVE" 같은 멋진 메시지를 띄워볼 수 있겠죠?

Slide 3: I2C의 장점

"와! 저도 글씨 쓸래요!" 하고 신나게 LCD를 샀는데, 포장을 뜯자마자 당황하는 분들이 많아요. 왜일까요?

  • 기본 LCD의 문제점: 원래 기본형 LCD(1602 Standard)는 아두이노와 연결해야 할 핀이 무려 16개나 돼요. 슬라이드 속 사진처럼 16가닥의 선을 브레드보드에 꽂다 보면 선들이 라면 면발처럼 엉켜서 다른 부품을 연결할 공간조차 남지 않게 되죠. 초보자에게는 그야말로 '16가닥의 악몽'이랍니다.

하지만 걱정 마세요! 똑똑한 공학자들이 우리를 위해 구세주를 만들어냈어요.

  • I2C 변환 모듈의 등장: 바로 'I2C 변환 모듈'이라는 친구입니다. 슬라이드 아래쪽 사진처럼 LCD 뒷면에 책가방처럼 딱 붙어있는 검은색 기판이 보이시나요? 이 기특한 친구가 16개의 복잡한 선을 단 4개로 획기적으로 줄여준답니다.
  • 4개 핀 구성: 우리는 이제 딱 4개의 핀만 연결하면 LCD를 사용할 수 있어요.
    • GND (Ground)
    • VCC (Power)
    • SDA (Data)
    • SCL (Clock)

16가닥의 악몽이 4가닥의 기적으로 바뀌는 순간이죠!

Slide 4: I2C의 회로 구성 핀

자, 그럼 이 기적의 4개 핀을 아두이노 어디에 연결해야 할까요? 슬라이드 그림이 아주 친절하게 알려주고 있네요. I2C LCD 핀에는 이름이 다 적혀 있어서 짝을 찾아주기만 하면 돼요.

  • 전원 연결 (밥 주기)
    • GND 핀은 아두이노의 GND (바닥) 핀에 연결해요.
    • VCC 핀은 아두이노의 5V (에너지) 핀에 연결해요.
  • 통신 연결 (대화하기)
    • SDA (Data) 핀은 데이터가 다니는 길이에요. 아두이노 A4 핀에 꽂아주세요.
    • SCL (Clock) 핀은 통신 박자를 맞추는 길이에요. 아두이노 A5 핀에 꽂아주세요.
⚠️ 아주 중요해요!
아두이노 우노(UNO) 보드의 A4, A5 핀은 I2C 통신을 위해 특별히 지정된 자리랍니다. 다른 곳에 꽂으면 LCD가 작동하지 않으니 꼭! A4는 SDA, A5는 SCL에 연결하는 걸 잊지 마세요!

Slide 5: 1602 LCD 규격

우리가 사용하는 LCD는 보통 '1602 LCD' 라고 불러요. 이 숫자 안에 화면 크기에 대한 비밀이 숨어있답니다.

  • 화면 크기
    • 16: 가로(한 줄)에 글자를 16개까지 쓸 수 있다는 뜻이에요.
    • 02: 세로로 총 2줄을 표시할 수 있다는 뜻이에요.
    • 즉, 16칸씩 2줄이니까 화면을 꽉 채우면 총 32개의 글자를 보여줄 수 있는 셈이죠.
  • 표시 원리
    • 그럼 글자는 어떻게 나타나는 걸까요? 슬라이드 그림처럼 글자가 들어가는 네모난 칸 하나를 아주 자세히 들여다보면, 작은 점(픽셀)들이 가로 5개, 세로 8개, 즉 5x8 배열로 모여 있어요.
    • 아두이노는 이 작은 점들을 껐다 켰다 조합해서 'A', 'B', '3' 같은 글자 모양을 그려내는 것이랍니다. 정말 신기하죠?

Slide 6: 라이브러리 설치

하드웨어 연결을 마쳤다면, 이제 아두이노가 LCD와 대화할 수 있도록 소프트웨어적인 준비를 해야 해요. 바로 '마법의 통역사'를 모셔오는 일이죠.

"선생님, 라이브러리(Library)가 도서관인가요?"

아니에요! 아두이노 세상에서 라이브러리는 '고수들이 미리 만들어 놓은 코드 종합 선물 세트'를 뜻해요. 요리에 비유하면 '밀키트(Meal Kit)'와 같답니다. 우리가 떡볶이를 먹기 위해 쌀농사부터 짓지 않아도 되는 것처럼, 라이브러리가 있으면 복잡한 원리를 몰라도 코드 한 줄로 쉽게 LCD를 제어할 수 있어요.
  • 필요한 라이브러리 (밀키트)
    • Wire.h: I2C 통신 규칙을 관리하는 매니저예요. (아두이노에 기본 내장)
    • LiquidCrystal_I2C.h: 실질적으로 LCD 화면을 제어하는 화가 역할이에요. (설치가 필요해요!)
  • 설치 방법
    1. 아두이노 IDE 왼쪽 메뉴에서 책 아이콘(라이브러리 매니저)을 클릭하세요.
    2. 검색창에 LiquidCrystal I2C 라고 정확히 입력해서 검색해요.
    3. 수많은 결과 중 'Frank de Brabander' 라는 아저씨가 만든 버전을 찾아 [설치] 버튼을 누르면 끝!

이제 우리는 코드 한 줄로 "글자 써!", "화면 지워!" 같은 명령을 내릴 수 있게 됐어요.

Slide 7: I2C 주소 확인

친구에게 편지를 보내려면 집 주소를 알아야 하듯, 아두이노가 LCD와 통신하려면 LCD의 고유한 '주소'를 알아야 해요. 공장에서 나올 때부터 저마다 주소를 가지고 나오는데, 보통 0x27 아니면 0x20 이지만 겉으로 봐서는 알 수가 없죠. 탐정처럼 주소를 찾아내 봅시다!

  • 찾는 방법: 'I2C Scanner'라는 프로그램을 이용할 거예요.
    1. 인터넷에서 'I2C Scanner Arduino' 코드를 검색해서 복사해요.
    2. 아두이노에 코드를 업로드합니다.
    3. 오른쪽 위 돋보기 아이콘(시리얼 모니터)을 켜면, 아두이노가 연결된 장치를 스캔하고 주소를 알려줘요.
    4. Found address: 0x27 이라고 나오면, 우리 LCD의 주소는 0x27 이랍니다!
  • 코드 적용: 나중에 코드를 짤 때, 이렇게 찾은 주소를 넣어줘야 해요.
    • LiquidCrystal_I2C lcd(0x27, 16, 2);
    • 괄호 안에는 (주소, 가로 칸수, 세로 줄수)를 순서대로 적어주는 거예요.

Slide 8: 작동 문제 해결

분명히 시키는 대로 다 했는데 LCD가 먹통일 때가 있죠? 당황하지 마세요! 실물 LCD를 쓸 때와 가상 시뮬레이터인 틴커캐드를 쓸 때 확인해야 할 포인트가 조금 달라요. 내 상황에 맞는 처방전을 확인해 보세요.

📌 실물 LCD 사용 시

  • 명암 조절: LCD 뒷면의 파란색 네모(가변 저항)를 십자드라이버로 살살 돌려보세요. 글씨가 너무 흐리거나 진해서 안 보이는 경우가 많아요.
  • 배선 확인: SDA는 A4, SCL은 A5에 잘 꽂혀 있는지 다시 한번 확인!
  • 초기화 코드: void setup() 안에 lcd.init();lcd.backlight(); 명령어가 꼭 들어있는지 확인하세요. 이 두 줄이 없으면 LCD가 잠에서 깨어나질 않아요.

📌 틴커캐드 사용 시

  • 유형 변경: 틴커캐드에서 LCD 부품을 클릭하면 설정창이 떠요. '유형'을 기본값(MCP23008)이 아닌 'PCF8574 기반'으로 바꿔주세요.
  • 주소 변환: 틴커캐드는 주소를 10진수(예: 32)로 보여줘요. 이걸 코드에 쓸 때는 16진수로 바꿔줘야 합니다.
    • 주소가 32로 표시되면 → 코드에는 0x20 이라고 입력
    • 주소가 39로 표시되면 → 코드에는 0x27 이라고 입력

오늘은 아두이노의 표현력을 한 단계 업그레이드해 줄 I2C LCD에 대해 A부터 Z까지 알아봤어요. 16개의 복잡한 선을 4개로 줄여주는 I2C의 편리함부터, 화면의 규격, 라이브러리 설치, 그리고 가장 중요한 주소 찾기까지! 이제 여러분은 아두이노 프로젝트에 멋진 '게시판'을 달아줄 모든 준비를 마쳤습니다.

다음 시간에는 오늘 배운 내용을 바탕으로 직접 코드를 작성해서 LCD에 원하는 글씨를 띄워보는 실습을 진행할 거예요. 기대 많이 해주세요! 수고하셨습니다. 👍

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

2.2.5. C언어 문법 : 조건문

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

지난 시간에는 코드의 흐름을 한눈에 볼 수 있게 도와주는 순서도에 대해 알아봤었죠. 지금까지 우리가 작성한 코드는 마치 외길을 걷는 것처럼, 위에서 아래로 정해진 순서대로만 실행되었어요. 하지만 오늘은 아두이노에게 '생각하는 힘', 즉 '판단력'을 선물해 주는 아주 중요한 문법을 배울 거예요. 바로 C언어의 '조건문'입니다!

Slide 1: 05. C언어 문법: 조건문

오늘의 주제는 바로 '조건문'입니다. 2장 '기본 부품과 C언어 체험하기'의 두 번째 부품인 '버튼'을 활용해서 조건문을 쉽고 재미있게 배워볼게요. 조건문을 배우고 나면, 여러분의 아두이노는 더 이상 시키는 일만 순서대로 하는 로봇이 아니라, 특정 상황에 맞춰 스스로 다른 행동을 하는 스마트한 친구가 될 거예요!

Slide 2: C언어 조건문 소개

"비가 오면 우산을 쓰고", "신호등이 빨간불이면 멈춘다"

사실 우리는 매 순간 선택과 판단을 하며 살아가요. 컴퓨터나 로봇이 똑똑해 보이는 이유도 바로 이런 상황 판단을 엄청나게 빠른 속도로 처리하기 때문이죠.

지금까지 우리가 짠 코드는 무조건 위에서 아래로 순서대로만 실행되는 '바보' 같은 코드였어요. 하지만 이제 if(만약에) 라는 마법의 단어를 배우면, 아두이노도 상황에 따라 다르게 행동하는 '판단력'을 갖게 된답니다. 이제 아두이노에게 진짜 지능을 불어넣어 줄 시간이에요!

Slide 3: C언어 조건문 실습 - 회로 구성

백문이 불여일견! 직접 만들어보면서 배우는 게 가장 빠르겠죠? '버튼을 누르면 LED가 켜지는' 간단한 회로부터 함께 만들어 봐요.

✅ 준비물

  • 아두이노, LED, 저항, 푸시 버튼, 브레드보드

✅ 회로 연결 방법

  1. LED: 긴 다리(+)는 아두이노 13번 핀에, 짧은 다리(-)는 저항을 거쳐 GND에 연결해주세요.
  2. 푸시 버튼: 한쪽 다리는 아두이노 2번 핀에, 반대쪽 다리는 GND에 바로 연결해주세요.

"어? 버튼에 저항을 연결 안 해도 되나요?" 라고 생각하셨다면, 훌륭해요! 맞아요. 이번 실습에서는 외부 저항 대신 아두이노 보드에 내장된 '내부 풀업(Pull-up) 저항'을 사용할 거예요. 이렇게 하면 회로가 훨씬 더 깔끔하고 간단해진답니다!

Slide 4: 조건문 소스 코드

회로가 완성되었다면, 이제 아두이노에게 '판단'을 내리게 할 코드를 작성해 봅시다.

CODE 2.6 | 버튼을 누르면 LED가 켜지는 코드
01// 1. 변수 선언
02int buttonPin = 2;  // 버튼 핀
03int ledPin = 13;    // LED 핀
04
05// 2. 초기 설정 함수 setup()
06void setup() {
07  pinMode(buttonPin, INPUT_PULLUP); // 버튼 핀을 내부 풀업 입력 모드로 설정!
08  pinMode(ledPin, OUTPUT);          // LED 핀을 출력 모드로 설정
09}
10
11// 3. 무한 반복 함수 loop()
12void loop() {
13  // 버튼 상태를 읽어서 buttonState 변수에 저장
14  int buttonState = digitalRead(buttonPin);
15
16  // 만약(if) 버튼이 눌렸다면(LOW 신호), LED를 켠다
17  if (buttonState == LOW) {
18    digitalWrite(ledPin, HIGH); // LED 켜기
19  }
20  // 그렇지 않다면(else), LED를 끈다
21  else {
22    digitalWrite(ledPin, LOW);  // LED 끄기
23  }
24}

🔍 코드 핵심 요약

  • setup() 함수에서 pinMode(buttonPin, INPUT_PULLUP); 이 부분이 핵심이에요. 이렇게 설정하면 버튼을 누르지 않았을 때 HIGH(1) 신호가, 눌렀을 때 LOW(0) 신호가 들어오게 됩니다.
  • loop() 함수에서는 digitalRead()로 버튼의 상태를 계속 확인해요.
  • 그리고 if-else 조건문을 사용해서, "만약 버튼이 눌렸다면(신호가 LOW라면) LED를 켜고, 그렇지 않으면 LED를 꺼라"는 논리를 구현한 것이죠.

이 코드를 업로드하고 버튼을 눌러보세요. 우리가 흔히 쓰는 초인종이나 키보드처럼, 버튼을 누르고 있는 동안에만 LED가 환하게 켜지는 것을 볼 수 있을 거예요!

Slide 5: if 문 - 가장 기본적인 조건문

자, 이제 코드에 사용된 조건문을 하나씩 자세히 살펴볼까요? 가장 기본이 되는 if 문입니다.

  • 의미: "만약에 (조건)이 사실이라면, { } 안의 명령을 실행해라"
  • 형식: if (조건) { 실행할 명령; }
  • 동작 원리: 괄호 ( ) 안의 조건이 참(True)일 때만 중괄호 { } 안의 코드를 실행해요. 만약 조건이 거짓(False)이라면, { } 안의 코드는 그냥 무시하고 다음으로 넘어가죠.

사용 예시

CODE 2.6.1 | if문 예시
01if (temp > 30) {
02  digitalWrite(ledPin, HIGH);
03}

"만약 온도 센서 값이 30을 초과하면, 경고등(LED)을 켜라!" 라는 의미가 되겠죠?

Slide 6: if-else 문 - 이거 아니면 저거!

다음은 if-else 문입니다. "이거 아니면 저거!"처럼 두 가지 선택지 중 하나를 반드시 골라야 할 때 사용해요. 마치 동전 던지기에서 앞면이 아니면 무조건 뒷면인 것과 같죠.

  • 의미: "만약 (조건)이 사실이라면 명령 A를 실행하고, 그렇지 않다면 명령 B를 실행해라"
  • 형식: if (조건) { 명령 A; } else { 명령 B; }
  • 동작 원리: if의 조건이 참이면 명령 A를 실행하고, 거짓이면 else의 명령 B를 실행해요. 둘 중 하나는 반드시 실행된다는 점이 중요해요!

우리가 만든 버튼 예제가 바로 이 if-else 구조를 사용한 거예요.
"버튼이 눌렸으면(참) LED를 켜고, 그렇지 않으면(거짓) LED를 꺼라."

Slide 7: if-else if-else 문 - 여러 갈래의 선택지

세상에는 '예/아니오'로만 결정할 수 없는 복잡한 상황도 많죠? 이럴 때 사용하는 것이 바로 if - else if - else 문입니다. 여러 개의 조건을 순서대로 체크할 수 있게 해줘요.

  • 의미: "만약 (조건 A)가 맞으면 명령 A 실행, 그게 아니고 만약 (조건 B)가 맞으면 명령 B 실행, ... 그것도 아니면 명령 C 실행"
  • 형식:
    CODE 2.6.2 | if-else if-else문 형식
    01if (조건 A) {
    02  // 명령 A
    03} else if (조건 B) {
    04  // 명령 B
    05} else {
    06  // 명령 C
    07}
  • 동작 원리: 위에서부터 순서대로 조건을 검사하다가, 가장 먼저 참이 되는 조건{ } 블록을 실행하고 전체 조건문을 빠져나와요. 만약 모든 조건이 거짓이라면 마지막 else 블록이 실행됩니다.

사용 예시

"점수가 90점 이상이면 A등급, 80점 이상이면 B등급, 그 외에는 모두 C등급을 부여해라." 와 같이 여러 경우의 수를 따져야 할 때 아주 유용하답니다.

Slide 8: [잠깐!] 꼭 알아야 할 비교 연산자

조건문에서 '조건'을 만들어주는 아주 중요한 친구들이 바로 비교 연산자예요. 수학 기호와 비슷하지만, 프로그래밍에서는 약간 다른 부분도 있으니 꼭 눈여겨보세요!

  • A == B : A와 B가 같다.
  • A != B : A와 B가 다르다. (!는 부정을 의미해요)
  • A > B : A가 B보다 크다. (초과)
  • A < B : A가 B보다 작다. (미만)
  • A >= B : A가 B보다 크거나 같다. (이상)
  • A <= B : A가 B보다 작거나 같다. (이하)

⚠️ 정말 중요해요!
프로그래밍에서 = 하나는 '오른쪽 값을 왼쪽에 넣어라(대입)'라는 뜻이에요. 두 값이 같은지 '비교'할 때는 반드시 == 이렇게 두 개를 써야 합니다! 초보자들이 가장 많이 하는 실수 중 하나이니 꼭 기억해주세요!

오늘은 아두이노에게 '판단력'을 부여하는 C언어 조건문에 대해 배워봤어요. if, if-else, if-else if-else 이 세 가지 구조만 잘 이해하고 있어도 훨씬 더 똑똑하고 유용한 프로그램을 만들 수 있답니다.

오늘 배운 내용을 응용해서 '버튼을 한 번 누르면 LED가 켜지고, 다시 누르면 꺼지는' 토글 스위치 기능을 한번 만들어보는 건 어떨까요? 처음에는 조금 헷갈릴 수 있지만, 직접 고민하고 코드를 짜보는 과정에서 실력이 쑥쑥 늘 거예요!

궁금한 점이 있다면 언제든지 댓글로 질문해주세요. 그럼 다음 포스팅에서 더 유익한 내용으로 다시 만나요! 👋

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

2026년 1월 11일 일요일

4.1.3. 자동 숫자 카운터 만들기

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

지난 시간에는 7-세그먼트에 숫자 '0'을 띄워보는 실습을 했었죠? digitalWrite() 함수를 여러 번 써서 겨우 숫자 하나를 만들었는데요. 만약 0부터 9까지 모든 숫자를, 그것도 1초마다 자동으로 바뀌게 만들려면 어떻게 해야 할까요? 설마 코드를 100줄 넘게 복사-붙여넣기 해야 할까요? 생각만 해도 머리가 아프죠.

오늘은 바로 이 문제를 해결해 줄 아주 똑똑하고 효율적인 프로그래밍 기법을 배워볼 거예요. '2차원 배열'과 '중첩 반복문'이라는 강력한 도구를 사용해서, 복잡한 작업을 단 몇 줄의 코드로 깔끔하게 처리하는 방법을 알려드릴게요. 그럼, 아두이노로 '자동 숫자 카운터'를 만들러 함께 떠나볼까요?

Slide 1: 03. 자동 숫자 카운터 만들기

이번 시간에 우리가 만들 프로젝트는 바로 '자동 숫자 카운터'입니다. 7-세그먼트 디스플레이에 0부터 9까지 숫자가 1초 간격으로 착착 바뀌는 멋진 작품이죠.

이 프로젝트를 통해 우리는 단순히 결과를 만들어내는 것을 넘어, 복잡하고 반복적인 데이터를 어떻게 체계적으로 정리하고, 또 어떻게 효율적으로 처리할 수 있는지에 대한 중요한 프로그래밍 원리를 배우게 될 거예요.

Slide 2: 자동 카운터 회로

본격적으로 코드를 작성하기 전에, 먼저 회로부터 살펴볼게요.

📌 준비물

  • 아두이노 우노
  • 7-세그먼트
  • 저항 (220옴 권장)
  • 브레드보드 및 점퍼선

📌 회로 구성

슬라이드에 보이는 회로도는 낯이 익죠? 맞아요! 지난번 숫자 '0'을 표시했던 실습과 완전히 똑같습니다. 이미 회로를 잘 연결해 두었다면, 아무것도 바꿀 필요 없이 그대로 사용하면 된답니다. 혹시 처음이거나 해체했다면, 위 그림을 보고 차근차근 연결해주세요.

Slide 3: 자동 카운터 코드 (1) - 데이터 준비하기

자, 이제 마법 같은 코드의 비밀을 파헤쳐 볼 시간이에요. 코드가 겉보기엔 조금 복잡해 보이지만, 원리를 알면 정말 편리하답니다. 핵심은 "정답표를 미리 만들어두고, 아두이노가 그 표를 보고 따라 그리게 하는 것" 이에요.

❶ 핀 배열 선언

CODE 3.1 | 핀 배열 선언
01int pin[7] = {2, 3, 4, 5, 6, 7, 8};

먼저, 7-세그먼트의 각 LED 조각(a, b, c, d, e, f, g)에 연결된 아두이노 핀 2번부터 8번까지를 pin이라는 이름의 배열(서랍장)에 순서대로 담아둬요. 이렇게 하면 나중에 핀 번호를 일일이 기억할 필요 없이 pin[0], pin[1]처럼 순서만으로 쉽게 꺼내 쓸 수 있어 편리해요.

❷ 모양 지도 (2차원 배열)

CODE 3.2 | 모양 지도 (2차원 배열)
01int segmentArray[10][7] = {
02 {1, 1, 1, 1, 1, 1, 0}, // 0
03 {0, 1, 1, 0, 0, 0, 0}, // 1
04 {1, 1, 0, 1, 1, 0, 1}, // 2
05 // ... (이하 생략)
06};

이 코드의 심장, 바로 '모양 지도'라고 불리는 segmentArray입니다. 이것이 바로 2차원 배열이에요. 데이터를 마치 아파트처럼 '층(행)'과 '호수(열)'로 정리하는 방법이죠.

  • segmentArray[10][7]의 의미는 "10층짜리 아파트를 짓고, 각 층마다 7개의 방을 만들어줘!" 라는 뜻이에요.
  • 층(행): 0층부터 9층까지는 우리가 표시할 숫자 0부터 9를 의미해요.
  • 방(열): 각 층의 7개 방에는 해당 숫자를 만들기 위해 7개 LED 조각(a~g)을 켤지(1) 끌지(0)에 대한 정보가 들어있어요.

예를 들어, 0층의 {1, 1, 1, 1, 1, 1, 0}은 숫자 '0'을 만들기 위해 g 조각만 끄고(0) 나머지는 모두 켠다(1)는 약속인 셈이죠. 이렇게 0부터 9까지 모든 숫자 모양을 미리 표로 만들어 두는 거예요.

Slide 4: 자동 카운터 코드 (2) - 똑똑하게 실행하기

'모양 지도'라는 멋진 설계도를 만들었으니, 이제 아두이노가 이 지도를 보고 실제로 그림을 그리도록 만들어야겠죠?

❶ 핀 모드 설정 (setup)

CODE 4.1 | 핀 모드 설정 (setup)
01void setup() {
02 // for문을 이용해 핀 7개를 한 번에 설정하기
03 for (int n = 0; n < 7; n++) {
04 pinMode(pin[n], OUTPUT);
05 }
06}

이전에는 pinMode() 함수를 7번이나 썼지만, 이번엔 for 반복문을 사용해서 단 3줄로 끝냈어요. pin 배열에 저장된 핀 번호(2~8번)를 n이 0부터 6까지 변하는 동안 하나씩 꺼내서 모두 출력(OUTPUT) 모드로 설정하는 거죠. 정말 깔끔하고 효율적이지 않나요?

❷ 중첩 반복문 (loop)

CODE 4.2 | 중첩 반복문 (loop)
01void loop() {
02 // 바깥쪽 for문: 0부터 9까지 숫자를 하나씩 바꿉니다.
03 for (int i = 0; i < 10; i++) {
04 // 안쪽 for문: 각 숫자에 맞는 7개의 조각(a~g)을 켜거나 끕니다.
05 for (int j = 0; j < 7; j++) {
06 digitalWrite(pin[j], segmentArray[i][j]);
07 }
08 delay(1000); // 1초 동안 보여주기
09 }
10}

loop() 함수 안에는 반복문이 2개 겹쳐있는 중첩 반복문이 사용되었어요.

  • 바깥쪽 for문 (변수 i): 0부터 9까지, 즉 어떤 숫자를 표시할지 결정하는 역할을 해요.
  • 안쪽 for문 (변수 j): i가 정해진 숫자일 때, 그 숫자를 만들기 위한 7개의 LED 조각을 하나씩 제어하는 역할을 하죠.

digitalWrite(pin[j], segmentArray[i][j]); 이 한 줄이 바로 마법의 핵심이에요!
"i번째 숫자를 만들기 위해, j번째 LED 조각을 켤지 끌지는 모양 지도 segmentArray의 i층 j호실에 적힌 값을 보고 결정해!" 라는 뜻이랍니다.

Slide 5: 2차원 배열의 개념

이번 실습의 핵심 개념인 2차원 배열에 대해 조금 더 자세히 알아볼게요.

  • 형식: 자료형 배열이름[행개수][열개수];
    • 우리가 사용한 int segmentArray[10][7];는 정수(int) 데이터를 담는, 10행 7열짜리 segmentArray라는 이름의 2차원 배열을 만들겠다는 의미예요.
  • 구조:
    • 행 (Row): 가로줄, 아파트의 층수에 해당해요. 우리 코드에서는 표시할 숫자의 종류(0~9, 총 10개)를 의미했죠.
    • 열 (Column): 세로줄, 각 층마다 있는 방의 개수예요. 우리 코드에서는 각 숫자를 이루는 LED 조각의 개수(a~g, 총 7개)를 의미했고요.
  • 사용 예시: segmentArray[1][2]
    • 이건 '아파트 1층(숫자 1)의 2호실(c 조각)에 있는 값을 알려줘!' 라는 뜻이에요. 우리가 만든 모양 지도를 보면, 숫자 1을 나타내는 {0, 1, 1, 0, 0, 0, 0}에서 세 번째 값(인덱스는 0부터 시작하므로 2)은 1이죠. 즉, 숫자 1을 표시할 때 c 조각은 켜야 한다는 걸 알 수 있어요.
  • ⚠️ 주의사항:
    • 컴퓨터의 세계에서는 모든 순서가 0부터 시작한다는 점, 정말 중요해요! 첫 번째 데이터의 주소는 [1][1]이 아니라 [0][0] 이라는 사실, 꼭 기억해주세요!

Slide 6: 중괄호 초기화의 의미

"선생님, 코드가 너무 복잡해 보여요!" 라고 생각할 수도 있어요. 하지만 우리가 중괄호 {...}를 사용한 덕분에 코드가 놀랍도록 짧아진 거랍니다.

  • 간편한 방법 (중괄호 사용): int arr[2][2] = {{1,2}, {3,4}};
    • 배열을 선언하는 동시에 중괄호를 이용해 초기값을 한 번에 싹 채워 넣는 방식이에요. 우리가 쓴 segmentArray 코드가 바로 이 방법을 사용한 거죠.
  • 원래 방법 (하나씩 대입):
    CODE 6.1 | 원래 방법 (하나씩 대입)
    01int segmentArray[10][7]; // 1. 빈 아파트를 짓고,
    02
    03// 2. 70개의 방에 하나하나 값을 넣어줌
    04segmentArray[0][0] = 1;
    05segmentArray[0][1] = 1;
    06...
    07segmentArray[9][6] = 1; // 총 70줄 필요!
    • 만약 중괄호 초기화 기능을 쓰지 않는다면, 먼저 빈 배열(아파트)을 만들고, 70개의 모든 칸(방)에 값을 하나씩 일일이 넣어주는 코드를 작성해야 해요. 무려 70줄이 넘게 필요하죠!
  • 장점:
    • 결국 중괄호 초기화는 이 70줄이 넘는 지루한 과정을 단 몇 줄로 깔끔하게 정리해주는 아주 고마운 기능이랍니다.

Slide 7: 중첩 반복문의 원리

마지막으로, 중첩 반복문이 어떻게 그렇게 효율적으로 동작하는지 시계바늘에 비유해서 알아볼게요.

  • 시계바늘 비유:
    • 안쪽 반복문 (분침): 빠르게 회전해요. 한 바퀴(0~6까지 7번)를 싹 돌아야 자기 임무가 끝나요.
    • 바깥쪽 반복문 (시침): 천천히 움직여요. 안쪽 반복문(분침)이 한 바퀴를 다 돌아야만, 겨우 한 칸(예: i가 0에서 1로) 움직이죠.
  • 실행 순서:
    1. 바깥쪽 루프 시작 (i = 0): "자, 숫자 '0'을 만들 차례야!"
    2. 안쪽 루프 실행 (j = 0~6): '0'을 만들기 위해 a~g 조각 7개를 segmentArray[0] 줄을 보며 7번 제어해요. → 숫자 '0' 모양 완성!
    3. 안쪽 루프 종료, 바깥쪽 루프 진행 (i = 1): "이제 숫자 '1'을 만들 차례야!"
    4. 안쪽 루프 다시 실행 (j = 0~6): '1'을 만들기 위해 a~g 조각 7개를 segmentArray[1] 줄을 보며 7번 제어해요. → 숫자 '1' 모양 완성!
    5. ... 이 과정을 i가 9가 될 때까지 반복해요.
  • 효율성:
    • 결과적으로 (숫자 10개) × (LED 조각 7개) = 총 70번의 동작을 단 몇 줄의 코드로 완벽하게 처리하는 놀라운 효율을 보여주는 거죠!

어떤가요? 오늘 우리는 2차원 배열로 복잡한 데이터를 '모양 지도'처럼 깔끔하게 정리하고, 중첩 반복문으로 이 지도를 읽어 70번의 반복 작업을 자동화하는 방법을 배웠어요. 처음에는 조금 낯설 수 있지만, 이 두 가지 개념은 앞으로 여러분이 더 복잡하고 멋진 프로젝트를 만드는 데 아주 중요한 무기가 될 거예요.

오늘 배운 내용을 응용해서 카운터가 9부터 0까지 거꾸로 세게 하거나, 홀수나 짝수만 표시하도록 코드를 직접 수정해보는 건 어떨까요? 직접 코드를 만져보면서 오늘 배운 내용을 완벽히 여러분의 것으로 만들어보세요!

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

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

2026년 1월 10일 토요일

4.1.2. 7-세그먼트 회로 구성하기

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

지난 시간에는 7-세그먼트의 원리에 대해 알아보았죠? 오늘은 이론을 넘어 직접 회로를 만들고 코드를 작성해서 숫자 '0'을 선명하게 화면에 띄워보는 실습을 진행할 거예요. "다리가 10개나 되고 순서도 뒤죽박죽이라 복잡해 보여요!"라고 생각하셨을 수도 있지만, 저와 함께 차근차근 따라 하면 누구나 성공할 수 있답니다. 자, 그럼 시작해 볼까요?

Slide 1: 7-세그먼트 회로 구성하기

이번 시간의 목표는 명확해요. 바로 7-세그먼트 회로를 구성하는 것이죠. 4장 '화면과 움직임으로 표현하기'의 첫 번째 실습인 만큼, 기본기를 탄탄히 다지는 시간이 될 거예요. 우리는 가장 이해하기 쉬운 공통 음극(Common Cathode) 방식을 사용해서 숫자 '0'을 만들어 보겠습니다.

Slide 2: 숫자 '0' 표시 회로 (1) - 준비와 연결 규칙

본격적으로 회로를 꾸미기 전에, 먼저 준비물과 연결 규칙부터 꼼꼼히 살펴볼게요. 계획을 잘 세우면 실제 연결은 훨씬 수월해지거든요.

준비물

먼저 아래 준비물을 챙겨주세요.

  • 아두이노 우노
  • 7-세그먼트 디스플레이 (공통 음극 타입)
  • 저항 (각 LED 조각을 보호할 220Ω ~ 1kΩ 저항 7개)
  • 브레드보드와 점퍼선

회로 구성 규칙

7-세그먼트는 결국 7개의 LED 묶음이라서 연결할 선이 꽤 많아요. 하지만 규칙만 알면 간단합니다!

  1. 공통 다리 연결: 우리가 사용할 부품은 '공통 음극(Common Cathode, CC)' 타입이에요. 이름처럼 모든 LED의 음극(-)이 하나로 묶여 있다는 뜻이죠. 이 공통 핀은 아두이노의 GND(Ground) 핀에 연결해주면 됩니다. 7-세그먼트 부품의 위아래 가운데에 있는 공통 핀(GND) 중 하나를 골라 연결해주세요.
  2. 신호 다리 연결: 이제 각 LED 조각(a~g)을 제어할 차례예요. 아래 핀 지도(Pin map)를 보고 순서대로 연결해 봅시다.
    • 핵심 원칙: LED를 연결할 땐 항상 저항을 함께 연결하는 것, 기억나시죠? '1인 1보디가드' 원칙! 각 신호선 중간에 저항을 하나씩 꼭 끼워주세요.
7-세그먼트 핀 아두이노 핀
a2
b3
c4
d5
e6
f7
g8
GNDGND

이 표만 있으면 길을 잃을 걱정은 없겠죠? a부터 g까지 차례대로 아두이노 2번부터 8번 핀에 연결하면 됩니다.

Slide 3: 숫자 '0' 표시 회로 (2) - 실제 회로도

자, 이제 앞서 배운 규칙대로 실제 브레드보드에 회로를 구성한 모습이에요. 그림을 보면서 천천히 따라 해보세요.

  • 7-세그먼트를 브레드보드 중앙에 꽂아주세요.
  • 핀 지도에 맞춰 각 핀(a~g)과 아두이노 핀(2~8)을 저항을 거쳐 점퍼선으로 연결합니다.
  • 7-세그먼트의 공통 GND 핀을 아두이노의 GND 핀에 연결합니다.

💡 멘토의 팁!
점퍼선 색깔을 핀마다 다르게 사용하면 나중에 연결이 맞는지 확인할 때 훨씬 편하답니다!

Slide 4: 숫자 '0' 표시 코드 (1) - 핀 모드 설정

하드웨어 연결이 끝났으니 이제 소프트웨어, 즉 코드를 작성할 차례예요. 아두이노에게 "어떤 핀을 어떻게 사용할지" 알려주는 단계부터 시작해 볼게요.

아두이노 스케치를 열고 setup() 함수 안에 아래 코드를 작성해 주세요. setup() 함수는 코드가 시작될 때 딱 한 번만 실행되는 초기 설정 공간이에요.

CODE 4.1 | 핀 모드 설정
01void setup() {
02 // 2번부터 8번까지 모든 핀을 '출력'으로 설정해요.
03 pinMode(2, OUTPUT);
04 pinMode(3, OUTPUT);
05 pinMode(4, OUTPUT);
06 pinMode(5, OUTPUT);
07 pinMode(6, OUTPUT);
08 pinMode(7, OUTPUT);
09 pinMode(8, OUTPUT);
10}

pinMode(핀번호, 모드) 함수는 특정 핀의 역할을 정해주는 역할을 해요. 우리는 7-세그먼트의 LED를 켜고 끄는 신호를 보내야 하니까, 2번부터 8번까지 총 7개의 핀을 모두 OUTPUT(출력) 모드로 설정했습니다.

Slide 5: 숫자 '0' 표시 코드 (2) - 숫자 '0' 만들기

이제 대망의 마지막 단계! loop() 함수 안에 실제로 숫자 '0' 모양을 만드는 코드를 작성해 보겠습니다. loop() 함수는 setup()이 끝난 후 계속해서 반복 실행되는 메인 공간이에요.

숫자 '0'을 만들려면 어떻게 해야 할까요? 맞아요! 가운데 허리띠 부분인 'g' 조각만 끄고, 나머지 테두리(a, b, c, d, e, f)는 모두 켜면 되겠죠?

CODE 5.1 | 숫자 '0' 만들기
01void loop() {
02 // 숫자 '0' 모양 만들기 (가운데 빼고 다 켜기)
03 digitalWrite(2, 1); // a (맨 위) 켜기
04 digitalWrite(3, 1); // b (오른쪽 위) 켜기
05 digitalWrite(4, 1); // c (오른쪽 아래) 켜기
06 digitalWrite(5, 1); // d (맨 아래) 켜기
07 digitalWrite(6, 1); // e (왼쪽 아래) 켜기
08 digitalWrite(7, 1); // f (왼쪽 위) 켜기
09 digitalWrite(8, 0); // g (가운데) 끄기 -> 이것만 꺼야 '0'
10}
  • 테두리 켜기: digitalWrite(핀번호, 1)은 해당 핀으로 전기를 보내라는(HIGH) 뜻이에요. 공통 음극 방식에서는 전기가 흘러야 LED가 켜지므로, a~f에 해당하는 2~7번 핀에 1 신호를 보내 모두 켭니다.
  • 가운데 끄기: 반대로 digitalWrite(핀번호, 0)은 전기를 끊으라는(LOW) 뜻입니다. 'g' 조각에 해당하는 8번 핀에 0 신호를 보내서 가운데 부분만 꺼주는 거죠.

코드를 모두 작성했다면 아두이노에 업로드해 보세요. 7-세그먼트에 빨간색 숫자 '0'이 선명하게 나타나면 성공입니다!

💡 잠깐! 틴커캐드(Tinkercad) 꿀팁
가상 시뮬레이션 도구인 틴커캐드로 실습하다가 "어? 7-세그먼트 부품이 안 보여요!" 하고 당황한 적 있나요? 틴커캐드는 처음엔 자주 쓰는 부품만 보여주는 [기본] 모드로 설정되어 있어요. 오른쪽 부품 창 상단의 '구성요소' 드롭다운 메뉴를 [모두(All)]로 바꿔보세요. 숨어있던 7-세그먼트를 비롯한 다양한 부품들을 만날 수 있답니다!

어때요, 생각보다 어렵지 않죠? 복잡해 보이는 7-세그먼트도 핀 지도를 보고 차근차근 연결하고, 각 조각을 제어하는 코드의 원리만 이해하면 멋진 숫자를 표현할 수 있답니다. 오늘 '0'을 만드는 데 성공하셨다면, 이제 다른 숫자나 알파벳을 만드는 데도 도전해볼 수 있을 거예요!

오늘 실습은 여러 개의 LED를 동시에 제어해서 특정 패턴을 만드는 아주 중요한 예제였어요. 궁금한 점이 있다면 언제든 댓글로 질문해주세요. 그럼, 다음 포스팅에서 더욱 재미있는 내용으로 다시 만나요! 👋

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

2026년 1월 9일 금요일

4.1.1. 7-세그먼트 알아보기

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

오늘은 우리 주변에서 정말 흔하게 볼 수 있지만, 그 원리는 잘 몰랐던 부품 하나를 속속들이 파헤쳐 보려고 해요. 바로 엘리베이터 층수나 전자레인지 시간을 알려주는 빨간 숫자판, '7-세그먼트(7-Segment)'입니다!

아두이노로 숫자를 표현하고 싶을 때 가장 먼저 배우게 되는 부품인데요, 오늘 저와 함께 7-세그먼트의 비밀을 하나씩 풀어가다 보면 어느새 여러분도 이 부품의 전문가가 되어 있을 거예요. 자, 그럼 시작해볼까요?

Slide 1: 7-세그먼트 알아보기

이번 시간에는 '4장 화면과 움직임으로 표현하기'의 첫 번째 주자인 '7-세그먼트'에 대해 알아보겠습니다. 이름은 조금 낯설지만, 사실은 우리에게 아주 친숙한 부품이랍니다.

Slide 2: 7-세그먼트의 개념

엘리베이터의 층수 표시, 전자레인지의 타이머... 이 모든 것이 바로 7-세그먼트예요.

이름이 왜 '7-세그먼트'일까요? 영어로 'Segment'는 '조각'이라는 뜻인데요, 말 그대로 7개의 막대기(조각)으로 숫자를 표현하는 부품이라는 의미랍니다.

이 7개의 막대기를 요리조리 껐다 켰다 조합하면 0부터 9까지 모든 숫자를 만들 수 있어요. 오른쪽 아래에 소수점을 나타내는 점(dp, Dot Point)까지 포함하면 사실 8개의 조각으로 이루어져 있죠.

각 조각에는 전 세계 공통으로 이름이 붙어있어요. 맨 위쪽부터 시계 방향으로 a, b, c, d, e, f, 그리고 가운데 허리띠가 g랍니다. 이 이름은 꼭 기억해주세요!

Slide 3: 7-세그먼트의 구조

7-세그먼트의 정체는 바로 '7개 LED의 합체 로봇'이에요!

겉보기엔 하나의 부품 같지만, 사실 그 속은 7개의 길쭉한 LED가 숫자 '8' 모양으로 배치되어 있는 구조랍니다. (소수점까지 8개!)

이게 왜 중요하냐면요, 우리가 이미 LED를 켜고 끄는 방법을 알고 있잖아요? 7-세그먼트도 결국 7개의 LED를 각각 제어하는 것과 원리가 똑같다는 뜻이에요. 전혀 새로운 게 아니니 겁먹을 필요 없어요!

각 LED 막대기의 이름과 위치를 다시 한번 정리해볼까요?

  • a: 맨 위쪽
  • b: 오른쪽 위
  • c: 오른쪽 아래
  • d: 맨 아래
  • e: 왼쪽 아래
  • f: 왼쪽 위
  • g: 정가운데 허리띠
  • dp: 소수점 (오른쪽 아래)

Slide 4: 공통 음극(Common Cathode, CC) 타입

7-세그먼트를 처음 다룰 때 많은 분들이 "코드는 똑같은데 왜 내 것만 안 켜지지?"하며 좌절하는 포인트가 바로 여기에요. 겉모습은 똑같지만 속이 다른 두 가지 타입이 있기 때문이죠. 바로 '공통 음극(CC)''공통 양극(CA)' 방식입니다.

먼저, 우리에게 익숙한 공통 음극(CC) 타입부터 알아볼게요.

  • 원리: 8개 LED의 -극(GND)을 하나로 묶어 공통으로 사용하는 방식이에요. "바닥(GND)을 같이 쓰자!"라고 기억하면 쉬워요.
  • 켜는 법: 우리가 아는 상식 그대로예요. 아두이노 핀에서 HIGH(5V) 신호를 주면 해당 LED가 켜집니다. (1 = ON)
  • 특징: 직관적이라 이해하기가 아주 쉽답니다.

Slide 5: 공통 양극(Common Anode, CA) 타입

다음은 약간 헷갈릴 수 있는 공통 양극(CA) 타입이에요.

  • 원리: 8개 LED의 +극(5V)을 하나로 묶어 공통으로 사용하는 방식이에요. "천장(5V)을 같이 쓰자!"라고 생각하면 돼요.
  • 켜는 법: 여기가 중요해요! 이 타입은 아두이노 핀에서 LOW(0V) 신호를 줘야 켜져요. (0 = ON)
  • 특징: 마치 청개구리처럼 반대로 동작하죠? 왜냐하면 +극에 이미 5V가 연결되어 있기 때문에, 반대쪽(-극)을 0V(GND)로 만들어줘야 전압 차이가 생겨서 전기가 흐르기 때문이에요.

코드를짰는데 LED가 반대로 켜지거나 꺼진다면, "아! 내가 가진 7-세그먼트는 다른 타입이구나!"하고 바로 알아차릴 수 있겠죠?

Slide 6 & 7: 핀 구조 - 다리가 10개인 이유

가운데 다리 2개: 공통(Common) 핀

위아래 정중앙에 있는 2개의 다리가 바로 '공통(Common) 다리'예요. 이 두 다리는 내부적으로 서로 연결되어 있고, 8개 LED가 함께 사용하는 '공동 전원선' 역할을 합니다.

  • CC 타입: 이 공통 다리를 GND(-)에 연결해요.
  • CA 타입: 이 공통 다리를 5V(+)에 연결해요.

나머지 8개 다리: 신호(Signal) 핀

나머지 8개의 다리는 각 LED 조각(a~g, dp)을 개별적으로 켜고 끄는 스위치 역할을 하는 '신호(Signal) 다리'예요.

🚨 가장 중요한 함정! 🚨
이 신호 핀들은 알파벳 순서대로 배열되어 있지 않아요! 왼쪽부터 A, B, C... 순서일 거라고 생각하면 큰 오산이에요. 부품에 따라 순서가 뒤죽박죽 섞여 있으니, 반드시 위 그림과 같은 핀 지도(Pin Map)를 보고 'a 핀이 어디지?', 'g 핀이 어디지?' 하나씩 확인하며 연결해야 실수를 막을 수 있습니다!

Slide 8 & 9: 저항 연결 - '1인 1보디가드' 원칙을 기억하세요!

LED를 쓸 때 과전류를 막기 위해 저항을 꼭 연결했던 것, 기억나시죠? 7-세그먼트는 LED 8개가 모인 것이니, 저항도 당연히 8개가 필요해요. (소수점을 안 쓴다면 7개)

저는 이걸 '1인 1보디가드 원칙'이라고 불러요. 각 LED 다리마다 보디가드(저항)를 한 명씩 붙여주는 거죠.

연결 공식은 간단해요.

(세그먼트 신호 핀) ↔ [저항] ↔ (아두이노 디지털 핀)

헷갈리지 않도록 알파벳 순서대로 아두이노 핀 번호를 매겨서 연결하는 것이 가장 좋은 방법이에요.

  • 세그먼트 A ↔ 저항 ↔ 아두이노 2번
  • 세그먼트 B ↔ 저항 ↔ 아두이노 3번
  • 세그먼트 C ↔ 저항 ↔ 아두이노 4번
  • ... 이런 식으로 DP 핀까지 순서대로 연결하면 됩니다.

Slide 10: 마지막 화룡점정, 공통 다리 연결

신호선 8개를 저항과 함께 아두이노에 다 연결했는데도 불이 안 들어온다면, 십중팔구 이 단계를 빠뜨린 거예요. 바로 공통(Common) 다리를 전원에 연결하는 일이죠!

  • 공통 음극(CC) 방식이라면: 가운데 공통 다리(위나 아래 중 하나)를 GND(-)에 연결해주세요.
  • 공통 양극(CA) 방식이라면: 가운데 공통 다리를 5V(+)에 연결해주세요.

이렇게 신호선 8개 + 공통선 1개, 총 9개의 선을 연결하면 드디어 7-세그먼트를 제어할 모든 하드웨어 준비가 끝납니다!

Slide 11: [잠깐!] 저항 1개로 퉁치면 안 되나요?

저항을 8개나 연결하려니 너무 귀찮죠? '에이, 그냥 공통 다리에 큰 저항 하나만 달면 안 될까?' 하는 생각이 스멀스멀 올라올 거예요.

결론부터 말하면, 절대 안 됩니다! 작동은 될지 몰라도 결과가 엉망이 되거든요.

아주 쉬운 비유를 들어볼게요.

전기를 , 저항을 하나의 수도꼭지, 각 LED 조각을 샤워기 구멍이라고 상상해보세요.

  • 숫자 '1'을 켤 땐 구멍 2개(b, c)만 열려요. 하나의 수도꼭지에서 나온 물이 2개 구멍으로만 나오니 물줄기가 아주 세겠죠? (→ 매우 밝음)
  • 숫자 '8'을 켤 땐 구멍 7개(a~g)가 전부 열려요. 똑같은 양의 물을 7개 구멍이 나눠 가져야 하니 물줄기가 약해지겠죠? (→ 어두움)

결국 숫자가 바뀔 때마다 밝기가 울렁거리게 돼요. 예쁜 숫자를 보려면 귀찮더라도 꼭! 정석대로 저항 8개를 모두 연결해주세요.

Slide 12: 틴커캐드(Tinkercad) 사용자 필독!

시뮬레이션 툴인 틴커캐드를 사용하시는 분들은 꼭 확인해야 할 부분이 있어요.

틴커캐드의 7-세그먼트는 기본적으로 공통 양극(CA, 0을 줘야 켜지는 청개구리 방식)으로 설정되어 있어요. 우리가 이해하기 쉬운 공통 음극(CC, 1을 줘야 켜지는 방식)으로 바꾸려면, 아래 순서대로 설정을 변경해주세요.

  1. 7-세그먼트 부품을 클릭하세요.
  2. 오른쪽에 뜨는 속성 창에서 '일반' 메뉴를 찾으세요.
  3. '양극'으로 되어있는 설정을 '음극'으로 바꿔주면 끝!

어떠셨나요? 오늘은 7-세그먼트의 기본 개념부터 종류, 핀 구조, 그리고 가장 중요한 저항 연결 원칙까지 꼼꼼하게 살펴봤어요. '합체 로봇', '1인 1보디가드', '수도꼭지 비유'만 기억하시면 앞으로 7-세그먼트를 다룰 때 절대 헷갈리지 않을 거예요!

이제 하드웨어 연결은 완벽하게 마스터했으니, 다음 시간에는 실제로 아두이노 코드를 작성해서 우리가 원하는 숫자를 자유자재로 켜보는 실습을 진행해볼게요.

오늘 내용 복습 잘 해두시고, 다음 시간에 더 재미있는 내용으로 만나요! 👋

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