안녕하세요! 여러분의 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️⃣ 라이브러리 포함
| 01 | #include <Servo.h> // 1. 서보 모터 라이브러리를 가져옵니다. |
서보 모터를 제어하려면 아주 정밀한 신호를 보내야 하는데, 이걸 우리가 직접 만들려면 너무 복잡해요. 다행히 아두이노에는 Servo.h라는 멋진 라이브러리(필수 도구함)가 있어서, 이 한 줄만 추가하면 복잡한 과정 없이 쉽게 모터를 제어할 수 있답니다.
2️⃣ 객체 생성
| 01 | Servo myServo; // 2. 내가 부릴 하인(모터)의 이름을 'myServo'라고 지어줍니다. |
라이브러리를 가져온 다음에는 우리가 제어할 모터에게 '이름'을 지어줘야 해요. Servo라는 설계도를 이용해서 myServo라는 이름의 실제 모터(객체)를 하나 만드는 과정이에요. 마치 "이제부터 내가 제어할 서보 모터의 이름은 'myServo'야!"라고 선언하는 것과 같아요.
3️⃣ setup() 함수 설정
| 01 | void setup() { |
| 02 | myServo.attach(8); // 3. 8번 핀에 모터가 연결되었다고 알려줍니다. |
| 03 | } |
setup() 함수는 코드가 시작될 때 딱 한 번만 실행되는 부분이죠? 여기서 myServo.attach(8); 이라는 명령을 통해 우리가 만든 myServo라는 모터가 실제 아두이노 8번 핀에 연결되어 있다는 사실을 알려주는 거예요. 이제 아두이노는 'myServo'에게 내리는 모든 명령을 8번 핀으로 보내게 됩니다.
Slide 4: 서보 모터 각도 제어 코드 (2)
이제 실제로 모터를 움직이는 명령을 내릴 시간입니다. 이 코드는 loop() 함수 안에 작성해서 계속 반복 실행되도록 할 거예요.
| 01 | void 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 | } |
코드가 정말 직관적이죠?
myServo.write(0);: 'myServo'야, 0도 위치로 움직여!delay(2000);: 그 위치에서 2초(2000밀리초) 동안 잠시 멈춰.myServo.write(90);: 이번엔 90도 위치로 움직여!delay(2000);: 또 2초간 멈추고.myServo.write(180);: 마지막으로 180도 위치로 움직여!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 라이브러리 덕분에 우리는 단 몇 줄의 코드로 복잡한 움직임을 만들어낼 수 있었습니다.
이제 여러분은 아두이노로 물리적인 세상을 제어하는 강력한 무기 하나를 손에 넣으신 거예요! 오늘 배운 내용을 응용해서 각도를 바꿔보거나, 멈추는 시간을 다르게 설정해보는 등 다양한 실험을 해보세요.
다음 포스팅에서는 더욱 흥미로운 주제로 여러분을 찾아뵙겠습니다. 그때까지 즐거운 코딩 하세요! 👋
이 포스팅의 내용은 교재 [주니어 공학교실 아두이노의 기초] **-** 페이지에 수록된 내용입니다.
댓글 없음:
댓글 쓰기