본문 바로가기

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

[모듈 1-4] 아두이노 시리얼통신 제어(Feat. 로봇팔 만들기)

 


● 모듈 구성 안내

1-4-1. 시리얼 통신으로 가변 저항값 받아오기

1-4-2. 시리얼 통신으로 서보모터 제어하기

1-4-3. 시리얼 통신으로 로봇팔 만들기

 

 

 


● 1-4-1. 시리얼 통신으로 가변저항값 받아오기

 [실습 1-4-1] 시리얼 통신으로 가변저항값 받아오기

 

 

 - 아래 회로를 구성한다.

 

-출처 : https://you-rang.tistory.com/22

 

 - 아래 코드를 복사 붙여 넣기 하여 아두이노를 동작시킨다.

int sensorPin = A3;
int ledPin = 3;
int sensorValue = 0;

void setup(){
	pinMode(ledPin, OUTPUT);
}

void loop(){
	sensorValue = analogRead(sensorPin);
    int ledValue = map(sensorValue, 0, 1023, 0, 255);
    analogWrite(ledPin, ledValue);
    delay(100);
}

 - 아두이노 동작을 확인하며 코드를 이해한다.

 

 

 

- 아래 코드를 보며 기존 코드에 /* 코드 추가 */ 부분을 타이핑 하여 추가한다.

int sensorPin = A3;
int ledPin = 3;
int sensorValue = 0;

void setup(){
	pinMode(ledPin, OUTPUT);
    /* 아래 1줄 코드 추가 */
    Serial.begin(9600); // 시리얼 통신을 9600보드레이트 속도로 시작합니다.
}

void loop(){
	sensorValue = analogRead(sensorPin);
   
    /* 아래 2줄 코드 추가 */
    Serial.print("가변저항 값 : ");
    Serial.println(sensorValue);
    
    int ledValue = map(sensorValue, 0, 1023, 0, 255);
    
    /* 아래 2줄 코드 추가 */
    Serial.print("변환된 가변저항 값 : ");
    Serial.println(ledValue);
    
    analogWrite(ledPin, ledValue);
    /* delay값 변경 */
    delay(300); 
}

 

 

- 아두이노 컴파일러에 코드를 업로드 시키고 아래 그림의 시리얼 모니터링을 클릭하여 시리얼 모니터 동작을 관찰한다.

 

 

*** 시리얼 모니터에 가변저항값이 잘 나온다면

*** [실습 1-4-1] 시리얼 통신으로 가변저항값 받아오기  완수!! 

 

 


● 1-4-2.  시리얼 통신으로 서보모터 제어하기

 

- 아래 서보모터 회로를 다시 구성하자.

 

출처 : 코딩런 : https://codingrun.com/110

 

 

- 아래 코드를 그대로 복붙해서 아두이노에 업로드 시킨다.

#include <Servo.h>
Servo servomotor;
int a = 0;

 
void setup() {
  servomotor.attach(7);
  Serial.begin(9600);                               // Serial 통신을 설정합니다.
  while(!Serial);                                           
  Serial.println("Servor Mortor");
}

void loop() {

  if(Serial.available()){                             //Serial 모니터창에 어떤 값이 들어오면 실행을 합니다.
    a = Serial.parseInt();                           //Serial 모니터창에서 받은 값을 a라는 변수로 넘겨줍니다.

      Serial.print("angle : ");
      Serial.println(a);

      servomotor.write(a);
      delay(15);
  }

}

코드 출처 : http://www.3demp.com/community/boardDetails.php?cbID=125

 

 

   ☞ 시리얼 모니터에 0~179 범위의 값을 입력해보자 서보모터는 어떻게 동작하는가?

 

   ☞ 시리얼 모니터에 180 이상의 값을 입력해보자 서보모터는 잘동작하는가? 잘동작하지 않는다면 원인은 무엇인가?

 

1-4-2.  시리얼 통신으로 서보모터 제어하기 도전과제

기존 코드를 수정하여 시리얼모니터에서 0미만의 값을 입력했을때는 서보모터는 위치 0에 고정하고
시리얼모니터에 180 이상의 값을 주었을때 서보모터의 위치가 179에 고정되게 코드를 수정하고 동작시키시오.

 

 

 


● 1-4-3.  로봇팔 만들기

- 아래 영상을 통해 우선 우리의 목표를 확인하자.

 

출처 : e4ds.

- 아래와 같이 회로를 구성한다.

출처 : https://make.e4ds.com/make/learn_guide_view.asp?idx=105

 

 

- 아래 코드를 복붙하고 업로드 한다.

#include <Servo.h> //헤더파일 포함

Servo servo1; //servo1 변수 선언
Servo servo2; //servo2 변수 선언

int motor1 = 3; //motor1을 입출력 3번 핀에 연결
int motor2 = 5; //motor2을 입출력 5번 핀에 연결
int angle1 = 90; //초기 각도값 설정  
int angle2 = 90; //초기 각도값 설정

void setup() {
  servo1.attach(motor1); //servo1에 입출력 3번 핀을 지정
  servo2.attach(motor2); //servo2에 입출력 5번 핀을 지정
  Serial.begin(9600); //시리얼 모니터 사용
  Serial.println("Enter the w,a,s,d ");
}
void loop() {
  if(Serial.available()) //시리얼 통신이 가능할 경우
  {
    char input = Serial.read(); //시리얼 모니터 입력 값을 읽어옴
    if(input =='w') //입력값이 W일 경우
    {
      Serial.print("+30");
      for(int i = 0; i <30; i++) // 30번 반복
      {
        angle1 = angle1 + 1; // angle1의 값에 1씩 30번을 더함
        if(angle1 >=180) // angle1이 180보다 커지거나 같아질 경우 
        angle1 = 180; // angle1을 180으로 고정
        servo1.write(angle1); // servo1을 angle1 값에 맞추어 동작
        delay(10);
      }
      Serial.print("\t\t");
      Serial.println(angle1);
    }
    else if(input =='a') //입력값이 a일 경우
    {
      Serial.print("+30");
      for(int j = 0; j <30; j++)
      {
        angle2 = angle2 + 1;
        if(angle2 >=180)
         angle2 = 180;
        servo2.write(angle2);
        delay(10);
      }
      Serial.print("\t\t");
      Serial.println(angle2);
    }
     else if(input == 's') //입력값이 s일 경우
     {
      Serial.print("\t-30\t");
      for(int i = 0; i <30; i++) // 30번 반복
      {
        angle1 = angle1 -1; // angle1의 값에 1씩 30번을 빼기
        if(angle1 <= 0) // angle1이 0보다 작아지거나 같을 경우
        angle1 = 0; // angle1을 0으로 고정
        servo1.write(angle1); // servo1을 angle 값에 맞추어 동작
        delay(10);
      }
      Serial.println(angle1);
     }
     else if(input == 'd')  //입력값이 d일 경우
     {
      Serial.print("\t-30\t");
      for(int j = 0; j <30; j++)
      {
        angle2 = angle2 -1;
        if(angle2 <= 0)
        angle2 = 0;
        servo2.write(angle2);
        delay(10);
      }
      Serial.println(angle2);
     }
  }
}

 

- 시리얼모니터를 켜고, w, s, a, d를 통해 2개의 서보모터를 제어한다.

 

- 원킹쌤이 주시는 재료를 가지고 로봇 팔 하드웨어를 제작한다.

 

 

 

 

 1-4-2.  시리얼 통신으로 서보모터 제어하기 도전과제

키보드 q를 눌렀을때 로봇팔이 위치가 초기값으로 초기화 될수 있게 코드를 수정 및 추가하고 동작을 완수 하시오.

 

 

 

 

 

고생하셨습니다.


FINISH


 

 

 

글쓴이 : Wonking / 교사 성원경