4주차 서보모터와 동전 먹는 저금통 만들기

아두위키 : Arduwiki
ArduWiki (토론 | 기여)님의 2024년 6월 11일 (화) 17:56 판

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. 회로 연결

  1. 양 팔에 연결한 전선 2개 : 1개의 전선은 gnd / 1개의 전선은 digital pin에 연결합니다.
  2. LED 전선 2개 : 1개의 전선은 gnd / 1개의 전선은 digital pin에 연결합니다.
  3. 서보모터 전선 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);
  }
}