본문 바로가기 주메뉴 바로가기

1. 개요

가정용 솜사탕 기계에 로봇 타워를 장착하여 자동으로 솜사탕을 만들어 주는 솜사탕 기계입니다.
아이들의 재미을 위하여 리모콘으로 로봇타워를 제어할 수 있고, 청소가 편해 유지보수도 쉽습니다.

코딩으로 직접 제어 학습도 가능하여 중,고등학교의 동아리 활동으로도 매우 좋습니다.

2. 기본 사용법


1. 기본 사용법 영상 보기



2. 기본 사용법 간단 설명


 1) 쿠션에 솜사탕로봇을 올려놓은 뒤 안전보호막을 씌웁니다.



 2) 리모컨과 로봇타워의 전원케이블(아답터)을 연결 후 전원을 본체와 로봇타워 2개 모두 연결합니다.


 3) 본체의 전원 ON/OFF 버튼을 눌러 4~5분간 예열을 합니다. ON이 되면 원형 가열판이 회전합니다. 4~5분이 지나면 전원을 끈 뒤 원형 회전판의 회전이 멈추면 솜사탕용 설탕을 넣고 다시 전원버튼을 켭니다. 예열은 처음 작업할 때와 작업 후 쉬는 시간이 길어 원형 회전판이 식었을 때만 진행하면 됩니다.

    전원버튼 ON (예열) → 전원버튼 OFF ( 솜사탕용 설탕 넣기) → 전원버튼 ON


 4) 종이빨대를 로봇팔의 봉에 끼웁니다.


 5) 조금의 시간이 지나면 솜사탕 실이 거미줄 처럼 생기는 것이 보입니다. 조금 생기면 리모컨의 A버튼을 눌러 시작합니다. 솜사탕이 핫도그 정도의 크기가 되면, 리모컨 왼쪽의 빨간색 또는 파란색 버튼을 누르면 자동으로 시간에 맞추어 올라가며 솜사탕이 만들어 집니다.



 6) 솜사탕 실이 더이상 나오지 않으면 리모컨의 B버튼을 눌러 작업을 종료합니다. 로봇팔이 완전히 제자리로 돌아올 때까지 기다렸다가 만들어진 솜사탕을 뺍니다.

[요약^^]
 

3. 유지보수


3.1. 원형 트레이 청소


원형트레이는 쉽게 분리되어 청소할 수 있습니다.
 

1. 솜사탕 제작 후 원형트레이에 붙은 것들은 빨대 등으로 톡톡 치면 떨어집니다.

2. 원형트레이 분리
   :  시계반대 방향으로 돌리면 빠집니다. 사진처럼 자세히 보시면 고정하는 요철이 보입니다.^^
3. 따뜻한 물로 세척
   : 물에 쉽게 녹습니다.^^
4. 재조립



3.2. 원형 회전판 청소


롱노우즈 등 장비를 이용하여 원형 회전판을 분리할 수 있습니다.

오랫동안 청소를 안하시면 설탕 녹은것이 붙어 있을 수 있으니 살짝 힘을 주셔야 될 수도 있습니다.


솜사탕 만들 때 설탕 잔여물 없이 전부 설탕실로 날아갈 때까지 기다리면 원형 회전판이 시커멓게 변하는 것을 줄일 수 있습니다.



1. 꼭 충분한 시간을 두어 식힌 뒤에 작업하세요.

2. 원형회전판을 손으로 잡고, 가운데 너트를 롱노우즈 등 공구를 이용하여 반시계방향으로 돌려 빼냅니다.
3. 따뜻한 물로 청소합니다. 
4. 물기를 제거한 뒤 재 조립합니다.



4. 로봇타워 제작


4.1. 알류미늄 버전


4.2. 3D프린팅 버전


5. 프로그래밍


5.1. 핀설정


1. 목표

 -. 아두이노 우노에 연결된 장치들의 핀을 설정하여 초기 상태를 정의

 -. 신호등 LED, DC모터 드라이버, 서보모터 2개의 핀을 설정

2. 핀 연결



 
3. 코드 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <Servo.h>
 
//아날로그 키패드 핀 설정
#define KEYPAD_PIN A0  
 
// LED 핀 설정
#define LED_R 9   // 빨강 LED 9번핀 연결
#define LED_Y 10  // 노랑 LED 10번핀 연결
#define LED_G 11  // 녹색 LED 11번핀 연결
 
// DC 모터 드라이버 핀 설정
#define MOTOR_A1A 5  // 모터 방향 제어 핀 1 5번핀 연결
#define MOTOR_A1B 6  // 모터 방향 제어 핀 2 6번핀 연결
 
// 서보모터 핀 설정
#define SERVO_1 3  // 서보모터 1번 3번핀 연결
#define SERVO_2 4  // 서보모터 2번 4번핀 연결
 
// 서보모터 객체 생성
Servo servo1;
Servo servo2;
 
void setup() {
    // LED 핀을 출력 모드로 설정
    pinMode(LED_R, OUTPUT);
    pinMode(LED_Y, OUTPUT);
    pinMode(LED_G, OUTPUT);
    
    // DC 모터 핀을 출력 모드로 설정
    pinMode(MOTOR_A1A, OUTPUT);
    pinMode(MOTOR_A1B, OUTPUT);
    
    // 서보모터 초기화
    servo1.attach(SERVO_1);
    servo2.attach(SERVO_2);
    
    // DC 모터 초기 상태 설정 (멈춤)
    digitalWrite(MOTOR_A1A, LOW);
    digitalWrite(MOTOR_A1B, LOW);
}
 
void loop() {
 
}
cs
4. 기타
 -. DC모터가 핀 설정을 하지 않으면 회전할 수 있습니다. 

  - 아두이노가 부팅될 때, 디지털 핀은 기본적으로 입력 모드(INPUT) 상태가 됨. (이때, 잠시 DC모터가 오동작으로 회전할 수 있습니다.)

  - 이 경우 핀 상태가 불확정(FLOAT 상태)가 되어, DC 모터 드라이버가 오작동할 가능성이 있음.

  - 따라서, 핀을 반드시 OUTPUT 모드로 설정하고 초기 값을 LOW로 설정해야 불필요한 모터 회전을 방지할 수 있음.

5.2. 신호등 LED 동작


1. 목표

 -. 신호등 LED를 활용하여 상태를 표시합니다.
 -. 실습 : 1초 단위로 색상이 바뀌는 LED 동작 구현

2. 핀연결
 -. 빨강 9번, 노랑 10번, 녹색 11번에 연결

3. 코드 작성하기 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <Servo.h>
 
//아날로그 키패드 핀 설정
#define KEYPAD_PIN A0  
 
// LED 핀 설정
#define LED_R 9   // 빨강 LED 9번핀 연결
#define LED_Y 10  // 노랑 LED 10번핀 연결
#define LED_G 11  // 녹색 LED 11번핀 연결
 
// DC 모터 드라이버 핀 설정
#define MOTOR_A1A 5  // 모터 방향 제어 핀 1 5번핀 연결
#define MOTOR_A1B 6  // 모터 방향 제어 핀 2 6번핀 연결
 
// 서보모터 핀 설정
#define SERVO_1 3  // 서보모터 1번 3번핀 연결
#define SERVO_2 4  // 서보모터 2번 4번핀 연결
 
// 서보모터 객체 생성
Servo servo1;
Servo servo2;
 
void setup() {
    // LED 핀을 출력 모드로 설정
    pinMode(LED_R, OUTPUT);
    pinMode(LED_Y, OUTPUT);
    pinMode(LED_G, OUTPUT);
    
    // DC 모터 핀을 출력 모드로 설정
    pinMode(MOTOR_A1A, OUTPUT);
    pinMode(MOTOR_A1B, OUTPUT);
    
    // 서보모터 초기화
    servo1.attach(SERVO_1);
    servo2.attach(SERVO_2);
    
    // DC 모터 초기 상태 설정 (멈춤)
    digitalWrite(MOTOR_A1A, LOW);
    digitalWrite(MOTOR_A1B, LOW);
}
 
void loop() {
    // 빨강 LED 켜기 (1초)
    digitalWrite(LED_R, HIGH);
    delay(1000);
    digitalWrite(LED_R, LOW);
    
    // 노랑 LED 켜기 (1초)
    digitalWrite(LED_Y, HIGH);
    delay(1000);
    digitalWrite(LED_Y, LOW);
    
    // 녹색 LED 켜기 (1초)
    digitalWrite(LED_G, HIGH);
    delay(1000);
    digitalWrite(LED_G, LOW);
}
cs

 

4. 실습결과



5. 핑크캔디봇에 응용
 -. 전원켜짐 : 빨강

 -. 작동 중 : 노랑
 -. 작업 완료 : 녹색 
 

5.3. 아날로그 키패드


1. 목표

 -. 아날로그 키패드를 사용하여 각각의 버튼 입력 값을 확인
 -. 5개의 버튼을 감지하여 각각의 값을 측정하여, 특정 범위를 기반으로 이름을 정의


2. 핀 연결

 -. A0 핀에 연결


3. 아날로그 입력값 확인하기

 -. 시리얼 통신(Serial.begin(9600);)을 시작하고, 각각의 키를 눌렀을 때 입력값을 시리얼 모니터로 출력해봅니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <Servo.h>
 
//아날로그 키패드 핀 설정
#define KEYPAD_PIN A0  
 
// LED 핀 설정
#define LED_R 9   // 빨강 LED 9번핀 연결
#define LED_Y 10  // 노랑 LED 10번핀 연결
#define LED_G 11  // 녹색 LED 11번핀 연결
 
// DC 모터 드라이버 핀 설정
#define MOTOR_A1A 5  // 모터 방향 제어 핀 1 5번핀 연결
#define MOTOR_A1B 6  // 모터 방향 제어 핀 2 6번핀 연결
 
// 서보모터 핀 설정
#define SERVO_1 3  // 서보모터 1번 3번핀 연결
#define SERVO_2 4  // 서보모터 2번 4번핀 연결
 
// 서보모터 객체 생성
Servo servo1;
Servo servo2;
 
void setup() {
    
    Serial.begin(9600); // 시리얼 통신 시작
 
    // LED 핀을 출력 모드로 설정
    pinMode(LED_R, OUTPUT);
    pinMode(LED_Y, OUTPUT);
    pinMode(LED_G, OUTPUT);
    
    // DC 모터 핀을 출력 모드로 설정
    pinMode(MOTOR_A1A, OUTPUT);
    pinMode(MOTOR_A1B, OUTPUT);
    
    // 서보모터 초기화
    servo1.attach(SERVO_1);
    servo2.attach(SERVO_2);
    
    // DC 모터 초기 상태 설정 (멈춤)
    digitalWrite(MOTOR_A1A, LOW);
    digitalWrite(MOTOR_A1B, LOW);
}
 
void loop() {
 
    int keyValue = analogRead(KEYPAD_PIN); // 키패드 값 읽기
    Serial.println(keyValue); // 시리얼 모니터에 출력
    delay(100); // 0.1초 간격으로 측정
 
}
cs



4. 키 이름 붙이기

 -. 오차가 있을 수 있으니 5정도를 여유값으로 줍니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <Servo.h>
 
//아날로그 키패드 핀 설정
#define KEYPAD_PIN A0
 
// 아날로그 키패드별 최대/최소 입력값 (5를 여유값으로)
#define SW_1_MIN 0
#define SW_1_MAX 10
#define SW_2_MIN 140
#define SW_2_MAX 150
#define SW_3_MIN 325
#define SW_3_MAX 336
#define SW_4_MIN 502
#define SW_4_MAX 513
#define SW_5_MIN 736
#define SW_5_MAX 747
 
// 각 버튼을 눌렀을 때 해당 버튼이 감지되면 true 값을 
bool SW_1() { int value = analogRead(KEYPAD_PIN); return (value >= SW_1_MIN && value <= SW_1_MAX); }
bool SW_2() { int value = analogRead(KEYPAD_PIN); return (value >= SW_2_MIN && value <= SW_2_MAX); }
bool SW_3() { int value = analogRead(KEYPAD_PIN); return (value >= SW_3_MIN && value <= SW_3_MAX); }
bool SW_4() { int value = analogRead(KEYPAD_PIN); return (value >= SW_4_MIN && value <= SW_4_MAX); }
bool SW_5() { int value = analogRead(KEYPAD_PIN); return (value >= SW_5_MIN && value <= SW_5_MAX); }  
 
// LED 핀 설정
#define LED_R 9   // 빨강 LED 9번핀 연결
#define LED_Y 10  // 노랑 LED 10번핀 연결
#define LED_G 11  // 녹색 LED 11번핀 연결
 
// DC 모터 드라이버 핀 설정
#define MOTOR_A1A 5  // 모터 방향 제어 핀 1 5번핀 연결
#define MOTOR_A1B 6  // 모터 방향 제어 핀 2 6번핀 연결
 
// 서보모터 핀 설정
#define SERVO_1 3  // 서보모터 1번 3번핀 연결
#define SERVO_2 4  // 서보모터 2번 4번핀 연결
 
// 서보모터 객체 생성
Servo servo1;
Servo servo2;
 
void setup() {
    
    Serial.begin(9600); // 시리얼 통신 시작
 
    // LED 핀을 출력 모드로 설정
    pinMode(LED_R, OUTPUT);
    pinMode(LED_Y, OUTPUT);
    pinMode(LED_G, OUTPUT);
    
    // DC 모터 핀을 출력 모드로 설정
    pinMode(MOTOR_A1A, OUTPUT);
    pinMode(MOTOR_A1B, OUTPUT);
    
    // 서보모터 초기화
    servo1.attach(SERVO_1);
    servo2.attach(SERVO_2);
    
    // DC 모터 초기 상태 설정 (멈춤)
    digitalWrite(MOTOR_A1A, LOW);
    digitalWrite(MOTOR_A1B, LOW);
}
 
void loop() {
 
    int keyValue = analogRead(KEYPAD_PIN); // 키패드 값 읽기
    Serial.println(keyValue); // 시리얼 모니터에 출력
    delay(100); // 0.1초 간격으로 측정
 
}
cs


5. 키 실습

 -. 2번키(빨강색키)와 5번키(흰색키)로 빨강 LED ON/OFF 해보기

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <Servo.h>
 
//아날로그 키패드 핀 설정
#define KEYPAD_PIN A0
 
// 아날로그 키패드별 최대/최소 입력값 (5를 여유값으로)
#define SW_1_MIN 0
#define SW_1_MAX 10
#define SW_2_MIN 140
#define SW_2_MAX 150
#define SW_3_MIN 325
#define SW_3_MAX 336
#define SW_4_MIN 502
#define SW_4_MAX 513
#define SW_5_MIN 736
#define SW_5_MAX 747
 
// 각 버튼을 눌렀을 때 해당 버튼이 감지되면 true 값을 반환
bool SW_1() { int value = analogRead(KEYPAD_PIN); return (value >= SW_1_MIN && value <= SW_1_MAX); }
bool SW_2() { int value = analogRead(KEYPAD_PIN); return (value >= SW_2_MIN && value <= SW_2_MAX); }
bool SW_3() { int value = analogRead(KEYPAD_PIN); return (value >= SW_3_MIN && value <= SW_3_MAX); }
bool SW_4() { int value = analogRead(KEYPAD_PIN); return (value >= SW_4_MIN && value <= SW_4_MAX); }
bool SW_5() { int value = analogRead(KEYPAD_PIN); return (value >= SW_5_MIN && value <= SW_5_MAX); }  
 
// LED 핀 설정
#define LED_R 9   // 빨강 LED 9번핀 연결
#define LED_Y 10  // 노랑 LED 10번핀 연결
#define LED_G 11  // 녹색 LED 11번핀 연결
 
// DC 모터 드라이버 핀 설정
#define MOTOR_A1A 5  // 모터 방향 제어 핀 1 5번핀 연결
#define MOTOR_A1B 6  // 모터 방향 제어 핀 2 6번핀 연결
 
// 서보모터 핀 설정
#define SERVO_1 3  // 서보모터 1번 3번핀 연결
#define SERVO_2 4  // 서보모터 2번 4번핀 연결
 
// 서보모터 객체 생성
Servo servo1;
Servo servo2;
 
void setup() {
    
    Serial.begin(9600); // 시리얼 통신 시작
 
    // LED 핀을 출력 모드로 설정
    pinMode(LED_R, OUTPUT);
    pinMode(LED_Y, OUTPUT);
    pinMode(LED_G, OUTPUT);
    
    // DC 모터 핀을 출력 모드로 설정
    pinMode(MOTOR_A1A, OUTPUT);
    pinMode(MOTOR_A1B, OUTPUT);
    
    // 서보모터 초기화
    servo1.attach(SERVO_1);
    servo2.attach(SERVO_2);
    
    // DC 모터 초기 상태 설정 (멈춤)
    digitalWrite(MOTOR_A1A, LOW);
    digitalWrite(MOTOR_A1B, LOW);
}
 
void loop() {
 
    int keyValue = analogRead(KEYPAD_PIN); // 키패드 값 읽기
    Serial.println(keyValue); // 시리얼 모니터에 출력
    delay(100); // 0.1초 간격으로 측정
 
    if (SW_2()) {
        digitalWrite(LED_R, HIGH); // SW_2을 누르면 빨강 LED 켜기
    } else if (SW_5()) {
        digitalWrite(LED_R, LOW);  // SW_5를 누르면 빨강 LED 끄기
    }
 
}
 


6. 실습 결과

 -. 노란색과 녹색도 해볼까요?^^


5.4. DC 모터


1. 목표

 -. L9110S DC모터 드라이버를 이용하여 DC 모터의 방향과 속도를 제어할 수 있다.


2. 핀 연결

 -. A1A - D5번핀, A1B - D6번 핀
 -. DC 모터 1개를 사용하여 나머지는 연결하지 않습니다.


3. 모터 제어 방법
 -. L9110S는 H-브릿지 방식(4개의 트랜지스터로 구성되어 DC모터의 방향을 제어)으로 두 개의 입력 핀을 HIGH 또는 LOW로 설정하여 모터의 회전방향을 결정합니다.
 


4. DC모터 실습 

 1) 정/역회전 실습
 -. 1초 간격으로 정회전, 정지, 역회전을 반복해봅니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void loop() {
 
    int keyValue = analogRead(KEYPAD_PIN); // 키패드 값 읽기
    Serial.println(keyValue); // 시리얼 모니터에 출력
    delay(100); // 0.1초 간격으로 측정
 
    // 정방향 회전 (1초)
    digitalWrite(MOTOR_A1A, HIGH);
    digitalWrite(MOTOR_A1B, LOW);
    delay(1000);
    
    // 정지 (1초)
    digitalWrite(MOTOR_A1A, LOW);
    digitalWrite(MOTOR_A1B, LOW);
    delay(1000);
    
    // 역방향 회전 (1초)
    digitalWrite(MOTOR_A1A, LOW);
    digitalWrite(MOTOR_A1B, HIGH);
    delay(1000);
    
    // 정지 (1초)
    digitalWrite(MOTOR_A1A, LOW);
    digitalWrite(MOTOR_A1B, LOW);
    delay(1000);
 
}
cs



 2) DC모터 속도 조절 

 -. L9110S 모터 드라이버는 PWM 신호를 활용하여 속도를 조절할 수 있습니다.
 -. analogWrite(v핀, 값)을 이용하여 속도를 설정합니다.
 -. 값은 0~255 이며 0은 정지입니다.
 -. 100부터 1초 간격으로 50씩 속도가 증가하는 코드를 작성해봅니다. (50은 힘이 너무 작어서 모터가 회전하지 않습니다.)
 -. 속도 조절은 실습으로만 해보며, 솜사탕 로봇은 최대 속도로 회전시킵니다^^

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void loop() {
 
    int keyValue = analogRead(KEYPAD_PIN); // 키패드 값 읽기
    Serial.println(keyValue); // 시리얼 모니터에 출력
    delay(100); // 0.1초 간격으로 측정
 
    //1초마다 50씩 속도 증가
    for (int speed = 100; speed <= 250; speed += 50) {
        analogWrite(MOTOR_A1A, speed);
        digitalWrite(MOTOR_A1B, LOW);
        delay(1000);
    }
    
    // 정지 (1초)
    digitalWrite(MOTOR_A1A, LOW);
    digitalWrite(MOTOR_A1B, LOW);
    delay(1000);
 
}
cs


 

 3) 스위치로 DC모터 제어해보기
 -. 1번스위치(노랑)으로 정회전, 4번스위치(녹색)으로 역회전, 5번스위치(흰색)으로 정지를 해봅니다.

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void loop() {
 
    int keyValue = analogRead(KEYPAD_PIN); // 키패드 값 읽기
    Serial.println(keyValue); // 시리얼 모니터에 출력
    delay(100); // 0.1초 간격으로 측정
 
    if (SW_1()) {
        // 정방향 회전
        digitalWrite(MOTOR_A1A, HIGH);
        digitalWrite(MOTOR_A1B, LOW);
    } else if (SW_4()) {
        // 역방향 회전
        digitalWrite(MOTOR_A1A, LOW);
        digitalWrite(MOTOR_A1B, HIGH);
    } else if (SW_5()) {
        // 모터 정지
        digitalWrite(MOTOR_A1A, LOW);
        digitalWrite(MOTOR_A1B, LOW);
    }
 
}
cs

 


5.5. 서보모터


1. 목표
 -. 서보모터의 각도를 제어할 수 있다.
 -. 부드럽게 움직이는 서보 명령 함수를 만들 수 있다.

2. 핀 연결
 -. 서보모터1(몸체에 연결된 서보) -> D3번핀
 -. 서보모터2(DC모터와 연결된 서보) -> D4번핀


3. 서보모터 각도 제어 실습 


 1) 기본 각도 제어 실습

  -. 서보모터2번의 각도를 90도와 180도로 1초 간격으로 움직여 봅니다.
  -. 동작의 모습을 관찰합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
void loop() {
 
    int keyValue = analogRead(KEYPAD_PIN); // 키패드 값 읽기
    Serial.println(keyValue); // 시리얼 모니터에 출력
    delay(100); // 0.1초 간격으로 측정
    
    servo2.write(90); // 서보모터 1번을 90도로 이동
    delay(1000);
 
    servo2.write(180); // 서보모터 1번을 130도로 이동
    delay(1000);
 
}
cs


  -. 서보모터의 각도가 한 번에 목표 각도로 이동하여 안정적이지 않습니다.

  


2) 부드럽게 움직이는 서보 제어 함수 구현
  -. 서보모터의 동작을 부드럽게 제어하여 로봇타워의 안정성을 도모합니다.
  -. 원하는 각도까지 0.01초마다 1도씩 이동하여 부드럽게 도달하도록 명령함수를 만들어 봅니다.
  -. 원하는 각도에 도달할 때까지 지연시간을 주어야 합니다.
    0.01초에 1도를 이동하니 90->180도로 90도를 이동하면 90*0.01초=0.9초가 걸리겠지요. 그래서 delay를 1초 주었습니다.^^ 
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void loop() {
 
    int keyValue = analogRead(KEYPAD_PIN); // 키패드 값 읽기
    Serial.println(keyValue); // 시리얼 모니터에 출력
    delay(100); // 0.1초 간격으로 측정
    
    moveServoSmoothly(servo2, 90); // 서보모터 2번을 부드럽게 90도로 이동
    delay(1000); // 원하는 각도에 도달할 때까지 기다리기
    moveServoSmoothly(servo2, 180);  // 서보모터 2번을 부드럽게 180도로 이동
    delay(1000); // 원하는 각도에 도달할 때까지 기다리기
 
}
 
void moveServoSmoothly(Servo &servo, int targetAngle) {
    int currentAngle = servo.read();
    while (currentAngle != targetAngle) {
        currentAngle += (targetAngle > currentAngle) ? 1 : -1;
        servo.write(currentAngle);
        delay(10); // 서보를 부드럽게 움직이기 위한 지연시간
    }
}
cs



3) 키패드를 이용한 각도 제어 실습


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void loop() {
 
    int keyValue = analogRead(KEYPAD_PIN); // 키패드 값 읽기
    Serial.println(keyValue); // 시리얼 모니터에 출력
    delay(100); // 0.1초 간격으로 측정
 
    if (SW_1()) {
    moveServoSmoothly(servo2, 180); // 서보모터 2번을 180도로 부드럽게 이동
    delay(1000);
 
    } else if (SW_2()) {
    moveServoSmoothly(servo2, 90);  // 서보모터 2번을 90도로 부드럽게 이동
    delay(1000);
    }    
}
 
void moveServoSmoothly(Servo &servo, int targetAngle) {
    int currentAngle = servo.read();
    while (currentAngle != targetAngle) {
        currentAngle += (targetAngle > currentAngle) ? 1 : -1;
        servo.write(currentAngle);
        delay(10); // 서보를 부드럽게 움직이기 위한 지연시간
    }
}
cs


 

5.6. 솜사탕 제작 동작


모든 입출력 장치를 제어하는 방법에 대하여 배웠습니다.
이제는 솜사탕을 멋지게 제작하기 위해 어떻게 동작 시킬 것인지 기획을 해볼까요?


1. 솜사탕 기계 동작 순서는?


 1) 솜사탕 기계 예열
 2) 로봇타워 전원 켜기
 3) 종이 빨때 끼우고 예열 대기
 4) 예열되면 설탕 넣고 솜사탕 기계 동작
 5) 설탕실이 나오기 시작하면 설탕실을 잘 감는 위치로 이동하여 DC모터 회전하여 설탕실 감기 시작
 6) 솜사탕의 크기가 핫도그 정도 되면 솜사탕 사이즈가 점점 커지는 시간에 맞추어 각도를 점점 올리기
 7) 적당한 사이즈의 솜사탕이 되는 각도에 도달하기
 8) 설탕실이 안나올 때까지 회전
 9) 설탕실이 다 나오면 동작 완료 후 솜사탕 빼기   


2. 기본 사항


 1) 단계 설정

    -. 각 단계에서는 마지막 단계에 가기전 이전 단계로 갈 수 없도록 코딩하기

       : 단계 값 설정합니다, 저는 아래에서 전원 켜기를 1단계로 하였으니 실제 동작이 되는 것은 2단계로 2부터 시작합니다.



 2) LED 표시 상태


  -. 전원켜짐 : 녹색
  -. 솜사탕 만드는 중 : 처음 솜사탕 감는 동작 : 빨강, 각도 올리기 동작 : 노랑
  -. 솜사탕 만드는 동작 완료 : 녹색


3. 세부 동작 


 1) 1단계
   -. 전원 켜기

     → LED 녹색 켜지기

     → 종이 빨대 끼우기 좋은 위치로 서보각도 초기 설정



 
 

 3) 2단계
   -. 솜사탕에서 나오는 설탕실을 잘 감을 수 있는 위치로 이동
   -. DC모터 회전하여 설탕실 감기

   -. 적당한 굵기로 설탕실이 감길 때까지 대기 (다음 단계 버튼 눌릴 때 까지)
      → 노랑 버튼(SW_1) 그리고 3단계 일때

      → 각도는 실제로 움직여 보면서 찾아보기

      → LED는 빨강색



 

 
 

 4) 3단계 

   -. 솜설탕이 핫도그 정도 크기가 되면, 각도(서보모터1/ 몸체에 연결된)를 60초 동안 조금씩 올려 더 크게 만들기
   -. 적당한 위치(80도)까지 도달하고 동작 중 노랑 LED 켜짐
   -. 설탕실이 나오지 않을 때까지 계속 DC모터 회전
      → 녹색 버튼(SW_4)으로 동작



 

 5) 4단계 

    -. 설탕실이 계속 많이 나올 때 수동으로 로봇암의 각도를 올리고 내려서 조절하기 
      → 빨강 버튼(SW_2) => 각도 올리기

      → 파랑버튼(SW_3) => 각도 내리기
      → 이 단계는 선택사항으로 건너 뛸 수 있음


 

 6) 5단계

    -. 종이빨대를 끼우는 위치로 이동하여 종료하기 
    -. 다음 명령 대기하기
      → 흰색버튼(SW_5) 


 

3. 전체 프로그램 보기


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include <Servo.h>
 
// LED 핀 설정
#define LED_R 9   // 빨강 LED
#define LED_Y 10  // 노랑 LED
#define LED_G 11  // 녹색 LED
 
// DC 모터 드라이버 핀 설정
#define MOTOR_A1A 5  // 모터 방향 제어 핀 1
#define MOTOR_A1B 6  // 모터 방향 제어 핀 2
 
// 서보모터 핀 설정
#define SERVO_1 3  // 서보모터 1번 
#define SERVO_2 4  // 서보모터 2번
 
// 키패드 입력 핀
#define KEYPAD_PIN A0  
 
// 아날로그 키패드별 최대/최소 입력값 (5를 여유값으로)
#define SW_1_MIN 0
#define SW_1_MAX 10
#define SW_2_MIN 140
#define SW_2_MAX 150
#define SW_3_MIN 325
#define SW_3_MAX 336
#define SW_4_MIN 502
#define SW_4_MAX 513
#define SW_5_MIN 736
#define SW_5_MAX 747
 
// 각 버튼을 눌렀을 때 해당 버튼이 감지되면 true 값을 반환
bool SW_1() { int value = analogRead(KEYPAD_PIN); return (value >= SW_1_MIN && value <= SW_1_MAX); }
bool SW_2() { int value = analogRead(KEYPAD_PIN); return (value >= SW_2_MIN && value <= SW_2_MAX); }
bool SW_3() { int value = analogRead(KEYPAD_PIN); return (value >= SW_3_MIN && value <= SW_3_MAX); }
bool SW_4() { int value = analogRead(KEYPAD_PIN); return (value >= SW_4_MIN && value <= SW_4_MAX); }
bool SW_5() { int value = analogRead(KEYPAD_PIN); return (value >= SW_5_MIN && value <= SW_5_MAX); }
 
// 서보모터 객체 생성
Servo servo1;
Servo servo2;
 
// 현재 진행 중인 단계 (초기값: 2단계)
int currentStep = 2;
 
// 서보모터 부드러운 이동 함수
void moveServoSmoothly(Servo &servo, int targetAngle) {
    int currentAngle = servo.read();
    while (currentAngle != targetAngle) {
        currentAngle += (targetAngle > currentAngle) ? 1 : -1;
        servo.write(currentAngle);
        delay(10);
    }
}
 
void setup() {
    Serial.begin(9600);
 
    // 핀 설정
    pinMode(LED_R, OUTPUT);
    pinMode(LED_Y, OUTPUT);
    pinMode(LED_G, OUTPUT);
    pinMode(MOTOR_A1A, OUTPUT);
    pinMode(MOTOR_A1B, OUTPUT);
    
    // 서보모터 초기화
    servo1.attach(SERVO_1);
    servo2.attach(SERVO_2);
 
    // 초기 상태 설정
    digitalWrite(LED_G, HIGH);
    digitalWrite(MOTOR_A1A, LOW);   // DC모터는 정지
    digitalWrite(MOTOR_A1B, LOW);
    moveServoSmoothly(servo2, 90);  // 종이빨대 끼우기 좋은 위치 이동, 서보2 먼저 동작
    moveServoSmoothly(servo1, 140);    
}
 
void loop() {
 
    // 1단계: 전원 켜기(초기값 설정) 
 
    // 2단계: 초기 설탕실 감기 위치로 이동하여 설탕실 감기 (1번 스위치)
 
    if (currentStep == 2 && SW_1()) {
        digitalWrite(LED_G, LOW);
        digitalWrite(LED_R, HIGH);  // LED 빨강 켜기지
        moveServoSmoothly(servo2, 175);  // 서보2 먼저 동작
        moveServoSmoothly(servo1, 60);
        digitalWrite(MOTOR_A1A, HIGH);
        digitalWrite(MOTOR_A1B, LOW);
        currentStep = 3// 다음 단계로 이동
    }
 
    // 3단계: 솜사탕이 핫도그 정도 크기가 커지는 솜사탕 크기에 따라 점점 각도를 올리기 (4번 스위치)
 
    static int currentAngle = 60;
    if (currentStep == 3 && SW_4() && currentAngle < 80) {   // 최종 목표각도는 80도
        digitalWrite(LED_R, LOW);
        digitalWrite(LED_Y, HIGH);  // LED 노랑 켜지기
        while (currentAngle < 80) {  
          // 서보모터 이동 (3초에 1도씩 증가, 60초 동안 20도 이동)
            moveServoSmoothly(servo1, ++currentAngle);   
            delay(3000);
        }
        // 목표 각도에 도달하면 녹색 LED 켜기
        digitalWrite(LED_Y, LOW);
        digitalWrite(LED_G, HIGH);
        currentStep = 4// 다음 단계로 이동
    }
 
    // 4단계: 수동 각도 조절 (선택사항)
    if (currentStep == 4) {
        if (SW_2()) { moveServoSmoothly(servo1, servo1.read() + 1); delay(500); }
        if (SW_3()) { moveServoSmoothly(servo1, servo1.read() - 1); delay(500); }
    }
 
    // 5단계: 작업 종료 (5번 스위치) - 서보2를 135도로 수정
    if (currentStep == 4 && SW_5()) { // 3단계 이후에서만 5단계로 이동 가능
        digitalWrite(MOTOR_A1A, LOW);
        digitalWrite(MOTOR_A1B, LOW);
        moveServoSmoothly(servo1, 140);  // 초기 위치로 이동(빨대 꽂는 위치)
        moveServoSmoothly(servo2, 90); 
        currentStep = 2// 다시 초기화
    }
}
 
cs


4. 동작 영상

 

TOP