4주차 서보모터와 동전 먹는 저금통 만들기
1. 서보모터 제어하기
서보모터를 아두이노에 연결해봅시다.
서보모터의 검정색 선을 GND, 빨간색 선을 5V, 주황색 선을 디지털 핀(8번)에 연결해주세요.
서보모터는 신호에 따라 회전 각도를 조절할 수 있습니다. 단, 0~180도 범위를 제어할 수 있습니다.
#include <Servo.h>
Servo s;
int servoPin = 8;
void setup() {
s.attach(servoPin);
}
void loop() {
s.write(0);
delay(3000);
s.write(180);
delay(3000);
}
서보모터를 사용하기 위해서는 #include <Servo.h>
코드를 추가하여 라이브러리를 사용합니다.
Servo 변수이름;
서보모터를 제어할 변수를 선언합니다.
attach(pin)
함수에 서보모터를 연결한 디지털 핀 번호를 넣어줍니다. attach 함수는 원하는 핀의 서보모터를 연결하고 제어할 수 있게 설정하는 함수입니다.
write(각도)
함수에 매개변수로 0~180 사이의 각도 값을 넣습니다. 서보모터가 설정한 각도로 움직이는 모습을 볼 수 있습니다.
위 코드를 실행하여 서보모터가 0도, 180도로 번갈아가며 각도가 변경되는 모습을 확인해봅시다.
2. 동전 먹는 저금통 조립하기.
2-1. 몸통 조립
먼저 5개의 조각을 가져옵니다. 저금통 모형의 아래 부분을 만들어봅시다.
아래 모양처럼 왼쪽, 오른쪽을 잘 보고 맞춰서 조립해주세요.
조립 후 몸통 부분에 나사가 구멍이 있는 곳을 7mm 나사로 고정할 수 있도록 조아주세요.
2-2. 머리 조립
먼저 5개의 조각을 가져옵니다. 저금통 모형의 머리 부분을 만들어봅시다.
아래 모양처럼 왼쪽, 오른쪽을 잘 보고 맞춰서 조립해주세요.
머리 부분의 왼쪽 면에 빨간색 동그라미로 표시한 구멍은 머리의 뒷 편으로 가도록 조립해야 합니다!
조립 후 머리 부분에 나사가 구멍이 있는 곳을 7mm 나사로 고정할 수 있도록 조아주세요.
2-3. 왼쪽 팔
저금통의 왼쪽 팔을 만들어 봅시다. 3개의 조각을 가져오고 10mm 핀과 주황 고무를 이용해 고정시켜 주세요.
2-4. 오른쪽 팔
저금통의 오른쪽 팔을 만들어 봅시다. 3개의 조각을 가져오고 7mm 나사를 이용해 조아주세요.
2-4. 서보모터 조립
위 그림처럼 서보모터를 몸통에 조립해주세요. 2개의 동그라미 조각을 가져와 양 옆에 끼워주세요.
서보모터가 조립되는 방향을 잘 보고 똑같이 적용시켜 주세요.
2-5. 팔 조립
2-3, 2-4에서 만든 팔을 저금통 몸통에 달아주세요! 주황색 고무를 이용해 고정시켜 주세요.
2-6. 철판 연결
양 팔에 전선을 먼저 연결시킵니다. 빨간색 동그라미를 잘 보고 구멍을 통과시킬 수 있도록 만들어주세요.
전선을 먼저 팔에 연결시킨 후 철판 조각 2개를 가져와서 전선과 연결시켜 주세요.
2-7. 철판 고정
철판을 고정시킬 조각을 가져와서 4mm 나사로 조아주세요.
2-8. 서보모터 선 정리
서보모터의 선을 몸통의 오른쪽 구멍으로 빼서 정리해주세요.
그 다음 서보모터를 아크릴 테이프를 이용해 흔들리지 않도록 고정시켜 주세요.
2-9. LED 연결
LED를 저금통 머리 부분에 연결합니다.
두 개의 선은 뒷 편에 있는 구멍 2개로 빼서 정리합니다.
2-10. 경첩으로 몸통과 머리 연결
경첩을 이용해 저금통의 몸통과 머리를 연결합니다. 4mm 나사를 이용해 조아줍니다.
2-11. 왼쪽 팔과 머리 연결
왼쪽 팔과 머리를 연결시켜 줍니다.
10mm 핀과 주황 고무를 이용해 고정시켜 주세요.
2-12. 동전 고정대
마지막으로 동전 거치를 위한 고정대를 조립합니다.
조립할 조각을 가져와서 7mm 나사로 조아줍니다.
3. 회로 연결
- 양 팔에 연결한 전선 2개 : 1개의 전선은 gnd / 1개의 전선은 digital pin에 연결합니다.
- LED 전선 2개 : 1개의 전선은 gnd / 1개의 전선은 digital pin에 연결합니다.
- 서보모터 전선 3개 : 갈색 전선은 gnd / 빨간색 전선은 5v / 주황색 전선은 digital pin에 연결합니다.
4. 코딩!
4-1. 실습) LED 제어하기
먼저 LED를 제어해봅시다. LED가 잘 동작하는지 확인해보세요.
앞서 배운 내용을 토대로 1초 간격으로 LED를 켜고 끄는 동작을 코딩해봅시다.
int LED = pin number;
void setup() {
pinMode(LED, OUTPUT);
}
void loop() {
// code..
}
4-2. 실습2) INPUT_PULLUP을 이용한 동전 존재 여부 판단하기
2주차 버튼 제어하기 에서 배운 INPUT_PULLUP 를 이용해 저금통에 동전을 올려놓았는지 확인하는 코드를 작성해봅시다.
우리는 저금통의 양 팔에 2개의 전선을 이용해 GND, digital pin에 연결하였습니다.
INPUT_PULLUP을 이용하면 동전이 전도체 역할을 하여 digital pin으로 LOW값을 읽어올 수 있을 것입니다.
Serial monitor에 동전을 올리게 되면 "coin!!"라는 코드를 출력하는 프로그램을 작성해보세요.
int coin = pin number;
void setup() {
pinMode(coin, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
// code..
}
4-3. 실습3) 서보모터 각도 제어하기
이제 동전을 저금통 위에 올려둔다면 서보모터의 각도를 제어하여 저금통이 움직일 수 있도록 만들어 봅시다.
서보모터의 각도가 180도 일 때 저금통이 입을 닫고 있는 모양이며, 120도 일 때 저금통이 입을 열어 동전을 먹는 모습을 만들 수 있습니다.
실습2) 를 이용해 동전이 올라오면 서보모터를 움직여 동전을 먹는 모습을 만들어 봅시다.
또, 동전이 올라오면 LED가 켜지고 동전을 삼켜 없어지면 LED가 꺼지도록 만들어 봅시다.
#include <Servo.h>
int coin = pin number;
int LED = pin number;
Servo s;
void setup() {
s.attach(pin number);
pinMode(LED, OUTPUT);
pinMode(coin, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
// code..
}
5. 실습 코드 참고하기
1. 실습 코드) LED 제어하기
int LED = 3;
void setup() {
pinMode(LED, OUTPUT);
}
void loop() {
digitalWrite(LED, HIGH);
delay(1000);
digitalWrite(LED, LOW);
delay(1000);
}
2. 실습 코드) INPUT_PULLUP을 이용한 동전 존재 여부 판단하기
int coin = pin number;
void setup() {
pinMode(coin, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
if(digitalRead(coin)==LOW) {
Serial.println("coin!!");
}
}
3. 실습 코드) 서보모터 각도 제어하기
#include <Servo.h>
int coin = pin number;
int LED = pin number;
Servo s;
void setup() {
s.attach(pin number);
pinMode(LED, OUTPUT);
pinMode(coin, INPUT_PULLUP);
Serial.begin(9600);
s.write(180);
}
void loop() {
if(digitalRead(coin) == LOW) {
delay(300);
s.write(120);
digitalWrite(LED, HIGH);
delay(1000);
s.write(180);
digitalWrite(LED, LOW);
delay(300);
}
}