반응형

【 아두이노 센서#24】 L298N 모터 모듈을 활용한 초음파센서 회로#1

 지난 시간까지 초음파 센서를 사용하여 LCD에 표시하는 방법들을 배웠다. 이번에는 초음파 회로에 L298모터 드라이버 모듈을 사용하여 모터가 초음파센서에 반응하는 실습을 진행해보려 한다. 


▶ 선수 학습 :

  1. #24 DC 모터 제어 하기 4 (L293 & H브릿지 참고)   강좌보기클릭

  2초음파 센서 경보회로 with LCD (초음파 센서이해)    강좌보기클릭


▶ 실습에 사용되는 부품 스팩 ( L298N ) 

1. 12V 단자로 7V~35V를 공급할 경우 5V단자를 5V전원으로(출력) 사용할 수 있다.
2. 단 구동전압(모터)12V보다 클 경우 모듈의  레귤레이터 손상을 피하기 위해 외부5V 전원 공급 필요 하다
3. ENA단자가 enable일때 IN1IN2으로 OUT1 OUT2제어
4. ENB단자가 enable일때 IN3IN4으로 OUT3 OUT4제어
5. 동작 온도 : -20~+135
6. 2개의 DC모터를 제어하거나 1개의 스텝모터 제어 가능
7. ENA, ENB 단자에 PWM신호(아두이노의 디지털단자’~’)를 인가하여 모터의 출력(스피드)를 제어 할 수 있다(0~250 : analogWrite() 함수 사용)

8.      ENA 단자를 연결시킬 경우 최대 (속도)255 입력된다.


 실습에 사용되는 모터드라이버 모듈의 핵심 IC는 L298N 이다.  이 IC는 아래 L293D IC와 구조적으로 거의 같다고 보면된다.  IC의 타입(모양)이 다르고 모터를 돌릴 수 있는 출력 전류(전력)가 더 커진 IC이지만 IC의 작동 구조는 아래 L293과 같기 때문에 동작원리 파악을 위해 참고 하면 좋을 것이다.

《참고》

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



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



▶ 실습 목표 :  

1. L298N 모듈에 대해 이해하고 모터를 연결하여 사용하는 방법에 대해 익힌다.

2. L298N 드라이버 모듈에 별도의 전원이 필요한 경우에 대해 이해 할 수 있다. 

3. 초음파 센서를 비롯한 센서의 신호를 체크하여 N298모듈에 연결된 모터들을 제어 할 수 있다. (RC카 이동제어의 기본)


▶ 실습 회로도면 :

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

※ 아두이노에 연결한 전원 만으로는 모터가 제대로 작동되지 않을 수 있다.  즉, 모터 쪽은 전력이 약하면 코드에 문제가 없어도 이상 동작을 보이거나 전혀 동작하지 않을 수 있다. 따라서 L298N 모터 드라이버 모듈에 별도의 추가 전원을 연결하고 아두이노 보드에도 전원을 연결해 주는 것이 좋다.  모터 드라이버쪽 전원의 전압은 연결된 모터의 용량이나 크기에 따라 혹은 돌리려는 속도에 따라 스펙상 3V~30V (12V 이하 권장) 적절한 전원을 넣어 주면 된다. 


※ DC(직류) 방식의 모터는 작은 용량(소비전력이 낮은)의 것을 사용하면 되며,  기어가 포함된(기어드) DC 모터를 사용한다면 아두이노의 작은 출력으로도 충분히 제어가 가능하다. 만약 회로연결과 아두이노 프로그램에 문제가 없는데도 동작이 되지 않는 다면, 공급전력에 비해 너무 큰 용량의 DC 모터가 연결된 경우 일 수 있으니,  이런 부분들을 확인 해보면 될 것이다. 



▶ 실습 절차  : 


1.    위 회로 연결도를 참고하여 부품들을 연결한다
2.    DC 모터의 연결선 방향은 우선 연결 후 프로그램으로 작동시켜보고 방향이 반대가 될 경우 다시 바꾸어 연결하면 된다.
3.    만약 가지고 있는 모터의 용량이 비교적 클 경우 아두이노 전원만으로는 동작이 어려울 수 있으니 회로도에서 처럼 별도 전원을 인가해주면 동작이 잘 될 것이다. (모터 관련 회로에서 대부분의 동작 문제는 모터에 공급되는 전력이 충분치 않아 발생한다) 
4.    초음파 센서에 손이나 장애물을 대어 보아서 모터제어가 잘 되는지 확인한다.


▶ 프로그램 코드 및 설명 : 

/*  L298N 모터 모듈을 활용한 초음파 센서 제어 회로 */

int distance;             /*  초음파센서로 모터제어 하기  */

int triggerPin = 13;

int echoPin = 12;

#define IN1 // L298모듈의 제어 신호 입력 핀 번호 지정

#define IN2 9

#define IN3 10

#define IN4 11


void forward() {      // L298 제어용 전진 함수

      digitalWrite(IN1, HIGH);

      digitalWrite(IN2, LOW);

      digitalWrite(IN3, HIGH);

      digitalWrite(IN4, LOW);    }


void back() {         // 후진

      digitalWrite(IN1, LOW);

      digitalWrite(IN2, HIGH);

      digitalWrite(IN3, LOW);

      digitalWrite(IN4, HIGH);   }


void left() {         // 좌회전(왼쪽모터 멈춤:오른쪽모터 전진)

      digitalWrite(IN1, LOW);

      digitalWrite(IN2, LOW);

      digitalWrite(IN3, HIGH);

      digitalWrite(IN4, LOW);  }


void right() {      // 우회전(왼쪽모터 전진:오른쪽모터 멈춤)

      digitalWrite(IN1, HIGH);

      digitalWrite(IN2, LOW);

      digitalWrite(IN3, LOW);

      digitalWrite(IN4, LOW);   }


void stop() {       // 정지

      digitalWrite(IN1, LOW);

      digitalWrite(IN2, LOW);

      digitalWrite(IN3, LOW);

      digitalWrite(IN4, LOW);  }


void setup( )  {

  Serial.begin(9600);

  pinMode(triggerPin, OUTPUT);  // 트리거 핀을 출력으로 설정

  pinMode(echoPin, INPUT);          // 에코 핀을 입력으로 설정

}


void loop( ) {

  digitalWrite(triggerPin, HIGH); // 트리거핀으로 10us의 펄스 발생

  delayMicroseconds(10);

  digitalWrite(triggerPin, LOW);  //에코 핀의 값을 cm 단위로 계산

  distance = pulseIn(echoPin, HIGH) / 58;

   // 100cm 이상은 모두 100cm로 처리

  distance = distance>100? 100:distance;

  Serial.println("Distance(cm) = " + String(distance));

  if (distance < 20) {    // 20cm 이내 장애물 감지

    stop();

    delay(1000);    // 1초간 정지후 후진

    back();

    delay(2000);    // 2초간 후진

  } else {          //   20cm이내에 벽이 없다면 전진

    forward();     } 

}

◈  모터 A, B가 동시에 시계방향으로 돌면 전진, 반시계 방향이면 후진이고,

  한쪽바퀴만 돌리거나 두 개의 바퀴를 서로 반대로 돌리면 좌회전 혹은 우회전이 된다.   이를 함수 형태로 만들고 메인 루프에서 적절히 함수들을 호출해서 사용하도록 하였다. 그리고 메인루프문에서 장애물이 감지 되었을 때 어떻게 동작을 하게 할 것인지를 간단히 프로그래밍 해 주면 된다. 

위 프로그래밍에서는 기본 전진 기동을 하다가, 물체가 20cm 이내로 감지되면 우선 정지(1초) 한 다음, 후진(2초) 하도록 단순하게 작성 하였다.  다음 강의에서는 자동차 처럼 장애물을 회피해서 기동하는 형태로 작성해볼 예정이다.


▶ 실행영상:  

(전체화면 보기로 보세요)


※ 센서의 반응에 의한 동작 확인을 위해 영상에서 처럼 모터 및 바퀴를 고정 할 수 있는 알루미늄 몸체를 연결한 모습이다.  만약 이런 바디가 없어도 상관없다. 모터만 연결하여 동작확인을 해보면 된다. 


▶ 아두이노 파일(다운) :

L298N_UltraSonic_Basic.ino





반응형
반응형

【 아두이노 센서#23】 HC-SR04 초음파센서 경보회로2 with i2c LCD

 지난시간 초음파 센서로 접근 경보회로를 구성하면서 LCD(16by02)에 표시하는 실습을 진행해 보았다. 하지만 LCD 핀을 일일이 연결해서 사용하는 것은 번거로움이 있고, 만약 아두이노에 추가적으로 여러가지 부품을 더 연결할 경우 포트에도 여유가 없게 된다. 이럴경우 가장 좋은 해결책은 LCD를 I2C 통신 타입으로 사용하면 쉽게 해결이 된다. I2C 타입 LCD는 온도센서와 습도센서를 다룰 때도 사용을 하였기에, 크게 어렵지 않을 것이다. 다만, I2C 통신에 대한 이해가 필요하다면 아래 선수 학습에서 참고하기 바란다. 


▶ 선수 학습 :

  1. I2C (Inter Integrated Circuit) 통신  강좌보기클릭

  2. I2C LCD로 TMP36 온도센서값 출력하기#3  강좌보기클릭

  3초음파 센서 경보회로 with LCD     강좌보기클릭


▶ 실습에 사용되는 부품 자료 ( HC-SR04 ) 



▶ 실습 목표 :  

1. 초음파 신호의 반사된 시간을 이용해서 물체까지의 거리값을 계산할 수 있다.

2. 물체가 일정거리(40cm) 이하로 감지가 되면 경보음과 함께 LED가 깜빡이게 하고, 가까울 수록 점점 더 빠르게 반응 하도록 프로그래밍 한다. 

3. 하나의 포트로 LED와 스피커(부저) 두 가지를 작동시키게 되면, 출력이 약하여 LED 혹은 스피커 작동이 약할 수 있다. 따라서 LED와 스피커를 분리하여 연결 (포트 추가 필요) 

4. LCD로 거리값을 출력하되, I2C통신 모듈이 달려있는 LCD를 사용함으로 연결 및 사용의 번거로움을 줄이고 아두이노 포트에 여유를 가져 올 수 있다. 


▶ 실습 회로도면 :

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


 ※ 위 회로에서 LED와 아두이노 9번 단자 사이에 100옴~330옴 사이 값 아무값의 저항을 하나를  기본적으로 넣어 주면 좋습니다. 

 아래 영상에 사용된 부저 모듈은 아래 이미지와 같은 3핀 모듈인데요, VCC핀은 +쪽에 ,  GND는 GND에 각각 연결하고,  I/O(신호) 단자를 아두이노의 8번 핀에 연결시켜 주면 됩니다. 이렇게 전원이 따로 분리된 모듈을 사용하면 출력이 좀 더 커지게 되는데요,   그런데, 사실상 아주 큰 소리는 나지는 않으니 참고하세요.

   능동형 부저 :  동작전압(Operating Voltage) : 3.3~5V


※ 아두이노 포트의 작은 출력으로 소리와 함께 LED를 작동 시키기 때문에, 기본적으로 소리가 작게 날 수 있으며, 스피커는 와트(w) 수가 작은 것을 사용해야 들을 수 있다. 또한 진동판을 전류로 울려서 소리를 내는 방식의 스피커 보다는 피에조 타입의(압전) 스피커를 사용하는 것이 좋다.  


▶ 실습 절차  : 

1.    위 회로 연결도를 참고하여 부품들을 연결한다
2.    초음파 센서의 거리 값을 16x2 LCD로 표시하라
3.    LCD에 거리값을 표시 할 경우 큰 수치에서 작은 수치로 줄어들어 이전 수치값이 남아 있어 값을 읽을 때 혼란스러운 현상이 일어난다. 이럴경우 몇가지 방법이 있으나간단한 방법은임의의 공백을 적당(2~10) 딜레이()와 함께 사용하면 해결할 수 있다.
4.    실제 거리와 유사한지 비교해본다


▶ 프로그램 코드 및 설명 : 

/*  초음파 센서를 사용한 거리값을 i2c 타입 LCD에 출력하기 */


#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd (0x27, 16,2);

int distance;

int alertLED=9; 

int alertBuzz=8; 

int triggerPin = 7;

int echoPin = 6;


void setup( )  {

  Serial.begin(9600);

  pinMode(alertLED, OUTPUT);    // 경보용 LED포트를 출력으로 설정

  pinMode(alertBuzz, OUTPUT);    // 경보용 Buzzer를 출력으로 설정

  pinMode(triggerPin, OUTPUT);  // 트리거 핀을 출력으로 설정

  pinMode(echoPin, INPUT);      // 에코 핀을 입력으로 설정

  lcd.begin();

  lcd.clear();


}


void loop( ) {

  // 트리거 핀으로 10 us의 펄스를 발생

  digitalWrite(triggerPin, HIGH);

  delayMicroseconds(10);

  digitalWrite(triggerPin, LOW);

  //에코 핀 입력으로부터 거리를 cm 단위로 계산

  distance = pulseIn(echoPin, HIGH) / 58;

  distance = distance>100? 100:distance;


  lcd.setCursor(0,0);

  lcd.print("UltraSonic Ruler");

  lcd.setCursor(0,1);

  lcd.print("distance :");

  lcd.print(distance);

  lcd.print("cm   ");

  if (distance < 40) {    

    digitalWrite(alertLED,HIGH);

    digitalWrite(alertBuzz,HIGH);

    delay(10);

    digitalWrite(alertLED,LOW);

    digitalWrite(alertBuzz,LOW);

    delay(distance); 

  }

  Serial.println(String(distance)+"(cm)");

  delay(50);

 }

}



▶ 실행영상:  

(전체화면 보기로 보세요)




▶ 아두이노 파일(다운) :

Ultrasonic_buzzer_i2cLCD.ino



【 LCD관련 에러나 동작이 안 될 때 】

 LCD관련한 라이브러리 에러나 코드 에러에 대한 안내를 드립니다.  

 크게 아래와 같은 두 가지 형태를 보이는데요, 


▶ 1. 코드를 실행하기전 LiquidCrystal_I2C.h: No such file or directory 에러라고 뜨는 경우!


 이때는 LCD 헤더파일이 설치가 되어 있지 않았을 경우입니다.  아예 관련 라이브러리(해더 파일)가 설치 되지 않은 경우입니다. 

해결법은 바로 아래에 첨부한 라이브러리를 다운받아 압축을 풀지 말고 라이브러리 관리 메뉴에서  .zip 라이브러리 추가 메뉴를 이용해서 추가해주세요.

경로 :  아두이노IDE >  스케치 》 라이브러리 포함하기  .zip 라이브러리 추가...  "다운받은 라이브러리파일 선택"


▶ 2. 또 한가지 LCD관련 에러는 ,  no matching function for call to ‘LiquidCrystal_I2C::begin();   라고 뜨는 경우!

 라이브러리 파일도 똑같은 이름이지만, 제공자에 따라 내부코드가 다른 라이브러리인 경우가 종종 있어요.  그래서 만약 제가 실험에서 사용한 라이브러리가 아닌,  같은 이름이지만 다른 라이브러리를 사용할 경우 위와 같은 에러 표시를 낼 수 있습니다.    라이브러리는 분명 설치되어 있지만 그래서 프로그램이 인지는 하는데, 코드에서 사용한 함수 적용이 되지 않을 때 이런 에러를 띄우게 됩니다.    그럼, 해결책은 실험에 사용한(적용한) 그 라이브러리를 다시 설치해 주어야 하는데요,   이 때 중요한 것은 아두이노에서는 똑 같은 이름의 라이브러리가 두 개 설치될 경우 또다른 중복에러를 띄우게 됩니다.   그러니 잘 못 설치된 라이브러리는 찾아서 반드시 삭제하거나,  다른이름으로 임시 변경해 놓거나,  나중에 다른 프로그램에서 사용해야 할 경우를 대비해서 압축해 놓고 원본은 지워 놓으면 됩니다. 


 그럼 기존 라이브러리를 찾아서 삭제를 하거나 하려면 설치된 라이브러리를 찾아야 겠죠? 

찾는 위치는 보통 아래 두 곳입니다.  (윈도우10 기준이며, 윈도우7도 비슷한 위치) 


두 곳으로 나뉘어 설치되는 이유는 아두이노 IDE의 "라이브러리 관리 메니저" 창을 통해 검색으로 설치되는 기본위치가 있고(아두이노 설치된 경로),   '.zip 라이브러리' 추가로 설치되는 위치가(도큐멘트 문서 저장영역-Doucuments) 따로 있어서 그렇습니다. 


< .zip 라이브러리 추가 메뉴에서 추가한 라이브러리 설치 위치 >

 1. C:\Users\유저-이름\Documents\Arduino\libraries    


 <라이브러리 관리 메뉴창에서 라이브러리 직접 검색으로 설치된 라이브러리 위치 >

 2. C:\Program Files (x86)\Arduino\libraries


위 두 곳에서 찾아서 삭제를 하세요.   (그냥, 폴더 째로 삭제하면 됩니다.)

 그리고 아래 첨부하는 라이브러리를 다운받아  압축파일 그대로 .zip 라이브러리 추가 메뉴로 추가해 주세요. 

만약, 압축파일 그대로 추가할 때 에러가 난다면,  앞축을 풀고  xxxxx.h 가 있는 폴더만 "C:\Users\유저-이름\Documents\Arduino\libraries" 경로에 붙여넣기 하면 됩니다.    이때 아두이노 스케치 IDE는 모두 닫고 재실행 해야 적용 됩니다.


 본 예제에서 사용한 라이브러리 다운로드 받기 :

Arduino-LiquidCrystal-I2C-library-master.zip




  ※ 중요! : 여기에서 제시된 코드로 작성할 경우 반드이 이 라이브러리로 설치하셔야 합니다.   만약, 여러분의 PC에 똑 같은 이름의 라이브러리가 있을 경우 반드시 삭제를 하거나 압축해서 백업을 해 놓으면 충돌이 일어나지 않습니다.!!!

반응형
반응형

【 아두이노 센서#22】 HC-SR04 초음파 센서 경보회로 with LCD

 지난시간 초음파 센서로 접근 경보회로 기본을 다루었다. 그럼 이제 LCD를 부착하여 거리값을 LCD에 표시해보자. 이렇게 된다면 포터블하며 실제로 자동차등에 부착할 수 있는 형태가 되어 훨씬 실용적으로 활용할 수 있게 된다.


▶ 선수 학습 :

  1. 초음파 센서 다루기 #1   강좌보기클릭

  2. 초음파 센서 다루기 #2   강좌보기클릭

  

▶ 실습에 사용되는 부품 자료 ( HC-SR04 ) 






▶ 실습 목표 :  


1. 초음파 신호의 반사된 시간을 이용해서 물체까지의 거리값을 계산할 수 있다.

2. 물체가 일정거리(40cm) 이하로 감지가 되면 경보음과 함께 LED가 깜빡이게 하고, 가까울 수록 점점 더 빠르게 반응 하도록 프로그래밍 한다. 

3. 스피커와 LED는 각각 포트로 제어 할 수 있으나, 지금은 하나의 포트(13)로 제어할 것이며, LCD(1602)를 부착하여 초음파로 측정된 거리 값을 LCD를 통해 표시할 수 있다. 


▶ 실습 회로도면 :

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


※ 아두이노 포트의 작은 출력으로 소리와 함께 LED를 작동 시키기 때문에, 기본적으로 소리가 작게 날 수 있으며, 스피커는 와트(w) 수가 작은 것을 사용해야 들을 수 있다. 또한 진동판을 전류로 울려서 소리를 내는 방식의 스피커 보다는 피에조 타입의(압전) 스피커를 사용하는 것이 좋다.


▶ 실습 절차  : 

1.    위 회로 연결도를 참고하여 부품들을 연결한다
2.    초음파 센서의 거리 값을 16x2 LCD로 표시하라
3.    LCD거리값을 표시 할 경우 큰 수치에서 작은 수치로 줄어들어 이전 수치값이 남아 있어 값을 읽을 때 혼란스러운 현상이 일어난다. 이럴경우 몇가지 방법이 있으나, 간단한 방법은, 임의의 공백을 적당(2~10) 딜레이()와 함께 사용하면 해결할 수 있다.
4.    실제 거리와 유사한지 비교해본다


▶ 프로그램 코드 및 설명 : 


/*  초음파 센서(HC-SR04 모듈)로 물체와의 거리측정하기 */


#include <LiquidCrystal.h>// LCD 사용을 위한 헤더 선언

int distance;

int triggerPin = 10;

int echoPin = 11;

int alertPin=3;    //   스피커 & LED 연결 핀 설정

LiquidCrystal lcd(2,3,4,5,6,7);//LCD 핀 배열 설정


void setup( )  {

  Serial.begin(9600);

  pinMode(triggerPin, OUTPUT);  // 트리거 핀을 출력으로 설정

  pinMode(echoPin, INPUT);       // 에코 핀을 입력으로 설정

}


void loop( ) {

 digitalWrite(triggerPinLOW);    // 트리거 핀 초기화

  digitalWrite(echoPin, LOW);      //  에코 핀 초기화

  delayMicroseconds(2);

  // 트리거 핀으로 10 us의 펄스를 발생

  digitalWrite(triggerPin, HIGH);

  delayMicroseconds(10);

  digitalWrite(triggerPin, LOW);

  // 에코 핀 입력으로부터 거리 값을  cm 단위로 계산

  distance = pulseIn(echoPin, HIGH) / 58;

  Serial.println("Distance(cm) = " + String(distance));

  delay(1000);

  distance = distance>100? 100:distance;//100이상의 값은 모두100


  if (distance 40) {       //  40 이하의 값부터 경보 시작

    digitalWrite(alertPin,HIGH);

    delay(10);

   digitalWrite(alertPin,LOW);

   delay(distance); // 거리가 가까울수록  음이 빨라지도록 딜레이값을 조정

  }

 lcd.setCursor(0,0);  //커서를 첫 열 첫 행으로 이동

 lcd.print("Distance(cm):");

 lcd.print(distance);

 delay(2);   // 거리값 표시를 위한 약간의 딜레이를 준다. 

 lcd.print("            ");  //거리 값이 계속 바뀌어 나타나는 잔상제거를 위한 공백

}


▶ 실행영상:  

(전체화면 보기로 보세요)
# 아래 영상은 동일한 회로와 프로그래밍이 되어 있으며, 휴대성을 위해 아두이노 보드만, 우노 R3에서 나노 보드로 교체한 회로 영상이다.



▶ 아두이노 파일(다운) :

Ultrasonic_buzzer_LCD_.ino


반응형
반응형

【 아두이노 센서#21】 HC-SR04 초음파 센서 다루기 #2

 이번 시간은 초음파 센서 다루기 두 번째 시간으로, 초음파 경보회로를 만들어보려한다. 지난시간 초음파 센서를 이용해서 거리값을 계산해 낼 수 있었다. 이번시간은 이 거리값을 이용해서 특정 거리 영역으로 인지되면 경보음을 울리는 회로를 구성해보려 한다. 그리고 마치 자동차 범퍼에 달려 있는 접근 경보 센서 회로 처럼, 가까이 근접할 수록 신호음과 불 빛을 더 빨리 울리도록 해볼 것이다. 


▶ 선수 학습 :

  1. 초음파 센서 다루기 #1        강좌보기클릭☜


  

▶ 실습에 사용되는 부품 자료 ( HC-SR04 ) 






▶ 실습 목표 :  


1. 초음파 신호의 반사된 시간을 이용해서 물체까지의 거리값을 계산할 수 있다.


2. 물체가 일정거리(40cm) 이하로 감지가 되면 경보음과 함께 LED가 깜빡이게 하고, 가까울 수록 점점 더 빠르게 반응 하도록 프로그래밍 한다. 


3. 실습1은 스피커와 LED를 같이 묶어 포트 하나로 간단히 제어 해 볼 것이고, 실습2는 포트 두 개를 사용하여 각각 제어 해 볼 것이다(출력 공급이 조금 더  좋아짐)



▶ 실습 회로도면 :

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




※ 아두이노 포트의 작은 출력으로 소리와 함께 LED를 작동 시키기 때문에, 기본적으로 소리가 작게 날 수 있으며, 스피커는 와트(w) 수가 작은 것을 사용해야 들을 수 있다. 또한 진동판을 전류로 울려서 소리를 내는 방식의 스피커 보다는 피에조 타입의(압전) 스피커를 사용하는 것이 좋다.



※ 본 실습 처럼 단순한 음을 듣기 위한 회로에서는 스피커의 극성 구분은 크게 의미가 없다. 


▶ 실습 1 절차  : 

1. 위 회로 연결도를 참고하여 부품들을 연결한다. 
2. 스피커와 LED를 하나의 포트에 연결하여 동시에 제어 해본다.


▶ 프로그램 코드 및 설명 : 


/*  초음파 센서(HC-SR04 모듈)로 물체와의 거리측정하기 */


int distance;

int triggerPin = 7;

int echoPin = 6;

int alertPin=3;    //   스피커 & LED 연결 핀 설정


void setup( )  {

  Serial.begin(9600);

  pinMode(triggerPin, OUTPUT);  // 트리거 핀을 출력으로 설정

  pinMode(echoPin, INPUT);       // 에코 핀을 입력으로 설정

}


void loop( ) {

 digitalWrite(triggerPinLOW);    // 트리거 핀 초기화

  digitalWrite(echoPin, LOW);      //  에코 핀 초기화

  delayMicroseconds(2);

  // 트리거 핀으로 10 us의 펄스를 발생

  digitalWrite(triggerPin, HIGH);

  delayMicroseconds(10);

  digitalWrite(triggerPin, LOW);

  // 에코 핀 입력으로부터 거리 값을  cm 단위로 계산

  distance = pulseIn(echoPin, HIGH) / 58;

  Serial.println("Distance(cm) = " + String(distance));

  delay(1000);

  distance = distance>100? 100:distance;//100이상의 값은 모두100


  if (distance < 40) {       //  40 이하의 값부터 경보 시작

    digitalWrite(alertPin,HIGH);

    delay(10);

   digitalWrite(alertPin,LOW);

   delay(distance); // 거리가 가까울수록  음이 빨라지도록 딜레이값을 조정

   }

}



▶ 실습 1 실행영상:  

(전체화면 보기로 보세요)



▶ 아두이노 파일(다운) :


Ultrasonic01_Basic.ino




▶ 실습 2 절차  : 

1. 위 회로 연결도를 참고하여 부품들을 연결한다. 
2. 스피커와 LED를 분리하여 각각의 아두이노 포트를 사용하여 연결한다.
▶ 실습 회로도면 :
 (이미지 클릭하면 확대 가능)



▶ 프로그램 코드 및 설명 : 


int distance;

int alertLED=9;   //   LED  연결 포트

int alertBuzz=8; //   Buzzer  연결 포트

int triggerPin = 7;

int echoPin = 6;


void setup() {

  Serial.begin(9600);

  pinMode(alertLED, OUTPUT);    // 경보용 LED포트를 출력으로 설정

  pinMode(alertBuzz, OUTPUT);   // 경보용 Buzzer를 출력으로 설정

  pinMode(triggerPin, OUTPUT);  // 트리거 핀을 출력으로 설정

  pinMode(echoPin, INPUT);         // 에코 핀을 입력으로 설정

}


void loop() {

 digitalWrite(triggerPin, LOW);    // 트리거 핀 초기화

  digitalWrite(echoPin, LOW);      //  에코 핀 초기화

  delayMicroseconds(2);

//   ----- 트리거  핀으로 10us의 펄스를 발생  -----

 digitalWrite(triggerPin, HIGH);

  delayMicroseconds(10);

  digitalWrite(triggerPin, LOW);

//---------------------------------------

  distance = pulseIn(echoPin, HIGH) / 58; //  거리값

 distance = distance>100? 100:distance;//100이상의 값은 모두100

if (distance < 40) {      //  40cm 미만 값 부터 경고음(Led) 시작

    digitalWrite(alertLED,HIGH);

    digitalWrite(alertBuzz,HIGH);

    delay(10);

    digitalWrite(alertLED,LOW);

    digitalWrite(alertBuzz,LOW);

    delay(distance);

 }

  Serial.println(String(distance)+"(cm)");

  delay(10);

}


▶ 실습 2 실행영상:  

(전체화면 보기로 보세요)



▶ 아두이노 파일(다운) :

Ultrasonic_buzzer2.ino


반응형
반응형

【 아두이노 센서#20】 HC-SR04 초음파 센서 다루기 #1


 이번 시간 부터, 아두이노에서 가장 활용도가 높은 초음파 센서를 다루어 보려고 한다. 앞으로 라즈이노에서 올리는 실습을 보면서, 차근 차근 하나씩 해보면 생각만큼 복잡하지 않으며 아두이노가 더욱 재미 있어질 것이다. 

게다가 초음파 센서를 이용하여 다양한 응용작품을 만들어 보려고 한다. 


▶ 선수 학습 :

  특별한 선수학습 없음

  

▶ 실습에 사용되는 부품 자료 ( HC-SR04 ) 







▶ 실습 목표 :  


1. 초음파 센서의 구동 원리에 대해 이해한다. 


2. 초음파 신호의 반사된 시간을 이용해서 물체까지의 거리값을 계산할 수 있다.


3. 측정된 값을 시리얼 모니터상에 거리값(cm)으로 표시한다.



▶ 실습 회로도면 :

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









▶ 실습 절차  : 

1. 위 회로 연결도를 참고하여 부품들을 연결한다. 
2. 시간값 계산식


3. 초음파센서의 거리측정 메카니즘을 이해한다.






▶ 프로그램 코드 및 설명 : 


/*  초음파 센서(HC-SR04 모듈)로 물체와의 거리측정하기 */


int distance;

int triggerPin = 7;

int echoPin = 6;


void setup( )  {

  Serial.begin(9600);

  pinMode(triggerPin, OUTPUT);  // 트리거 핀을 출력으로 설정

  pinMode(echoPin, INPUT);       // 에코 핀을 입력으로 설정

}


void loop( ) {

 digitalWrite(triggerPin, LOW);    // 트리거 핀 초기화

  digitalWrite(echoPin, LOW);      //  에코 핀 초기화

  delayMicroseconds(2);

  // 트리거 핀으로 10 us의 펄스를 발생

  digitalWrite(triggerPin, HIGH);

  delayMicroseconds(10);

  digitalWrite(triggerPin, LOW);

  // 에코 핀 입력으로부터 거리 값을  cm 단위로 계산

  distance = pulseIn(echoPin, HIGH) / 58;

  Serial.println("Distance(cm) = " + String(distance));

  delay(1000);

}




▶ 실행 영상:  【 시리얼 모니터 화면 】





▶ 아두이노 파일(다운) :


Ultrasonic.ino


반응형
반응형

 【 아두이노 센서#7】 I2C LCD로 TMP36 온도센서값 출력하기 #3

 지난 시간에 tmp36 온도센서의 값을 일반 LCD에 표시(☜클릭) 하는 실습을 하였고, 오늘은 I2C 통신이 가능한 LCD에 이 온도 값을 표시해보고자 한다.




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


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

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


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


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


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

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


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



▶ 실습 목표 :  


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

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

2. 온도 값(섭씨)을 I2C LCD로 출력 하라. 


▶ 실습 회로도면 :

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







▶ 실습 절차  : 

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

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


3. I2C 통신 모듈이 장착된 LCD를 사용하면 회로  연결이 매우 간편해 진다.- 1602(162) LCD의 경우 고유주소는 대개 ’0x27’이며 스캐닝 프로그램 이용해 확인 가능하다.



▶ 프로그램 코드 및 설명 : 


#include <Wire.h>                          // I2C 통신을 위한 헤더파일 추가

#include <LiquidCrystal_I2C.h> // I2C LCD 헤더파일 추가

LiquidCrystal_I2C lcd (0x27, 16,2); // 1602 LCD의 고유 주소 설정

const int RLED=9;    // 빨간색 LED 상수형변수에 아두이노 9번 핀 할당

const int GLED=10; // 녹색 LED 상수형변수에 아두이노 10핀 할당

const int BLED=11; //파란색 LED 상수형변수에 아두이노 11핀 할당

const int TEMP=0;     // 아날로그 입력 0(A0) 핀 선

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

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

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

byte SpecialChar0[8] = {      // 온도 표시를 위한 특수 문자 배열

 B00010,

 B00101,

 B00101,

 B00010,

 B00000,

 B00000,

 B00000,

 B00000   };


void setup()   {

  Serial.begin(9600);

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

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

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

  Serial.begin(9600);

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

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

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

  lcd.begin();               // LiquidCrystal_I2C.h 에서 lcd.begin(16,2)’                                 

                                       //  지정하면 에러 발생함, ‘()’ 안을 비워 둘 것

  lcd.clear();

  lcd.createChar(1,SpecialChar1);      

}

 

void loop()   {

  val=analogRead(TEMP); 

  Serial.println(val);

  float mVoltage = val*5000.0/1024.0;

  float TempDotC = (mVoltage - 500) / 10.0;

  Serial.print(TempDotC);

  Serial.println("℃\n");

  lcd.setCursor(0,0); 

  lcd.print("Tmp36 Sensor !");

  lcd.setCursor(0,1);

  lcd.print("Temp:");

  lcd.print(TempDotC);

  lcd.write(0);

  lcd.print("C"); 

  delay(500);

  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);    

  }

}   



▶ 프로그램 코드 다운로드 :

TEMP_sensor_LCD_I2C.zip


 



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.   정상 동작이 되면 온도 변환 공식을 이용하여 섭씨온도로 변환하여 시리얼 모니터를 통해 화면에 표시하는 프로그램을 다음 과제로 진행해 해보고자 한.


※위의 섭씨온도식에서 




▶ 실행 결과 :

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





【 LCD관련 에러나 동작이 안 될 때 】

 LCD관련한 라이브러리 에러나 코드 에러에 대한 안내를 드립니다.  

 크게 아래와 같은 두 가지 형태를 보이는데요, 


▶ 1. 코드를 실행하기전 LiquidCrystal_I2C.h: No such file or directory 에러라고 뜨는 경우!


 이때는 LCD 헤더파일이 설치가 되어 있지 않았을 경우입니다.  아예 관련 라이브러리(해더 파일)가 설치 되지 않은 경우입니다. 

해결법은 바로 아래에 첨부한 라이브러리를 다운받아 압축을 풀지 말고 라이브러리 관리 메뉴에서  .zip 라이브러리 추가 메뉴를 이용해서 추가해주세요.

경로 :  아두이노IDE >  스케치 》 라이브러리 포함하기  .zip 라이브러리 추가...  "다운받은 라이브러리파일 선택"


▶ 2. 또 한가지 LCD관련 에러는 ,  no matching function for call to ‘LiquidCrystal_I2C::begin();   라고 뜨는 경우!

 라이브러리 파일도 똑같은 이름이지만, 제공자에 따라 내부코드가 다른 라이브러리인 경우가 종종 있어요.  그래서 만약 제가 실험에서 사용한 라이브러리가 아닌,  같은 이름이지만 다른 라이브러리를 사용할 경우 위와 같은 에러 표시를 낼 수 있습니다.    라이브러리는 분명 설치되어 있지만 그래서 프로그램이 인지는 하는데, 코드에서 사용한 함수 적용이 되지 않을 때 이런 에러를 띄우게 됩니다.    그럼, 해결책은 실험에 사용한(적용한) 그 라이브러리를 다시 설치해 주어야 하는데요,   이 때 중요한 것은 아두이노에서는 똑 같은 이름의 라이브러리가 두 개 설치될 경우 또다른 중복에러를 띄우게 됩니다.   그러니 잘 못 설치된 라이브러리는 찾아서 반드시 삭제하거나,  다른이름으로 임시 변경해 놓거나,  나중에 다른 프로그램에서 사용해야 할 경우를 대비해서 압축해 놓고 원본은 지워 놓으면 됩니다. 


 그럼 기존 라이브러리를 찾아서 삭제를 하거나 하려면 설치된 라이브러리를 찾아야 겠죠? 

찾는 위치는 보통 아래 두 곳입니다.  (윈도우10 기준이며, 윈도우7도 비슷한 위치) 


두 곳으로 나뉘어 설치되는 이유는 아두이노 IDE의 "라이브러리 관리 메니저" 창을 통해 검색으로 설치되는 기본위치가 있고(아두이노 설치된 경로),   '.zip 라이브러리' 추가로 설치되는 위치가(도큐멘트 문서 저장영역-Doucuments) 따로 있어서 그렇습니다. 


< .zip 라이브러리 추가 메뉴에서 추가한 라이브러리 설치 위치 >

 1. C:\Users\유저-이름\Documents\Arduino\libraries    


 <라이브러리 관리 메뉴창에서 라이브러리 직접 검색으로 설치된 라이브러리 위치 >

 2. C:\Program Files (x86)\Arduino\libraries


위 두 곳에서 찾아서 삭제를 하세요.   (그냥, 폴더 째로 삭제하면 됩니다.)

 그리고 아래 첨부하는 라이브러리를 다운받아  압축파일 그대로 .zip 라이브러리 추가 메뉴로 추가해 주세요. 

만약, 압축파일 그대로 추가할 때 에러가 난다면,  앞축을 풀고  xxxxx.h 가 있는 폴더만 "C:\Users\유저-이름\Documents\Arduino\libraries" 경로에 붙여넣기 하면 됩니다.    이때 아두이노 스케치 IDE는 모두 닫고 재실행 해야 적용 됩니다.


 본 예제에서 사용한 라이브러리 다운로드 받기 :

Arduino-LiquidCrystal-I2C-library-master.zip




  ※ 중요! : 여기에서 제시된 코드로 작성할 경우 반드이 이 라이브러리로 설치하셔야 합니다.   만약, 여러분의 PC에 똑 같은 이름의 라이브러리가 있을 경우 반드시 삭제를 하거나 압축해서 백업을 해 놓으면 충돌이 일어나지 않습니다.!!!

반응형
반응형

 【 아두이노 센서#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


반응형