안녕하세요! 여러분의 AI-IT 멘토, '파이컴'입니다. 😊
지난 시간에 피에조 부저로 '학교종'을 연주했던 것, 모두 기억하시나요? tone()과 delay() 함수를 계속해서 반복하다 보니 코드가 꽤 길어졌었죠. 만약 연주할 곡이 100마디가 넘어간다면 어떨까요? 아마 코드만 입력하다가 지쳐버릴지도 몰라요. 😥
하지만 걱정 마세요! 오늘은 '배열'이라는 아주 똑똑한 데이터 보관함과 'for 반복문'을 함께 사용해서, 아무리 긴 악보라도 아주 짧고 우아한 코드로 연주하는 마법 같은 방법을 알려드릴게요. 그럼, 바로 시작해볼까요?
Slide 1: C언어 문법 : 배열
오늘 우리가 정복할 주제는 바로 C언어 문법의 핵심 중 하나인 '배열(Array)' 입니다. 배열이 무엇인지, 그리고 아두이노에서 어떻게 활용해서 피에조 부저로 멋진 연주를 할 수 있는지 차근차근 알아볼 거예요.
Slide 2: 배열을 이용한 연주 - 소개
문제점: 끝없는 복사-붙여넣기
이전 '학교종' 코드는 tone()과 delay() 함수의 반복이었어요. 음 하나하나를 명령하다 보니 코드가 길어질 수밖에 없었죠. 이런 방식으로는 100마디짜리 긴 곡을 코딩하는 건 거의 불가능에 가까워요.
해결책: 배열과 반복문의 환상적인 조합!
바로 이 문제를 해결해 줄 똑똑한 방법이 있어요!
- 배열: 멜로디(음계)와 박자 데이터를 미리 '배열'이라는 서랍장에 차곡차곡 정리해둬요.
- for 반복문: 반복문을 이용해 서랍장을 순서대로 열면서 음계와 박자를 꺼내 연주하도록 시키는 거죠.
결과는? 훨씬 짧고 깔끔한 코드로 똑같은 연주를 해낼 수 있답니다!
Slide 3: 회로 구성 – 학교종 연주하기와 동일
이번 실습의 회로는 이전에 했던 '학교종 연주하기'와 완전히 똑같아요. 새로 만들 필요 없이 그대로 사용하면 된답니다!
- 준비물: 아두이노, 피에조 부저, 브레드보드, 점퍼선
- 회로 구성:
- 피에조 부저의 긴 다리(+) → 아두이노 11번 핀
- 피에조 부저의 짧은 다리(-) → 아두이노 GND 핀
- 주의사항: 피에조 부저는 극성(+, -)이 있는 부품이에요. 다리 길이를 꼭 확인하고 연결해주세요!
Slide 4: 학교종 배열 버전 - 코드
자, 드디어 마법 같은 코드를 만나볼 시간이에요! 이전 코드와 비교하면 얼마나 간결해졌는지 한눈에 보일 거예요.
| 01 | void setup() { |
| 02 | int i; |
| 03 | |
| 04 | // 학교 종 멜로디(주파수)를 배열 a에 저장 |
| 05 | int a[7] = {392, 392, 440, 440, 392, 392, 330}; |
| 06 | |
| 07 | // 각 음의 박자(시간)를 배열 b에 저장 |
| 08 | int b[7] = {1000, 1000, 1000, 1000, 1000, 1000, 2000}; |
| 09 | |
| 10 | // 0번째부터 6번째까지 7번 반복 |
| 11 | for (i = 0; i < 7; i++) { |
| 12 | tone(11, a[i], b[i]); // a[i]멜로디를 b[i]시간만큼 연주 |
| 13 | delay(b[i]); // 소리가 날 때까지 대기 |
| 14 | } |
| 15 | } |
| 16 | |
| 17 | void loop() { |
| 18 | } |
코드를 하나씩 살펴볼까요?
- 멜로디 배열
a:int a[7] = { ... };
'솔솔라라솔솔미'에 해당하는 7개 음의 주파수 값을a라는 이름의 배열에 순서대로 저장했어요. - 박자 배열
b:int b[7] = { ... };
각 음을 얼마나 길게 연주할지(시간, ms)b라는 배열에 저장했어요. 마지막 '미'는 길게 연주해야 하니까 2000(2초)으로 설정했네요. - 반복문
for:for (i = 0; i < 7; i++) { ... }
이 부분이 바로 핵심이에요!i라는 변수가 0부터 6까지 1씩 증가하면서 총 7번 반복해요.tone(11, a[i], b[i]);: 반복문이 돌 때마다i번째 멜로디(a[i])와i번째 박자(b[i])를 가져와서 11번 핀으로 연주하라는 뜻이에요.
이 코드를 업로드하면 아두이노가 배열에 정리된 악보를 보고 스스로 연주를 시작할 거예요. 정말 스마트하죠?
Slide 5: 배열 기본 개념
배열(Array)이란?
개념을 좀 더 자세히 알아볼게요. 변수가 물건을 딱 하나만 담을 수 있는 '상자'라면, 배열은 번호가 매겨진 '사물함'이나 '기차'와 같아요. 비슷한 종류의 데이터 여러 개를 하나의 이름으로 묶어서 번호로 관리하는 아주 유용한 방법이죠.
형식
배열은 아래와 같은 형식으로 만들어요.자료형 배열이름[개수] = {값1, 값2, ...};
예시
int a[3] = {10, 20, 30}; 이라는 코드를 분석해볼까요?
int: 이 배열에는 정수(숫자)만 들어갈 수 있다는 뜻이에요.a: 이 배열의 대표 이름은 'a'예요.[3]: 방(공간)이 총 3개 있다는 뜻이에요.{10, 20, 30}: 각 방에 10, 20, 30이라는 값을 순서대로 채워 넣는다는 의미죠.
Slide 6: 배열의 인덱스
가장 중요한 규칙: 번호는 0부터!
여기서 정말 정말 중요한 규칙이 하나 있어요. 바로 배열의 방 번호(인덱스, Index)는 1이 아니라 0부터 시작한다는 점이에요. 프로그래밍 초보자들이 가장 많이 하는 실수 중 하나니 꼭 기억해주세요!
예시
int a[3] = {10, 20, 30}; 배열을 다시 볼게요.
- 첫 번째 방:
a[0](값: 10) - 두 번째 방:
a[1](값: 20) - 세 번째 방:
a[2](값: 30)
슬라이드의 사물함 그림을 보면 이해가 더 쉬울 거예요. 3개의 칸이 있지만 번호는 a[0], a[1], a[2]로 붙어있죠? 즉, 방이 3개인 배열의 마지막 방 번호는 2번이랍니다.
Slide 7: 배열과 반복문
찰떡궁합, 환상의 짝꿍!
배열의 인덱스가 0, 1, 2... 와 같은 숫자라는 점, 뭔가 떠오르지 않나요? 맞아요! for 반복문에서 0부터 1씩 증가하는 변수 i와 완벽한 짝을 이뤄요. 이 둘을 함께 사용하면 정말 강력한 기능을 발휘한답니다.
코드 예시
| 01 | int a[3] = {10, 20, 30}; |
| 02 | |
| 03 | for (int i = 0; i < 3; i++) { |
| 04 | tone(11, a[i], 1000); // a[i] 값을 1초간 연주 |
| 05 | delay(1000); |
| 06 | } |
위 코드는 아래 3줄의 코드를 반복해서 실행하는 것과 완전히 똑같아요.
i가 0일 때 →tone(11, a[0], 1000);(10Hz 소리 연주)i가 1일 때 →tone(11, a[1], 1000);(20Hz 소리 연주)i가 2일 때 →tone(11, a[2], 1000);(30Hz 소리 연주)
이렇게 i 값만 바꾸면 배열의 모든 값을 순서대로 사용할 수 있으니, 코드가 간결해지고 유지보수도 훨씬 쉬워지겠죠?
Slide 8: 배열 사용의 장점
오늘 배운 배열을 사용하면 어떤 점이 좋을까요? 3가지로 정리해볼게요.
- 코드 간결성: 수십, 수백 줄이 될 수도 있는 반복 작업을 단 몇 줄의 코드로 자동화할 수 있어요.
- 유지보수 용이성: 만약 '학교종' 멜로디를 다른 곡으로 바꾸고 싶다면? 복잡한 코드 로직을 건드릴 필요 없이 배열
a와b에 들어있는 값만 수정해주면 끝! 정말 간편하죠? - 확장성: 100마디짜리 긴 곡을 연주하고 싶다면? 배열의 크기(
[7]이 부분을[100]으로)를 늘리고, 그 안에 음계와 박자 값만 쭉 채워주면 돼요. 코드의 기본 구조는 전혀 바꿀 필요가 없답니다.
오늘은 배열과 반복문을 활용해 코드를 획기적으로 다이어트하는 방법을 배워봤어요. 이제 어떤 긴 악보라도 자신 있게 코드로 옮길 수 있겠죠? 처음에는 인덱스가 0부터 시작하는 것이 조금 낯설 수 있지만, 몇 번만 직접 코드를 짜보면 금방 익숙해질 거예요.
여러분도 좋아하는 동요나 노래의 악보를 찾아서 직접 배열로 만들어 연주해보는 건 어떨까요? 직접 해보는 것만큼 좋은 공부는 없으니까요!
오늘 내용 중 궁금한 점이 있다면 언제든지 댓글로 질문해주세요. 그럼 다음 시간에 더 유익하고 재미있는 주제로 다시 만나요! 👋
이 포스팅의 내용은 교재 [주니어 공학교실 아두이노의 기초] 153-157 페이지에 수록된 내용입니다.
댓글 없음:
댓글 쓰기