[아두이노] 릴레이 모듈+온도센서+DC모터 응용

IOT/아두이노|2019. 3. 28. 09:00

[아두이노] 릴레이 모듈+온도센서+DC모터 응용 



다른 주제로 포스팅을 끝냈는데 @ellenalee 님이 릴레이 모듈로 선풍기를 제어 해보셨다고 하셔서 이걸 한번 비슷하게 구현해보면 릴레이 모듈의 응용으로 괜찮을 것 같아서 가상시뮬레이터에서 느낌만 비슷하게 한번 구현해 보도록 하겠습니다.

1. 회로도 구성


  • 준비물 : relay DPDT 1개, DC Motor 1개, Temperature Sensor[TmP36] 1개, Power Supply, 아두이노우노
  • 내용 : 온도센서의 값에 의해서 모터가 회전할 수 있게 회로도를 구성해 보자.


대충 DC Motor가 선풍기라고 생각해 봅시다. 느낌은 그런데로 비슷해가 표현 했네요.

3. 코딩


  • 사용함수 : analogRead(), map()
  • 내용 : LED 깜박이는 소스를 이용해서 그 값을 제어값으로 해서 Light bulb 깜박이게 해보자.
  • 참고소스 : [아두이노] 온도센서(TMP36) 제어

복습

  • analogRead(아날로그핀) : 아날로그신호값을 읽음
  • map(입력값,입력최소값,입력최대값,출력최소값,출력최대값) : 입력값이 입력범위에 기준에 맞게 출력범위의 해당값을 출력.

변형함수(만든함수)

  • fmap(입력값,입력최소값,입력최대값,출력최소값,출력최대값) : map()함수와 동일하지만 자료형 타입을 float형으로만 변경했습니다. 계산값이 실수형 값이라서 map()함수를 사용하기가 애매해서 인자들을 전부 float형으로 변경했네요.

[ 온도센서 측정 소스 ]

[아두이노] 릴레이 모듈+온도센서+DC모터 응용
void loop(){
  float V =fmap(analogRead(A0),0,1023,0,5); //map함수 원리를 이용한 다이렉트 Voltage계산
   //공식
  //float V = analogRead(A0)*5.0/1023;
 
  float C = (V-0.5)*100;  //섭씨 C = (F-32)*1.8;
  float F = C*9.0/5.0+32; //화씨 F = C*1.8+32;
 
}

float fmap(long x, long in_min, long in_max, float out_min, float out_max)
{
  return (x - in_min) * (out_max - out_min) /(float) (in_max - in_min) + out_min;
}

여기서 대충 온도 C변수 값에 따라서 릴레이모듈를 제어하면 되겠죠

[아두이노] 릴레이 모듈+온도센서+DC모터 응용
   if(C>35){    //35도 이상이면 참
     digitalWrite(2, HIGH); //스위치 켜라
  }
  else{
     digitalWrite(2, LOW);  //스위치 꺼라
  }  

끝! 간단하게 느낌만 살렸습니다.

전체적인 코드를 살펴보면,

[아두이노] 릴레이 모듈+온도센서+DC모터 응용
void setup()
{
  Serial.begin(9600);
  pinMode(7, INPUT_PULLUP);
  pinMode(2, OUTPUT);
}
void loop()
{
  
  float V =fmap(analogRead(A0),0,1023,0,5); //map함수 원리를 이용한 다이렉트 Voltage계산
  float C = (V-0.5)*100;  //섭씨 C = (F-32)*1.8;
  
  if(C>35){    
     digitalWrite(2, HIGH); 
  }
  else{
     digitalWrite(2, LOW);   
  }   
}

float fmap(long x, long in_min, long in_max, float out_min, float out_max)
{
  return (x - in_min) * (out_max - out_min) /(float) (in_max - in_min) + out_min;
}

4. 결과


[ 35도 이하일때 ] : 그림에서는 25도 위치



[ 35도 이상일때 ] : 그림에서는 57도 위치


동영상을 찍어야 했지만 그냥 이미지로 간단히 차이점을 화살표로 표시 해 놨습니다. 25도일때는 0.00A로 전류가 흐르지 않는 상태이고 57도 위치에서는 79.9mA로 전류가 흐르는 상태입니다. 그 차이점으로 확인해주시기 바랍니다.

코딩에서는 35도 이상이면 모터가 회전되게 되어 있습니다. 실제 시뮬레이터로 돌아가는 장면을 보고 싶으면 공개되 회로도에서 바로 시뮬레이터를 실행 시켜서 그 결과를 확인 할 수 있습니다.


링크된 곳으로 가면 위 그림과 같은 창이 뜹니다. 거기서 1번 눌러주셔서 2번의 시뮬레이터 실행버턴의 창이 뜹니다. 그리고 2번을 누르시면 실행을 시킬 수 있습니다. 한번 온도조절을 해보시고 결과를 확인해 보세요.

마무리


상상이 어렵지만 표현은 그렇게 어렵지 않습니다. 매번 상상의 나래를 펼치라는 멘트를 날리는 이유가 바로 그 이유입니다. 온도에 따라서 선풍기를 자동을 켜볼까라는 상상력이 뭔가를 만들어 냅니다.

여러분들도 어떤 원리를 배우게 되면 그 원리에서만 멈추지 말고 상상력을 더해서 새로운 뭔가를 창조할 수 있는 능력을 키우시면 엄청난 결과를 얻을 수 있을 거에요.

언제나 그럴듯이 상상의 나래를 펼쳐 보세요.

댓글()

[아두이노] 온도센서(TMP36) 제어

IOT/아두이노|2019. 3. 9. 09:00

[아두이노] 온도센서(TMP36) 제어



오늘은 온도센서(TMP36)를 제어 해보는 시간을 가지도록 합시다. 원래 예전에 공부할때 온도계산에 대한 부분은 다른분의 블로그를 보고 했는데 기억이 안나네요. 암튼 온도 계산식을 제가 만든것도 아니고 기존에 공식이 있는 거라서 제가 참조한 출처는 못찾아서 해당 온도계산식이 나와 있는 블로그를 하나 링크를 걸어 놓았네요.

1. 온도센서(TMP36)



대부분의 측정센서는 Vcc, Gnd로 전원을 공급하고 센서에서 측정한 값은 Vout 출력됩니다. Vout은 온도에 따른 전류를 측정하는 것이죠. 그래서 전류를 계산하는 공식이 필요합니다.

 float V = analogRead(A0)*5.0/1023;
 float C = (V-0.5)*100;  //섭씨 C = (F-32)*1.8;
 float F = C*9.0/5.0+32; //화씨 F = C*1.8+32;

이게 기본베이스 입니다. 제가 만든건 아니고 기본적으로 이 공식으로 섭씨와 화씨를 측정하더군요.
제 블로그에서는 약간 수정하여 map()함수를 응용해서 함수를 따로 만들었습니다. 정수를 실수형으로 변수를 바꾼것 밖에 없지만요,

float fmap(long x, long in_min, long in_max, float out_min, float out_max)
{
  return (x - in_min) * (out_max - out_min) /(float) (in_max - in_min) + out_min;
}
<

V 계산을 map()함수 로직에다 삽입해서 바로 V값이 나오도록 했죠. 그냥 이렇다는 것이고 위의 공식으로 그냥 하셔도 됩니다.

2. 회로도 구성


  • 준비물 : TMP36 센서, 아두이노우노
  • 내용 : 온도센서에서 읽어들인 값을 아두이노 IDE 시리얼모니터로 출력시키기 위한 회로도 만들자.


선 연결 참 쉽죠. 원래는 LCD16x2로 온도값을 출력할려고 했는데 그러면 TMP36 제어를 어려워 할 것 같아서 최소한 코딩으로 원리만 전달하고자 간단히 표현했네요.

원리를 이해했으면 LCD16x2로 출력해 보세요. 아두이노는 하나의 부품을 배우면 지난 시간에 배운 부품들과 계속 결합해서 응용력을 키워야 실력이 늘어 납니다.

3. 코딩


  • 사용함수 : analogRead(), map(), Serial.begin(9600), Serial.print(), Serial.println()
  • 내용 : 온도계산공식을 이용하여 간단히 아두이노 IDE 시리얼모니터로 현재 온도를 출력하자.

복습

  • analogRead(A0) : A0핀으로 아날로그 값을 읽음
  • map(입력값,입력최소값,입력최대값,출력최소값,출력최대값) : 입력값이 입력범위에 기준에 맞게 출력범위의 해당값을 출력.
  • Serial.begin(9600) : 시리얼 통신 시작
  • Serial.print(출력값) : 출력값을 시리얼 모니터로 출력하는데 새로운 라인으로 안넘어가고 현재라인에 커서가 위치함.
  • Serial.println(출력값) : 출력값을 시리얼 모니터로 출력한 다음 새로운 라인으로 커서가 이동하는데 Enter(\n) 의미로 이해

설계

  1. 온도센서값을 읽어옴
  2. 섭씨와 화씨를 구함
  3. 시리얼모니터로 출력

온도센서는 analogRead(A0)로 읽어온다. 0~1023값을 읽어오는데 V를 구해야한다. 0~5V의 아두이노는 흐른다. 즉, 0~1023의 수치를 0~5V 값으로 출력을 맞춰야 합니다.

가령, map()함수라는 것은 0~100까지의 입력 범위가 있으면 출력을 0~10사이로 맞출때 사용합니다.

입력이 10이면 출력은 1
입력이 20이면 출력은 2

...

입력이 100이면 출력은 10

이렇게 되게죠. map()함수에 대해서 이해 하셨을거라 생각 합니다. 그런데 map()함수는 정수값으로 나오기 때문에 실수값으로 0~5V사이 값이 나오기 때문에 기존의 map()을 그대로 쓰면 안됩니다. 변수를 실수형태로 변경해 줘야 합니다. 실수형으로 변수를 선언해주면 간단히 해결 됩니다.

float V =fmap(analogRead(A0),0,1023,0,5); //map함수 원리를 이용한 다이렉트 Voltage계산

V값이 구해지면 섭씨(C)와 화씨(F)를 공식에 대입하면

float C = (V-0.5)*100;  //섭씨 C = (F-32)*1.8;
float F = C*9.0/5.0+32; //화씨 F = C*1.8+32;

이렇게 섭씨(C)와 화씨(F)가 구해지겠죠. Serial.print(), Serial.println()함수로 좀 이쁘게 그 값을 출력하면 됩니다.

코딩을 전체적으로 하면

void setup() {
  Serial.begin(9600); //시리얼통신 시작
}

void loop() {
 
  float V =fmap(analogRead(A0),0,1023,0,5); //map함수 원리를 이용한 다이렉트 Voltage계산
 
  //공식
  //float V = analogRead(A0)*5.0/1023;
  float C = (V-0.5)*100;  //섭씨 C = (F-32)*1.8;
  float F = C*9.0/5.0+32; //화씨 F = C*1.8+32;
  
  Serial.print("V : ");
  Serial.println(V);
  Serial.print("C : ");
  Serial.println(C);
  Serial.print("F : ");
  Serial.println(F);
  
  delay(1000);  
}

float fmap(long x, long in_min, long in_max, float out_min, float out_max)
{
  return (x - in_min) * (out_max - out_min) /(float) (in_max - in_min) + out_min;
}

4. 결과


가상시뮬레이터에서지만 약간은 오차가 발생 하네요. 실제로 하더라도 보정이 좀 필요할 듯 합니다.

마무리


오늘은 온도센서(TMP36)을 이용해서 아두이노에서 간단히 계산하니깐 온도계가 되었네요. 온도를 측정할 수 있다는 것은 많은 것들을 할 수 있게 됩니다.

가령 방마다 온도를 측정한다 그리고 무선통신을 이용해서 그 값을 따로 컴퓨터에 저장시켜서 4계절 집안 온도의 데이터를 수집할 수 있게 되고 그걸 통해서 집안 난방을 관리할 수 있게 되겠죠. 또 다른 예로 식물재배에서도 온도를 측정하면 온도에 맞게 자동으로 제어를 할 수 있겠죠.

온도를 측정한 다는 것은 그 데이터를 수집해서 다른 용도로 사용할 수 도 있고 아니면 현재의 온도에 맞게 특정한 동작을 수행하도록 하는 목적으로 사용할 수 도 있겠죠.

암튼 온도를 측정할 수 있으면 여러분들은 뭘 하고 싶을지 상상의 나래를 펼쳐보세요


댓글()

[아두이노] GAS Sensor

IOT/아두이노|2019. 3. 2. 09:00

[아두이노] GAS Sensor



이제 다시 쉬운 주제로 Gas Sensor를 다루는 것을 배워 보도록 하겠습니다. 가상시뮬레이터에서 GAS Sensor는 좀 회로도 연결해야하는 핀이 많아서 불편할 수 있을꺼에요. 만약 실제로 MQ-2 같은 센서를 사용하면 핀 연결이 쉬울 수 있는데 가상시뮬레이터에서 실험해야하기 때문에 약간은 불편함을 감수해야 할 듯요. 암튼 회로도 구성만 좀 어려울뿐 나머지는 코딩은 쉬우니깐 간단히 원리만 이해하시고 넘어가시면 됩니다.

1. GAS Sensor



어느방향이든 상관없이 한쪽 방향이 Vcc이면 반대편 방향이 Gnd 쪽으로 연결하고 한개만 GAS 측정값을 출력하는 핀으로 사용하면 됩니다. 대충 실험에서는 그림에서 볼때 하단을 Vcc로 3핀을 전부 열결했으며 상단 왼쪽핀 저항을 붙여서 Gnd로 연결하고 가운데는 Gnd 연결 오른쪽을 출력핀으로 사용하였습니다. 햇갈리시면 회로도 구성을 살펴보시면 됩니다.


실제 MQ-2 모델을 구입해서 많이 사용하는데 위 그림을 자세히 살펴보면 Gnd, DO, AO, Vcc 핀으로 구성되어 있습니다. 출력핀이 2개인데 디지털 출력이나 아날로그 출력이냐로 구분되는데 디지털이든 아날로그든 하나를 선택하고 나머지 Vcc, Gnd를 사용하여 총 3핀만 아두이노우노에 연결해서 실험하시면 됩니다.

하지만 가상시뮬레이터에서는 총 6핀으로 구성되고 핀 연결을 어쩔 수 없이 복잡하지만 회로도를 만들어야 겠죠.

2. 회로도 구성


  • 준비물 : GAS Sensor, 저항 1K옴 1개, 아두이노우노, 뻥판
  • 내용 : 간단히 GAS 측정하여 IDE 시리얼 모니터로 측정된 값을 출력하도록 설계


회로도를 보면 간단합니다. 회로도에서 위아래가 반대로 연결해도 됩니다. 참가로 가운데 핀은 고정이고요 사이드 핀은 저항을 세번째로 옮기고 A0핀을 입력받는 핀을 GAS Sensor 첫번째로 핀으로 연결해도 됩니다. 쉽게 가운데 핀은 고정이고 위아래는 한쪽 방향으로 Vcc, Gnd로 나뉘고 양쪽 사이드 핀은 서로 바꿀 수 있다는 것만 알아 두시면 됩니다.

그리고 참고하셔야 할 것은 GAS Sensor에 연결된 저항r값에 따라서 측정되는 값이 달라집니다. 한번 나중에 시뮬레이터를 돌릴때 저항값을 바꿔 보세요.

3. 코딩


  • 사용함수 : Serial.begin(), Serial.println(), analogRead()
  • 내용 : GAS Sensor에서 측정된 값을 아두이노 IDE의 시리얼 모니터로 간단히 출력하자.

복습

  • Serial.begin(9600) : 시리얼 통신 시작
  • Serial.println(출력값) : 출력값을 시리얼 모니터로 출력
  • analogRead(아날로그핀) : 아날로그 값을 읽음

설계

  1. GAS Sensor의 값을 읽자.
  2. 아두이노 IDE 시리얼모니터로 GAS 값 출력한다.

코딩을 전체적으로 하면

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

void loop() {  
  Serial.println(analogRead(A0));
  delay(1000);
}

4. LCD16x2로 GAS Sensor 값을 출력해보자.



지난 시간에 다뤘던 LCD16x2로 출력을 한다면 어떻게 해야 할까요. 지난 포스팅한 참고자료에 보시면 됩니다. 여기서 필요한 것은 지난 코딩 소스에서 출력값을 analogRead(A0)만 삽입하면 그냥 간단히 해결 됩니다. 원래는 변수를 선언하고 변수에 저장된 값을 출력해야 하는데 정석이지만 최대한 코딩로직을 출이고 원리만 전달하는 목적으로 표현한 점을 이해해 주세요.

회로도 보면


LCD16x2 회로도와 오늘 포스팅한 GAS Sensor 회로도를 하나로 결합한 형태입니다.

코딩도 합치면

#include <LiquidCrystal.h>

//LiquidCrystal(rs, enable, d4, d5, d6, d7) 
LiquidCrystal lcd(3, 4, 9, 10, 11, 12);

void setup()
{
  lcd.begin(16,2);
  lcd.setCursor(0, 0);
  lcd.print("Hello World");
  delay(1000);
  lcd.clear();
}
void loop() {
  lcd.setCursor(0, 1);
  lcd.print("Sensor : ");
  lcd.setCursor(10, 1);
  lcd.print(analogRead(A0));   
  delay(20);      
  lcd.print("            ");   
}

간단히 이부분에 analogRead(A0) 함수만 추가되었네요. " "로 공백문자를 출력시킴으로 지우는 효과를 부여 했습니다. 가상시뮬레이터에서 lcd.clear()함수를 사용할때 좀 문제가 있어서 출력한 라인을 공백문자로 덮여서 지우는 효과를 대신했습니다.

  lcd.print(analogRead(A0));
  delay(20); 
  lcd.print("            ");  

참 쉽죠.

5. 결과


실험 영상은 GAS Sensor 실험과정의 내용만 담았습니다. 그리고 LCD16x2로 출력하는 실험결과를 마지막에 시뮬레이터 결과만을 영상에 포함 시켰습니다.


마무리


GAS Sensor는 거실이나 부엌 천장에 보면 가정집마다 다 붙어 있는 걸 확인 확인 할 수 있을꺼에요. 가스 검침원이 오면 측정기로 GAS가 새는지 확인하는 경우도 경험 하셨을꺼에요. 일상에서 자주 사용되는 부품이지요. 단순히 수치로 시리얼모니터로 출력을 하고 복습차원으로 LCD16x2로 출력 실험을 했습니다.

여기서 측정된 수치값을 기준을 정하여 위험수치가 되면 경보기가 울리게 한번 설계해 보세요. 피에조부저를 연결 하시면 경보기를 쉽게 만들 수 있겠죠.

[아두이노] 피에조부저 제어 포스팅의 내용을 오늘 배운 회로도에 추가하여 경보기를 만들어 보세요.


댓글()

[아두이노] 기울기센서(Tilt Sensor) 제어

IOT/아두이노|2019. 2. 27. 09:00

[아두이노] 기울기센서(Tilt Sensor) 제어



오늘도 쉬운 난이도로 기울기센서를 이용한 실험을 다루겠습니다. 기울기센서는 기울기에 따라서 연결되고 끊어지는 두가지 상태를 나타내고 그 상태값을 기준으로 스위치 역활로 수행 할 수 있습니다. 실험에서는 스위치 역활로 기울기에 따라서 Red LED에 불이 들어오고 꺼지는 동작 제어를 통해 Title Sensor를 이해하는 시간을 갖도록 하겠습니다.

1. 기울기센서(Tilt Sensor)



Tilt Sensor는 안에 들어있는 전류를 흐를 수 있는 물질이 들어 있어서 기울기에 따라 센서안에 두 단자를 연결하거나 끊어지게 할 수 있습니다. 가상시뮬레이터에서 수평과 기울기 모양을 나타내는 조절이미지가 있는데 이걸로 Tilt Sensor를 조절하고 출력은 스위치버턴과 동일하게 출력값을 얻으시면 됩니다.

2. 기울기센서(Tilt Sensor) 동작 모습


수평기울어질때

그림에서 보는것과 같이 기울어질때 값을 기준으로 Red LED에 불이 들어오게 됩니다. 스위치 버턴 제어(아두이노)의 실험예제에서 스위치 버턴위치에 Tilt Sensor가 바뀌었을뿐 동일한 예제입니다. 어떤 동작을 하는 센서인지 대충 감이 잡히셧을꺼에요.

1. 회로도 구성


  • 준비물 : LED 1개, 저항 220옴 1개, 저항 10k옴 1개, Tilt Sensor 1개, 아두이노우노, 뻥판
  • 내용 : Tilt Sensor를 통해 기울어지는 상태값을 Red LED로 출력하게 하자.

(1) 기본(2) 내부풀업모드

두가지 형태로 표현해 볼 수 있습니다. 스위치버턴 예제를 다시 보시고 한번 풀다운모드 형태로 회로도를 한번 디자인 해보세요.

3. 코딩



복습

  • pinMode(사용핀, OUTPUT) : 사용핀은 출력모드
  • digitalWrite(사용핀, 상태) : 디지털출력핀에 상태가 HIGH(5V) or LOW(0V)를 선택한다.
  • digitalRead(사용핀) : 전기신호를 입력받는다.

설계

  1. Tilte Sensor에서 수평과 기울어졌을때의 값을 읽어들인다. => digitalRead(입력핀)
  2. 그 읽은 신호값을 기준으로 Red led에 불이 들어오게 한다. =>
    if(입력값==LOW) digitalWirt(출력핀,HIGH);
    else digitalWirt(출력핀,LOW);

코딩을 전체적으로 하면

(1) 기본 코딩은

void setup()
{
  pinMode(13, OUTPUT);      
  pinMode(7, INPUT);    
}

void loop()
{     
   if(digitalRead(7)==LOW) digitalWrite(13, HIGH);       
   else digitalWrite(13, LOW);     
}

(2) 내부풀업 코딩은

void setup()
{
  pinMode(13, OUTPUT);      
  pinMode(7, INPUT_PULLUP);    
}

void loop()
{     
   if(digitalRead(7)==LOW) digitalWrite(13, HIGH);       
   else digitalWrite(13, LOW);     
}

둘 차이는 PinMode() 함수에서 입력모드만 변경해주면 된다. 코딩 로직은 따로 수정할 게 없다.

5. 결과


간단히 디자인 하는 모습과 실행 결과를 만들어 놨으니 한번 보시고 따라 해보세요.

마무리


Tilte Sensor의 동작 제어를 해보았습니다. PIR Sensor는 두가지 상태값으로 스위치 역활을 이번 실험에서 실행해 보았습니다. 여기에 피에조부저를 부착해서 소리를 만들어 내면 경보기도 될 수 있겠죠. 아니면 어떤 물체의 특정 대상이 될때 대상이 된 물체가 기울어졌는지 수평인지를 체크하는 용도로도 사용할 수 있겠죠.

한번 기울기센서를 이용해서 어디에 적용해 볼까 상상의 나래를 펼쳐보세요.


댓글()

[아두이노] 인체감지 센서(PIR Sensor) 제어

IOT/아두이노|2019. 2. 26. 09:00

[아두이노] 인체감지 센서(PIR Sensor) 제어



오늘은 좀 난이도 낮춰서 쉬운 인체감지 센서(PIR Sensor) 작동원리를 배워 보도록 하겠습니다. 흔히 아파트 통로나 현관문에 저녁때 들어서면 잠시 조명에 불이 들어오는걸 많이 경험해 보셨을 꺼에요. 그리고 자세히 보면 둥근 모양의 물체가 부착되어 있는 것을 아마 한번쯤은 보셨을 거라 생각됩니다. PIR Sensor는 사람이나 동물의 움직임을 감지하는 센서입니다. 이 감지된 신호를 가지고 아두이노에서 실험를 해보겠습니다.

1. 인체감지 센서(PIR Sensor)




가상시뮬레이터에서 제공되는 PIR Sensor에는 총 3개의 핀이 있습니다. 어떤 센서이든 전원을 담당하는 Vcc, Gnd핀과 출력을 담당하는 Signal 핀으로 대부분 구성되어 있습니다. 여기서 PIR Sensor에서 인체의 움직임을 감지하면 전기신호로 Signal핀을 통해 출력된다는 것을 기억해 두세요. 인체의 움직임 감지되면 전기신호값은 하나의 전류값으로 가상시뮬레이터에서 거의 5V의 가까운 신호값이 발생하고 움직임이 없으면 0V로 고정됩니다. 즉, 인체가 감지되면 전류가 흐르고 인체가 감지되지 않으면 전류가 흐르지 않는 2가지 상태값이 Signal에서 발생하는 것이죠.

2. 인체감지 센서(PIR Sensor) 동작 모습


작동중움직임감지



그림에서 보는 것 처럼 움직임이 감지 되면은 Red Led에 불이 들어오게 됩니다. 계속 들어오는게 아니라 일정시간동안 들어왔다가 다시 꺼지게 됩니다.

1. 회로도 구성


  • 준비물 : LED 1개, 저항 220옴 1개, PIR Sensor 1개, 아두이노우노
  • 내용 : PIR Sensor를 통해 움직임이 감지되면 그 결과를 LED로 출력


최대한 원리 실험을 목적으로 단축표현한 회로도 입니다. 위에서 인체 감지 센서 동작과 같은 표현입니다. 구지 아두이노를 사용할 필요는 없지만 중요한것은 이 신호값을 받으면 아두이노에서 LED로 특정 동작을 수행하게 했다는 것에 실험의 목적입니다. 즉, A라는 신호를 받아서 B라는 동작을 지시한다란 개념을 머리속에 넣어 두세요.

3. 코딩


  • 사용함수 : pinMode(), digitalWirte(), analogRead()
  • 내용 : PIR Seneor를 통해 움직임을 감지되면 Red LED에 불이 잠시 들어오게 한다.
  • 참고 : [아두이노]LED 제어

복습

  • pinMode(사용핀, OUTPUT) : 사용핀은 출력모드
  • digitalWrite(사용핀, 상태) : 디지털출력핀에 상태가 HIGH(5V) or LOW(0V)를 선택한다.
  • analogRead(사용핀) : 아날로그신호를 입력받는다.
  • delay(시간) : 1000은 1초

설계

  1. PIR Sensor에 움직임이 감지되면 아두이노에서 그 신호 값을 읽는다.
  2. 그 신호값이 입력되면 Red LED에 불이 들어오게 한다.

코딩을 전체적으로 하면

void setup()
{
  pinMode(13, OUTPUT);  
}

void loop()
{
  digitalWrite(13, analogRead(A0)); 
  delay(10); 
}

디지털핀은 입력/출력모드를 선언해야하지만 아날로그 입력은 구지 선언 안해도 됩니다. 입력전용으로 쓰기 때문에 그렇습니다. 만약에 출력모드로 아날로그 입력핀을 사용할 경우는 pinMode()에서 선언하여 디지털핀처럼 사용이 가능합니다.

여기서,

digitalWrite(13, analogRead(A0)); 

이렇게 표현한 이유는 digitalWrite(13,1) or (digitalWrite(13,1023) 이든 상관없이 0이 아닌 정수로 참임으로 전부다 5V가 출력이 됩니다. digitalWirte(13,0)이여야만 0V가 출력되고 그 외는 다 5V만 출력된다는 점을 이용해 코딩량을 대폭 줄였습니다. 즉, digitalWirte()출력은 0이 아니면 모든 숫자는 참으로 5V가 출력되고 0만 0V가 출력됩니다.
원래 이렇게 코딩하면 안됩니다. 그냥 억지로 끼워 맞춘 코딩입니다. 원래는 입력된 값을 기준으로 해서 if 조건문을 세우고 그 조건문을 기준으로 Red LED를 일정시간 동안 딜레이를 줘서 아파트 복도나 현관문처럼 좀 긴 시간을 줘서 비슷한 효과를 부여할 수 있지만 오늘 포스팅은 PIR Sensor의 원리를 이해하는게 목적임으로 최대한 줄여서 그 의미만 전달하고자 표현한 코딩이라는 점을 참고하세요.

5. 결과


이 실험을 할 당시 가상시뮬레이터 사이트에 아두이노 컴파일러가 버그가 발생해서 동영상 촬영을 포기했는데 올리기전에 다행히 사이트 복구가 되어 정상적으로 간단히 실험했네요. 최대한 코딩을 줄여서 복잡한 부분을 줄여 이해도를 높였네요. 간단한 코딩과 결과만 쉽게 실험했으니 이번 포스팅 내용은 쉬울꺼에요.


마무리


PIR Sensor의 동작 제어를 해보았습니다. PIR Sensor는 아파트 복도나 현관문에 조명을 제어하는 목적으로 사용할 수 있지만 여기에 피에조부저를 부착하여 소리를 발생시키면 어떻게 될까요. 바로 경보기로도 만들 수 있겠죠. 그렇다면 여러분들은 PIR Sensor로 인체 감지를 할 수 있으면 어떤걸 해보고 싶으신가요.

한번 상상의 나래를 펄쳐보세요.


댓글()

[아두이노] 조도센서 제어

IOT/아두이노|2019. 2. 11. 13:34

[아두이노] 조도센서 제어



오늘은 간단히 조도센서를 제어하는 실험을 해보겠습니다. 조도 센서는 빛의 밝기에 따라서 전류값이 달라지는데 이 전류값을 아날로그핀에서 입력으로 받아서 빛에 의해서 어떤 행동을 하기 위한 곳에서 사용할 수 있는 재밌는 센서입니다. 쉽게 생각하시면 가로등을 예로 들 수 있겠죠. 밤이되면 조도센서를 이용해서 가로등을 자동으로 켜지게 할 수 있겠죠.

1. 회로도 구성


  • 준비물 : green led 1개, 조도센서 1개, 저항(220옴) 1개, 저항(10k옴) 1개, 아두이노우노, 뻥판
  • 내용 : 특정 조도센서값을 기준으로 green led에 불이 들어오게 한다.

A모델(-)방향 입력값B모델(+) 방향 입력값



어둠(0) ~ 밝음(255)
어둠(255) ~ 밝음(0)

2. 코딩


  • 사용함수 : Serial.begin( ), Serial.print( ), Serial.println( ), map( ), analogRead( ), pinMode( ), digitalWrite( )
  • 내용 : A모델을 기반으로 조도값이 100이하면 불이 들어오게 코딩을 해보자

  • 시리얼모니터 출력 :
    Serial.begin(9600)으로 시리얼통신을 사용하겠다고 선언
    Serial.print(출력값)은 출력값을 아두이노 IDE 시리얼모니터에 값을 출력하고 새로운 라인으로 안넘어감
    Serial.println(출력값)은 출력값을 출력하고 새로운 라인으로 넘어감

자세히 알고싶다면 => 출처 : https://www.arduino.cc/en/Serial/Println

  • green led 제어 :
    pinMode(핀, 모드)으로 전류를 출력할 핀 13번을 출력모드(OUTPUT) 사용하겠다고 선언
    digitalWrite(핀, 상태)은 13번핀을 HIGH(5V) or LOW(0V)로 전류를 출력할지 말지를 결정

  • 조도센서 입력 :
    map(입력값,입력최소값,입력최대값,변환최소값,변환최대값)으로 입력(0~1023)값을 자동으로 매핑시켜 (0~255)으로 변환시킨다. 즉, 알아서 크기에 맞게 값을 잡아준다고 생각하시면 됨.
    analogRead(아날로그입력핀) 전류의 값을 읽어옴

설계

  1. 조도센서를 읽어옴
    int m_cds = map(analogRead(cdspin),0,1023,0,255);
  2. 조도센서의 값이 100이하면 led가 켜지게 한다.
    if(m_cds){
    digitalWrite(greenpin, HIGH);
    }
    else {
    digitalWrite(greenpin, LOW);
    }

A모델 코딩을 실제 하면은

int greenpin = 13;
int cdspin = A0;

void setup()
{
  Serial.begin(9600);
  pinMode(greenpin, OUTPUT);
}

void loop()
{
  int m_cds = map(analogRead(cdspin),0,1023,0,255);
  
  Serial.print("CDS =  ");
  Serial.println(m_cds);
  
  if(m_cds<100) { 
     digitalWrite(greenpin, HIGH);  
  }
  else {
      digitalWrite(greenpin, LOW);  
  }
  
}

0~1023으로 잡고 시작하고 싶다면 map()함수는 필요 없겠죠. 입력값을 자신이 원하는 값(0~255)의 범위로 추가로 만들어 보았어요.

그냥 아날로핀값을 읽어서 그 값을 if문으로 해서 led에 불이 들어오게 할지 말지만 정하면 되니깐 위 코딩에서 절반이상 코딩량을 줄어 듭니다. 정확히 실험을 하기 위해서 그 값을 시리얼모니터에 줄력하기 위해 코딩이 늘어나고 또 입력된 값을 특정값의 범위로 맞추고 싶을때 map()함수가 추가되었을뿐 제어는 간단합니다.

if(analogRead(cdspin) < 300) digitalWrite(greenpin, HIGH);  

else  digitalWrite(greenpin, LOW);  

딱 두문장으로 끝낼 수 있죠. 원리는 이 두문장이고 약간 조미료를 추가한것이 A모델 코딩입니다. 원리만 이해하셔도 돼요.

결과



마무리


오늘은 간단한 실험을 해 보았습니다. 조도센서는 빛에 따라서 값의 변화가 일어납니다. 실제로 전류의 변화가 일어납니다. 이 전류값은 아날로핀으로 0~1023사이의 값으로 읽어오게 됩니다. 이 값을 기반으로 아두이노에서 제어를 하게 됩니다. 쉽게 떠오르는 것은 가로등이 있겠죠.

여러분들은 조도센서로 뭘 하고 싶으신가요. 예술가를 예를 들어볼께요. 어떤 작품을 만들었는데 그 작품에 빛에 반응한다고 생각해보세요. 그리고 RGB led를 작품에 부착한다면 조도센서값들에 따라서 작품은 다체로운 색상들을 만들어 낼 수 있다면 관람객과 소통하는 작품을 구현할 수 있겠죠.

또는 조도센서를 언제쯤 어두워지고 언제쯤 밝아지는지 데이터를 매일 수집하면 빅데이터로 활용도 가능해지겠죠.

한번 조도센서를 사용한다면 어디에다 사용할지 상상의 나래를 펼처보세요.


댓글()

[아두이노] 초음파줄자 응용

IOT/아두이노|2019. 2. 9. 12:46

[아두이노] 초음파줄자 응용




초음파센서로 줄자를 만들려면 대충 이런식으로 A, B의 벽까지의 거리를 측정하면 쉽게 줄자가 만들어 질 수 있겠죠.
이걸 표현하기 위해서 실험을 하고자 합니다.

1. 회로도 구성


  • 준비물 : 초음파센서3핀 2개, 스위치버턴 1개, 아두이노우노, 뻥판
  • 내용 : 벽과 벽사이의 거리를 측정하는 줄자를 구현해보자.

스위치를 누르면 아두이노우노 본체를 기준으로 양쪽 두지점의 벽과 벽사이 거리를 측정하도록 하기 위해서 회로도를 우선 아두이노우노 기준으로 양쪽 방향으로 초음파센서를 배치하여 회로도를 구성하였습니다.


2. 코딩


  • 거리계산 : ((float)(340 * 초음파거리시간값) / 10000) / 2;
  • 두지점거리계산식 : 아두이노우노를 10cm로 가정할경우
    total=v1+v2+10; => v1(A초음파), v2(B초음파), 10(아두이노우노본체크기)
  • 내용 : 스위치를 누르면 A,B 초음파 거리를 측정하고 그 결과를 시리얼모니터에 출력한다.

우선 스위치버턴은 복습차원으로 내부풀업저항을 이용합니다. 그래서 pinMode은 INPUT_PULLUP으로 선언합니다. 그리고 스위치 버턴값을 읽기 위해서 digitalRead(핀번호) 함수를 사용합니다. 지난 스위치버턴 포스팅에서 이미 소개했으며 복습차원으로 스위치 버턴을 사용하였습니다.

void setup() {
  Serial.begin(9600);
  pinMode(5,INPUT_PULLUP);
}
void loop() {  
  if(digitalRead(5)==0){
    float v1=UltrasonicDistance(6);
    float v2=UltrasonicDistance(7);
    float total=v1+v2+10;
    Serial.println(total);
    delay(500);
  }  
}

float UltrasonicDistance(int m_pin){
  pinMode(m_pin,OUTPUT); 
  digitalWrite(m_pin, LOW); 
  delayMicroseconds(2); 
  digitalWrite(m_pin,HIGH); 
  delayMicroseconds(10); 
  digitalWrite(m_pin,LOW); 
  
  pinMode(m_pin,INPUT);    
  float duration = pulseIn(m_pin, HIGH);  
  return duration / 57.5;  
}

여기서 2개의 초음파 거리측정을 해야하는데 그러면 두번의 중복 코딩이 발생합니다. 지난시간에 배웠던 C언어문법 외부함수로 재정의하여 뺐습니다.

복습하자면

float 초음파거리(int A){
 return 거리식;
}

초음파거리함수에 인자는 핀번호입니다. 함수 앞에 float는 변수 선언에서 설명한 자료형입니다. 즉, 함수 앞에서 자료형이 표현되었다는 것은 return의 명령어로 자료형(float)으로 반환한다는 의미입니다. 여기서는 좀 더 정확한 거리계산을 위해서 실수형으로 거리 계산된 값을 반환하겠다는 의미인거죠. 만약 정수형(int, long)으로 반환하겠다면 앞에 정수자료형을 선언하시면 됩니다.

loop()함수에서 사용할때는

<
v1=초음파거리(6)

이렇게 하면 6번핀의 초음파센서가 거리계산을 한뒤에 그 값을 반환하여 v1에 저장하게 됩니다.
v1 6번핀에 연결된 초음파센서 거리값이 저장됩니다.

초음파거리 계산식을 외부함수로 재정의함으로써 중복코딩을 줄이게 됩니다.
loop()안에는 아두이노 전원이 공급되고 반복되는 작업 명령들이 수행됩니다. 가독성을 위해서는 될 수 있으면 loop()함수에 선언되는 코딩들은 최소화 해야합니다. 그래야 가독성이 좋고 나중에 수정하기도 편합니다.

코딩 순서는

  1. 스위치버턴을 누르면 거리를 계산한다.
    pinMode(5,INPUT_PULLUP); //선언
    if(digitalRead(5){ //동작
    거리계산;
    }
  2. A, B초음파 거리 계산측정한다.
    float v1=UltrasonicDistance(6); //A 초음파거리계산
    float v2=UltrasonicDistance(7); //B 초음파거리계산
  3. 최종거리 계산한다.
    float total=v1+v2+10;
  4. 시리얼모니터에 그 결과를 출력한다.
    Serial.begin(9600); //선언
    Serial.println(total); //출력

3. 결과



마무리


코딩은 우선 어떤 명령을 내릴지 한글로 메모장에다가 순서를 정하여 글로 써보세요. 그리고 그 명령에 대해 사용할 함수들은 각 부품을 다룰때 쓰던 함수들을 그대로 사용하시면 됩니다. 어렵게 생각하실 필요없이 각 부품을 소개할때 거기에 사용한 함수들 2~3개를 기억했다가 그 함수의 의미를 이해하고 그것을 응용해서 표현하시면 됩니다.

정교한 초음파센서를 이용해서 건축현장에서 건물안에 길이를 측정할 때 유용하겠죠.

또 초음파로 어떤것을 표현할 수 있을까요. 상상의 나래를 펼쳐 보세요.


댓글()

[아두이노] 거리경보장치 응용

IOT/아두이노|2019. 2. 7. 18:50

[아두이노] 거리경보장치 응용



예전에 실험한 내용인데 초음파 응용편으로 소개할까 합니다. 거리경보장치는 실생활에 가장 유사한것이 자동차 후진 주차할때 경보장치를 연상하시면 될꺼에요. 뒤에 장애물과의 거리가 위험할때 나는 경보음을 생각하시면 아마 이해가 빠를꺼에요.

1. 회로도 구성


  • 준비물 : 초음파센서3핀 1개, led 2개, 저항 220옴 2개, 피에조부저 1개, 아두이노우노, 뻥판
  • 내용 : 장애물과의 거리가 50cm미만일때 경보음과 Red Led에 불이 들어오고 위험을 알리고, 50cm이상일때 Green Led에 불이 들어오고 안전상태를 표현합니다.


2. 코딩


  • Led : 선언-pinMode(핀번호, OUTPUT) 제어-digitalWrite(핀번호,상태값); 로 상태값 1(5V) or 0(0V)

  • 피에조부조 : 제어-tone(출력핀,음계,음길이), noTone(출력핀)으로 음과 음사이를 끊어줌

  • 초음파센서 : 선언pinMode(핀번호, 입/출력모드), delayMicroseconds(시간값)으로 마이크로초로 잡게 딜레이 시킴, pulseIn(7, HIGH)로 초음파가 장애물에 부딪치고 되돌아온 거리시간값을 입력받음

  • 거리계산 : ((float)(340 * 초음파거리시간값) / 10000) / 2;


코딩 설계는

  1. 초음파센서 거리 측정한다.
  2. Led 2개로 안전/위험 상태를 나타낸다.
  3. 피에조부조에서 위험거리일때 경보음이 울리게 한다.

1번 코딩 :
지난시간의 초음파 거리측정 코딩을 그대로 적용한다. 하지만 안전/위험 상태를 기준을 50cm로 설정한다면 어떻게 코딩해야할까요. 지난시간에 배웠던 문법 if문 조건이 참/거짓으로 나뉘면 쉽겠죠.

  • 거리측정은 7번핀에서 pulseIn(7, HIGH)로 거리시간값을 ((float)(340 * 초음파거리시간값) / 10000) / 2 로 거리가 구함
  • if(거리<50) {처리문1; } else {처리문2;}

2번 코딩 :
led 2개로 led은 위험, green은 안전으로 1번 코딩에서 50cm미만일때 red led 켜고, 50cm이상일때 green led 켜면 되겠죠.

if(거리<50){
    digitalWrite(11, HIGH);  
    digitalWrite(10, LOW);  
}
else
{
   digitalWrite(11, LOW);  
   digitalWrite(10, HIGH);  
}

참쉽죠

3번 코딩 :
경보음은 피에조부저에서 tone(), noTone()함수를 어떤 음계로 음의길이를 어느정도 할지는 자유입니다. 그런데 어디에 코딩할까. 50cm이하 일때 경보음을 울려야 겠죠.

if(거리<50){
    tone(12,523,1000/8);     // 도음으로 8분음표(음길이)
    delay(1000/4*1.30);             
    noTone(12);            
}
else
{
}

이렇게 해서 코딩은 간단히 해결되었습니다. 쪼개서 보면 별거 없습니다. 처음 기준이 되는 부품이 어떤 상태가 되면 다른 부품이 그 상태를 기준으로 어떻게 변화되는지만 글로 한번 설계해보시고 그걸 코딩으로 표현하시면 됩니다.

초음파센서로 거리가 50cm미만이면 위험상태(red led 켜고, 피에조부저 경보음)와 안전상태(green led 켜기)를 표현한 것 뿐이죠. 그런데 이걸 다 합쳐진 코딩을 보면 복잡해 보일 수 있습니다. 하지만 부품 한개 한개의 제어한 것들을 합치니깐 복잡해 보일뿐 부품을 개별적으로 생각하시면 아주 간단한 코딩입니다.

종합해서 코딩하면은

void setup() {  
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
}
void loop() {   
  pinMode(7,OUTPUT); //7번핀 출력모드로
  digitalWrite(7, LOW); 
  delayMicroseconds(2); 
  digitalWrite(7,HIGH); 
  delayMicroseconds(10); 
  digitalWrite(7,LOW); 
  
  pinMode(7,INPUT);    //7번핀 입력모드로
  float duration = pulseIn(7, HIGH);
  float distance = duration / 57.5;  
  

  if(distance < 50){    //50cm 미만 경보발동

    digitalWrite(11, HIGH);  
    digitalWrite(10, LOW);  

    tone(12,523,1000/8);     // 도음으로 8분음표(음길이)
    delay(1000/4*1.30);             
    noTone(12);            

  } else{                   //50cm 이상 안정거리
    digitalWrite(11, LOW);  
    digitalWrite(10, HIGH); 
  } 
}  

3. 결과



마무리


led, 피에조부저, 초음파센서를 각각 이전 시간에 배웠고 그걸 합쳐서 하나의 경보장치를 만들어 보았습니다.
또, 어떤것들이 있을까요 한번 상상의 나래를 펼쳐보세요.

초음파센서가 은근 재밌는 소재라 또다른 응용편을 다음에 소개 할께요.


댓글()

[아두이노] 초음파센서 제어

IOT/아두이노|2019. 2. 6. 11:01

[아두이노] 초음파센서 제어



오늘은 재밌는 소재로 거리를 측정할 수 있는 초음파센서를 사용하여 실험하는 내용을 다뤄 보겠습니다. 실제 초음파센서를 구매하시면 4핀으로 구성되어 있는데 가상시뮬레이터에서는 초음파센서가 3핀으로 되어서 어떻게 코딩해야하나 혼동 되실 수 있지만 원리는 동일하니깐 어렵게 생각하실 필요는 없습니다.

1. 초음파센서



초음파센서를 부품을 실제 구입하면 1200원정도 하는 초급 초음파센서를 구매하실수 있을꺼에요. 핀은 총 4핀으로 전원(+,-) 2핀, 입력핀, 출력핀으로 구성되어 있습니다. 하지만 가상시뮬레이터에서는 3핀으로 구성되어 있으면 입력/출력을 한핀에서 다 제어해야 합니다.

가상 시뮬레이터 코딩은 이 한핀을 어떻게 제어할지만 생각하시고 표현하시면 됩니다.

2. 초음파센서 계산 공식


  • 공식 : 기본 340 (위 1200원짜리 4핀 초음파센서 초음파속도입니다.)
    거리 = ((초음파속도 * 센서시간값) / 10000) / 2

            ((float)(340 * duration) / 10000) / 2;  
    

초음파속도 : 실제 사용하는 초음파센서 부품의 초음파속도입니다. 즉 초음파센서마다 초음파속도는 다르고 부품을 구매하실때 제공되는 정보를 잘 확인하시면 정교한 계산을 하실 수 있을꺼에요.

센서시간값 : 초음파센서에서 초음파가 나가고 앞에 장애물에 부딪치고 되돌아오는데 까지 걸리는 시간값입니다. 왕복시간값이라고 생각하시면 됩니다. 그래서 마지막에 나누기 2를 함으로써 초음파센서의 위치에서 장애물까지의 거리가 나오게 되는 것이죠.

3. 초음파센서 코딩

  digitalWrite(7, LOW); 
  delayMicroseconds(2); 
  digitalWrite(7,HIGH); 
  delayMicroseconds(10); 
  digitalWrite(7,LOW); 
   
  float duration = pulseIn(6, HIGH);
    
  float distance = ((float)(340 * duration) / 10000) / 2;  
    

7번핀이 출력모드이고 6번핀은 입력모드입니다. 7번핀으로 초음파를 쏘고 되돌아오는 초음파를 6번핀에서 읽게 됩니다. 그 값은 시간값이고 초음파공식에 대입하여 계산하게 됩니다.

  1. 초음파를 쏘기 전 초음파출력핀을 LOW(0)으로 한다. => 초기단계
  2. 딜레이 delayMicroseconds()함수는 시간을 마이크로초로 딜레이 시킬 때 사용. => 대기시간단계
  3. 초음파출력핀을 HIGH(5V)으로 한다. => 초음파를 출력 시작
  4. 딜레이 delayMicroseconds()함수로 대기한다. => 초음파를 쏘는 시간이다.
  5. 초음파출력핀을 LOW(5V)으로 한다. => 초음파 출력 중지

쉽게 말해서 초기상태는 초음파 출력핀 0V 상태로 2마이크로초로 초기상태로 뒀다가 7번핀을 통해 10마이크로초동안 초음파를 쏘고 난뒤에 초음파 출력핀 0V으로 10마이크로초동안만 초음파를 쏜 신호값을 거리계산에 사용한다는 점만 이해하시면 된다.

pulseIn(입력핀, HIGH)함수 : 펄스 신호의 길이를 잴 때 사용합니다. 초음파 되돌아 왔을때 HIGH->LOW가 되는 시점까지의 시간값을 반환하는 함수입니다. 좀 어려울 수 있습니다.
그냥 저 함수로 초음파 거리 시간값을 읽어오는 구나 정도만 처음에 이해하시면 됩니다.

정 모르겠다면 통으로 저 코딩을 외우시면 됩니다. 초음파센서를 사용할때 저 코딩으로 제어하는 구나 정도만 이해하시면 됩니다.

4. 회로도 구성


  • 준비물 : 초음파센서3핀 1개, 아두이노우노

5. 코딩


void setup() {
  Serial.begin(9600);
}
void loop() {   
  pinMode(7,OUTPUT); //출력모드  초음파 출력
  digitalWrite(7, LOW); 
  delayMicroseconds(2); 
  digitalWrite(7,HIGH); 
  delayMicroseconds(10); 
  digitalWrite(7,LOW); 
  
  pinMode(7,INPUT);    //입력모드로 초음파 입력
  float duration = pulseIn(7, HIGH); //초음파 거리 시간값 읽기
  float distance = duration / 57.5;  // ((float)(340 * duration) / 10000) / 2;   

  Serial.println(distance);   
} 

핀의 입력/출력모드 setup()함수에 선언된다고 했는데 여기서는 loop()함수에서 선언하였습니다. 왜 그렇게 했을까요. 그것은 바로 7번핀을 입력모드와 출력모드를 둘 다 사용해야 하기 때문에 계속 핀모드를 변경해야 합니다. 그래서 loop()함수에 선언된거죠.

초음파를 출력하기전에 7번핀을 출력모드로 선언했다가 다시 7번핀을 pulseIn()함수로 입력을 받을때에는 그 앞에 7번핀을 입력모드로 선언해야겠죠. 이런식으로 해서 7번핀으로 입력/출력모드 제어가 가능해 지는 것이죠.

 float distance = duration / 57.5;  // ((float)(340 * duration) / 10000) / 2;   

이식은 공식에서 최대한 줄이고 가상시뮬레이터에서 좀 더 거리가 비슷하게 나타내기 위해서 근사값 57.5로 표현했습니다. 실제로 하실때는 정식 공식을 사용하세요. 가상시뮬레이터에서는 정식 공식으로 대입하면 오차 거리가 좀 크게 나서 일부러 공식을 줄이고 줄인 공식에서 숫자를 앞뒤로 근사값들을 임의로 정해서 여러차례 실험한 뒤에 가장 오차가 적게 나오는 값이 57.5여서 이렇게 식을 만들었습니다.

실제로 하실때에는 정식 공식을 사용하시고 정식 공식을 써도 오차 거리가 발생할때에 그 부품에 맞게 근사값들을 잡아서 오차 거리를 줄이시면 아마 될꺼에요.

시리얼모니터 출력

지난시간에 사용했지만 복습차원으로 다시 설명하자면

아두이노 IDE 시리얼모니터를 사용하기 위해서

void setup()
{
 Serial.begin(9600);
}
void loop(){
Serial.println(distance);   
}

setup()함수에서 시리얼 통신을 시작한다고 선언(Serial.begin) 하고 loop()함수에서 시리얼모니터로 출력(Serial.println) 합니다.

Serial.println(출력값);   

이정도만 우선 알아두세요.

6. 결과

마무리


실제로 한다면 4핀 코딩을 해야하는데 아래와 같이 실험하시면 됩니다.

void setup() {
  Serial.begin(9600);
  pinMode(7,OUTPUT); //출력모드
  pinMode(6,INPUT);    //입력모드
}
void loop() {    
  digitalWrite(7, LOW); 
  delayMicroseconds(2); 
  digitalWrite(7,HIGH); 
  delayMicroseconds(10); 
  digitalWrite(7,LOW); 
   
  float duration = pulseIn(6, HIGH);
  float distance = duration / 57.5;  // ((float)(340 * duration) / 10000) / 2;  

  Serial.println(distance);   
}  

이 초음파센서 하나로 어떤곳에 사용하면 좋을까요 한번 상상의 나래를 펼쳐보세요. 초음파센서가 거리를 측정할 수 있는 재밌는 부품이여서 거리를 측정할 수 있으면 할 수 있는 것들이 참 많습니다. 한번 생각해 보세요.


댓글()