반응형

 【 아두이노 센서#4】 TMP36 온도센서 #2





▶ 실험에 사용되는 온도센서 자료 ( TMP36 ) 


아래는 온도 값과 출력전압과의 상관관계를 나타낸 그래프이다.

예를 들어 TMP36센서는 주변 온도가 50도씨 일때 출력단자로 1.0V의 전압값을 출력한다는 뜻이다.


 그래프특성을 살펴보고 자신이 사용하고자 하는 환경에 맞는 센서를 사용하면 되며,  통상적으로 활용 온도 범위가 넓은 TMP36센서를 많이 사용한다. 


[ 실습에 사용될 RGB LED(3색LED) 구조 및 사양 ]


RGB LED 는 그림에서 보듯 3가지 색 LED가 한 몸체에 구성되어 있다고 이해하면 쉽다.

다만, 단자하나는 공통단자로 연결되어 있고, LED의 마이너스(-) 극이 공통단자로 되면 Common 케소드(음극),    플러스(+)극이 공통단자로 되면 Common 애노드(양극)이 된다. (통상적으로 부품의 다리 길이가 제일 긴 단자가 공통단자다)


따라서 부품을 사용하기전에 자신의 부품이 컴온 캐소드 타입인지? , 컴온 애노드 타입인지?  반드시 확인해야 하며, 단자의 색상 위치도 그림과 순서가 다를 수 있으니 멀티테스터기 혹은? 3V 정도의 낮은 전원을 가하여 색의 위치를 사전에 확인하면 좋을 것이다. 



▶ 실습 목표 :  


 온도 범위에 따라 LED의 색을 다르게 표시하라. 

[예, 수치 값이 165 이하는 블루색, 165~175는 그린색,  그 이상은 레드색]


▶ 실습 회로도면 :

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





▶ 실습 절차  : 

1. 안정적으로 사용하기 위해서는 LED 공통단자에 220Ω정도의 저항을 
 달아 준다.

2.LED 3개를 사용 하여 회로를 구성하여도 무방하며이때에도 각각 
 저항을 연결해주는 것이 좋다.




▶ 프로그램 코드 및 설명 : 


const int RLED=9;            //9번 핀을 사용하는 빨간색 BLED 상수정의

const int GLED=10;         //10번 핀을 사용하는 초록색 GLED 상수정의

const int BLED=11;         //11번 핀을 사용하는 파란색 RLED 상수 정의

const int TEMP=0;                        //아날로그 입력 0번 핀을 상수 정의

const int LOWER_BOUND=165;      // 온도 하한 값을 정의 함

const int UPPER_BOUND=175;       // 온도 상한 값을 정의 함

int val=0;                          // 온도 센서의 현재 값을 저장하는 val 변수 선언

void setup() {

  pinMode(RLED, OUTPUT);       // RLED를 출력으로 지정

  pinMode(GLED, OUTPUT);       // GLED를 출력으로 지정

  pinMode(BLED, OUTPUT);      // BLED를 출력으로 지정

}

void loop() {                        // 공통단자가 '-'인 RGB LED 부품 사용

  val=analogRead(TEMP); 

  Serial.println(val);

  float mVoltage = val*5000.0/1024.0;     // 센서의 출력값을 전압값으로 변환

  float TempDotC = (mVoltage - 500) / 10.0;  // 전압값을 Tmp36식에 의해 섭씨온도로변환

  Serial.print(TempDotC);

  Serial.println("℃\n");

  delay(500);

  if(val < LOWER_BOUND)   {         // 아래쪽 경계 값 보다 작다면

    digitalWrite(RLED,HIGH);

    digitalWrite(GLED,HIGH);      val=analogRead(TEMP);     // 하위 경계선 값 이하이면 Blue LED ON

  if(val < LOWER_BOUND)   {

    digitalWrite(RLED, LOW);

    digitalWrite(GLED, LOW);

    digitalWrite(BLED, HIGH);      //  켜려고 하는 LED HIGH 값 지정

  }

  else if (val>UPPER_BOUND) {//상위 경계선값 이상이면 Red LED ON

    digitalWrite(RLED,HIGH);

    digitalWrite(GLED, LOW); 

    digitalWrite(BLED, LOW);    

  }

  else {                                               // 경계선 사이 값이라면 Green LED On

    digitalWrite(RLED, LOW);

    digitalWrite(GLED, HIGH);  

    digitalWrite(BLED, LOW);    

  }

}   


1.TMP 36 온도 센서를 이용해서 온도값에 따른 RGB LED의 색을 
 다르게출력 해보는 실습이다.
2.Common Anode 타입의 RGB LED는 공통단자를 V+ 연결 하기 
 때문에 LED를 On 하기 위해서는 입력단자 LOW신호가 들어가야 한다.

3.온도 변화에 따른 LED 색을 다르게 표시하기 위해  TMP36의 출력 
 값을 측정하여 경계값을 설정한다
  예165  이하면  블루 LED ON’     
  175 
값 이상이면  레드 LED ON’ 
  165~175 
사이 값이면  그린 LED ON’

4. 정상 동작이 되면 온도 변환 공식을 이용하여 섭씨온도로 변환하여 
 시리얼 모니터를 통해 화면에 표시하는 프로그램을 다음 과제로 진행해
 본다.


※위의 섭씨온도식에서 




▶ 실행 결과 :

 (영상은 고화질로 설정하고 전체화면으로 보세요)





반응형
반응형

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



반응형
반응형

【 아두이노 기초 】 #23

 서보 모터 제어 1

 이번 시간은 서보 모터를 구동해 보는, 실습 첫 시간을 가져본다. 

서보(Servo) 모터는 "따른다, 추종한다"라는 의미의 이름을 가진 모터로, 시스템이 요구하는 특정 위치로 정확하게 이동하기에 적합한 모터이다. 

 선풍기, 믹서기에서 처럼 특정위치 제어가 불필요하고 한방향으로 일정하게 회전시키면서 사용자가 켜고 끄는 제어를 위해서는 DC모터를 사용한다. 

 그러나, 프린터의 헤드, CCTV 카메라, 캠코더와 같은 내부 명령에 따라 특정 위치와 속도를 제어하기 위해서는 이런 서보모터를 사용하게 된다. 

▶ Servo 모터 제어 회로도 :

 

 1. 서보 모터 동작 원리 설명 

 서보 모터는 아래 처럼 펄스의 폭을 이용해 제어(PWM 신호)를 하게 되는데, 펄스폭이 1.0 ms 이면 모터 회전축의 위치가 제일 좌측에 위치하고, 1.5ms 이면 가운데, 2.0ms 이면 제일 우측에 위치하는 특성을 가진 모터이다. 

또한 그 사이의 시간값에 따라 각각 위치하게 된다. 다만, 제조회사별 모터의 종류와 연결된 회로 및 프로그램에 따라 시간값의 범위에 변동이 있을 수 있다. 

 

  아래 프로그램에서는 이런 위치에 대한 제어 코드가 보이지 않는데, 이는 프로그래밍을 간편하게 작성 하도록 하기위해 다음과 같은 함수를 사용하기 때문이다. 

 "servo.write(angle) " 

 : angle에 각도 값을 넣어 주면 해당하는 각 위치로 회전축이 회전한다. 이 함수를 사용하기 위해서는 <Servo.h> 헤더파일을 선언하여 사용해야 한다. 

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

▶ 부품 목록    :  Servo 모터, 전원을 보강해줄 콘덴서 100 ㎌ 이상 아무거나

▶ 실습 절차  : 
 1. 위 회로도를 참고하여 모터 와 부품들을 연결한다. 
 2. 서보 모터는 세개의 라인이 있으며, +,- 전원 라인과, 제어를 위한 하나의 신호 라인으로 구성 되어 있다. 전원라인은 아두이노의 +5V 와 GND 단자에 연결하고, 신호라인은 PWM 신호 출력이 가능한 디지털 포트에 연결한다.
( 위 회로에서는 9번핀 보통 "~" 이 그려져 있는 포트가 PWM 신호 출력이 가능한 단자를 표시한 것이다.  )

 3. 위 회로에서 콘덴서는 반드시 달아주어야 하는 것은 아니나, 대개 모터가 연결 된 회로에서 모터의 출력을 보완해 주는 용도로 콘덴서를 전원라인에 연결해주는 것이 일반적이다. 

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

▶ 실습 목표  : 

  1. 서보모터를 180도 회전 시켜 본다(위치가 180도 가 되면 자동으로 원위치 함)

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

#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씩 증가

    // 서보 모터의 각도가 변하는 것을 기다린다.  0.015초 시간 지연한다

      delay(50);

  }

}

 

▶ 실행 영상 : 

※ 프로그래밍에 의해 '180도' 에 다다르면, 자동으로 '0도' 로 회전하는 특성이 있다. 

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

sketch_ServoMotor.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





반응형
반응형

【 아두이노기초】#21 LCD쉴드이용하기III(keyPAD-키패드2)


   LCD 액정 디스플레이를 이용하기 위해서는 다소 복잡한 선 연결이 필요했다. 

(앞 강좌 참조: http://rasino.tistory.com/132 or http://rasino.tistory.com/133 참조 )

하지만 아두이노 우노 보드 위에 삽입되는 LCD 쉴드를 이용하면 간편히 연결되어 LCD 디스플레이 하기가 훨씬 간편해지는 장점이 있다.

이 외에 I2C모듈을 내장한 LCD의 경우 보다 적은 핀 연결이 가능하고 통신도 수월해지는 장점이 있다. 이번 시간에는 LCD shield (쉴드)의 키패드 (Keypad)를 다루어 보도록 하자


▶ LCD 키패드 쉴드( 1602) 와 키패드 실물 이미지 :



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


▶ 부품 목록    : LCD키패드 쉴드( 1602 )  


▶ 실습 절차  : 

1. 실습목표

   - LCD 1번 줄에 ‘Push the buttons’ 를 출력한다 

   - LCD 2번 줄에 각 버튼을 누를 때 마다 버튼 이름이 출력 되도록 한다.

   - 커서 (9,1) 위치에 숫자를 표시하고 UP버튼은 1씩 증가, Down버튼은 1씩 감소 시킨다

   - LEFT, RIGHT 버튼으로 현재의 커서 위치를 좌우로 이동 시킬 수 있게

2. 실습절차

 - LCD 쉴드의 키패드는 A0 (아날로그 포트) 연결되어 있고 각 버튼 마다 출력 전압 값이 다르게 설계되어 있다.

 - 아날로그 포트(A0)10비트(2^10=1023)의 데이터 값으로 ·출력 되는데 각 버튼 마다 다른 값이 입력되는 것이다

 - 아래 각 버튼 별 ADC표를 참고하고 switch~case구문을 이용하여 버튼이 눌러지면 해당 버튼 이름을 표시하라

 - 각 버튼의 ADC 값은 Serial 통신() 화면을 통해 아래와 같은지 확인해보고, switch~case구문에 사용될 적정 범위 값을 임의로 정하라.  (RST 버튼은 보드의 Reset 버튼과 같은 기능-설정 되어 있음)


※ 버튼 이름 



▶ 버튼 별 전압 값과 변환 입력되는 ADC값 표


▶ LCD 함수 표 ( LiquidCrystal.h 파일 포함된 )



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

#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);  // LCD 쉴드 제어를 위한 핀 설정

int lcd_key     = 0;

int adc_key_in  = 0;

int counter = 0;           // 숫자 증감을 위한 변수

int cur = 0;                 // cursor 위치값 변수

#define btnRIGHT  0

#define btnUP     1

#define btnDOWN   2

#define btnLEFT   3

#define btnSELECT 4

#define btnNONE   5

int read_LCD_buttons()  {

adc_key_in =analogRead(0); // 키패드와 연결된 AO핀의 아날로그값                        

// 읽어온 아날로그의 값에 따라 눌려진 버튼을 판단함

 if (adc_key_in > 1000 ) return btnNONE;   // 모니터링 값 : 1023

 if (adc_key_in < 20)   return btnRIGHT// 모니터링 값 :    0 

 if (adc_key_in < 150)  return btnUP;     // 모니터링 값 100

 if (adc_key_in < 300)  return btnDOWN;   // 모니터링 값 :  258

 if (adc_key_in < 500)  return btnLEFT;   // 모니터링 값 :  411

 if (adc_key_in < 700)  return btnSELECT; // 모니터링 값 :  641 

 return btnNONE; }            // 기타의 경우 btnNONE 리턴함

void setup()

{

 lcd.begin(16, 2);                      // LCD 초기화

 lcd.setCursor(0,0);                    // LCD 출에 출력

 lcd.print("Push the buttons");     // LCD 출력 메세지

}


void loop() {

 lcd.cursor();                     // LCD에 커서를 표시

 lcd.setCursor(9,1);            // (9,1) 위치로 커서를 옮김

 lcd.print(counter);            // (9,1) 위치에 숫자를 표시

 lcd.setCursor(0,1);            // 2번째 줄 1번째 칸에 커서 위치시킴   

 lcd.print(counter);

 lcd_key = read_LCD_buttons(); // 눌려진 버튼이름 출력 하는 함수 호출

switch (lcd_key) {         // 버튼 확인을 위한 스위치 구문

case btnRIGHT:      {            // 오른쪽 버튼

     lcd.print("RIGHT  ");

     lcd.setCursor(cur++,1); // 버튼이 눌러질때 마다 커서를 우로1칸이동

     delay(500);

     break;         }

   case btnLEFT:        {            // 왼쪽 버튼

     lcd.print("LEFT   ");

     lcd.setCursor(cur--,1);   // 버튼이 눌러지는 동안 빠른 루틴 회전에

     delay(500);                // 의한 입력 방지를 위해 delay  삽입

     break;           }

   case btnUP:          {            // 위쪽 버튼

     lcd.print("UP    ");

     lcd.setCursor(9,1);

     lcd.print(counter++);    // 버튼 누를 때 마다 숫자 값을 +1 증가

     delay(500);

     break;     }

   case btnDOWN:     {            // 아래쪽 버튼

     lcd.print("DOWN  ");

     lcd.setCursor(9,1);    

     lcd.print(counter--);     // 버튼 누를 때 마다 숫자 값을 -1 씩 감소

     delay(500);       

     break;     }   

   case btnSELECT:     {            // 선택 버튼

     lcd.print("SELECT");

     break;         }

   case btnNONE:       {           // 아무것도 누르지 않음

     lcd.print("NONE  ");

     break;         }     

    }   

 }


▶ 실행 영상 : 





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


LCDshield_Keypad_control2.ino



반응형
반응형

【 아두이노기초】 #20 LCD쉴드 이용하기II(keyPAD-키패드)


 LCD 액정 디스플레이를 이용하기 위해서는 다소 복잡한 선 연결이 필요했다. 

(앞 강좌 참조: http://rasino.tistory.com/128  or  http://rasino.tistory.com/132 )

하지만 아두이노 우노 보드 위에 삽입되는 LCD 쉴드를 이용하면 간편히 연결되어 LCD 디스플레이 하기가 훨씬 간편해지는 장점이 있다.

이 외에 I2C모듈을 내장한 LCD의 경우 보다 적은 핀 연결이 가능하고 통신도 수월해지는 장점이 있다. 이번 시간에는 LCD shield (쉴드)의 키패드 (Keypad)를 다루어 보도록 하자


▶ LCD 키패드 쉴드( 1602) 와 키패드 실물 이미지 :



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


▶ 부품 목록    : LCD키패드 쉴드( 1602 )  


▶ 실습 절차  : 

1. 실습목표

   - 라인 1번 줄에 ‘Push the buttons’ 를 출력한다 

   - 라인 2번 줄에 각 버튼을 누를 때 마다 버튼 이름이 출력 되도록 한다.

2. 실습절차

 - LCD 쉴드의 키패드는 A0 (아날로그 포트) 연결되어 있고 각 버튼 마다 출력 전압값이 다르게 설계되어 있다.

 - 아날로그 포트(A0)10비트(2^10=1023)의 데이터 값으로 입력 되는데, 각 버튼 마다 다른 값이 입력되는 것이다.

 - 아래 각 버튼 별 ADC 값 표를 참고하고 switch~case 구문을 이용하여 버튼이 눌러지면 해당 버튼 이름을 표시

 - 각 버튼의 ADC 값은 Serial 통신() 화면을 통해 확인하고 적정 범위 값을 임의로 정하라.


※ 버튼 이름 



▶ 버튼 별 전압 값과 변환 입력되는 ADC값 표


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

#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);  // LCD 제어를 위한 핀 설정

int lcd_key     = 0;

int adc_key_in  = 0;

#define btnRIGHT  0

#define btnUP     1

#define btnDOWN   2

#define btnLEFT   3

#define btnSELECT 4

#define btnNONE   5

int read_LCD_buttons()  {

adc_key_in =analogRead(0); // 키패드와 연결된 A0핀의아날로그값                        

// 읽어온 아날로그의 값에 따라 눌려진 버튼을 판단함

 if (adc_key_in > 1000 ) return btnNONE;   // 모니터링 값 : 1023

 if (adc_key_in < 20)   return btnRIGHT// 모니터링 값 :    0 

 if (adc_key_in < 150)  return btnUP;     // 모니터링 값 100

 if (adc_key_in < 300)  return btnDOWN;   // 모니터링 값 :  258

 if (adc_key_in < 500)  return btnLEFT;   // 모니터링 값 :  411

 if (adc_key_in < 700)  return btnSELECT; // 모니터링 값 :  641 

 return btnNONE;                   // 기타의 경우 btnNONE 리턴함

 }

void setup()

{

 lcd.begin(16, 2);              // LCD 초기화

 lcd.setCursor(0,0);            // LCD 출에 출력

 lcd.print("Push the buttons"); // LCD 출력 메세지

 Serial.begin(9600); 

 }

void loop() {

 lcd.setCursor(0,1);                  // 2번째 1번째 칸 커서 위치시킴   

 lcd_key = read_LCD_buttons(); // 눌려진 버튼이름 출력 하는 함수 호출

 switch (lcd_key)                    // 버튼 확인

 {

   case btnRIGHT:      {            // 오른쪽 버튼

     lcd.print("RIGHT ");

     Serial.println(adc_key_in);

     break;  

      }

   case btnLEFT:        {            // 왼쪽 버튼

     lcd.print("LEFT   ");

     Serial.println(adc_key_in);

     break;     

     }

   case btnUP:          {            // 위쪽 버튼

     lcd.print("UP    ");

     Serial.println(adc_key_in);

     break;

     }

   case btnDOWN:     {            // 아래쪽 버튼

     lcd.print("DOWN  ");

     Serial.println(adc_key_in);

     break;

     }

   case btnSELECT:     {            // 선택 버튼

     lcd.print("SELECT");

     Serial.println(adc_key_in);

     break;         }

     case btnNONE:     {           // 아무것도 누르지 않음

     lcd.print("NONE  ");

     Serial.println(adc_key_in);

     break;      }     } 

}



▶ 실행 영상 : 




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


LCDshield_Keypad_control.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


반응형