아두이노 로봇 팔 동작 기억 코드 - adu-ino lobos pal dongjag gieog kodeu

※ 아두이노 실행 프로그램이 설치되어 있지 않거나, 아두이노를 처음 접하시는 분들은 아래 버튼을 클릭해 사용법을 확인하시길 바랍니다.

아두이노 로봇 팔 동작 기억 코드 - adu-ino lobos pal dongjag gieog kodeu


본 게시글은 로봇팔 조립을 모두 마친 이후, 아두이노에 소스 코드를 업로드하는 과정을 담고 있습니다.


아두이노 로봇 팔 동작 기억 코드 - adu-ino lobos pal dongjag gieog kodeu

완성한 로봇팔이 정상적으로 작동하기 위해, 조립된 서보모터의 각도를 초기화하는 작업이 꼭 필요합니다.

초기화 코드를 아두이노에 업로드하기 전, 반드시 서보모터와 연결된 프레임을 분리한 후 코드를 실행해주어야 합니다.

프레임을 분리하지 않은 채로 코드를 실행하게 되면 고정되어 있는 프레임 때문에 서보모터의 톱니(각도)가 움직일 수 없어 고장이 날 수 있습니다.

아래 사진을 참고하여 차근히 따라하시길 바랍니다.

아두이노 로봇 팔 동작 기억 코드 - adu-ino lobos pal dongjag gieog kodeu

아두이노 로봇 팔 동작 기억 코드 - adu-ino lobos pal dongjag gieog kodeu

아두이노 로봇 팔 동작 기억 코드 - adu-ino lobos pal dongjag gieog kodeu

아두이노 로봇 팔 동작 기억 코드 - adu-ino lobos pal dongjag gieog kodeu

아두이노 로봇 팔 동작 기억 코드 - adu-ino lobos pal dongjag gieog kodeu

아두이노 로봇 팔 동작 기억 코드 - adu-ino lobos pal dongjag gieog kodeu


아두이노 로봇 팔 동작 기억 코드 - adu-ino lobos pal dongjag gieog kodeu

소스코드는 게시글의 맨 하단에서 다운받을 수 있습니다.

아두이노 로봇 팔 동작 기억 코드 - adu-ino lobos pal dongjag gieog kodeu

로봇팔 반복 동작 시키기

아두이노 로봇 팔 동작 기억 코드 - adu-ino lobos pal dongjag gieog kodeu

내가 움직이는 조이스틱 값(x, y) 확인하기

아두이노 로봇 팔 동작 기억 코드 - adu-ino lobos pal dongjag gieog kodeu

조이스틱으로 로봇팔 움직이기

아두이노 로봇 팔 동작 기억 코드 - adu-ino lobos pal dongjag gieog kodeu

로봇팔 초기화 시키기

아두이노 로봇 팔 동작 기억 코드 - adu-ino lobos pal dongjag gieog kodeu

완성된 소스 코드에 대한 간략한 설명입니다.

아래 내용을 참고하여 조이스틱의 움직임(x, y 값)에 따라 로봇팔의 각도를 조절할 수 있습니다.

아두이노 로봇 팔 동작 기억 코드 - adu-ino lobos pal dongjag gieog kodeu

아두이노 로봇 팔 동작 기억 코드 - adu-ino lobos pal dongjag gieog kodeu



● 모듈 구성 안내

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

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

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

아두이노 로봇 팔 동작 기억 코드 - adu-ino lobos pal dongjag gieog kodeu

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

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

 - 아래 회로를 구성한다.

아두이노 로봇 팔 동작 기억 코드 - adu-ino lobos pal dongjag gieog kodeu
-출처 : 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); 
}

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

아두이노 로봇 팔 동작 기억 코드 - adu-ino lobos pal dongjag gieog kodeu

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

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


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

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

아두이노 로봇 팔 동작 기억 코드 - adu-ino lobos pal dongjag gieog kodeu
출처 : 코딩런 : 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.
아두이노 로봇 팔 동작 기억 코드 - adu-ino lobos pal dongjag gieog kodeu

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

아두이노 로봇 팔 동작 기억 코드 - adu-ino lobos pal dongjag gieog kodeu
출처 : 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 / 교사 성원경

아두이노 로봇 팔 동작 기억 코드 - adu-ino lobos pal dongjag gieog kodeu