본문 바로가기

메이커 프로젝트/아두이노 +

아두이노 서보모터 제어(심화)

1. 기존 원킹쌤의 서보모터 교육 자료 복습

https://ai0.kr/3 

 

[모듈 1-3] 아두이노 서보모터 제어하기 (feat. For 구문)

● 모듈 구성 안내 1-3-1. 서보모터란 무엇인가 1-3-2. 서보모터 기본 제어 1-3-3. for 구문으로 서보모터 제어하기 1-3-4. 포텐셜미터(가변저항)으로 서보모터 제어하기 ● 1-3-1. 서보모터란 무엇인가?

ai0.kr

 

 

2. 1개의 서브모터를 블루투스랑 연결해 보자.

 

앱인벤터로 아두이노와 블루투스로 연결하여 서보모터 조정하기

Lab-10: 안드로이드-아두이노 서보모터 제어 앱인벤터로 아두이노와 블루투스로 연결하여 서보모터 조정하기 (1) 아두이노 회로도 및 소스 - Servo Motor : 회전각을 조정할 수 있는 모터,        

ael.chungbuk.ac.kr

- 위 자료를 참고해서 앱인벤터로 제작한 자체 앱으로 블루투스 - 서브모터를 제어하시오.

 

 

 

3. 2개의 서보모터를 블루투스로 연결해 보자.

 

[아두이노 프로젝트] '발사!' 레이저 장난감 만들기

'발사!' 레이저 장난감 만들기 안녕하세요! 토요일인데 다들 뭐 하고 계시나요? 주말이니까 다들 휴식을 취...

blog.naver.com

- 위 자료와 [2]번 자료를 참고하여, 자체제작 앱인벤터 앱으로 2개의 서브모터를 제어해보시오.

- 레이저 모듈이 아직 배송중이오니, 일단은 적색 led로 대체

- 자체제작 앱 인벤터에도 led 제어 버튼을 추가하시오

 -> 켜짐, 꺼짐, 점멸 

- 3d 프린트 전에 아이소 핑크로 프로토 타입을 제작하시오.

 

 

 

[추가 과제 - 블루투스로 서보모터 2개 제어하기.]

 

1. 회

 

2. 아두이노 코드

#include <SoftwareSerial.h>    //블루투스 시리얼 통신 라이브러리 추가
#include <Servo.h>
SoftwareSerial BTSerial(3, 2); //블루투스 설정 BTSerial(Tx, Rx)
Servo servomotor1;
Servo servomotor2;
int b = 0;
int c = 0;
int Yellow = 7;
int Red = 9;    //led 핀 설정
void setup() {
  BTSerial.begin(9600); //블루투스 통신 시작
  servomotor1.attach(9);   // 9번핀에 서보모터1 연결
  servomotor2.attach(8);   // 8번핀에 서보모터2 연결
  pinMode(Red, OUTPUT);
  pinMode(Yellow, OUTPUT);
  Serial.begin(9600);
}
void loop() {
  if(BTSerial.available())        //값이 들어오면
  {
    char bt;                     //제어할 변수 bt선언
    bt = BTSerial.read();        //들어온 값을 bt에 저장
    Serial.println(bt);
    if(bt == '1'){                //bt가 1면 위로
    if(b<180){b = b+10;}
    servomotor1.write(b);   // 9번핀에 서보모터1 연결
    }
    else if(bt == '2'){                //bt가 2면 아래로
    if(b>0){b = b-10;}
    servomotor1.write(b);
    }
    else if(bt == '3'){                //bt가 3면 우로
    if(c<180){c = c+10;}
    servomotor2.write(c);
    }
    else if(bt == '4'){                //bt가 4면 좌로
    if(c>0){c = c-10;}
    servomotor2.write(c);
    }
    else if(bt == '0'){                //bt가 0면 중앙
    servomotor1.write(90);
    servomotor2.write(90);
    b=90;
    c=90;
    }
    else if(bt == 'o')
      digitalWrite(Yellow, HIGH);
    else if(bt == 'f')
      digitalWrite(Yellow, LOW);
  }
   delay(100);
}

 

3. 블루트스 어플 제작

 -> 아래 2가지 방법 중 하나 선택하여 실행

 1) 앱 인벤터로 직접 제작 : 1, 2, 3, 4 등등 신호를 보내 아두이노 에게 송신

 2) 기존 앱 다운(아두이노 rc 리모콘) 하여 아두이노에게 블루투스 신호 송신 

 

 

 

 

 

[최종 과제] 블루투스 + DC 모터 2개 + 서보모터 2개 + led

 

 

1. 아두이노 회로

 

2. 아두이노 코드

#include <SoftwareSerial.h>    //블루투스 시리얼 통신 라이브러리 추가
#include <Servo.h>
SoftwareSerial BTSerial(3, 2); //블루투스 설정 BTSerial(Tx, Rx)

//모터 PIN 설정
#define LEFT_A1 8 //왼쪽 바퀴
#define LEFT_B1 9 //왼쪽 바퀴
#define RIGHT_A2 10 //오른쪽 바퀴
#define RIGHT_B2 11 //오른쪽 바퀴
const int ENA = 7;
const int ENB = 12;

//서브모터 설정
Servo servomotor1;
Servo servomotor2;
int b = 0;
int c = 0;
int Yellow = 4; //led 핀 설정
void setup() {
  BTSerial.begin(9600); //블루투스 통신 시작
  servomotor1.attach(6);   // 6번핀에 서보모터1 연결
  servomotor2.attach(5);   // 5번핀에 서보모터2 연결
  pinMode(Yellow, OUTPUT); // led 노랑
  Serial.begin(9600); // 시리얼모니터
  pinMode(LEFT_A1, OUTPUT);
  pinMode(RIGHT_A2, OUTPUT);
  pinMode(LEFT_B1, OUTPUT);
  pinMode(RIGHT_B2, OUTPUT);
  Serial.println("Arduino Bluetooth Car is ready to start");
}
void loop() {
  if(BTSerial.available())        //값이 들어오면
  {
    char bt;                     //제어할 변수 bt선언
    bt = BTSerial.read();        //들어온 값을 bt에 저장
    Serial.println(bt);
    if(bt == '1'){                //bt가 1면 위로
    if(b<180){b = b+10;}
    servomotor1.write(b);   // 9번핀에 서보모터1 연결
    }
    else if(bt == '2'){                //bt가 2면 아래로
    if(b>0){b = b-10;}
    servomotor1.write(b);
    }
    else if(bt == '3'){                //bt가 3면 우로
    if(c<180){c = c+10;}
    servomotor2.write(c);
    }
    else if(bt == '4'){                //bt가 4면 좌로
    if(c>0){c = c-10;}
    servomotor2.write(c);
    }
    else if(bt == '0'){                //bt가 0면 중앙
    servomotor1.write(90);
    servomotor2.write(90);
    b=90;
    c=90;
    }
    else if(bt == 'o'){digitalWrite(Yellow, HIGH);}
    else if(bt == 'g'){digitalWrite(Yellow, LOW);}
  // dc모터 코드
      else if(bt == 'l'){        //좌회전(강)
       Serial.println("left");
       left();
     }else if(bt == 'r'){      //우회전(강)
       Serial.println("right");
       right();
     }else if(bt == 'f'){      //전진
       Serial.println("forward");
       forward();
     }else if(bt == 'b'){      //후진
       Serial.println("backward");
       backward();
     }else if(bt == 'w'){      //우회전(약)
       Serial.println("slow right");
       sRight();
     }else if(bt == 'q'){      //좌회전(약)
       Serial.println("slow left");
       sLeft();
     }else if(bt == 'c'){      //우회전(뒷)
       Serial.println("back right");
       bRight();
     }else if(bt == 'z'){      //좌회전(뒷)
       Serial.println("back left");
       bLeft();
     }else if(bt == 's'){      //정지
       Serial.println("stop");
       stop();
     }
  } delay(100);
}
   // 자동차 움직임 정의 Function 들
void forward(){
  digitalWrite(LEFT_A1, HIGH);
  digitalWrite(LEFT_B1, LOW);
  digitalWrite(RIGHT_A2, HIGH);
  digitalWrite(RIGHT_B2, LOW);
  analogWrite(ENB, 255);
  analogWrite(ENA, 255);
}
void backward(){
  digitalWrite(LEFT_A1, LOW);
  digitalWrite(LEFT_B1, HIGH);
  digitalWrite(RIGHT_A2, LOW);
  digitalWrite(RIGHT_B2, HIGH);
  analogWrite(ENB, 255);
  analogWrite(ENA, 255);
}
void left(){
  digitalWrite(LEFT_A1, LOW);
  digitalWrite(LEFT_B1, HIGH);
  digitalWrite(RIGHT_A2, HIGH);
  digitalWrite(RIGHT_B2, LOW);
  analogWrite(ENB, 255);
  analogWrite(ENA, 255);
}
void right(){
  digitalWrite(LEFT_A1, HIGH);
  digitalWrite(LEFT_B1, LOW);
  digitalWrite(RIGHT_A2, LOW);
  digitalWrite(RIGHT_B2, HIGH);
  analogWrite(ENB, 255);
  analogWrite(ENA, 255);
}
void sLeft(){
  digitalWrite(LEFT_A1, LOW);
  digitalWrite(LEFT_B1, LOW);
  digitalWrite(RIGHT_A2, HIGH);
  digitalWrite(RIGHT_B2, LOW);
  analogWrite(ENB, 255);
  analogWrite(ENA, 255);
}
void bLeft(){
  digitalWrite(LEFT_A1, LOW);
  digitalWrite(LEFT_B1, LOW);
  digitalWrite(RIGHT_A2, LOW);
  digitalWrite(RIGHT_B2, HIGH);
  analogWrite(ENB, 255);
  analogWrite(ENA, 255);
}
void sRight(){
  digitalWrite(LEFT_A1, HIGH);
  digitalWrite(LEFT_B1, LOW);
  digitalWrite(RIGHT_A2, LOW);
  digitalWrite(RIGHT_B2, LOW);
  analogWrite(ENB, 255);
  analogWrite(ENA, 255);
}
void bRight(){
  digitalWrite(LEFT_A1, LOW);
  digitalWrite(LEFT_B1, HIGH);
  digitalWrite(RIGHT_A2, LOW);
  digitalWrite(RIGHT_B2, LOW);
  analogWrite(ENB, 255);
  analogWrite(ENA, 255);
}
void stop(){
  digitalWrite(LEFT_A1, LOW);
  digitalWrite(LEFT_B1, LOW);
  digitalWrite(RIGHT_A2, LOW);
  digitalWrite(RIGHT_B2, LOW);
}

3. 앱인벤터 설계

1) 앱 화면 그래픽

 

 

2) 앱 블록 코딩

 

끝.