이번에 알아볼 센서는 거리를 측정할 수 있는 초음파 센서인 HC-SR04입니다.



상세 Datasheet는 아래 문서에서 확인 할 수 있습니다.

http://www.micropik.com/PDF/HCSR04.pdf


Specifications


           - Power Supply :+5V DC

           - Quiescent Current : <2mA

           - Working Currnt: 15mA

           - Effectual Angle: <15°

           - Ranging Distance : 2cm – 400 cm/1" - 13ft

           - Resolution : 0.3 cm

           - Measuring Angle: 30 degree

           - Trigger Input Pulse width: 10uS

           - Dimension: 45mm x 20mm x 15mm


Pins

  • VCC: +5VDC
  • Trig : Trigger (INPUT)
  • Echo: Echo (OUTPUT)
  • GND: GND



앞선 포스트들을 보셨다면 이제 시그널들에 조금 익숙해 지셨을 텐데요.

아래 diagram을 보면 10us동안 HIGH를 INPUT으로 넣어주면, 센서 내부에서 8개의 40kHz의 시그널을 송출합니다. 

그리고 반사된 신호가 들어오면 그 시간동안 OUTPUT pin을 High로 올려주게 됩니다.




예제 코드를 돌려보면... 잘 동작하네요 ^^::






/*      sedew810225@gmail.com

 *      Ultrasonic sensor Pins:        

 *      VCC: +5VDC        

 *      Trig : Trigger (INPUT) - Pin 4       

 *      Echo: Echo (OUTPUT) - Pin 5       

 *      GND: GND

 */


unsigned int trigPin = 4;

unsigned int echoPin = 5;

long duration, cm, inches;


void setup() {

  Serial.begin (9600);


  pinMode(trigPin, OUTPUT);

  pinMode(echoPin, INPUT);

}


void loop() {

  // start by a High pulse of 10 microseconds

   digitalWrite(trigPin, LOW);

  delayMicroseconds(5);

  digitalWrite(trigPin, HIGH);

  delayMicroseconds(10);

  digitalWrite(trigPin, LOW);


  //read data from echoPIN for the duration of HIGH signal

  pinMode(echoPin, INPUT);

  duration = pulseIn(echoPin, HIGH);


  //convert time to distance

  cm = (duration/2) / 29.1;

  inches = (duration/2) / 74; 


  Serial.print(inches);

  Serial.print("in, ");

  Serial.print(cm);

  Serial.print("cm");

  Serial.println();

  

  delay(250);

}


References :

http://www.instructables.com/id/Simple-Arduino-and-HC-SR04-Example/

http://randomnerdtutorials.com/complete-guide-for-ultrasonic-sensor-hc-sr04/

https://www.arduino.cc/en/Reference/PulseIn

반응형

'TinyProjects' 카테고리의 다른 글

Beautiful KiWi with Python and OpenCV  (0) 2016.03.17
LCD1602 모듈과 아두이노  (0) 2016.03.13
SEN0018 적외선 감지 센서  (0) 2016.03.10
DHT-11 Sensor 아두이노 테스트  (13) 2016.03.10
ARDUINO/GENUINO 개발 환경 세팅하기  (0) 2016.03.10

이번에 알아볼 센서는 적외선 감지 센서 SEN0018 입니다.

이글루 처럼 생긴 모자를 쓰고 있습니다.




DFrobot 공식 홈페이지가 접속이 되지 않아 다른 곳에 저장된 DataSheet를 확인해 봅니다.


http://www.rdd-tech.com/sites/default/files/attachment/Digital%20Infrared%20motion%20sensor.pdf


Specification 

Type: Digital 

Supply Voltage:3~5V 

Current:50μA 

Working temperature:0℃~+70℃ 

Output level(HIGH):4V 

Output level(LOW):0.4V 

Detect angle:110 degree 

Detect distance:7 meters 

Size:28mm×36mm Weight:25g


너무나 간단해서 더 이상 쓸 내용이 없을 정도 입니다.


아래 DFrobot사 패키징 모델의 경우 세개의 핀만 연결해 주면 됩니다.


  • 1:Digital Signal Out
  • 2:VCC (5V)
  • 3:GND




해당 Data pin에서 digital 값을 읽어 오면 움직이는 물체가 있는지를 알 수 있습니다.

void setup() {

  Serial.begin(115200);

}


void loop() {


  Serial.println(digitalRead(3));

  delay(100);

  

}





반응형

센서를 아두이노에 연결해보고는 너무 허무해서 잠시 공황상태에 빠져 있었습니다. ^^

우선 DTH11에 대해서 알아 봅시다.


센서 제조사 홈페이지에서 우선 기본 적인 사항을 확인해 봅니다.


http://www.waveshare.com/temperature-humidity-sensor.htm

http://www.waveshare.com/wiki/DHT11_Temperature-Humidity_Sensor


아두이노등과 연결하기 위해 PIN 연결에 대한 상세 정보를 확인합니다.






귀찮은 나머지 빵판 없이 바로 연결을 해 봅니다.

GND / 5V / DataPin 8 번과 모듈을 연결~ 

정상적으로 연결되면 모듈의 PWR LED에 사진처럼 불이 들어옵니다.




아래는 DataSheet 자료입니다.

Datasheet에 아래와 같이 데이터 자료 구조와 interface의 signal정보를 찾을 수 있습니다.


http://www.waveshare.com/w/upload/c/c7/DHT11_datasheet.pdf


◎Parity bit data definition 


“8bit humidity integer data + 8bit humidity decimal data +8 bit temperature integer data + 8bit temperature fractional data” 8bit checksum is equal to the results of the last eight. 


Example 1: 40 data is received: 

              0011 0101         0000 0000          0001 1000         0000 0000     0100 1101 

              High humidity 8   Low humidity 8    High temp. 8     Low temp. 8     Parity bit 

Calculate: 0011 0101+0000 0000+0001 1000+0000 0000= 0100 1101 

Received data is correct: Humidity:0011 0101=35H=53%

                               RH Temperature:0001 1000=18H=24℃ 


미리 예제 코드를 돌려서 Probe로 동작하는 pulse를 찍어보니 DataSheet 대로 나오고 있음이 확인 됩니다.



High 신호에 있다가 위의 그림처럼 18ms 시간 동안 Low로 DATA pin을 Host가 내려주다가 다시 High로 올려주면, 모듈단에서 Start signal로 인식이 됩니다. 위의 diagram에서 후반부에 많이 겹쳐 있는 시그널 부분이 40 bit data 전송 구간입니다.




Diagram 신호를 확대해 보면 Host가 start signal을 위해 High로 올려준 신호 이후에, 80us 간격으로 Low와 High signal이 보입니다. 
위의 다이어 그램과 비교해보면 [Host the start of Signal] 과 [Response Signal] 구간입니다.
아래 신호에서 마우스로 표기되어 있는 부분이 실제 데이터 전송의 시작 부분입니다.




0과 1의 구분은 High 로 올라간 신호의 길이를 통해 구분하는 것을 아래 Datasheet를 통해 확인 할 수 있습니다.

위의 diagram의 Data 0 와 Data 1 부분을 보면 실제 정의된 대로 신호가 출력되고 있음을 알 수 있습니다.




모듈 제조사의 홈페이지를 보니 친절하게 예제 소스 코드도 들어 있네요.

Datasheet에 정의된 시그널 대로 처리를 해주어야 값을 제대로 읽어 올 수 있습니다.



컴파일/다운로드 이후 실행 결과를 보고 싶으시다면 Sketch의 Serial Monitor를 통해서도 확인할 수 있습니다.






아래는 테스용 코드로 여기저기서 짜집기한 코드입니다. 

필요하시면 참조하세요.

// sedew810225@gmail.com


const int DHTdataPin = 8;


int temperature = -1;

int humidity = -1;


void setup() {

  Serial.begin(115200);

}


void loop() {


  int ret = readDHT11();

  if (ret != 0){ 

    Serial.println(ret);

  } else {

    Serial.print("Humidity: "); Serial.print(humidity); Serial.println(" %");

    Serial.print("Temperature: "); Serial.print(temperature); Serial.println(" C");

  }

  delay(400);

  

}


int readDHT11(){

  uint8_t recvBuffer[5];

  uint8_t cnt = 7;

  uint8_t idx = 0;

  for (int i=0;i<5;i++) recvBuffer[i] = 0;

  

  // request sample

  pinMode(DHTdataPin, OUTPUT);

  digitalWrite(DHTdataPin, LOW);

  delay(18);

  digitalWrite(DHTdataPin, HIGH);

  delayMicroseconds(40);


  pinMode(DHTdataPin,INPUT);


  unsigned int timeout = 10000;


  // ACK 

  timeout = 10000;

  while(digitalRead(DHTdataPin) == LOW){

    if (timeout==0) return -1;

    timeout--;

  }


  timeout = 10000;

  while(digitalRead(DHTdataPin) == HIGH){

    if (timeout==0) return -2;

    timeout--;

  }


  // Read data for 40 bits 

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

    

    timeout = 10000;

    while(digitalRead(DHTdataPin) == LOW){

      if (timeout==0) return -3;

      timeout--;

    }


    unsigned long t = micros();


    timeout = 10000;

    while(digitalRead(DHTdataPin) == HIGH){

      if (timeout==0) return -4;

      timeout--;

    }


    if ( (micros() -t) > 40) recvBuffer[idx] |= (1<<cnt);

    if (cnt==0){

        cnt=7;

        idx++;

    } else cnt--;

   

  }


  humidity = recvBuffer[0];

  temperature = recvBuffer[2];

  uint8_t sum = recvBuffer[0]+recvBuffer[2]; 

  if ( recvBuffer[4] != sum) return -2;

  return 0;

}


반응형

Arduino/Genuino를 사용하기 위해서는 아래 IDE 개발 환경 S/W를 우선 개발 PC에 설치해야 합니다.

아래 사이트에 가보시면 Learning 부분에 간략한 소개와 사용법을 확인 할 수 있습니다.


https://www.arduino.cc/en/Guide/Arduino101




https://www.arduino.cc/en/Main/Software




드디어 말로만 들어보던 Sketch 가 실행됩니다.

우선 아두이노/제누이노랑 연결을 위해선 보드 종류를 선택해 주어야 합니다.

아래 101 보드가 없으니 [보드 메니저]에서 패키지를 추가해 보아요.



추가할 Type의 이름은 [intel curie boards] 로 설치를 진행하시면 됩니다.




아래 소스를 잠깐 보면 정말 간단하다는 것을 느낄 수 있습니다.


setup()함수는 일종의 초기화를 하는 것으로 이해하시면 됩니다.


그리고 loop() 함수는 흡사 init 함수들 처럼 무한 루프를 돌면 이벤트 들을 처리하는 것으로 보시면 됩니다.





이제 남은 일은 보드에 컴파일된 이미지를 로딩하는 일만 남았습니다.


하지만 Window 10에서 DFU error가 발생하며 다운로드가 되질 않네요. ( 3월 9일 시도 )

아래 다른 분들이 여러가지 시도를 해 보시기도 하셨는데..

https://forum.arduino.cc/index.php?topic=368777.0


3월 10일날 Board Manager에 Intel Curie Boards version 1.0.5 에서 해결이 되었는지 

업데이트 하고 나니 정상적으로 동작하고 있습니다.





혹시 업데이트 해도 다운로드 안되시는 분들은 리눅스 환경에서 시도해보시기를 권장 드립니다.





반응형




드디어 벼르고 벼르던 ARDUINO와 센서들을 구입하였습니다.

장난 삼아서라도 그냥 만들어 보고 싶던 것을 무작정 만들어보기~


아래 녀석은 ARDUINO 시리즈 중에 Genuino 101 입니다. 

미국에서는 ARDUINO라고 파는데, 그 외의 국가에서는 GENUINO라는 브랜드 명을 사용합니다.



이 보드를 선택하게 된 이유는 중력 센서와 가속도 센서가 포함되어 있기 때문이랍니다.

자세히 보니 BLE도 포함되어 있군요



OPEN-SOURCE는 사랑입니다. ㅎ




좀더 자세한 정보는 아래 Official 링크에서 확인 하실 수 있습니다.

https://www.arduino.cc/en/Main/ArduinoBoard101





기존에 사둔 라즈베리파이와 이 보드를 이용하여 우선 만들어 보고 싶은 프로젝트 1호는

집앞 아파트 계단에 몰래 담배피는 학생들을 잡기 위해 초음파 센서를 붙인 몰카 입니다. 

잡히기만 해봐라~ 부모님과 면담을 기필코 진행해 주리라 !!


아래는 HC-SR04 초음파 센서입니다. 측정거리는 2~400cm, DC 5V/2mA 로 저정도 성능이면 충분히 계단참을 감시할 수 있으리라 ^^: 생각이 듭니다.


이건 16*2 5V LCD 모듈입니다. 간단히 디버그 메세지 등을 뿌려 볼 예정입니다.


아래는 DHT11 온/습도 센서입니다. 영하 측정이 안되어서 아쉽긴 하지만 축사 온도 측정 등의 프로젝트에 활용해 볼 예정입니다. 온도는 0~50도, 습도는 20%~95%까지 측정 가능합니다.


S/W 쟁이라 첨보는 신기한 물건이라 사진을 찍어 보았습니다. 빵판입니다 ^^ Bread-Board로 납땜하기 싫을때 위에 모듈들을 꼽아 쓰는 보드 입니다.



허접하고 기술적으로도 많이 부족하지만 

그래도 뭔가 만들어 본다는 혼자만의 만족감이라고나 할까요 ㅎㅎ


진행사항 있을때마다 조금씩 업데이트 해보도록 하겠습니다.

반응형

+ Recent posts