반응형

【 아두이노 기초 】 #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’포트로 입력되는 전압이 조절 된다.

 

▶ 실행 영상 : 





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



반응형
반응형

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




반응형
반응형

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





반응형