반응형

Arduino 초음파센서(HC-SR04) 사용하기


사용할 센서는 HC-SR04이다.


HC-SR04 센서는 초음파를 이용하여 거리를 측정할 수 있는 센서다초음파는 귀에

들리지 않을 정도의 높은 주파수(약 20MHz이상)의 소리를 말하며초당 340m의 속도를

갖는다이러한 초음파의 속도를 바탕으로 시간관련 함수를 응용하면 초음파를 활용하여

거리나 수위적설 등을 측정할 수 있다.

 

초음파 거리센서의 구조는 생각보다 간단하다총 4개의 핀으로 구성되어있으며 양끝의

VCC와 Gnd를 통해 전원(5V)을 입력받고, Trig핀을 통해 신호를 입력 받으면 초음파를

발신초음파가 다시 수신되면 Echo핀을 통해 신호를 출력한다센서는 5V에서 작동하며

약 15mA의 전류를 사용한다측정 범위는 최소 2cm에서 4m이지만 주변 환경에 의해

오차가 발생할 수 있다.



초음파 거리 측정

 

회로도 연결


Vcc,Pin13,12,GND 차례로 연결해주었다.



실제 연결 모습이다.


초음파 거리센서의 VCCGND는 전원(5V,GND)에 연결을 해주며 Trig는 초음파를 쏘기

위해 디지털 핀 출력 설정을, Echo는 초음파를 받기 위해 디지털 핀 입력을 설정해준다.



Source


int trig = 13; // 변수 trig를 생성하고 13를 대입한다

int echo = 12; // 변수 echo를 생성하고 12을 대입한다

 

void setup() {

pinMode(trig, OUTPUT); // trig(13)핀을 출력모드로 설정한다

pinMode(echo, INPUT); // echo(12)핀을 입력모드로 설정한다

Serial.begin(9600); //보드레이트를 설정합니다.

}

 

void loop() {

digitalWrite(trig, HIGH); // trig(13)핀에 HIGH신호를 보낸다

delayMicroseconds(10); // 10마이크로초(1/100,000) 동안

digitalWrite(trig, LOW); // trig(13)핀에 LOW신호를 보낸다

int distance = pulseIn(echo, HIGH) * 17 / 1000;

// 변수 distance = echo핀이 다시 HIGH신호를 받기까지의 시간 * 17/1000

Serial.print(distance); // 변수 distance를 출력한다

Serial.println("cm"); // 문자열 cm을 출력하고 줄바꿈

delay(200); // 딜레이 0.1

}

 

계산식


거리를 구하기 위한 식은 다음과 같다.

거리 = 시간 x 속도

거리를 구하기 위해서는 시간과 속도를 구해야하며, 시간과 속도는 다음과 같다.

 

속도 : 초음파의 속도는 초당 340m.

 

시간을 구하기 위해 pulseIn()이라는 함수가 등장했다. 위에서 사용한 pulseIn(echo,HIGH)

해석해보자면, echo핀이 HIGH상태에서 LOW신호를 받고, 다시 HIGH를 받기까지의 시간, 즉 다시

HIGH가 되기까지의 시간을 반환한다. , 10 마이크로초동안 쏜 초음파를 받기까지의 시간을

구하게된다.

시간: pulseIn(echo, HIGH); // 초음파가 돌아오는 시간

*17을 한 이유는 pulseln()함수로 구한 시간이 왕복 시간이기

때문입니다. 그렇기에 식에 나누기2를 합니다. /1000을 한 이유는 그냥 보기 좋게 cm로 단위를

맞추기 위함이다.

 

 

 

 

결과



반응형

Arduino LED 제어하기





모든 제어동작할 때 항상 기본적으로 시작하는 LED제어를 해보았다.




LED의 회로는 항상 간단하다.


소스

void setup() {

//LED 핀 설정을 해줍니다.

pinMode(11,OUTPUT);

}

 

void loop() {

//1개씩 순차적으로 켭니다.

digitalWrite(11,HIGH);

delay(500);

 

//1개씩 순차적으로 끕니다.

digitalWrite(11,LOW);

delay(500);

}

 

이 함수들을 간단히 이용한다면 사용자가 원하는 다양한 패턴을 사용할 수 있다.



=========================================================================


pinmode() : Arduino 보드의 pin을 입력 핀으로 사용할지 아니면 출력 핀으로 사용할지 설정하기 위하여 사용한다.

 

아두이노 우노에서는 20개의 디지털 입/출력 핀들이 제공되고 있습니다. 디지털 14 (D0 ~ D13), 아나로그 6(A0 ~ A5) 20개를 지원합니다. 즉 디지털 입출력 핀이 모자라면, 아나로그 핀들도 디지털 핀들로 사용 가능하다는 것입니다.

우선 사용할 핀들을 어떻게 사용할 것인지를 결정하는 명령이 바로 pinMode입니다.

문법

void pinMode(pin, mode)

pin은 디지털 입출력으로 사용할 핀 번호이며, modeINPUT, INPUT_PULLUP, OUTPUT과 같이 동작할 모드 값입니다.

설명

pin 값으로 디지털 핀들은 0 ~ 13 값으로 할당되고, 아나로그 A0 ~ A5 핀들은 14 ~ 19로 할당되어 사용됩니다. A0A5는 상수로 정의되어 있어 mode 값으로 같이 사용할 수 있습니다. A0 혹은 14를 사용하여도 같은 결과를 얻을 수 있습니다.

modeINPUT, INPUT_PULLUP, OUTPUT 3가지 모드를 지원하고 있습니다. OUTPUT은 핀을 출력 용으로 사용하고자 할 때 , INPUTINPUT_PULLUP은 둘 모두 입력 용으로 사용하고자 할 때 필요한 것이며, INPUT_PULLUP은 내부적으로 PULLUP 저항을 사용하여 외부에서 신호 값을 넣지 않을 경우에는 PULLUP 저항을 통하여 +5V가 공급되어 "1"로 읽히게 됩니다. 이를 간단한 회로도를 통하여 설명하는 것이 이해가 쉬울 것입니다.



digitalWrite() : digitalWrite(pin, value)는 디지털 출력 핀 pin에 정수 0(LOW) 혹은 정수 1(HIGH) 값을 써 출력 핀의 전압을 0V 혹은 아두이노 보드의 동작 전압에 따라 +3.3V 혹은 +5V로 만드는 함수

 

문법

아두이노에서 사용되는 모든 디지털 핀들의 번호 값을 pin에 넣고, 핀의 출력 전압을 0로 하고자 하면, 0 혹은 LOWvalue에 넣고, 출력 전압을 VCC로 하고자 하면 1 혹은 HIGH를 넣고 호출하면 됩니다. 아날로그 A0 ~A5 핀들도 디지털 핀들로 사용될 수 있으며, pinA0와 같은 값을 넣으면 됩니다.

void digitalWrite(uint8_t pin, uint8_t value)

주의하여야 할 사항으로 먼저 pinMode(...) 함수를 사용하여 핀의 동작 모드를 출력 모드로 설정한 후에 digitalWrite(...) 함수를 사용하여야 원하는 동작 결과를 얻을 수 있습니다. 물론 내부 풀업 저항으로 사용하기 위한 용도일 경우, 필요치 않습니다:

// 사용하는 3, 4, A0, A1 핀들을 출력 핀으로 설정합니다:

pinMode(3, OUTPUT);

pinMode(4, OUTPUT);

pinMode(A0, OUTPUT);

pinMode(A1, OUTPUT);

 

digitalWrite(3, HIGH); // HIGH1과 같습니다

digitalWrite(4, 1); // 출력 핀을 VCC로 만듭니다

digitalWrite(5, HIGH); // 내부 풀업 저항으로 사용

// pinMode(5, INPUT_PULLUP)과 같은 효과

digitalWrite(A0, LOW); // LOW0와 같습니다

digitalWrite(A1, 0); // 출력 핀을 0volt로 만듭니다

또한 analogWrite(pin, value) 함수로 PWM을 신호를 발생하고 있는 출력 핀에 사용하면 당연히 PWM 신호 발생이 중단되게 됩니다.

 


반응형

Arduino 온도센서(LM35) 사용


아두이노를 접하면 기본적인 센서 중 하나가 온도센서 LM35이다.

작동전압은 작동 전압은 2.7V ~ 5.5V 이다.

0~100도까지 측정가능하다고 한다.

 

아래 이미지의 순서대로 연결하면 센서가 작동한다.


Source

float temperature;

int reading;

int lm35Pin = A0;

 

void setup()

{

analogReference(DEFAULT); // param

Serial.begin(9600);

}

 

void loop()

{

reading = analogRead(lm35Pin);

//temperature = reading/9.31; //1.1기준전압인 INTERNAL로 할 때 적용 식

temperature = (5.0 * analogRead(lm35Pin) * 100.0) / 1024;

Serial.println(temp);

delay(1000);

}

 

LM35센서에 적용되어 전압을 온도로 변환시키는 공식이 설명되어있다.


http://playground.arduino.cc/Main/LM35HigherResolution


temp = (5.0 * analogRead(tempPin) * 100.0) / 1024;

 

결과

analogReference(INTERNAL)


analogReference(DEFAULT)





====================================================

analogReference() : ADC의 기준전압을 설정하는 함수

param

-DEFAULT: analogReference() 함수를 사용하지 않고 analogRead() 함수를 사용하면 기본으로 동작하는 모드이며, analogReference(DEFAULT) 함수를 사용하면 5V 전압을 사용하는 아두이노 보드들에서는 5 볼트, 3.3V 전압을 사용하는 아두이노 보드들은 3.3 볼트를 아날로그 기준 전압 값으로 사용한다.

 

-INTERNAL: 내장 기준 전압을 사용한다는 의미이며, ATmega168ATmega328 MCU를 사용한 아두이노 보드에서는 1.1 볼트, ATmega8 MCU를 사용한 보드에서는 2.56 볼트가 아날로그 기준 전압이 된다. 이 설정은 아두이노 메가에서는 사용할 수 없다.

 

-INTERNAL1V1 (아두이노 메가 보드 전용): 내장 1.1 볼트를 아날로그 입력 기준 전압으로 사용한다는 의미다. 아두이노 메가 보드에서만 사용 가능하다.

 

-INTERAL2V56 (아두이노 메가 보드 전용): 내장 2.56 볼트를 아날로그 입력 기준 전압으로 사용한다는 의미이며, 아두이노 메가 보드에서만 사용 가능하다.

 

-EXTERNAL: AREF 핀에 외부 전원(0에서 5V 사이의 전압만 사용하여야 함)을 연결하여 기준 전압으로 사용할 수 있다.

경고

===

0V 보다 작거나 5V 보다 높은 외부 전압을 AREF 핀에 연결하지 안됨. AREF 핀에 외부 기준 전압을 연결하여 사용하고자 하면, analogRead() 함수를 사용하기 전에 꼭 EXTERNAL로 기준 전압을 설정해야 한다. 이렇게 하지 않으면, 내부에서 만들어낸 기준 전압과 외부에서 AREF 핀으로 공급되는 전압이 합선되어(short) 아두이노 보드의 마이크로컨트롤러를 손상시킬 수 있다.

 

다른 방법으로서, 외부와 내부 기준 전압을 번갈아 가며 사용할 수 있도록 외부 기준 전압을 5K 저항을 통하여 AREF 핀에 연결할 수 있다. 이렇게 저항을 통하여 외부 기준 전압을 공급하면 AREF 핀에 내부 저항 32K가 연결되어 있어 외부 기준 전압과 다른 전압이 AREF 핀에 공급되게 된다. 두 저항이 전압 분배기와 같이 동작하기 때문이며, 예를 들어 2.5V가 저항을 통하여 AREF 핀에 공급되면, AREF 핀의 전압은 2.5 * 32 / (32 + 5) = ~2.2V가 된다.

 

 



+ Recent posts