반응형

 【 아두이노 기초 】 #34 스텝(Step Motor)모터 제어3 (VR 속도제어)


  지난시간 스텝모터를 시리얼 통신을 이용해 제어해 보았다. 만약 스텝모터 동작 원리를 참고하려면 여기 글을 참고하라. ( ☞ 스텝모터의 이해 ) 

 이번 시간에는 스텝모터의 속도를 VR(가변 저항)을 이용하여 제어해 볼 것이다.


▶ 실험에 사용되는 스텝 모터 자료 ( 모터 뱅크, NK243-01AT )



▶ 스텝모터 구동 원리 





▶ 실습 목표 :  

 스텝모터를 VR(가변 저항: 레버를 회전 시키면 저항 값이 변하는 소자)을 이용해서 스텝모터의 회전 속도를 느리게 혹은 빠르게 변화 시켜 보고자 한다. 

High/Low와 같은 On/Off 제어가 아니기 때문에 Digital 포트가 아닌 아두이노의 Analog 포트를 이용해서 제어 해야 한다.  실습에서는 A0 포트를 이용한다.


▶ 실습 회로도면 :

  (이미지 클릭하면 확대 가능)



 

L293D 모터드라이버 IC의 연결을 위해 아래 이미지를 참고 하라.


▶ 부대품 목록 : 아두이노 보드, 브레드 보드 


▶ 부품 목록    : 스텝 모터(NK243-01AT, 모터뱅크, 1.8˚) , L293D, VR(100㏀~100㏀ 사이값)


▶ 실습 절차  : 

 1. 회로도를 참고하여 모터 와 부품들을 연결한다.
 
 2. 대부분의 스텝모터를 사용할 때는 아두이노 출력전원과 같은 단일전원 만으로는 스텝모터가 구동 되지 않는다. 따라서 추가 전원을 스텝모터에 따로 공급 해주어야 하는데, L293과 같은 모터 드라이버 IC를 사용하게 될 경우 추가 전원을 IC 8번 핀으로 공급해주면 된다.  (스텝 모터 마다 허용 공급 전원이 상이 함으로 허용 가능 전압을 확인 할 것, 본 실험에서는 5V를 입력함)

 3. 회로의 모든 GND(그라운드, '-' 단자)는 하나로 연결 한다. 

 4. VR(가변 저항의 크기와 유형은 여러가지 이기 때문에 갖고 있는 것으로 실험 하면 되며, 통상 가운데 단자(리드선)를 A0포트에 연결 시켜보면 변화된 값을 받을 수 있다. 



▶ 프로그램 (코드& 설명) : 


#include <Stepper.h>     // 스테핑 모터 라이브러리를 정의 한다

 int in1Pin = 12;            // [A] 상을 정의 한다

 int in2Pin = 11;            // [B] 상을 정의 한다

 int in3Pin = 10;            // [/A] 상을 정의 한다

 int in4Pin = 9;             // [/B] 상을 정의 한다 

 Stepper motor(200, in1Pin, in2Pin, in3Pin, in4Pin);


void setup() {

  pinMode(in1Pin, OUTPUT);  // [A] 상을 출력으로 지정한다

  pinMode(in2Pin, OUTPUT);  // [B] 상을 출력으로 지정한다

  pinMode(in3Pin, OUTPUT);  // [/A] 상을 출력으로 지정한다

  pinMode(in4Pin, OUTPUT);  // [/B] 상을 출력으로 지정한다

  motor.setSpeed(30);   // 스텝모터의 스피드 설정 함수 (RPM)

  Serial.begin(9600);        // 시리얼 통신 가능하도록 설정함

}

void loop() {


  int ReadVR=analogRead(A0); //아날로그 포트 A0에서 VR값 읽기 

  int motorSpeed = map(ReadVR,0,1023,0,100); //10bit값을 맵핑

  if (motorSpeed >0) {     // VR값이 0 이상 일 때 모터동작

    motor.setSpeed(motorSpeed); //맵핑된 VR값으로 속도값 입력

    motor.step(200);        //모터 스텝 수 지정(200X1.8=360)

    delay(1000);             //바퀴 구분을 위한 시간지연 (1)

  }

}




▶ 실행 영상 : 





▶ 아두이노 소스 코드 다운로드 : 



반응형
반응형

 【 아두이노 기초 】 #33 스텝(Step Motor)모터 제어2 (시리얼통신제어)

  지난시간 스텝모터를 정역 회전 시켜 보았다. 스텝모터 동작 원리를 참고하려면 여기 글을 참고하라. ( ☞ 스텝모터의 이해 )  이제는 스텝모터를 시리얼 통신을 통해 숫자 입력 만으로 정역회전 제어를 해볼 것이다. 


▶ 실험에 사용되는 스텝 모터 자료 ( 모터 뱅크, NK243-01AT )



▶ 스텝모터 구동 원리 





▶ 실습 목표 :  

 스텝모터를 시리얼 모니터 창을 통해 숫자 '1'을 입력 하면, 360도 한 바퀴 '정회전' 시키고, 숫자 '2'를 입력하면, 360도 한 바퀴 '역회전' 시켜보자. 그 이외의 숫자나 문자 입력시에는 다시 입력하라는 안내 메세지도 보내보도록 해보자. 


▶ 실습 회로도면 :

  (이미지 클릭하면 확대 가능)



 

L293D 모터드라이버 IC의 연결을 위해 아래 이미지를 참고 하라.


▶ 부대품 목록 : 아두이노 보드, 브레드 보드 


▶ 부품 목록    : 스텝 모터(NK243-01AT, 모터뱅크, 1.8˚) , L293D


▶ 실습 절차  : 

 1. 회로도를 참고하여 모터 와 부품들을 연결한다.
 
 2. 대부분의 스텝모터를 사용할 때는 아두이노 출력전원과 같은 단일전원 만으로는 스텝모터가 구동 되지 않는다. 따라서 추가 전원을 스텝모터에 따로 공급 해주어야 하는데, L293과 같은 모터 드라이버 IC를 사용하게 될 경우 추가 전원을 IC 8번 핀으로 공급해주면 된다.  (스텝 모터 마다 허용 공급 전원이 상이 함으로 허용 가능 전압을 확인 할 것, 본 실험에서는 5V를 입력함)

 3. 회로의 모든 GND(그라운드, '-' 단자)는 하나로 연결 한다. 

 4. 시리얼 통신창에서 전송속도가 '9600'으로 프로그램과 일치하는지 확인.


▶ 프로그램 (코드& 설명) : 


#include <Stepper.h>     // 스테핑 모터 라이브러리를 정의 한다

 int in1Pin = 12;            // [A] 상을 정의 한다

 int in2Pin = 11;            // [B] 상을 정의 한다

 int in3Pin = 10;            // [/A] 상을 정의 한다

 int in4Pin = 9;             // [/B] 상을 정의 한다 

 Stepper motor(200, in1Pin, in2Pin, in3Pin, in4Pin);


void setup() {

  pinMode(in1Pin, OUTPUT);  // [A] 상을 출력으로 지정한다

  pinMode(in2Pin, OUTPUT);  // [B] 상을 출력으로 지정한다

  pinMode(in3Pin, OUTPUT);  // [/A] 상을 출력으로 지정한다

  pinMode(in4Pin, OUTPUT);  // [/B] 상을 출력으로 지정한다

  motor.setSpeed(30);   // 스텝모터의 스피드 설정 함수 (RPM)

  Serial.begin(9600);        // 시리얼 통신 가능하도록 설정함

}

void loop() {


  int steps = 200;            // 스텝 수 지정(200X1.8=360)

  if (Serial.available()) {     // 시리얼 입력이 있는지 체크 함

  int direct = Serial.parseInt();시리얼로 받은 정수문자를 정수로 반환

   if (direct ==1) {           // 입력값이 ‘1’ 이면 정회전

     Serial.print("It's Normal Direction!\n\n");

     motor.step(steps);   }   // 지정된 스텝만큼 모터 정회전

   else if (direct ==2)  {     // 입력값이 ‘2’ 이면 역회전

     Serial.print("It's Reverse Direction!\n\n");

     motor.step(-steps);   }  // 지정된 스텝만큼 모터 역회전

   else                          // 그외 입력값은 아래 안내문자 출력

     Serial.print("You only choose '1' or '2'\n\n");  

   }

}



▶ 실행 영상 : 




▶ 아두이노 소스 코드 다운로드 : 



반응형
반응형

 【 아두이노 기초 】 #32 스텝(Step Motor)모터 정회전 역회전

  지난시간 스텝모터에 대한 이해를 위한 설명을 간단한 예제와 함께 자세히 설명을 하였으니, 먼저 참고하면 좋을 것이다.( ☞ 스텝모터의 이해 )  이어서 스텝모터를 가지고 본격적으로 동작실험을 진행해 보도록 하겠다. 


▶ 실험에 사용되는 스텝 모터 자료 ( 모터 뱅크, NK243-01AT )



▶ 스텝모터 구동 원리 





▶ 실습 목표 :  

 스텝모터를 정확히 360도 정회전 후 90도로 역회전 시켜보자. 이 동작을 계속 반복(loop 문으로 자동 반복 되도록) 한다. ( L293 모터 제어용 IC를 이용)


▶ 실습 회로도면 :

  (이미지 클릭하면 확대 가능)



 

L293D 모터드라이버 IC의 연결을 위해 아래 이미지를 참고 하라.


▶ 부대품 목록 : 아두이노 보드, 브레드 보드 


▶ 부품 목록    : 스텝 모터(NK243-01AT, 모터뱅크, 1.8˚) , L293D


▶ 실습 절차  : 

 1. 회로도를 참고하여 모터 와 부품들을 연결한다.
 
 2. 대부분의 스텝모터를 사용할 때는 아두이노 출력전원과 같은 단일전원 만으로는 스텝모터가 구동 되지 않는다. 따라서 추가 전원을 스텝모터에 따로 공급 해주어야 하는데, L293과 같은 모터 드라이버 IC를 사용하게 될 경우 추가 전원을 IC 8번 핀으로 공급해주면 된다.  (스텝 모터 마다 허용 공급 전원이 상이 함으로 허용 가능 전압을 확인 할 것, 본 실험에서는 5V를 입력함)

 3. 회로의 모든 GND(그라운드, '-' 단자)는 하나로 연결 한다. 



▶ 프로그램 (코드& 설명) : 


#include <Stepper.h>     // 스테핑 모터 라이브러리를 정의 한다

 int in1Pin = 12;            // [A] 상을 정의 한다

 int in2Pin = 11;            // [B] 상을 정의 한다

 int in3Pin = 10;            // [/A] 상을 정의 한다

 int in4Pin = 9;             // [/B] 상을 정의 한다

Stepper motor(200, in1Pin, in2Pin, in3Pin, in4Pin);

void setup() {

  pinMode(in1Pin, OUTPUT);  // [A] 상을 출력으로 지정한다

  pinMode(in2Pin, OUTPUT);  // [B] 상을 출력으로 지정한다

  pinMode(in3Pin, OUTPUT);  // [/A] 상을 출력으로 지정한다

  pinMode(in4Pin, OUTPUT);  // [/B] 상을 출력으로 지정한다

  motor.setSpeed(30);  // 스텝모터의 스피드 설정 함수 (RPM)

}

void loop() {

  // 정회전 구간

  int steps = 200;                // 스텝 수 지정(200X1.8=360)

  motor.step(steps);             // 지정된 스텝만큼 모터를 구동한다

  delay(1000);


  // 역회전 구간

  int steps = 50;                // 스텝 수 지정(50X1.8=90)

  motor.step(-steps);          // 스텝수 앞에 '-' 기호를 붙이면 역회전 동작

  delay(1000);

}



▶ 실행 영상 : 





▶ 아두이노 소스 코드 다운로드 : 



반응형
반응형

 【 아두이노 기초 】 #31 스텝(Step Motor)모터의 이해


  이번 시간부터는 스텝 모터를 제어해 보도록 하자.  먼저 스텝 모터를 잘 이해하는 것이 필요 한데,  처음에는 구조나 개념 이해가 어려울 수 있겠지만, 앞으로 여러 번의 실습을 차근차근해본다면 이해하는데 많은 도움이 될 것이다.


▶ 스텝모터 외형과 구조


《 스텝모터의 실제 내부 구조 모습 





- 스테핑 모터는 펄스 모양의 전압에 의해 일정 각도 회전하는 전동기이다.

- 회전 각도는 입력 펄스의 신호의 수에 비례하고, 회전 속도는 입력 펄스 신호의 주파수에 비례한다.
- 스테핑 모터를 구동하려면 사용하려는 모터는 몇 상 모터인지? 어떤 여자 방식을 이용하여 동작시킬 것인지를 고려해야 한다
- 모터를 구성하고 있는 권선 수에 따라 한 펄스당 회전하는 회전각이 달라진다.
- 스테핑 모터의 회전은 A /A   ,   B /B  상을 연속적으로 인가하면 모터가 회전한다.
- 스텝 각이 1.8도인 모터에  펄스를 100개 인가하면 모터는 180도를 회전하게 된다.  (200펄스 → 360도 회전)
- 스텝 모터의 구동방식에는 유니폴라(uni-polar)바이폴로(bi-polar) 구동방식이있다.

- 구동방식을 분류하면, 하나의 상(코일: A /A)을 구동하는 1상 여자 방식과, 2상 여자 방식, 1-2상 여자 방식이 있다.



▶ 스텝모터 구동 원리 설명




《 DC 모터의 구조 》

스텝모터의 원리를 이해하기 위해서는 DC모터의 구조를 파악하여 무엇이 다른지 파악하면 도움이 된다. 

 아래 이미지는 DC 모터의 구조로서, 전원공급기(Power Supply)에서 브러시를 통해 전류가 N극과 S극이 있는 로터 코일로 흐르게 되면, 플레밍의 왼손법칙에 의한 방향으로 로터코일이 힘을 받아 회전하게 된다.  




《 스텝 모터의 구조와 원리 》

 DC 모터와 달리 스텝모터는 전자석의 기능을 이용하여 로터(모터 회전축)를 돌리는 구조다.  아래 이미지에서 4번 코일에 전류를 흘리면 S극의 성질을 띄게 되어(전자석의 원리) , 중심 회전축인 로터(그림상의 가운데 자석)의 N극이 당겨지게 된다.  (자석에서 N극과 S극은 서로 당기고, 같은 극끼리는 밀어내는 성질은 잘 알고 있을 것이다.)  

 이제 4코일에 흘리던 전류를 멈추고 3번 코일에 전류를 흘리면 다시 중심 로터축의 N극이 3번 쪽으로 회전을 하게 된다. 다시 연속해서 3번 쪽 전류를 멈추고 2번 코일에 전류를 흘리면 로터는 다시 2번 코일의 위치로 회전 할 것이다. 

이런 식으로해서  4 → 3 → → 1 회전을 하면 시계방향으로 회전하게 되고,   → 2 → 3 → 4 로 전류가 흐러면 반시계방향으로 회전하게 된다. 



 아래 차트는 각 코일의 신호(전류) 상태를 시간을(타이밍) 기준으로 나타낸 것이다.   4번에 신호(전류 흘림)가 있을 때는 3번, 2번, 1번 코일에는 신호(전류)를 보내지 않는다.  그리고 그 다음 타이밍에 4번에 신호(전류)를 빼고 3번에만 신호를 넣는다. 이런식으로 1번까지 신호를 넣고 나면 그 다음 타이밍에 다시 4번 코일에 신호를 넣는 식이다. 아래는 이것을 나타낸 표이며, 타이밍 차트라하고 표현한다.   또한 한번에 코일 하나에만 전류를 공급하기 때문에 싱글 코일 여자방식 이라고 말한다 (Single-coil Excitation)  



1. 풀스텝 구동 ( full step drive) 

  스텝모터 구동은 아래처럼 풀스텝 구동이 기본이다. 4-3번 코일에 전류를 인가하고(통상적으로 여자 또는 여기된다는 말로 사용됨) 다음 스텝에서는 3-2번이 여자되고, 다음스텝에서는 2-1번이 여자,  그리고 1-4번이 여자 되면서 한 바퀴 회전이 되는 구동방식이다.    



2. 하프 스텝 구동 ( half step drive)

 아래 이미지는 하프 스텝 구동 방식으로, 첫 스텝에 4번 코일이 여자 되고, 그 다음 스텝에는 4-3번 코일이 동시에 여자되면서 로터 회전축이 두 개의 코일 사이에 위치시킬 수 있게 되며, 다음 스텝에서 3번 코일에만 여자 상태를 유지시키면서 회전축을 완전히 3번 코일 쪽으로 회전을 시키게 된다.  

이런 방식으로 풀스텝을 반으로 나뉘어 회전각을 더 작게 (정밀하게) 회전시킬 수 있다.  이를 하프스텝 구동이라 한다.  


3. 마이크로 스텝 구동 ( Micro step drive)

 마이크로 스텝 구동은 기존 하프 스텝에서 더 나아가 두 개 코일의 힘(전류)의 균형을 조절하여 중심 회전축의 위치를 더 세밀하게 스텝을 줄 수 있는 방식이다. 

예, 4번 코일과 3번 코일의 힘(전류)을 50%씩 동일하게 줄 때는 중심회전축이 4번과 3번 코일 정중앙에 위치하게 되고, 4번 코일에 40% , 3번 코일에 60%를 유지하면 3번 코일쪽으로 약간 회전한 상태로 중심축(로터)을 위치시킬 수 있게 된다. 이런식으로 모터마다 정해진 각(예, 1.8도)을 극복하고 더 세밀하게 스텝각을 나뉘어 컨트롤 할 수 있게 되고 이를 마이크로 스텝 제어라 한다. 마이크로 스텝제어가 되면 진동 및 소음을 크게 줄일 수 있다.  

 아래 이미지에서 처럼 물리적인 1스텝 각이 1.8도 인 스텝모터가 있다고 할 때 통상적으로 2등분, 4등분, 8등분, 16등분 하여 더 잘게 스텝각을 등분 할 수 있다. 

 아래 표는 마이크로 스텝 제어 등분에 따라, 360도 1회전을 하기위해 필요한 스텝수를 표시 하였다. 


 아래 이미지나 스텝 모터의 실사 내부 이미지를 보면 코일이 여러개의 다발 형태로 구성되어 있다. 이런 형태이기 때문에 스텝 각이 1.8도로 매우 작은 스텝모터를 볼 수 있는 것이다.  





▶ 실습 목표 :  

 스텝모터를 정확히 1회전 반복 제어를 시켜보자. 360도 회전 구분을 위해 중간에 1초 정도 딜레이 타임을 주도록 한다. ( L293 모터 제어용 IC를 이용한다)


▶ 실습 회로도면 :

  (이미지 클릭하면 확대 가능)



 대부분의 6핀(케이블) 스텝 모터는 아래와 같은 코일의 구조와 케이블 순서를 가진다. 간혹 과거 오래전 제품의 케이블 색은 아래와 다를 수 있으나, 순서는 아래와 같다고 보면 된다.  스텝모터의 모델 넘버를 구글링하여 제품스팩자료를 찾아 확인 할 수도 있다.

L293D 모터드라이버 IC의 연결을 위해 아래 이미지를 참고 하라.


▶ 부대품 목록 : 아두이노 보드, 브레드 보드 


▶ 부품 목록    : 스텝 모터(NK243-01AT, 모터뱅크, 1.8˚) , L293D


▶ 실습 절차  : 

 1. 회로도를 참고하여 모터 와 부품들을 연결한다.
 
 2. 대부분의 스텝모터를 사용할 때는 아두이노 출력전원과 같은 단일전원 만으로는 스텝모터가 구동 되지 않는다. 따라서 추가 전원을 스텝모터에 따로 공급 해주어야 하는데, L293과 같은 모터 드라이버 IC를 사용하게 될 경우 추가 전원을 IC 8번 핀으로 공급해주면 된다.  (스텝 모터 마다 허용 공급 전원이 상이 함으로 허용 가능 전압을 확인 할 것, 본 실험에서는 5V를 입력함)

 3. 회로의 모든 GND(그라운드, '-' 단자)는 하나로 연결 한다. 



▶ 프로그램 (코드& 설명) : 


#include <Stepper.h>     // 스테핑 모터 라이브러리를 정의 한다

 int in1Pin = 12;            // [A] 상을 정의 한다

 int in2Pin = 11;            // [B] 상을 정의 한다

 int in3Pin = 10;            // [/A] 상을 정의 한다

 int in4Pin = 9;             // [/B] 상을 정의 한다

Stepper motor(200, in1Pin, in2Pin, in3Pin, in4Pin);

void setup() {

  pinMode(in1Pin, OUTPUT);  // [A] 상을 출력으로 지정한다

  pinMode(in2Pin, OUTPUT);  // [B] 상을 출력으로 지정한다

  pinMode(in3Pin, OUTPUT);  // [/A] 상을 출력으로 지정한다

  pinMode(in4Pin, OUTPUT);  // [/B] 상을 출력으로 지정한다

  motor.setSpeed(30);  // 스텝모터의 스피드 설정 함수 (RPM)

}

void loop() {

  int steps = 200;                // 스텝 수 지정(200X1.8=360)

  motor.step(steps);             // 지정된 스텝만큼 모터를 구동한다

  delay(1000);

}


※ 보충 설명

- 스텝핑 모터는 DC전압이나 전류를 모터의 각 상의

 단자에 펄스 형태로 입력 시켜 줌으로서 일정한 각도를 회전하게 하는 모터이다.

-  setSpeed 값을 변화 시켜보라
- 정방향 / 역방향을 번갈아 회전시켜보라  (역방향은 스텝수 앞에 '-' 기호를 붙여 넣으면 역방향으로 회전하게 된다)
- 아래 코드를 참고하여 시리얼 통신창으로 스텝 값을 직접 입력해서 제어해보라

void loop() {

  if (Serial.available())   {

    int steps = Serial.parseInt();

    motor.step(steps);

 

}

 

▶ 실행 영상 : 






▶ 아두이노 소스 코드 다운로드 : 



반응형
반응형

【 아두이노 기초 】 #30 서보(Servo) 모터 제어 하기 응용

 지난 시간(http://rasino.tistory.com/147)에는 서보 모터를 정방향과 역방향 180도 회전제어를 해보았다. 

  이번 시간에는 빛에 따라 저항값이 변하는 CDS(광도전셀)를 이용해서 빛에 따라 서보모터를 제어 해보도록 하자.  이를 이용하면 매우 간단하게 빛에 따라 도어를 개폐하는 등의 작업이 가능하다. 



▶ SG90 및 각종 서보 모터 


《 SG90 》

《 HS311FS5106R 》

《 FS5106R - 무한 회전 서보 모터 》






▶ 실습 목표 :  

 CDS를 이용하여 빛의 밝기에 따라 서보모터를 0˚ 에서 180˚ 회전 시켜 본다.


▶ 실습 회로도면 :

  (이미지 클릭하면 확대 가능)








▶ 부대품 목록 : 아두이노 보드, 브레드 보드 


▶ 부품 목록    : 서보모터(SG90), CDS, 저항(220Ω)


▶ 실습 절차  : 

 1. 회로도를 참고하여 모터 와 부품들을 연결한다.
 
 2. CDS는 실습 상황에서는 크기(용량)는 상관 없으니 구할 수 있는 것을 사용한다.

 3. 회로의 모든 GND(그라운드, - 단자)는 하나로 연결 한다. 

 4. 회로에 서보모터 두 개 이상을 연결할 때는 아두이노 전원 만으로는 충분치 않으므로 외부 전원을 모터 전원선(+적색선, -흑색선) 에 직접 인가해야 정상적으로 동작 될 것이다. 






▶ 프로그램 (코드& 설명) : 


#include <Servo.h>

#define  ServoPin 9                      //  서보모터 연결할 핀 설정

Servo myservo;

int Angle = 0;

void setup() {

  myservo.attach(ServoPin);      

  Serial.begin(9600); 

}

void loop() {

  val=analogRead(TEMP); 

  int Val_light = analogRead(A0); // CDS로부터  전압 값  받아서 저장

  Serial.println(Val_light);

   Angle = map(Val_light, 1,42, 0, 180);  // 실 측정값으로 맵핑

   myservo.write(Angle);

   delay(50);                              // 서보모터가 동작하는 시간을 기다려 줌

}   


※ 보충 설명

1. CDS는 빛이 최대로 들어 올 때 저항 값이 ‘0’에 가깝고, 가장 어두울 때 저항 값을 무한대로 

가지는 소자다.

2. CDS와 저항에 인가되는 5V 전압 값으로부터, 빛의 밝기에 따른 CDS
저항 값의 변화로 인해 ‘A0’포트로 입력되는 전압이 조절 된다.

 

▶ 실행 영상 : 





▶ 아두이노 소스 코드 다운로드 : 



반응형
반응형

【 아두이노 기초 】 #29 서보(Servo) 모터 제어 하기 2


 지난 시간(http://rasino.tistory.com/146)에는 서보 모터를 한 방향으로만 180도를 움직여 보았다.  명령에 의해 180도가 움직인 후에는 반복 루프문에 의해 자동으로 0도 위치로 되돌아 온 후, 다시 180도로 제어되는 모습을 보았다.  


 이번 시간에는 서보모터의 자동 감김이 아니라 반대방향으로도 제어를 해볼 것이다.  즉 처음 시계방향으로 180도 회전 후,  다시 반시계방향으로 180도 회전하도록 프로그래밍을 해보자. 



▶ SG90 및 각종 서보 모터 


《 SG90 》

《 HS311FS5106R 》

《 FS5106R - 무한 회전 서보 모터 》






▶ 실습 목표 :  

 서보 모터를 0˚ 에서 180˚ 회전 시킨 후 다시 반대방향으로 180˚ 회전 하도록 프로그래밍 해보자.


▶ 실습 회로도면 :

  (이미지 클릭하면 확대 가능)


▶ 부대품 목록 : 아두이노 보드, 브레드 보드 


▶ 부품 목록    : 서보모터(SG90), 전해 콘덴서 (10uf~100uf )-생략 가능


▶ 실습 절차  : 

 1. 회로도를 참고하여 모터 와 부품들을 연결한다.
 
 2. 회로의 콘덴서는 생략 가능하며 일반적으로 모터류에 콘덴서를 달면 노이즈 제거(세라믹 콘덴서) 효과와, 전원보충(전해 콘덴서)의 효과가 있어 달게 되나, 간단한 실험을 위해서는 달지 않아도 실험에는 크게 지장이 없다. 

 3. 회로의 모든 GND(그라운드, - 단자)는 하나로 연결 한다. 

 4. 회로에 서보모터 두 개 이상을 연결할 때는 아두이노 전원 만으로는 충분치 않으므로 외부 전원을 모터 전원선(+적색선, -흑색선) 에 직접 인가해야 정상적으로 동작 될 것이다. 




▶ 프로그램 (코드& 설명) : 


#include <Servo.h>    // 전용 서보 라이브러리 사용

#define servoPin 9     // 서보 모터핀을 지정

Servo servo;      // 서보라이브러리 변수를 초기화한다

int angle=0;        // 서보모터 각도 변수 설정과 위치를 0˚ 초기화


void setup() {

  servo.attach(servoPin);   // 서보모터 핀을 설정한다 (현재 9번 핀)

}


void loop() {


  for ( angle=0;  angle < 180; angle++)  {  // 0도~180도 까지 1도씩 증가 

      servo.write(angle);   

      delay(30);       // 서보 모터의 각도가 변하는 것을 기다려준다

  }


  for ( angle=180;  angle > 0; angle--)  {  // 180도~0도 까지 1도씩 감소

      servo.write(angle);   // 서보모터의 각도 증가

      delay(30);       // 서보 모터의 각도가 변하는 것을 기다려준다

  }

}


※ 서보 모터는 입력 되는 신호의 펄스 폭에 따라 회전의 각도가 정해지는 방식의 모터이다. 위 그림 처럼 1.0ms에 가까울 수록 좌측 끝의 각도로 움직이고, 2.0ms에 가까울 수록 우측 끝으로 회전하게 된다. 1.5ms 이면 가운데 위치하고, 그 사이 사이 펄스 값에 따라 해당 위치로 회전을 하게 되는데, 1.0ms~2.0ms 타이밍이 정확히 일치 하는 것은 아니니 회로를 구성해놓고 실험을 통해서 확인 하면 되겠다. 

 

▶ 실행 영상 : 






▶ 아두이노 소스 코드 다운로드 : 



반응형
반응형

【 아두이노 기초 】 #28 서보(Servo) 모터 제어 하기 1

 이번 시간에는 서보 모터를 제어 해보도록 하자. 

서보 모터는 RC카의 방향제어나 로봇의 관절제어 등 360도 회전보다는 반복 회전 이면서, DC 모터 보다는 정밀한 제어를 요하는 곳에 사용된다. 



▶ SG90 및 각종 서보 모터 


《 SG90 》

《 HS311FS5106R 》

FS5106R - 무한 회전 서보 모터 》






▶ 실습 목표 :  

 서보 모터를 0˚ 에서 180˚ 회전 시켜 보도록 하자. 서보 모터가 프로그래밍에 의해 끝에(180˚ ) 다다르면 자동으로 원위치 된다. 



▶ 실습 회로도면 :

  (이미지 클릭하면 확대 가능)


▶ 부대품 목록 : 아두이노 보드, 브레드 보드 


▶ 부품 목록    : 서보모터(SG90), 전해 콘덴서 (10uf~100uf )-생략 가능


▶ 실습 절차  : 

 1. 회로도를 참고하여 모터 와 부품들을 연결한다.
 
 2. 회로의 콘덴서는 생략 가능하며 일반적으로 모터류에 콘덴서를 달면 노이즈 제거(세라믹 콘덴서) 효과와, 전원보충(전해 콘덴서)의 효과가 있어 달게 되나, 간단한 실험을 위해서는 달지 않아도 실험에는 크게 지장이 없다. 

 3. 회로의 모든 GND(그라운드, - 단자)는 하나로 연결 한다. 

 4. 회로에 서보모터 두 개 이상을 연결할 때는 아두이노 전원 만으로는 충분치 않으므로 외부 전원을 모터 전원선(+적색선, -흑색선) 에 직접 인가해야 정상적으로 동작 될 것이다. 




▶ 프로그램 (코드& 설명) : 


#include <Servo.h>    // 전용 서보 라이브러리 사용

#define servoPin 9     // 서보 모터핀을 지정

Servo servo;      // 서보라이브러리 변수를 초기화한다

int pos=0;        // 현재 각도를 저장할 변수를 지정한다


void setup() {

  servo.attach(servoPin);   // 서보모터 핀을 설정한다 (현재 9번 핀)

}


void loop() {

  for(pos=0; pos < 180; pos +=1)  {

      servo.write(pos);   // 서보모터의 각도를 1씩 증가

      delay(50);  }     // 서보 모터의 각도가 변하는 것을 기다린다

}


※ 서보 모터는 입력 되는 신호의 펄스 폭에 따라 회전의 각도가 정해지는 방식의 모터이다. 위 그림 처럼 1.0ms에 가까울 수록 좌측 끝의 각도로 움직이고, 2.0ms에 가까울 수록 우측 끝으로 회전하게 된다. 1.5ms 이면 가운데 위치하고, 그 사이 사이 펄스 값에 따라 해당 위치로 회전을 하게 된다. 



위 사진을 보면 하나의 신호 다음 이어지는 신호의 주기는 일정하지만, HIGH의 신호는 1ms~2ms 사이로 조절이 되어 HIGH 신호의 주기가 조절이 되는 되는 것으로 이 차이를 이용해 서보모터의 각도가 정해지는 것이다. 

PWM 파형의 폭이 1ms~2ms 사이일 때 서보모터가 0도~180도 사이로 움직이게 된다. 


 

▶ 실행 영상 : 






▶ 아두이노 소스 코드 다운로드 : 



반응형
반응형

【 아두이노 기초 】 #27 DC 모터 제어 하기 7

 지난 시간에 DC 모터를 버튼 하나를 이용하여 정회전과 역회전을 시켜보았다. 이번에는 버튼 하나를 더 추가 하여 버튼A를 누르면 좌회전,  버튼B를 누르면 우회전,  버튼 A와 B를 동시에 누르면 역회전을 하는 회로를 실습해보도록 하자. 이 실습을 거치게 되면, RC카의 기본적인 구동원리를 이해하게 된다. 


※ 모터 구동을 도와 주는 H브릿지 IC(L293D)에 대한 설명은 앞의 게시글을 참조.   ( # 24 DC 모터 제어하기 4 바로가기 )  


▶ L293D 모터 제어 드라이버 IC 핀배열 및 구성도 :





▶ 실습 목표 :  

  처음에는 두 개의 모터를 정회전(전진)시키고, 좌버튼(버튼A)을 누르고 있는 동안은 좌회전, 우버튼(버튼B)을 누르고 있는 동안은 우회전,  두 개의 버튼(A&B)을 동시에 누르면 역회전(후진) 시켜서,  버튼 두 개로 마치 RC자동차 처럼 동작 시킬 수 있다. 



▶ 실습 회로도면 :

  (이미지 클릭하면 확대 가능)


※ 모터에 공급되는 별도의 전원은 본인이 실험하는 모터의 용량에 맞추어(4.5V~35V사이) 입력을 하되, 가급적 낮은 전압을 공급하라. 높은 전압은 L293D IC의 높은 발열과 고장의 원인이 되니 주의 할 것!








▶ 부대품 목록 : 아두이노 보드, 브레드 보드


▶ 부품 목록    : L293D IC , DC 모터 x 2 , 푸쉬버튼 x 2 , 가변저항 10KΩ~500KΩ 사이 아무거나


▶ 실습 절차  : 

 1. 회로도를 참고하여 모터 와 부품들을 연결한다.
 
 2. 위 선연결 이미지를 참조 하여 회로 연결을 완성한다. 회로 연결에서 VCC1(IC의 16번 핀)에 아두이노의 +5V 단자를 연결하고, 모터 구동을 위한 VCC2(IC의 8번 핀)에는 모터 구동하기에 무리가 없는 4.5V~36V 사이의 별도 전원을 공급한다. ※ 구동 토크가 크거나, 비교적 큰 모터를 연결하게 되면 L293D IC에 발열이 심하게 나고 나가버릴 수 있으니 주의 할 것.

 3. 회로의 모든 GND(그라운드, - 단자)는 하나로 연결 한다. 

 4. 속도 제어를 위해서는 PWM신호 출력이 가능한 아두이노 포트를 사용해야 한다. (디지털 포트중 '~'물결 무늬가 표시된 포트가 PWM 출력이 가능한 포트 이다)  따라서 IC의 1번핀(Enable 단자)에는 반드시 아두이노의 PWM 포트를 연결하도록 한다. (~3,~5,~6,~9,~10,~11 포트 중 아무거나 사용해도 무방) 

 5. 모터 연결선 +,- 두 가닥은 PWM 기능과는 무관 함으로 디지털 포트 중, 아무 포트에 연결 하도록 한다. 

 6. 스위치 역활을 할 수 있는 푸쉬 버튼을 아두이노 남는 포트에 연결 한다. 
 (만약 푸쉬 버튼이 없을 경우 점퍼선으로 대체 가능하다)


▶ 프로그램 (코드& 설명) : 


#define btnFront 0  // '버튼정지' 변수를 '0'의 숫자값으로 정의

#define btnLeft  1

#define btnRight 2

#define btnBack  3

int in1=7;  

int in2=8;

int in3=12; 

int in4=13;

int btnL= 9;  // 모터 방향 변경을 위한 버튼 변수 선언

int btnR=10;  // 모터 방향 변경을 위한 버튼 변수 선언

int Direction; // 모터 방향 변수

int MotorL=6;  // 왼쪽 모터

int MotorR=11; // 오른쪽 모터

int pwm;      // 모터 회전 속도 변수


void setup() {

  pinMode(in1, OUTPUT);  // L293D의 1번 채널의 입력 1

  pinMode(in2, OUTPUT);  // L293D의 1번 채널의 입력 2

  pinMode(in1, OUTPUT);  // L293D의 2번 채널의 입력 1

  pinMode(in2, OUTPUT);  // L293D의 2번 채널의 입력 2

  pinMode(MotorA, OUTPUT);

  pinMode(MotorBOUTPUT);

  pinMode(btnL, INPUT_PULLUP); //좌버튼 입력을 내부풀업 입력으로설정

  pinMode(btnR, INPUT_PULLUP); //우버튼 입력을 내부풀업 입력으로설정    

}


void loop() {

  boolean btnL_HL = digitalRead(btnL);  // 좌측 버튼의 논리값 저장

  boolean btnR_HL = digitalRead(btnR); // 우측 버튼의 논리값 저장

  pwm = analogRead(A0)/4;                // 0~256 값을 넣기 위해 '/4' 


 // 버튼 누름에 따른 비교문(if)과 , Case 선택문 실행

if ( btnL_HL == HIGH && btnR_HL == HIGH) 

  {

  Direction = 0;  

  }

else if ( btnL_HL == LOW && btnR_HL == HIGH) 

  {

  Direction = 1;   

  }

else if ( btnL_HL == HIGH && btnR_HL == LOW) 

  {

  Direction = 2;   

  }

else if ( btnL_HL == LOW && btnR_HL == LOW) 

  {

  Direction = 3;   

  }


switch (Direction)

{

  case btnFront             // 전진  [ L, R 모터 정회전 ]

  {

  analogWrite(MotorL, pwm);

  digitalWrite(in1, HIGH);

  digitalWrite(in2, LOW);

  analogWrite(MotorR, pwm);

  digitalWrite(in3, HIGH);

  digitalWrite(in4, LOW);     

  break;      

  }

 

  case btnLeft :                 // 좌회전 [ L모터 정지, R모터 전진 ]

  {

  analogWrite(MotorL, pwm);

  digitalWrite(in1, LOW);

  digitalWrite(in2, LOW);

  analogWrite(MotorR, pwm);

  digitalWrite(in3, HIGH);

  digitalWrite(in4, LOW); 

  break;    

  }

case btnRight :                 // 우회전 [ L모터 전진, R모터 정지 ]

  {

  analogWrite(MotorL, pwm);

  digitalWrite(in1, HIGH);

  digitalWrite(in2, LOW);

  analogWrite(MotorR, pwm);

  digitalWrite(in3, LOW);

  digitalWrite(in4, LOW); 

  break;

  }

  case btnBack :                  // 후진 [ L, R 모터 역회전 ]

  {

  analogWrite(MotorL, pwm);

  digitalWrite(in1, LOW);

  digitalWrite(in2, HIGH);

  analogWrite(MotorR, pwm);

  digitalWrite(in3, LOW);

  digitalWrite(in4, HIGH); 

  break;

  } 

 }

}

 

▶ 실행 영상 : 





▶ 아두이노 소스 코드 다운로드 : 


DCmortorAB_2Button.ino




반응형
반응형

【 아두이노 기초 】 #26 DC 모터 제어 하기 6

 지난 시간에 DC 모터를 버튼을 이용하여 정회전과 역회전을 시켜보았다. 이번시간에는 모터 하나를 더 추가하여 동시에 두개의 모터의 정·역 제어를 해보도록 하자.  L283D의 나머지 채널 하나만 추가로 연결하면 되니 어렵지 않을 것이다.


※ 모터 구동을 도와 주는 H브릿지 IC(L293D)에 대한 설명은 앞의 게시글을 참조.   ( # 24 DC 모터 제어하기 4 바로가기 )  


▶ L293D 모터 제어 드라이버 IC 핀배열 및 구성도 :





▶ 실습 목표 :  

  두 개의 모터를 L283과 아두이노에 연결하고 같은 방향으로 전진을 시킨다. 푸쉬버튼을 누르고 있는 순간만 두 개의 바퀴가 역회전이 되도록 프로그래밍 하라.  ( 가변저항을 통한 속도제어도 가능하도록 하라)



▶ 실습 회로도면 :

  (이미지 클릭하면 확대 가능)








▶ 부대품 목록 : 아두이노 보드, 브레드 보드


▶ 부품 목록    : L293D IC, DC 모터 x 2, 푸쉬버튼, 가변저항 10KΩ~500KΩ 사이 아무거나


▶ 실습 절차  : 

 1. 회로도를 참고하여 모터 와 부품들을 연결한다.
 
 2. 위 선연결 이미지를 참조 하여 회로 연결을 완성한다. 회로 연결에서 VCC1(IC의 16번 핀)에 아두이노의 +5V 단자를 연결하고, 모터 구동을 위한 VCC2(IC의 8번 핀)에는 모터 구동하기에 무리가 없는 4.5V~36V 사이의 별도 전원을 공급한다. ※ 구동 토크가 크거나, 비교적 큰 모터를 연결하게 되면 L293D IC에 발열이 심하게 나고 나가버릴 수 있으니 주의 할 것.

 3. 회로의 모든 GND(그라운드, - 단자)는 하나로 연결 한다. 

 4. 속도 제어를 위해서는 PWM신호 출력이 가능한 아두이노 포트를 사용해야 한다. (디지털 포트중 '~'물결 무늬가 표시된 포트가 PWM 출력이 가능한 포트 이다)  따라서 IC의 1번핀(Enable 단자)에는 반드시 아두이노의 PWM 포트를 연결하도록 한다. (~3,~5,~6,~9,~10,~11 포트 중 아무거나 사용해도 무방) 

 5. 모터 연결선 +,- 두 가닥은 PWM 기능과는 무관 함으로 디지털 포트 중, 아무 포트에 연결 하도록 한다. 

 6. 스위치 역활을 할 수 있는 푸쉬 버튼을 아두이노 남는 포트에 연결 한다. 
 (만약 푸쉬 버튼이 없을 경우 점퍼선으로 대체 가능하다)


▶ 프로그램 (코드& 설명) : 


int in1=7;  

int in2=8;

int in3=12; 

int in4=13;

int MotorA=6;      // 좌측 모터

int MotorB=11;     // 우측 모터

int pwmA;

int btn=10;              // 모터 방향 변경을 위한 버튼 변수 선언

void setup() {

  pinMode(in1, OUTPUT);  // L293D의 1번 채널의 입력 1

  pinMode(in2, OUTPUT);  // L293D의 1번 채널의 입력 2

  pinMode(in1, OUTPUT);  // L293D2채널의 입력 1

  pinMode(in2, OUTPUT);  // L293D2채널의 입력 2

  pinMode(MotorA, OUTPUT);

  pinMode(MotorB, OUTPUT);

  pinMode(btn, INPUT_PULLUP); //아두이노 보드 내부 풀업저항 사용 코드

}

void loop() {

  boolean btnHL = digitalRead(btn);  //boolean0(LOW),1(HIGH)논리값

  pwmA = analogRead(A0)/4;           //0~256 값을 넣기위해 '/4'

  MotorSet(pwmA,btnHL);    // 모터의 속도와 방향을 설정하는 함수 실행

} 


void MotorSet(int pwmAboolean btnHL)  //속도값과 버튼상태 값 전달

{

  analogWrite(MotorApwmA);

  digitalWrite(in1, !btnHL); // A 모터 + LinebtnHL 반대 논리 값(!btnHL) 출력

  digitalWrite(in2, btnHL);  // A 모터  - LinebtnHL의 논리 출력

  analogWrite(MotorB, pwm);

  digitalWrite(in3, !btnHL); // B 모터 + LinebtnHL 반대 논리 값(!btnHL) 출력

  digitalWrite(in4, btnHL); //  B 모터  - LinebtnHL의 논리 값 출력

}


▶ 실행 영상 : 




▶ 아두이노 소스 코드 다운로드 : 


DCmortorAB_Button.ino




반응형
반응형

【 아두이노 기초 】 #25 DC 모터 제어 하기 5

 지난 시간에 H브릿지 IC(L293D)를 이용하여 모터를 회전시키고 속도조절을 해보았다. 이번시간에는 동일한 구성에 푸쉬버튼 스위치 하나만 추가하여 정회전으로 돌아가고 있는 모터를 역회전을 시켜보자


※ 모터 구동을 도와 주는 H브릿지 IC(L293D)에 대한 설명은 앞의 게시글을 참조.   ( # 24 DC 모터 제어하기 4 바로가기 )  


▶ L293D 모터 제어 드라이버 IC 핀배열 및 구성도 :





▶ 실습 목표 :  

  모터가 정회전 하고 있을 때 푸쉬 버튼 스위치를 누르면 역회전 하도록 프로그래밍 하라. ( 가변저항을 통한 속도제어도 가능하도록 하라)



▶ 실습 회로도면 :

  (이미지 클릭하면 확대 가능)






▶ 부대품 목록 : 아두이노 보드, 브레드 보드


▶ 부품 목록    : L293D IC, DC 모터, 푸쉬버튼, 저항 10KΩ~500KΩ 사이 아무거나


▶ 실습 절차  : 

 1. 회로도를 참고하여 모터 와 부품들을 연결한다.
 
 2. 회로 연결에서 VCC1(IC의 16번 핀)에 아두이노의 +5V 단자를 연결하고, 모터 구동을 위한 VCC2(IC의 8번 핀)에는 모터 구동하기에 무리가 없는 4.5V~36V 사이의 별도 전원을 공급한다. 

 3. 회로의 모든 GND(그라운드, - 단자)는 하나로 연결 한다. 

 4. 속도 제어를 위해서는 PWM신호 출력이 가능한 아두이노 포트를 사용해야 한다. (디지털 포트중 '~'물결 무늬가 표시된 포트가 PWM 출력이 가능한 포트 이다)  따라서 IC의 1번핀(Enable 단자)에는 반드시 아두이노의 PWM 포트를 연결하도록 한다. (~3,~5,~6,~9,~10,~11 포트 중 아무거나 사용해도 무방) 

 5. 모터 연결선 +,- 두 가닥은 PWM 기능과는 무관 함으로 디지털 포트 중, 아무 포트에 연결 하도록 한다. 

 6. 스위치 역활을 할 수 있는 푸쉬 버튼을 아두이노 남는 포트에 연결 한다. 
 (만약 푸쉬 버튼이 없을 경우 점퍼선으로 대체 가능하다)


▶ 프로그램 (코드& 설명) : 


int in1=7;  

int in2=8;

int MotorA=6;          // 모터 연결 핀을 정의한다.

int pwmA;

int btn=10;              // 모터 방향 변경을 위한 버튼 변수 선언

void setup() {

  pinMode(in1, OUTPUT);  // L293D의 1번 채널의 입력 1

  pinMode(in2, OUTPUT);  // L293D의 1번 채널의 입력 2

  pinMode(MotorA, OUTPUT);

  pinMode(btn, INPUT_PULLUP); //아두이노 보드 내부 풀업저항 사용 코드

}

void loop() {

  boolean btnHL = digitalRead(btn);  //boolean0(LOW),1(HIGH)논리값

  pwmA = analogRead(A0)/4;           //0~256 값을 넣기위해 '/4'

  MotorSet(pwmA,btnHL);    // 모터의 속도와 방향을 설정하는 함수 실행

} 


void MotorSet(int pwmA, boolean btnHL//속도값과 버튼상태 값 전달

{

  analogWrite(MotorA, pwmA);

  // 버튼이 그라운드와 연결 되어 있어 눌러지면 Low가 입력됨

  digitalWrite(in1, !btnHL); // 7번과 연결된 모터라인에 btnHL 반대값                                               // (!btnHL) 출력

  digitalWrite(in2, btnHL); // 8번과 연결된 모터라인에 btnHL 논리 값 출력

}


▶ 실행 영상 : 






▶ 아두이노 소스 코드 다운로드 : 


DCmortorA_Button.ino


반응형