반응형

【 아두이노모듈#23 Adafruit 사의 4채널 아두이노 모터쉴드 - 스텝모터 사용하기! #1  

 Adafruit 사의 모터쉴드는 L293D 모터드라이버를 2개를 H-bridge 구성한 4채널 모터드라이브 쉴드 보드이다. 

여기서 쉴드보드란, 아두이노 우노, 메가, 레오나르도 등에 적층하여 사용할 수 있는 확장형 보드라는 의미이다.  따라서 다른 형태의 모터드라이버 보드와는 달리 거추장스러운 선연결이 많이 줄어 들게 되는 장점이 있다.  또한, 서보모터(2개), DC 모터(4개) 혹은 스텝모터(2개)를 함께 연결하여 동시 구동이 가능한 확장성을 지닌 보드이다.  지난 시간 서보모터 연결에 이어, 이번엔 스텝모터 두 개를 연결해보도록 하자.  우선, 보편적으로 많이 사용하는 28BYJ-48 모터를 사용해볼 것이다.  그리고, 28BYJ-48 모터는 ULN2003 이라는 전용 드라이버가 있어서 이를 이용해서 모터쉴드에 연결해도 되고 사용도 간편하지만, Adafruit모터쉴드 자체가 드라이버 역할을 함으로 ULN2003 드라이버 없이 사용해볼 것이다. 

 Let's get it~!

 

▶ 선수학습 :

    1. [아두이노 기초#35] 스텝모터제어하기(28BYJ-48모터 기초) ☜ (클릭)

    2. [아두이노 모듈#22] Adafruit4채널아두이노 모터쉴드   ☜ (클릭)

 

▶ 아두이노 L293D 모터 드라이버 쉴드 스펙

▶ 스텝모터(2개) 제어하기

 

 (사전준비 )

 아래처럼 라이브러리 관리에서 Adafruit 사의 모터 드라이버를 다운받아 라이브러리에 추가 한다.(구글, 깃허브 등에서 다운로드도 가능)

 라이브러리 직접 다운로드 :

Adafruit-Motor-Shield.zip
0.01MB

 

▶ 회로연결 :

 아래와 같이 스텝모터 두 개를 연결한다.

위 이미지는 하단에 아두이노 보드가 2단으로 결합 된 모습임을 참고하라.

 ※ 주의 사항 :

 1. 모터 쉴드를 사용할 때의 전원 공급 방법은 a. 보드에 직접 전원을 연결 (이때, 쉴드의 'PWRJMP' 점퍼가 연결되어 있어야함).   b.  외부전원으로 공급 (이때, 쉴드의 'PWRJMP' 점퍼가 연결되어 있어야함).   c. 보드 전원과 외부전원 동시 공급 (이때, 쉴드의 'PWRJMP' 점퍼는 제거 해야함).

 2. 보드 전원(USB 케이블전원) 만으로는 위 두개의 스텝모터 구동이 안 되거나 부분적으로 동작이 안 될 수 있다.

 이럴 때는, 외부전원(별도의) 을 입력해주면 동작에 문제가 없으나, 사용하는 스텝모터의 정격용량(현재 5v)을 많이 초과 하는 경우 장시간 사용시 스텝모터가 과열되어 손상이 갈 수 있으니, 테스트를 통해 적정 전원을 공급해주어야 한다.

 3. 케이블 연결 순서에 주의 할 것.( 순서가 잘 못되면, 동작이 안 되거나, 반대방향으로 회전한다)

 

【 28BYJ28 스텝모터 부연 설명 

유니폴라 방식의 모터로서(1,3,4,2번으로 전류가 들어가며 5번(Red) 공통단자로 전류가 흘러나오는 연결 구조이다,  15  , 35, 45, 25  )

 색깔을 주의 깊게 보면서,  A → B → C → D의 순서대로 켜지도록 전류를 흘려주면 CW(시계방향),   

 D → C → B → A의 순서대로 흘려주면 CCW(반시계 방향) 으로 모터가 회전하게 된다. 

 

▶ 코딩 :

/* 스텝모터(28BYJ-48) 2대 구동하기                                   */   
/* 라이브러리 메니저 창에서 Ardafruit 검색후 AFMotor.h 설치 */
#include <AFMotor.h> 
// 1스텝당 회전각 5.625˚ * 64스텝 = 360˚
AF_Stepper motor1(64 , 1);  //1회전당 필요 스텝수(64), 연결 모터채널(모터1) 
AF_Stepper motor2(64 , 2);  //1회전당 필요 스텝수(64), 연결 모터채널(모터2) 

void setup() {
  Serial.begin(9600);           
  Serial.println("Stepper test!");
  motor1.setSpeed(200);  // 200 rpm  : 범위(0~255)
  motor2.setSpeed(200);   
}

void loop() {
  Serial.println("Single coil steps"); //SINGLE : 1개의 코일만 동작
  // ( stepsdirectionstyle)
  motor1.step(2048FORWARDSINGLE); // 2048 : 1회전에 필요한 스텝수
  motor2.step(2048, FORWARD, SINGLE);    
  // motorX.release():회전멈추고 전류를 차단함 
  delay(2000);  
  motor1.step(2048, BACKWARD, SINGLE); 
  motor2.step(2048, BACKWARD, SINGLE); 
  delay(2000);
  Serial.println("Double coil steps");
  motor1.step(2048, FORWARD, DOUBLE);  //DOUBLE : 2개의 코일 동작(토크상승)
  motor2.step(2048, FORWARD, DOUBLE);
  delay(2000);
  Serial.println("Interleave coil steps");
  motor1.step(2048, BACKWARD, INTERLEAVE); // INTERLEAVE: 1,2개 코일 번갈아 동작
  motor2.step(2048, BACKWARD, INTERLEAVE); // 약간의 부드러운 구동과,약간의 속도감소
  delay(2000);
  Serial.println("Micrsostep steps");
  motor1.step(2048, FORWARD, MICROSTEP); //MICROSTEP:부드러운회전(단,토크와 속도감소)
  motor2.step(2048, FORWARD, MICROSTEP); 
}

 

【코드 다운로드】

28BYJ-48_2motor.zip
0.00MB

▶ 동작 영상 :

(유튜브 고화질로 보기-옵션:1080P영상)

 https://youtu.be/93dd7Gjszwo

 

(카카오로 보기)

 

반응형
반응형

【 아두이노모듈#22 Adafruit 사의 4채널 아두이노 모터쉴드 - 서보모터 사용하기!  

 Adafruit 사의 모터쉴드는 L293D 모터드라이버를 2개를 H-bridge 구성한 4채널 모터드라이브 쉴드 보드이다. 

여기서 쉴드보드란, 아두이노 우노, 메가, 레오나르도 등에 적층하여 사용할 수 있는 확장형 보드라는 의미이다.  따라서 다른 형태의 모터드라이버 보드와는 달리 거추장스러운 선연결이 많이 줄어 들게 되는 장점이 있다.  또한, 서보모터(2개), DC 모터(4개) 혹은 스텝모터(2개)를 함께 연결하여 동시 구동이 가능한 확장성을 지닌 보드이다.  이번 시간부터 서보모터 부터 실습하여 DC모터 4개를 구동할 수 있는 RC Car 구동에 활용해 볼 예정이다. 

 Let's get it~!

▶ 아두이노 L293D 모터 드라이버 쉴드 스펙

아두이노 우노, 레오나르도, 메가, 듀에 보드 위에 결합 가능한 핀구조이다.

[ 주요 스펙-특징 ]

- 모터 채널당 최대 600mA 출력을 내보낼 수 있다. (합산 전류 최대치는 1.2A-보호회로 내장) 

- 5V Servo 모터 2개를 연결 사용가능하다 (High resolution)

- 동시에 4개의 DC 모터 또는 2개의 Stepper 모터 또는 2개의 Servo 모터 구동이 가능하다.

- DC 모터 구동시 양방향 구동과 8bit의 속도제어가 가능하다 (speed : 0~255)

- 4.5V~36V DC 모터 제어가 가능하다.

- 아두이노 보드와 연결된 리셋 단자가 있다.

- 모터구동을 원활하게 하기 위하여 위부 전원 입력단자가 별도로 있다.

각종 모터를 연결한 모습

 

▶ 서보모터(2개) 제어하기

 

▶ 사전준비 :

 아래처럼 라이브러리 관리에서 Adafruit 사의 모터 드라이버를 다운받아 라이브러리에 추가 한다.(구글, 깃허브 등에서 다운로드도 가능)

 라이브러리 직접 다운로드 :

Adafruit-Motor-Shield.zip
0.01MB

 

▶ 회로연결 :

 아래와 같이 서보모터 두 개를 연결한다.

 ※ 외부전원 +, GND 구분을 잘하여 연결하고, 가급적 6~7V 이상의 전원을 공급해준다. (AA x 4개도 가능)

    위 이미지는 하단에 아두이노 보드가 결합 된 모습임을 참고하라.

 

▶ 코딩 :

 

/* 모터쉴드에 서보모터 2대 연결 실습 코드              */

#include     // Adafruit의 L293D모터쉴드 라이브러리
#include       // 서보모터 라이브러리
Servo servo1;    // 서보모터 1 정의
Servo servo2;    // 서보모터 2 정의

void setup() {
  Serial.begin(9600);    
  servo1.attach(9); // 서보모터 1 연결 (9번핀-고정)
  servo2.attach(10); // 서보모터 2 연결 (10번핀-고정)
}
void loop() {
  servo1.write(0);    // 서보모터1을 0도의 위치로 이동
  delay(1000);        // 1초 시간 지연
  servo1.write(180);  // 서보모터1을 180도의 위치로 이동
  delay(1000);        // 1초 시간 지연
     
  servo2.write(0);    // 서보모터2를 0도의 위치로 이동
  delay(1000);        // 1초 시간 지연
  servo2.write(180);  // 서보모터2를 180도의 위치로 이동
  delay(1000);        // 1초 시간 지연
}

 

【코드 다운로드】

01_2Servo-motor_shield.zip
0.00MB

▶ 동작 영상 :

반응형
반응형

【 아두이노모듈#15 L9110S #1(모터 드라이버) 모듈 사용하기

 

 아두이노로 스텝모터나 DC 모터를 제어하기 위해서는 TR이나 IC를 사용하여, H-bridge (h-브릿지) 회로를 구성하여 정역(정회전, 역회전) 제어를 하게 된다. 직접 TR이나 IC를 이용해서 따로 구성할 수 있지만 다소 번거롭다. 이를 해결해 줄 수 있는 모터 구동 모듈이 있어서 사용법을 간단히 소개하려 한다.  바로 L9110S 모듈이며, DC모터는 2개를 , 스텝모터는 1개(4선 2상)를 각각 제어 할 수 있다. 

L298 드라이버 모듈에 대해서도 포스팅 하였지만, 이 모듈보다 가격이 저렴(700원대)하고, 크기와 부피가 작아서 작은 크기의 작품을 만들려고 할 때 적합하다고 할 수 있겠다.

 

 

▶ 선수 학습 :

      1. [아두이노 기초#24] DC모터 제어하기 4 (H-bridge 참조)  ☜ (클릭)

 

 L9110S 모듈 세부 스팩

 

▶ 실습 목표 :  

 1. [ L9110S 모터 모듀을 이용하여 2개의 DC모터 방향을 제어 할 수 있다

 2. [ 아두이노의 아날로그 출력 함수를 이용하여 속도를 조절 해 볼 수 있다.]

 

▶ 실습 회로도면 :  L9110S 모터드라이버 모듈 연결도
  (이미지 클릭하면 확대 가능)

L9110S 모터드라이버 모듈 연결도

 

▶ 실습 절차  : 

 

1.   부품을 준비하여 위와 같은 회로를 구성한다. 

2.   아래 코드를 작성하고 프로그램을 로딩 후 실행시킨다.(혹은 첨부파일 다운)

3.  먼저 디지털 포트를 사용하여 방향제어를 해본다. (코딩1)

4.  코딩2를 참고하여 속도제어 실습도 해본다. (코딩2)

 

▶ 프로그램 코드 및 설명 1 : 

/* L9110S 모듈 제어 해보기  (방향제어 : 코딩1) */

int motorA1 =  5; 
int motorA2  = 6; 
int motorB1 =  9; 
int motorB2 =  10; 

 

void setup ( ) {  

  pinMode( motorA1 , OUTPUT);
  pinMode( motorA2 , OUTPUT);
  pinMode( motorB1 , OUTPUT);
  pinMode( motorB2 , OUTPUT);

}

void loop ( )  {

  // 필요한경우 아래 코드에 따라 모터의 연결을 조정해야한다. 

  // <전진>

  digitalWrite( motorA1 , HIGH);
  digitalWrite( motorA2 , LOW);
  digitalWrite( motorB1 , HIGH);
  digitalWrite( motorB2 , LOW);

  delay(2000);

// 후진
  digitalWrite( motorA1 , LOW);
  digitalWrite( motorA2 , HIGH);
  digitalWrite( motorB1 , LOW);
  digitalWrite( motorB2 , HIGH);

  delay(2000);

 

 // 좌회전
  digitalWrite( motorA1 , HIGH);
  digitalWrite( motorA2 , LOW);
  digitalWrite( motorB1 , LOW);
  digitalWrite( motorB2 , HIGH);
  delay(2000);

 

 // 우회전
  digitalWrite( motorA1 , LOW);
  digitalWrite( motorA2 , HIGH);
  digitalWrite( motorB1 , HIGH);
  digitalWrite( motorB2 , LOW);
  delay(2000);

 

 // 정지

  digitalWrite( motorA1 , LOW);
  digitalWrite( motorA2 , LOW);
  digitalWrite( motorB1 , LOW);
  digitalWrite( motorB2 , LOW);
  delay(2000);

}

 

 

▶ 프로그램 코드 및 설명 2: 

/* L9110S 모듈 제어 해보기   (방향과 속도 제어 : 코딩2) */

int motorA1 =  5; 
int motorA2  = 6; 
int motorB1 =  9; 
int motorB2 =  10; 

int  speed = 255 ;   // speed :  0 ~ 255

 

void setup ( ) {  

  pinMode( motorA1 , OUTPUT); 
  pinMode( motorA2 , OUTPUT); 
  pinMode( motorB1 , OUTPUT); 
  pinMode( motorB2 , OUTPUT);

}

void loop ( )  {

  // 필요한경우 아래 코드에 따라 모터의 연결을 조정해야한다. 

  // <전진>

  analogWrite( motorA1 , 150);  // 숫자 값으로 속도 조절
 
analogWrite( motorA2 , 0);
 
analogWrite( motorB1 , 150);
 
analogWrite( motorB2 , 0);

  delay(2000);

// <후진>
  analogWrite( motorA1 , 0);
 
analogWrite( motorA2 , speed);
 
analogWrite( motorB1 ,  0);
 
analogWrite( motorB2 , speed);

  delay(2000);

 // <좌회전>
 
 analogWrite( motorA1 ,  speed);
 
analogWrite( motorA2 , 0);
 
analogWrite( motorB1 ,  0);
 
analogWrite( motorB2 , speed);

  delay(2000);

 // <우회전> 
 
 analogWrite( motorA1 ,  0);
 
analogWrite( motorA2 , speed);
 
analogWrite( motorB1 ,  speed);
 
analogWrite( motorB2 , 0);

  delay(2000);

 // <정지>

  digitalWrite( motorA1 , 0);
 
digitalWrite( motorA2 , 0);
 
digitalWrite( motorB1 , 0);
 
digitalWrite( motorB2 , 0);
  delay(2000);

}

 

▶ 아두이노 파일다운 :

(다운받아서 압축을 풀어 사용하세요)

# 1.  <코딩 1>

L9110S_Basic_OK.zip
0.00MB

 

# 2.  <코딩 2>

L9110S_Speed_OK.zip
0.00MB

반응형
반응형

【 아두이노 기초 】 #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


반응형
반응형

【 아두이노 기초 】 #24 DC 모터 제어 하기 4

 이번 시간 부터는 DC모터를 RC카 등에 응용 할 수 있도록 본격적으로 제어해보는 실습을 가져보자. 


※ 일반적으로 소형 DC 모터라도 기어박스가 달린 모터를 제어할 때는 소모전류를 체크 해야 한다. 아두이노 포트의 출력은 40mA로 매우 제한 적이기 때문에 포트에서 직접 모터로 출력을 연결 할 경우 아두이노 포트나 주변회로가 손상 될 수 있으며 모터 또한 미약한 전류로는 돌릴 수 없게 된다. 


 이를 보완 하기 위해 모터에 충분한 전류를 공급해 줄 수 있는 IC가 개발되어 있다.  이런 모터 드라이버용 IC (본 실험에서는 L293D) 를 이용해서 모터를 구동해 보고자 한다. 


 모터제어의 핵심은 정회전으로 돌릴 것인가? 역회전으로 돌릴 것인가? 같은 "방향제어"와 "속도 제어" 인데,  H 브릿지라고 불리는 아래 그림과 같은 간단한 회로를 통해 방향제어가 가능하며, 이런 H 브릿지 회로가 두 개(2채널) 들어가 있는 IC가 바로 L293D IC이며, PWM 신호입력을 통해 속도 제어 까지 가능하다. 


※ H - 브릿지 회로 (모터 구동 회로)



위 그림에서 스위치 1번과 4번을 닫을 때(2,3번은 오픈) 전류의 흐름으로 인해 한 방향으로 회전 하기 시작하며 , 방향을 반대 방향으로 전환 하려고 할 때는 2번과 3번 스위치를 닫으면(1, 4번은 오픈) 방향전환이 이루어진다. 

 만약 그 이외의 경우는(1,2번 닫고 3,4 오픈 /  1,2번 오픈 3,4 닫기 / 모두 오픈) 모터가 회전 하지 않는다(정지)




회로 연결도가 알파벳 H를 닮았다 하여 'H-bridge' 라고 하며, 아래 그림의 TR 처럼 베이스 단자를 통해 스위치의 ON/OFF를 전자적으로 제어 할 수 있다.


이러한 H브릿지 기능을 포함 하고 속도 제어 까지 가능 하도록 만들어진 IC가 바로 L293D (시리즈) IC이며,  이를 활용하여 DC 모터를 제어해 보도록 하자.




▶ L293D 모터 제어 드라이버 IC :



H 브릿지 회로가  2개(2채널) 들어가 있으며, IC 이미지에서 처럼 좌우측 으로 구분 되어 있다.  


정방향 회전 (정, 역방향은 연결에 따라 기준이 달라짐)

 위 그림을 통해 왼쪽의 1번 채널을 살펴 보자.  Input 1으로(2번 핀,1A)  High 신호가 입력이 되면 VCC2(8번핀) 으로 연결된 별도 공급의 모터 전원이 3번핀(1Y)에서 나와서 DC motor를 거치고 6번핀(2Y) 으로 빠져 나가면서 모터를 (예를 들어)정방향으로 회전 시킨다.  이때 Input 2 (7번핀, 2A)는 Low 신호 여야 한다. 


 방향 회전 

 Input 1으로(2번 핀,1A)은 Low 신호 , Input 2 (7번핀, 2A)는 High 신호 입력이 되면 VCC2(8번핀) 으로 연결된 별도 공급의 모터 전원이 6번핀(2Y)에서 나와서 아까와는 반대 방향으로 DC motor를 거치고 3번핀(1Y)으로 빠져 나가면서 모터를 역방향 회전 시킨다.  


L293D IC는 이렇게 제어 가능한 H-브릿지 채널이 구조상 좌측에 한 개 , 우측에 한 개,  총 두 개로 구성되어진 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 기능과는 무관 함으로 디지털 포트 중, 아무 포트에 연결 하도록 한다. 


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


int in1=7;  

int in2=8;

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

int pwmA;


void setup() {

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

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

  pinMode(MotorA, OUTPUT);


}

void loop() {

  digitalWrite(in1, HIGH); 

  digitalWrite(in2, LOW);  

  // 정방향(in1=HIGH ,in2= LOW)

  // 역방향(in1=LOW ,in2= HIGH)

  // 모터선 연결에 따라 반대 방향이 될 수 있다.  

  

  pwmA = analogRead(A0)/4; // 속도 제어, 0~256 값을 넣기위해 '/4'함

  analogWrite(MotorA,pwmA); // 모터를 회전시킴 & 속도를 결정   

  delay(20);                         //출력값이 적용 될 수 있는 시간을 준다 

}


▶ 실행 영상 : 






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


DCmortorA.ino



반응형
반응형

【 아두이노 기초 】 #22 DC 모터 제어 하기 3

 이번 시간은 DC모터를 시리얼 통신(창)을 이용해 제어해보자, 입력값에 따라 속도 조절도 가능하다.

(관련 내용은 앞의 DC모터 자료를 참고 : http://rasino.tistory.com/133 )


※ 모터를 다룰 때는 주의 할 것은 코일로 이루어진 모터에 전류를 흘릴 경우 반대방향으로 기전력(역기전력)이 발생하게 되는데 이를 방지하기 위해 모터와 병렬로 다이오드를 반드시 달아 주어야 한다.  그래야 주변 회로(TR, FET 등)가 손상되지 않는다. 



▶ DC 모터 제어 회로도 :




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


▶ 부품 목록    : DC 모터, 100Ω (전류 제한용도), NPN형 TR, 정류용 다이오드(1N4001~4007, 아무거나) 


▶ 실습 절차  : 

 1. 회로도를 참고하여 모터 와 부품들을 연결한다.
 
 2. 저항은 전류제한(+,- 쇼트 방지용) 용도로 사용하기 위함 임으로 100옴 
    정도의 작은 저항을 사용하면 된다. 따라서 만약 100옴의 저항이 없다면, 
    50옴, 80옴, 120옴, 200옴 등의 값이 작은 저항을 사용하면 문제가 없다. 

 3. TR은 스위치 작용을 위해 연결 한 것임으로 모델 종류에 상관 NPN 타입을
  사용하면 된다. 단, TR의 극성에 주의 한다. B(베이스 단자), 
   E(에이터 단자), C(콜렉터 단자)

 4. 아래 프로그램 코드를 작성해서 실행해 본다.

 5. 아래와 같이 시리얼 모니터 창을 열어 회전값을 입력해 본다.



▶ 실습 목표  : 




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


int motorPin =3;    // 모터 연결 핀을 정의한다.

void setup() {

   pinMode(motorPin, OUTPUT);   //모터 연결핀을 출력으로 설정

   Serial.begin(9600);        // 시리얼 통신을 초기화 한다

   Serial.println("Speed 0 to  255"); // 입력범위를 화면에 표시한다

}

void loop() {

  if(Serial.available())    // 시리얼 데이터가 있으면 실행한다

  {

    int speed = Serial.parseInt(); // 시리얼 입력 데이터를 정수로 저장

    if(speed> 0 && speed <= 255)

    {

      analogWrite(motorPin,speed); // 시리얼 입력데이터만큼 출력

      Serial.println(speed);   //현재 스피드를 출력한다

    }

  } 

}




▶ 실행 영상 : 







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


serial_Input_motorControl.ino





반응형
반응형

【 아두이노 기초 】 #19 DC 모터 제어 하기 2


 DC모터를 제어 해보자!  DC 모터는 전류가 흐르는 방향으로 회전을 하기 때문에 포트의 출력을 제어하여 모터의 회전 방향을 결정할 수 있다.

이번에는 가변 저항을 연결하여 모터의 속도를 제어 해보도록 하자!   


※ 모터를 다룰 때는 주의 할 것은 코일로 이루어진 모터에 전류를 흘릴 경우 반대방향으로 기전력(역기전력)이 발생하게 되는데 이를 방지하기 위해 모터와 병렬로 다이오드를 반드시 달아 주어야 한다.  그래야 주변 회로(TR, FET 등)가 손상되지 않는다. 



▶ DC 모터 제어 회로도 :




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


▶ 부품 목록    : DC 모터, 100Ω (전류 제한용도), NPN형 TR, 정류용 다이오드(1N4001~4007, 아무거나) , 100KΩ (10Ω~500KΩ 등, 가지고 있는 가변저항 사용)


▶ 실습 절차  : 

 1. 회로도를 참고하여 모터 와 부품들을 연결한다.
 
 2. 저항은 전류제한(+,- 쇼트 방지용) 용도로 사용하기 위함 임으로 100옴 
    정도의 작은 저항을 사용하면 된다. 따라서 만약 100옴의 저항이 없다면, 
    50옴, 80옴, 120옴, 200옴 등의 값이 작은 저항을 사용하면 문제가 없다. 

 3. TR은 스위치 작용을 위해 연결 한 것임으로 모델 종류에 상관 NPN 타입을
  사용하면 된다. 단, TR의 극성에 주의 한다. B(베이스 단자), 
   E(에이터 단자), C(콜렉터 단자)

 4. 아래 프로그램 코드를 작성해서 실행해 본다.



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


int motorPin =3;                     // 모터 연결 핀을 정의한다.

void setup() {

 pinMode(motorPin, OUTPUT);   //모터 연결 핀을 출력으로 지정함

}

void loop() {

 int reading=analogRead(A3);   // 아날로그포트에서 최대 2^8 (256)      // 값을 읽어온다

 digitalWrite(motorPin,HIGH);   // 읽어 들인 데이터 만큼 HIGH유지

 delay(reading);                    

 digitalWrite(motorPin,LOW);  //(255-읽어온 데이터)만큼 LOW 유지

 delay(255-reading);

}


  가변저항으로 인해 분배되어 들어 오는 값, 즉 전압에 의한 레벨값으로 2^8비트 값(최대값이 256 값-0~255) 을 읽어 들이는데 이 값을 가지고 PWM 신호 듀티비를 조절하여 모터의 속도를 조절 하는 방식이다.

 

( PWM 신호와 같이 듀티비(High와 Low 신호 비율) 로 모터의 회전 속도를 제어하는 것이다. 

 High 신호가 Low 신호 보다 출력 시간을 길게 하면 상대적으로 모터가 빨리 회전 한다.


▶ 실행 영상 : 





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


sketch_motor2_control.ino


반응형

【 아두이노 기초 】 #18 DC 모터 제어 하기 1

카테고리 없음 2018. 8. 30. 19:28 Posted by 엑소더스팩토리
반응형

【 아두이노 기초 】 #18 DC 모터 제어 하기 1



 DC모터를 제어 해보자!  DC 모터는 전류가 흐르는 방향으로 회전을 하기 때문에 포트의 출력을 제어하여 모터의 회전 방향을 결정할 수 있다.   


※ 모터를 다룰 때는 주의 할 것은 코일로 이루어진 모터에 전류를 흘릴 경우 반대방향으로 기전력(역기전력)이 발생하게 되는데 이를 방지하기 위해 모터와 병렬로 다이오드를 반드시 달아 주어야 한다.  그래야 주변 회로(TR, FET 등)가 손상되지 않는다. 



DC 모터 제어 회로도 :








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


▶ 부품 목록    : DC 모터, 100Ω (전류 제한용도), NPN형 TR, 정류용 다이오드(1N4001~4007, 아무거나) 



▶ 실습 절차  : 

 1. 회로도를 참고하여 모터 와 부품들을 연결한다.
 
 2. 저항은 전류제한(+,- 쇼트 방지용) 용도로 사용하기 위함 임으로 100옴 
    정도의 작은 저항을 사용하면 된다. 따라서 만약 100옴의 저항이 없다면, 
    50옴, 80옴, 120옴, 200옴 등의 값이 작은 저항을 사용하면 문제가 없다. 

 3. TR은 스위치 작용을 위해 연결 한 것임으로 모델 종류에 상관 NPN 타입을
  사용하면 된다. 단, TR의 극성에 주의 한다. B(베이스 단자), 
   E(에이터 단자), C(콜렉터 단자)

 4. 아래 프로그램 코드를 작성해서 실행해 본다.



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


int motorPin =3;    // 모터 연결 핀을 정의한다.


void setup() {

   pinMode(motorPin, OUTPUT);   //모터 연결핀을 출력으로 설정한다

}


void loop() {

  // PWM 형태로 모터를 구동한다( duty rate= 50)

  digitalWrite(motorPin,HIGH);    // 모터 연결핀에 5[v]를 출력한다

  delay(10);                      // 10ms 시간 지연한다

  digitalWrite(motorPin,LOW);     // 모터 연결핀에 0[v]를 출력한다

  delay(10);                      // 10ms 시간 지연한다

}


  PWM 신호와 같이 듀티비(High와 Low 신호 비율) 로 모터의 회전 속도를 제어하는 것이다. 

 High 신호가 Low 신호 보다 출력 시간을 길게 하면 상대적으로 모터가 빨리 회전 한다. 


▶ 실행 영상 : 





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


sketch_motor1.ino

반응형