반응형

【 아두이노모듈#13 RFID #3(RC522) 도어락 만들기!

 

 RFID(Radio Frequancy Identification)는 무선 주파수를 이용하여 RFID 태그와 RFID리더간 데이터를 교환하는 장치이다.

 교통카드, 학생신분증 겸용카드, 연구실 및 회사 출입문카드, 구내식당 카드, 마트 등의 상품 진열 및 관리 등등 다방면에서 이용되고 있다. 

 지난 실습에서 아두이노와 RFID모듈을 연결하고 특정 ID카드의 ID를 등록하여 시리얼모니터를 통해 승인 또는 거부 표시를 해보았다.  이번에는 좀더 실제적으로 응용이 가능하도록 서보모터와 LED를 이용해서 도어락 기능을 구현해보려 한다. 선수학습을 잘 따라왔다면, 크게 어렵지않고 더욱 흥미가 생길 것이다. 

 

▶ 선수 학습 :

      1. [아두이노 기초#30] 서보모터 제어하기 응용 ☜ (클릭)

      2. [아두이노 센서#3] TMP36 온도센서 #1 (RGB LED 부분 참조) ☜ (클릭)

      3. [아두이노 모듈#11] RFID(RC522) 사용하기 #1 ☜ (클릭)

      4. [아두이노 모듈#12] RFID(RC522) 사용하기 #2 ☜ (클릭)

 

 RFID 모듈 (RC522) 세부 스팩

   세부스팩은 위 선수학습 내용을 참조.

 

▶ 실습 목표 :  

 1. [ RFID 구동원리, 통신 방식에 대해 이해할 수 있다. 

 2. [ SPI통신과 회로 연결에 대해 이해 할 수 있다.]

 3. [ 카드별 고유넘버(UID)를 알아 낼 수 있다.]

 4. [ 특정 UID를 지정하여 승인 및 거부 처리를 할 수 있다.]

 5. [ '서보 모터'와 , 'RGB LED'를 적용하여 RFID모듈 제어를 할 수 있다.] 

 

▶ 실습 회로도면 :
  (이미지 클릭하면 확대 가능)

RFID Rc522모듈을 활용한 도어락 회로도

▶ 실습 절차  : 

 

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

2.   아두이노IDE에서 MFRC522 라이브러리를 검색후 설치한다. 

     ( 라이브러리 설치는 위 선수학습내용 참조)

3.  첨부된 아두이노 파일을 다운 받아 코드를 실행시킨다. 

4.  문으로 사용될 미이어쳐나 모형 등을 준비한다.  (RGB LED가 없으면 일반 LED를 사용)

5. 동작확인이 되면(실제 도어 등에 적용할 방법에 대해 고민해본다, 릴레이 사용 등등)

 

▶ 프로그램 코드 및 설명 : 

/* RFID 도어락 만들어 보기 */

#include <SPI.h>
#
include <MFRC522.h>
#
define SS_PIN 10    // spi 통신을 위한 SS(chip select)핀 설정
#define RST_PIN 9    // 리셋 핀 설정 
MFRC522 
rfid(SS_PIN, RST_PIN); // 'rfid' 이름으로 클래스 객체 선언

#include <Servo.h>    // 서보 라이브러리를 지정

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

Servo servo;      // 서보 라이브러리 변수를 선언

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

int RLED=7;     // 빨간색 LED단자를 아두이노 7번과 연결

int GLED=6;     // 초록색 LED단자를 아두이노 6번과 연결

 

void setup ( ) {  

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

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

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

  servo.write(0);                // 서보모터 0도 위치로 초기화

  Serial.begin(9600);
  
SPI.begin();           // SPI 통신 시작

  rfid.PCD_Init();       // RFID(MFRC522) 초기화

  Serial.println("Approximate your card to the reader...");
  
Serial.println();  

}

void loop ( )  {

 // 새카드 접촉이 있을 때만 다음 단계로 넘어감

  if ( ! rfid.PICC_IsNewCardPresent())
  {

      return;

  }

 // 카드 읽힘이 제대로 되면 다음으로 넘어감
  if ( ! rfid.PICC_ReadCardSerial())

  {

      return;

  }

  // 현재 접촉 되는 카드 타입을 읽어와 모니터에 표시함  

  Serial.print("UID tag :");
  
String content= "";
  
byte letter;    
  
for (byte i = 0; i < rfid.uid.size; i++) 
  
{   
     
Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " ");
     
Serial.print(rfid.uid.uidByte[i], HEX);
     
content.concat(String(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "));
     
content.concat(String(rfid.uid.uidByte[i], HEX));
  
}

  Serial.println();
  
Serial.print("Message : ");
  
content.toUpperCase();
  // UID값이 아래 값과 같으면 승인 처리
  if (content.substring(1) == "85 7C FB D1") // 승인 하고자하는 UID 기록

  {

   // 인증이 되면 Green LED와 함께 서보모터를 작동시킨다.
    Serial.println("Authorized access");
   
Serial.println();

    digitalWrite(GLED,HIGH);

    servo.write(180);   // 서보모터의 각도를 변경한다     

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

    servo.write(0);     // 시간지연 후 문을 닫는다 

    digitalWrite(GLED,LOW);   // 시간지연 후 LED 끈다

  }

 

   // 승인 목록에 없는 UID 처리는

   // 서보모터의 작동 없이 Red LED만 켜고 끈다

  else   {

    Serial.println(" Access denied");
    digitalWrite(RLED,HIGH);

    delay(3000);

    digitalWrite(RLED,LOW);

   }

}

 

▶ 실행영상 :  

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

RFID 도어락 만들어 보기

(아래는 유튜브로 시청하기)

https://youtu.be/6nBu0obCx5Q

▶ 아두이노 파일다운 :

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

 

ko_arduino_code_Servo_LED.zip
0.00MB

 

 

 

 컴파일 에러 발생시 해결 방법 참고 :  아래 최신글을 참고해 보세요.

rasino.tistory.com/321

 

【 MFRC522 RFID with Nano 33 iot #1】 아두이노 나노(33 IoT) 보드에 RFID 카드 모듈 사용해 보기!( feat. RFID

【 MFRC522 RFID with Nano 33 iot #1】 아두이노 나노(33 IoT) 보드에 RFID 카드 모듈 사용해 보기! ( feat. RFID 컴파일 오류 있는 경우도 보세요! ) Nano 33 every(또는 33 iot 등)에서 RFID를 사용해보려 하..

rasino.tistory.com

 

반응형
반응형

【 아두이노모듈#12 RFID (RC522) 사용하기 #2

 

 RFID(Radio Frequancy Identification)는 무선 주파수를 이용하여 RFID 태그와 RFID리더간 데이터를 교환하는 장치이다.

 교통카드, 학생신분증 겸용카드, 연구실 및 회사 출입문카드, 구내식당 카드, 마트 등의 상품 진열 및 관리 등등 다방면에서 이용되고 있다. 

 지난 실습에서 아두이노와 연결하는 기본회로 만들어 보았는데, 시리얼모니터를 통해 특정 ID카드의 고유값(UID)을 확인한 승인 처리 및 거부 처리 해보는 실습을 진행하려고 한다. 

 

▶ 선수 학습 :

      1. [아두이노 모듈#11] RFID(RC522) 사용하기 #1 ☜ (클릭)

 

 RFID 모듈 (RC522) 세부 스팩

※ RFID 모듈 개요 

 - RC522모듈은 RFID 범주에 속하는 NFC통신 방식을 사용한다. NFC는 13.56MHz의 주파수 대역을 사용하고 10cm 이내 가까운 거리의 비첩촉 통신을 뜻한다.

 - RC522의 모듈 구성은 RFID 데이터를 잃고 기록 할 수 있는 본체가 있으며, RFID 고유데이터(UID) 코드가 저장되어 있는 카드키와 열쇠고리형키가 포함 되어 있다. 

 - 본 실습에서는 아두이노와 통신하기 위해 SPI통신 방식으로 연결하여 사용한다.

 

▶ 실습 목표 :  

 1. [ RFID 구동원리, 통신 방식에 대해 이해할 수 있다. 

 2. [ SPI통신과 회로 연결에 대해 이해 할 수 있다.]

 3. [ 카드별 고유넘버(UID)를 알아 낼 수 있다.]

 4. [ 특정 UID를 지정하여 승인 및 거부 처리를 할 수 있다.]

 

▶ 실습 회로도면 :
  (이미지 클릭하면 확대 가능)

RFID RC522 모듈 연결 회로도

▶ 실습 절차  : 

 

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

2.   아두이노IDE에서 MFRC522 라이브러리를 검색후 설치한다. 
  (메뉴 : 스케치 》 라이브러리 포함하기 》 라이브러리 관리 》 라이브러리 메니저 )
  

3.  첨부된 아두이노 파일을 다운 받아 코드를 실행시킨다. 

 

4. 프로그램을 동작시키고 승인처리할 카드키 값을 읽어 프로그램에 적용한다.

5. 승인 및 거부 처리가 잘 되는지 확인한다. 

 

▶ 프로그램 코드 및 설명 : 

/* ID 카드의 UID값에 따라 승인 또는 거부 처리하기 */

#include <SPI.h>
#
include <MFRC522.h>
#
define SS_PIN 10    // spi 통신을 위한 SS(chip select)핀 설정
#define RST_PIN 9    // 리셋 핀 설정 
MFRC522 
rfid(SS_PIN, RST_PIN); // 'rfid' 이름으로 클래스 객체 선언

void setup ( ) {

  Serial.begin(9600);
  
SPI.begin();           // SPI 통신 시작

  rfid.PCD_Init();       // RFID(MFRC522) 초기화

  Serial.println("Approximate your card to the reader...");
 
Serial.println();

  }

}

void loop ( )  {

 // 새카드 접촉이 있을 때만 다음 단계로 넘어감

  if ( ! rfid.PICC_IsNewCardPresent())
    
return;

 // 카드 읽힘이 제대로 되면 다음으로 넘어감
  if ( ! rfid.PICC_ReadCardSerial())

    return;

  // 현재 접촉 되는 카드 타입을 읽어와 모니터에 표시함  

  Serial.print("UID tag :");
 
String content= "";
 
byte letter;   
 
for (byte i = 0; i < rfid.uid.size; i++)
 
{  
    
Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " ");
    
Serial.print(rfid.uid.uidByte[i], HEX);
    
content.concat(String(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "));
    
content.concat(String(rfid.uid.uidByte[i], HEX));
 
}

  Serial.println();
 
Serial.print("Message : ");
 
content.toUpperCase();
  // UID값이 아래 값과 같으면 승인 처리
  if (content.substring(1) == "85 7C FB D1") // 승인 하고자하는 UID 기록
 {
   
Serial.println("Authorized access");
   
Serial.println();
   
delay(3000);      // 카드 접촉 및 연속체크 시간에 대한 딜레이 주기
  }
 // UID값이 다르다면 엑세스 거부 처리
  else   {
   
Serial.println(" Access denied");
   
delay(3000);     // 카드 접촉 및 연속체크 시간에 대한 딜레이 주기
  }

}

 

▶ 실행영상 :  

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

(아래는 유튜브로 시청하기)

https://youtu.be/I9uYJHTNAzA

 

▶ 아두이노 파일다운 :

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

RFID_Access_Denaied_ok.zip
0.00MB

 

 

 컴파일 에러 발생시 해결 방법 참고 :  아래 최신글을 참고해 보세요.

rasino.tistory.com/321

 

【 MFRC522 RFID with Nano 33 iot #1】 아두이노 나노(33 IoT) 보드에 RFID 카드 모듈 사용해 보기!( feat. RFID

【 MFRC522 RFID with Nano 33 iot #1】 아두이노 나노(33 IoT) 보드에 RFID 카드 모듈 사용해 보기! ( feat. RFID 컴파일 오류 있는 경우도 보세요! ) Nano 33 every(또는 33 iot 등)에서 RFID를 사용해보려 하..

rasino.tistory.com

 

반응형
반응형

【 아두이노모듈#11RFID (RC522) 사용하기 #1

 

 RFID(Radio Frequancy Identification)는 무선 주파수를 이용하여 RFID 태그와 RFID리더간 데이터를 교환하는 장치이다.

 교통카드, 학생신분증 겸용카드, 연구실 및 회사 출입문카드, 구내식당 카드, 마트 등의 상품 진열 및 관리 등등 다방면에서 이용되고 있다. 

 이번 실습에서는 아두이노와 연결하는 기본회로를 구성하고 시리얼 모니터를 통해 카드별로 UID를 확인해보는 실습을 진행하려고 한다. 

 

▶ 선수 학습 :

   없음.

 

RFID 모듈 (RC522) 세부 스팩

 RFID 모듈 개요 

 - RC522모듈은 RFID 범주에 속하는 NFC통신 방식을 사용한다. NFC는 13.56MHz의 주파수 대역을 사용하고 10cm 이내 가까운 거리의 비첩촉 통신을 뜻한다.

 - RC522의 모듈 구성은 RFID 데이터를 읽고 기록 할 수 있는 본체가 있으며, RFID 고유데이터(UID) 코드가 저장되어 있는 카드키와 열쇠고리형키가 포함 되어 있다. 

 - 본 실습에서는 아두이노와 통신하기 위해 SPI통신 방식으로 연결하여 사용한다.

 

▶ 실습 목표 :  

 1. [ RFID 구동원리, 통신 방식에 대해 이해할 수 있다. 

 2. [ SPI통신과 회로 연결에 대해 이해 할 수 있다.]

 3. [ 카드별 고유넘버(UID)를 알아 낼 수 있다.]

 

▶ 실습 회로도면 :
  (이미지 클릭하면 확대 가능)

RFID 기본 회로도

 

▶ 실습 절차  : 

 

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

2.   아두이노IDE에서 MFRC522 라이브러리를 검색후 설치한다.
  (메뉴 : 스케치 》 라이브러리 포함하기 》 라이브러리 관리 》 라이브러리 메니저 )
  

3.  설치된 라이브러리가 제공하는 예제파일을 열어 실행시킨다. (ReadNUD : UID 스캔 프로그램)

  (메뉴 : 파일 》 예제 》 MFRC522 》 ReadNUD 클릭)  

라이브러리 설치후 제공되는 예제파일 실행

4. 프로그램을 동작시키고 카드키를 RC522본체에 접촉시킨 후 시리얼 모니터창을 통해 UID값을 확인한다.

 

▶ 프로그램 코드 및 설명 : 

/* RC522.h 라이브러리에 포함된 ReadNUID 예제 참조 */

#include <SPI.h>
#
include <MFRC522.h>
#
define SS_PIN 10    // spi 통신을 위한 SS(chip select)핀 설정
#define RST_PIN 9    // 리셋 핀 설정
MFRC522
rfid(SS_PIN, RST_PIN); // 'rfid' 이름으로 클래스 객체 선언
MFRC522::MIFARE_Key key;
byte
nuidPICC[4];   // 카드 ID들을 저장(비교)하기 위한 배열(변수)선언

void setup ( ) {

  Serial.begin(9600);
 
SPI.begin();           // SPI 통신 시작

  rfid.PCD_Init();       // RFID(MFRC522) 초기화

  // ID값 초기화 

  for (byte i = 0; i < 6; i++) {

    key.keyByte[i] = 0xFF;

  }

// MIFARE 타입의 카드키 종류들만 인식됨을 표시

  Serial.println(F("This code scan the MIFARE Classsic NUID."));

  Serial.print(F("Using the following key:"));

  printHex(key.keyByte, MFRC522::MF_KEY_SIZE);

}

void loop ( )  {

 // 새카드 접촉이 있을 때만 다음 단계로 넘어감

  if ( ! rfid.PICC_IsNewCardPresent())
   
return;

 // 카드 읽힘이 제대로 되면 다음으로 넘어감
  if ( ! rfid.PICC_ReadCardSerial())

    return;

  // 현재 접촉 되는 카드 타입을 읽어와 모니터에 표시함

  Serial.print(F("PICC type: "));

  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);

  Serial.println(rfid.PICC_GetTypeName(piccType));

  // MIFARE 방식의 카드인지 확인 루틴

  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI && 

    piccType != MFRC522::PICC_TYPE_MIFARE_1K &&

    piccType != MFRC522::PICC_TYPE_MIFARE_4K) {

    Serial.println(F("Your tag is not of type MIFARE Classic."));

    return;

  }

 // 이전 인식된 카드와 다른, 혹은 새카드가 인식되면

  if (rfid.uid.uidByte[0] != nuidPICC[0] ||

    rfid.uid.uidByte[1] != nuidPICC[1] ||

    rfid.uid.uidByte[2] != nuidPICC[2] ||

    rfid.uid.uidByte[3] != nuidPICC[3] ) {

    Serial.println(F("A new card has been detected."));

 // 고유아이디(UID) 값을 저장한다.

    for (byte i = 0; i < 4; i++) {

      nuidPICC[i] = rfid.uid.uidByte[i];

    }

 // 그 UID 값을 16진값으로 출력 한다.

    Serial.println(F("The NUID tag is:"));

    Serial.print(F("In hex: "));

    printHex(rfid.uid.uidByte, rfid.uid.size);

    Serial.println();

 // 그 UID 값을 10진값으로 출력 한다.

    Serial.print(F("In dec: "));

    printDec(rfid.uid.uidByte, rfid.uid.size);

    Serial.println();

  }

 // 연속으로 동일한 카드를 접촉하면 다른 처리 없이

 // '이미 인식된 카드'라는 메세지를 출력한다.

  else Serial.println(F("Card read previously."));

  rfid.PICC_HaltA();

  rfid.PCD_StopCrypto1();

}

// 16진 값으로 변환 해주는 함수 정의

void printHex(byte *buffer, byte bufferSize) {

  for (byte i = 0; i < bufferSize; i++) {

    Serial.print(buffer[i] < 0x10 ? " 0" : " ");

    Serial.print(buffer[i], HEX);

  }

}

// 10진 값으로 변환 해주는 함수 정의

void printDec(byte *buffer, byte bufferSize) {

  for (byte i = 0; i < bufferSize; i++) {

    Serial.print(buffer[i] < 0x10 ? " 0" : " ");

    Serial.print(buffer[i], DEC);

  }

}

 

▶ 실행영상 :  

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

(아래는 유튜브로 시청하기)

https://youtu.be/uwi1Uk9U64w

RFID 회로 조립과 최초 동작확인

 

▶ 아두이노 파일다운 :

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

01_ReadNUID.zip
0.00MB

 

 

컴파일 에러 발생시 해결 방법 참고 :  아래 최신글을 참고해 보세요.

rasino.tistory.com/321

 

【 MFRC522 RFID with Nano 33 iot #1】 아두이노 나노(33 IoT) 보드에 RFID 카드 모듈 사용해 보기!( feat. RFID

【 MFRC522 RFID with Nano 33 iot #1】 아두이노 나노(33 IoT) 보드에 RFID 카드 모듈 사용해 보기! ( feat. RFID 컴파일 오류 있는 경우도 보세요! ) Nano 33 every(또는 33 iot 등)에서 RFID를 사용해보려 하..

rasino.tistory.com

 

반응형
반응형

【 아두이노Proj#3아두이노 스마트 화분 만들기 Ver1

 

 아두이노를 이용해 스마트 화분을 만들어 보자~!

우선 핵심기능으로 토양습도센서로 흙의 습도 값을 측정하여 일정 수치이하로 떨어지면(수분이 마르면) 워터펌프를 작동하여 물을 공급해주는 기능을 구현해 보려 한다. 

 아울러 !

 [ FND를 부착하여 수분정도를 알려주는 스마트화분 버전(Ver. 2)여기를 참고  ]

 [ FND와 LCD를 함께 부착하여 수분정도를 알려주는 스마트화분 버전(Ver. 3)여기를 참고  ]

 

▶ 선수 학습 :

   1. [아두이노 센서#34]  토양 센서( YL-38) Sensor 다루기  ☜ (클릭)

 

토양습도센서 (YL-38 , YL-69) 세부 스팩

< 센서모듈과 수분탐침을 연결한 모습 >

 

 

 

 

 

 시중에 YL-38, YL-69 두 종류가 있다, 기능상의 차이는 없으며 핀배열이 조금 상이할 뿐이다. 여기서는 YL-38을 가지고 제작 하려고 한다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 워터 펌프 스팩

 

 

 

 

 

 

 

 

 

 

 

 

< 워터펌프용 튜브 : 지름 6mm (외경:6mm, 내경:4mm) >

※ 위에 사용된 호수는 외경이 6 mm 이고 내경이 4mm 입니다. 그리고 펌프 출수구에 호수를 끼울때 호수를 출수구 바같으로 감싸듯 끼우게 되는데요, 펌프출수구의 외경이 7.4mm 됩니다. 이렇게 어느정도 역으로 크기 차이가 나야 호수가 수압에 의해 쉽게 빠지지 않습니다. 다만, 지금 정도의 차이에서, 끼워보니 상당히 빡빡했어요. 이럴때는 호수 내부에 물기를 살짝 묻혀서 끼워보면 조금 쉽게 끼워집니다.  ^^

 

▶ 실습 목표 :  

  1. [ 토양습도 센서에 대해 이해 할 수 있다. 

 2. [ 워터펌프에 대해 이해 할 수 있다. ]

 3. [ 토양 센서 값에 따라 펌프를 작동시켜 물공급 조절을 할 수 있다.]

 

▶ 실습 회로도면 :
  (이미지 클릭하면 확대 가능)

< 스마트 화분 연결 구성도 >

※ 위 회로에 대해 모터 작동이 원활 하지 않을 수 있고, 장시간 사용시 아두이노 보드에 무리가 갈 수 있어 아래 처럼 NPN타입의 TR과 저항을 추가하여 보강하였다.  가급적이면 아래 회로를 참조하여 구성해주면 좋을 것이다.

(TR은 NPN 타입의 ' 2SC 9013 '을 사용하였으나,   TR 타입이 NPN타입 이면 어떤 것이든 동일하게 사용 가능하다. ) 

- C9011과 C9012, C9013은 모두 핀 배열이 동일함( E B C)

- C1815는 핀배열이 E C B 임

[ 위 회로에서 주의 하셔야 할 것은  아두이노 회로에서 주로 사용되는 TR의 경우(2SA, 2SC타입)  NPN형 타입은 PNP형 타입과 마찬가지로 핀의 순서가 있으니 주의 하셔야 합니다. 

우선, 도면에 사용된 NPN형 TR은 2SC9011 이며, 라벨이 적인 면의 왼쪽을 기준으로 핀 이름이 
1.   2SC9011 :  - E B C -  순서로 되어 있고, 

2.   2SC1815 :  - E C B - 순서로 되어 있으니 반드시 확인 후 연결하세요. 

또한, 이외의 TR을 사용할 경우 미니 테스터기 혹은 인터넷 검색으로 핀 순서를 확인하여 도면대로 연결하시면 문제 없이 동작 할 거예요. ]

 

[ 추가로 위 회로의 모터 연결 방식은 장시간 사용하기에는 좀 무리가 따르며, 전원을 별도로 넣어 줄 수 있는 릴레이 모듈이나, L298 모터 드라이버 모듈을 연결해서 사용하시는 걸 권장합니다. 조만간 보강된 회로의 업로드 버전도 올려 볼게요. ^^; ]   

 

▶ 실습 절차  : 

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

2.   물펌프는 물통 속에 담겨진다. 따라서 물펌프의 전선이 빠져나오는 부분은 필요한 경우 글루건 등으로 보강처리 할 필요가 있다. 

3.  우선 본 실험처럼 작은 물통을 준비하고, 간이 화분을 준비해서 실험을 해 본 후 실제 화분에 설치해보면 좋을 것이다. 또한 필요한 경우 센서를 두 개 이상 설치할 수도 있고, 두개의 화분을 하나의 보드로 연결하여 관리 해 볼 수 있을 것이다.

4.  다음 버전에서는 수분 값 등을 FND 혹은 LED, LCD 등을 부착하여 표시해보려고 한다. 

 

 

▶ 프로그램 코드 및 설명 : 

 

/* 스마트 화분 만들기 [코딩]  */

#define A0Pin 0

int sensorVal = 0;

int pump = 13;

void setup ( ) {
 Serial.begin(9600);

 pinMode(pump, OUTPUT);

 }

void loop ( ) { 

  sensorVal = analogRead(A0Pin);    //토양센서 센서 값 읽어 저장

  delay(1000);

  Serial.print("Asensor = ");

  Serial.println(sensorVal);  // 0(습함) ~ 1023(건조)값 출력

  // 습도 값에 따라 출력 처리 다르게 해줌

  if ( sensorVal <= 900) {   

    Serial.println(" Very Wet ! ");       

    digitalWrite(pump, LOW);   

  }

 else if ( sensorVal > 900){

    Serial.println(" Very Dry ! ");   

    digitalWrite(pump, HIGH);

    Serial.println(" Pump On for 1 Second!");   

    delay(1000);

  }   

  delay(3000);   // 정보수집 시간(간격) 설정

}

▶ 실행영상 :  

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

 

(아래는 유튜브로 시청하기)

https://youtu.be/GlYIry2jga8

▶ 아두이노 파일다운 :

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

AutoWaterPot.zip
0.00MB

 

반응형
반응형

【 아두이노 Proj#2】 라인트레이서 자동차 만들기 L298N모듈)

 

 적외선 센서를 이용하여 바닥에 그려진 라인을 따라 이동하는 RC카를 만들어 보자. 

 

▶ 선수 학습 :

1. (기초) #24 DC 모터 제어 하기 4 (L293 & H브릿지 참고 강좌 클릭
2. (센서) #2 적외선(근접)센서 TCRT5000(TCRT5000 참고 강좌 클릭
3. (센서) #24 L298N 모터 모듈활용한... (L298N 모듈 참고 강좌 클릭   
4. (응용) #1 초음파센서로 자동차 만들기 (자동차 구동이해)  강좌 클릭

 

▶ 라인트레이서 완성 모습

 

▶ 라인트레이서 동작 원리

 

 이와 같은 센싱 역할을 하는 센서가 바로 아래 소개 되는 TCRT5000센서이며 이를 사용하기 편하게 모듈화 한 것이다.

 

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

 

 TCRT 5000은 적외선 방식이어서 적외선 센서로 불리지만, 가깝고 짧은 거리에 사용되기 때문에 근접센서로도 불린다. 

 TCRT 5000 모듈의 상세한 사용 설명은 선수학습 '2.번'을 참고 

 

 

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

 

 모터 모듈의 상세한 사용 설명은 선수학습 '3.번'을 참고
 
 

▶ 실습 목표 :  

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

2. 적외선 센서(TCRT5000)의 작동방식과 활용하는 법을 익힐 수 있다.

4. 검은색 라인위를 따라 이동하는 라인트레이서 로봇을 구현할 수 있다. 

 

 

※ 전원 공급은 건전지를 사용할 수도 있지만 , 요즘 많이 보유하고 있는 휴대폰보조베터리를 사용해도 된다.  소형 보조 베터리 사용시 장점은, 건전지보다 장시간 플레이가 가능하며, 언제든 손쉽게 재충전이 가능하여 건전지 교체비용을 줄일 수 있다. 

 

▶ 실습 회로도면 1 (기본회로):

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

※ 주의!! 위 이미지에서 아두이노에 연결된 붉은 선이 5V가 아니라 Vin으로 연결 되어야 합니다!!!

※ 실습회로 도면 1에 보면, 9V 건전지는 아두이노쪽에 전원공급용으로 쓰였구요. L298N모듈에 보면, +5V~(모터, 별도전원) 이라고 되어 있는 부분에는 5V이상 되는 전원을 따로 넣어(연결) 주라는 의미에요.   
그래서, 건전지를 두 개(가지) 사용해야 모터가 잘 돌아갑니다. 

 

▶ 실습 회로도면 2 (확장회로):

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

 

 ※ 기본 회로로 동작이 확인 되면 위 그림 처럼 마치 자동차의 헤드램프 처럼 라이트가 들어오도록 LED와 저항을 추가 할 수 있으며, RC카의 전원을 켜고 끄기 쉽도록 슬라이드 스위치를 달아 놓았다.  (토글 스위치를 사용하여도 무방)

 

▶ 회로 연결 쉽게 따라하기 (영상) :

 

(영상을 확대해서 플레이해서 보세요)

 

 

▶ 실습 절차  : 

 
1.    위 회로 연결도를 참고하여 부품들을 연결한다
2.    DC 모터의 연결선 방향은 우선 연결 후 프로그램으로 작동시켜보고 방향이 반대가 될 경우 다시 바꾸어 연결하면 된다.
3.    만약 가지고 있는 모터의 용량이 비교적 클 경우 아두이노 전원만으로는 동작이 어려울 수 있으니 회로도에서 처럼 별도 전원을 인가해주면 동작이 잘 될 것이다. (※ 모터 관련 회로에서 대부분의 동작 문제는 모터에 공급되는 전력이 충분치 않아 발생한다) 
 
5.   전원 하나로 아두이노와 DC모터를 포함한 L298모듈 둘 다를 돌리기에는 한계가 있다따라서 아두이노와 DC모터 모듈 전원을 각각 공급해주어야 하며이때 그라운드(GND) 공통으로 연결해주면 된다.  (속도가 빠르지는 않지만 휴대폰 보조베터리를 연결하면 하나의 전원으로 구동이 가능하다)
 
6.  모터 모듈 전원은 최소 5V이상, 모터용량에 따라 넣어 주면 되는데, 모터 구동에는 전압보다 전류가 중요한 역할을 하게 된다실험을 해보면모터모듈 전원으로 9V 베터리를 연결 할 때 보다, 1.5V X 4개 (6V)를 연결할 때가 훨씬 잘 동작될 것이다.(4개의 건전지에서 전류가 충분히 공급 되기 때문)
7.   TCRT5000 센서 동작에 문제가 있다면, 센서에 달려 있는 가변저항을 소형드라이버 등으로 돌려서 측정가능한 거리값을 조절 해보기 바란다. 
8. '라인'은 방바닥에 두툼한 검정색 혹은 짙은색 (종이)테이프 등으로 모양을 만들어도 잘 작동한다.
 
 

 

 

▶ 프로그램 코드 및 설명 : 

/* 라인트레이서(Line Tracer) 프로그램       */
/* by RASIno , http://rasino.tistory.com  */


#define IN1 8#define IN2 9#define IN3 10#define IN4 11int leftLineSensor =  12;      // 라인트레이서 왼쪽 센서

int rightLineSensor = 13;      // 라인트레이서 오른쪽 센서

 

void forward() {      // 

전진 : 모터 두 개를 모두 정회전 시킴

      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() {       // 

정지 : 2개의 모터 모두 회전 멈춤

      digitalWrite(IN1, LOW);

      digitalWrite(IN2, LOW);

      digitalWrite(IN3, LOW);

 

      digitalWrite(IN4, LOW);  }

 

void setup( )  {

  pinMode(IN1, OUTPUT);     // A 모터 1

  pinMode(IN2, OUTPUT);     // A 모터 2

  pinMode(IN3, OUTPUT);     // B 모터 1

  pinMode(IN4, OUTPUT);     // B 모터 2

  pinMode(leftLineSensor, INPUT);

  pinMode(rightLineSensor, INPUT);  

}

 

void loop( ) {

 

// 만약 양쪽 센서가 모두 선 미감지’(반사신호’OK’) 경우 : 전진

if (!digitalRead(leftLineSensor) && !digitalRead(rightLineSensor)) {

  forward();  

 }  

 

// 만약 왼쪽 센서만 선감지(반사신호X)’ 경우 :  좌회전

else if (!digitalRead(leftLineSensor) && digitalRead(rightLineSensor)) {

  left();  

 }   

 

// 만약 오른쪽 센서만 선감지(반사신호X)’ 경우 :  우회전

else if (digitalRead(leftLineSensor) && !digitalRead(rightLineSensor)) {

  right();

 } 

 

  // 만약 양쪽 센서 모두 선감지(반사신호X)’ 경우 :  정지

else if (digitalRead(leftLineSensor) && digitalRead(rightLineSensor)) {

 

  stop();  

 } 

 

}

◈  모터 A, B가 동시에 시계방향으로 돌면 전진, 반시계 방향이면 후진이고, 
한 쪽바퀴만 돌리거나 두 개의 바퀴를 서로 반대로 돌리면 좌회전 혹은 우회전이 된다.  

 이를 함수 형태로 만들고 메인 루프에서 적절히 함수들을 호출해서 사용하도록 하였다.  라인트레이서의 동작을 좀더 다양하게 꾸밀 수 있는데, 바닥의 라인에 따라 되돌아 나오기 등등 여러 형태로 프로그래밍 해 볼 수 있다. 

▶ 실행영상 :  

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

 

 

 

 

 

 

 

 

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

LineTracerRC-CAR.ino
다운로드

 

 

▶ 동작이 안 될 때 :

아래 사항을 하나씩 살펴보세요. (위 글 내용에도 강조했지만 다시 정리해드리면)

 

1. 회로 연결을 꼼꼼하게 한번더 살펴 보세요. 분명 회로도 보고 하셔도 어디 한 두 군데 잘못연결되면 동작되지 않습니다. 

2. 모터가 들어가는 회로에서 모터 동작이 이상하거나 잘 안되는 원인의 대부분은 전력부족이에요.   전력 중에서도 전류가 충분하게 공급되어야 하죠. (전압보다 전류가 더 중요해요)

실습회로 도면 1에 보면, 9V 건전지는 아두이노쪽에 전원공급용으로 쓰였구요. 
L298N모듈에 보면, +5V~(모터, 별도전원) 이라고 되어 있는 부분에는 5V이상 되는 전원을 따로 넣어(연결) 주라는 의미에요.   그래서, 건전지를 두 개(가지) 사용해야 아마 제대로 돌아갈 거예요. 

건전지 하나로는 보통 겨우 겨우 돌아가거나 제대로 안 돌아 갈 수 있어요. 

그리고, 9V 건전지는 전압은 높아보이지만 전류가 약한 타입이라서 아두이노 본체 전원으로는 좋은데, 모터쪽 전원으로는 부적합해요.  그래서 모터쪽 전원으로는 AA(1.5V)건전지 4개를 직렬연결해서 6V정도로 만들어 공급해주면 좋구요,  아니면, 18650(3.7V) 두 개를 직렬(7.4V) 연결한 걸 공급해주면 됩니다.  얘네들은 전류가 쎈 건전지라서 모터가 잘 돌아가요. 

그리고, 스위치를 추가한 회로 도면 2번(확장회로)에도 1번과 같이 모터쪽 전원과 따로 분리해서 전원을 이중으로 넣어주면 됩니다.

반응형
반응형

【 아두이노 Proj#1】 초음파센서로 자동차 만들기 L298N모듈)

 지난 시간 L298모터 드라이버 모듈을 활용하여 초음파 센서에 반응하여 모터를 구동시키는 실습을 해보았다. 이제 본격적으로 초음파 센싱으로 작동되는 자동차를 만들어보려 한다.  또한 초음파 센서쪽에 서보모터를 부착하여 좌우의 장애물의 유무를 파악하여 장애물이 없는 쪽으로 움직일 수 있도록 하였다. 

▶ 선수 학습 :

1. (기초)#24 DC 모터 제어 하기 4 (L293 & H브릿지 참고)   강좌보기클릭  2(기초)#28 서보(Servo) 모터 제어 하기 1 (서보모터이해)    강좌보기클릭  3(기초)#29 서보(Servo) 모터 제어 하기 2 (서보모터이해)    강좌보기클릭  
4. (센서)#24 초음파센서 경보회로with LCD (초음파 센서이해)    강좌보기클릭


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

 모터 모듈의 상세한 사용 설명은 선수학습 4.번을 참고


▶ 실습 목표 :  

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

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

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

4. 초음파로 장애물을 확인하고 회피기동 프로그램을 작성하여 스스로 움직이는 RC카처럼 구성해볼 수 있다. 


▶ 실습 회로도면 (서보모터 부착회로):

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

 ※ 아두이노에 공급되는 전원과 별도로 모터에도 전원을 인가해주면 좋을 것이다.(단일 전원 구성도 가능하나, 바퀴가 힘있게 굴러가지 못하고 작동시간도 매우 짧기 때문에 모터 구동(모듈)쪽에 별도의 전원을 넣어 주는 것이 좋다) 


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



▶ 실습 절차  : 

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

5.   전원 하나로 아두이노와 DC모터를 포함한 L298모듈 둘 다를 돌리기에는 한계가 있다따라서 아두이노와 DC모터 모듈 전원을 각각 공급해주어야 하며, 이때 그라운드(GND) 공통으로 연결해주면 된다.

6.  모터 모듈 전원은 최소 5V이상, 모터용량에 따라 넣어 주면 되는데, 모터 구동에는 전압보다 전류가 중요한 역할을 하게 된다실험을 해보면, 모터모듈 전원으로 9V 베터리를 연결 할 때 보다, 1.5V X 4(6V)를 연결할 때가 훨씬 잘 동작될 것이다.(4개의 건전지에서 전류가 충분히 공급 되기 때문)
7. 서보모터는 180도 왕복 회전할 수 있는 것을 사용한다.
8.   초음파 센서에 손이나 장애물을 대어 보아서 모터제어가 잘 되는지 확인한다.

▶ 프로그램 코드 및 설명 : 

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

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

int triggerPin = 13;

int echoPin = 12;

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

#define IN2 9

#define IN3 10

#define IN4 11

float distance;          // 초음파 센서 거리값 변수

int servoPin = 2;     // 서보모터 연결 포트

Servo servo;


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);          // 에코 핀을 입력으로 설정

  servo.attach(servoPin);               // 서보모터 연결 지정

  servo.write(90);                            // 초기값으로 정면 응시

  delay(1000);               

}


float getDistanceCM() {      // 초음파 센서 거리 측정 함수(단위:cm)

  digitalWrite(echoPin, LOW);

  digitalWrite(trigPin, LOW);

  delayMicroseconds(2);

  digitalWrite(trigPin, HIGH);

  delayMicroseconds(10);

  digitalWrite(trigPin, LOW); 

  distance = pulseIn(echoPin, HIGH)  / 58;  //거리값 계산 후 저장

  return distance;

}


// 거리값 정확도를 위한 평균치 계산 함수(1회이상~ 10회미만으로 조정해보기)

float getStableDistanceCM() {

  int CmSum = 0;

  for (int i = 0; i < 8; i++) {

    CmSum += getDistanceCM();  //, 'sum = sum + cm' 동일

   }

  return CmSum / 8;

}


void loop( ) {

   if ( getStableDistanceCM() < 25 ) {  // 25cm이하 장애물 감지

         stop();

         delay(300);     
         servo.write(180);      // 서보모터 좌회전 후 측정 거리값 변수에 저장     

        delay(500);

        int leftDistance = getStableDistanceCM();

        delay(300);

        servo.write(0);           // 서보모터 우회전 후 측정 거리값 변수에 저장

        delay(500);

        int rightDistance = getStableDistanceCM();

        delay(300);

        servo.write(90);        // 서보모터 중앙으로 원위치

        delay(500);

        back();                         // 0.5초간 후진

        delay(500);

       if (leftDistance > rightDistance {

           left();

       } else {

          right();
       } 

      delay(500);

  }   else {                            // 장애물 감지가 안 될 경우 전진

      forward();

      }

   }

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

  한쪽바퀴만 돌리거나 두 개의 바퀴를 서로 반대로 돌리면 좌회전 혹은 우회전이 된다.   이를 함수 형태로 만들고 메인 루프에서 적절히 함수들을 호출해서 사용하도록 하였다. 또한 거리값을 계산하는 부분을 함수로 만들었다(getDistanceCM()) , 그리고 얻어진 거리값을 초음파로 측정할 때 오류가 날 수 있기 때문에 1~8회 사이 몇 번 측정후 평균을 내면 편차가 큰 오류값은 걸러낼 수 있고 이를 함수로(getStableDistanceCM()) 만들었다.  

 위 프로그래밍에서는 기본 전진 기동을 하다가, 물체가 20cm 이내로 감지되면 정지를 시키고, 초음파 센서에 달린 서보모터를 좌, 우로 돌려보고 거리값을 각각 측정하여 물체가 없거나 물체와의 거리가 더 먼쪽의 방향으로 회전(좌회전 또는 우회전) 하도록 프로그래밍 한 것이다. 


▶ 실행영상 :  

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


※ 자동차 몸체는 영상에 있는 것이 아니어도 좋다. 두 바퀴를 안정적으로 고정시킬 수 있는 몸체와 앞 뒤로 기울어지지 않게 볼캐스트(볼 베어링)를 종이박스나, 폼보드 등에 부착해서 직접 만들어도 된다. 


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

UltraSonicRC-CAR_Servo.ino






반응형
반응형

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


반응형