개발자/라즈베리파이4

라즈베리파이4 스마트홈 소리센서 코드 4

지구빵집 2023. 5. 11. 09:55
반응형

 

 

소리센서는 소리를 감지하는 사운드센서 혹은 음향센서로 부른다. 

 

사운드 센서란 주변에서 흔히 볼 수 있는 마이크를 생각하면 된다. 소리가 발생할 경우 소리 센서는 소리의 크기와 지속시간에 따른 아날로그 신호를 출력한다. 소리로 전등을 켜고 끄거나 또는 주차 중인 차 안에 설치하여 주변에 소리가 발생할 경우 카메라가 동작하는 기능들은 사운드 센서를 사용해서 구현할 수 있는 기능들이다.

 

 

라즈베리파이 스마트 홈 실습 과정 전체 포스팅 리스트 

 

라즈베리파이4 스마트홈 제품 특징 1

라즈베리파이4 스마트홈 불꽃 센서 코드 2

라즈베리파이4 스마트홈 가스센서 코드 3

라즈베리파이4 스마트홈 소리센서 코드 4

라즈베리파이4 스마트홈 조도센서 코드 5

라즈베리파이4 스마트홈 온도 습도센서 코드 6

라즈베리파이4 스마트홈 인체감지 모션센서 코드 7

라즈베리파이4 스마트홈 액츄에이터 디지털 도어록 실습 8

라즈베리파이4 스마트홈 가스타이머 실습 9

라즈베리파이4 스마트홈 전동볼밸브 실습 10

라즈베리파이4 스마트홈 RFID 실습 11

라즈베리파이4 스마트홈 RGB LED 실습 12

라즈베리파이4 스마트홈 카메라 실습 13

라즈베리파이4 스마트홈 조명 LED bar 실습 14

라즈베리파이4 스마트홈 서버 프로그램 실습 15

라즈베리파이4 스마트홈 안드로이드 앱 설명 16

 

주변에서 여러 가지 응용범위가 많은 사운드 센서를 실습하기로 한다. 아래는 사운드 센서의 모양과 핀 맵을 보여준다. 사운드 센서도 마찬가지로 출력은 4핀으로 되어 있다. 전원과 GND과 센서의 출력을 Analog로 출력하는 Aout과 HIGH, LOW로 출력하는 Digital 출력핀이 그것이다. 아래는 사운드 센서의 외관과 핀 맵을 나타낸다.  

 

 

사운드센서 핀맵

 

사운드 센서 사양과 전기적 특성

 

사양 특징
크기 32mm*17mm*15mm( length*width*height)
Chip LM393, 전기 콘덴서 마이크
작동 전압 DC 3-6v
출력 아날로그/디지털
LED Power LED, Sensor Indicator LED

 

여기서 사운드 센서 테스트는 아날로그 입력을 받아 아날로그 값을 출력하는 것을 테스트한다. 스마트 홈 보드의 U4인 MCP3208 IC는 SPI인터페이스를 사용한다. 이종 컴퓨터 간의 데이터 통신을 위해 사용되는 것으로 센서, ADC, 다른 MCU와의 통신에 많이 사용되며, 마스터 및 슬레이브로 나누어 상호 간의 통신을 할 수 있다. 라즈베리파이와 8-Channel 12-Bit A/D Converters 인 MCP3208을 SPI 기능을 통하여 통신하여, MCP3208를 이용하여 센서 값을 받아오는 테스트를 해보도록 하겠다. 아래는 대표적인 SPI 인터페이스회로이다. 

 

 

아날로그신호를 얻는 12bit ADC MCP3208 연결도

 

 

위와 같이 연결되어 SPI 인터페이스로 사운드 센서의 데이터를 획득할 수 있다. 아날로그 데이터를 얻기 위해 연결된 모양을 아래 그림에 나타내었다. 

 

 

스마트 홈 시스템의 소리센서

 

센서 캘리브레이션 (Calibration, 보정)

 

다른 센서와 마찬가지로 사운드 센서도 보정을 거친 후 사용해야 한다. 방법은 전원을 연결하면 센서모듈 중앙의 두 개의 LED 중 한 개 전원 LED에 불이 들어온다. 이때 다른 LED 도 켜져 있다면 항상 신호가 들어오는 것이므로 가변저항을 돌려 약간만 시계, 반시계 방향으로 돌려도 신호 출력 LED 가 꺼지는 상태까지 보정해 주면 된다.  

 

사운드 센서 테스트 소스코드 home-sound.c

 

#include <stdio.h> 
#include <string.h> 
#include <errno.h>
 
#include <wiringPi.h> 
#include <wiringPiSPI.h> 

#define CS_MCP3208 8 //GPIO 8

#define SPI_CHANNEL 0 
#define SPI_SPEED 1000000 //1Mhz

// spi communication with Rpi and get sensor data 

int read_mcp3208_adc(unsigned char adcChannel) 
{
	unsigned char buff[3];
	int adcValue = 0;
	
	buff[0] = 0x06 | ((adcChannel & 0x07) >> 2);
	buff[1] = ((adcChannel & 0x07) << 6);
	buff[2] = 0x00;
	
	digitalWrite(CS_MCP3208, 0);
	wiringPiSPIDataRW(SPI_CHANNEL, buff, 3);
	
	buff[1] = 0x0f & buff[1];
	adcValue = (buff[1] << 8 ) | buff[2];
	
	digitalWrite(CS_MCP3208, 1);
	
	return adcValue;
}

int main(void) {

	unsigned char adcChannel_sound = 2;

	int adcValue_sound = 0;

	printf("start");
	
	if(wiringPiSetupGpio() == -1)
	{
		fprintf(stdout, "Unable to start wiringPi :%s\n", strerror(errno));
		return 1;
	}
	
	if(wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1)
	{
		fprintf(stdout, "wiringPiSPISetup Failed :%s\n", strerror(errno));
		return 1;
	}
	
	pinMode(CS_MCP3208, OUTPUT);
	
	while(1)
	{
		adcValue_sound = read_mcp3208_adc(adcChannel_sound);
		
		printf("sound = %u\n", adcValue_sound);
		
		delay(100);
	}
	return 0;
}

 

 

컴파일 명령

 

$gcc –o home-sound home-sound.c -lwiringPi

 

실행 명령

 

$ sudo ./home-sound

혹은

./home-sound

 

모든 센서들의 출력은 아날로그 출력을 기본적으로 가지고 있다. 정밀한 센서값과 필요할 때 언제든지 센서값을 읽어 처리가 가능하다는 면에서 아날로그 출력을 사용하는 장점이 있다. 사용상의 어려움으로 디지털 출력을 선호하고, 디지털 출력을 혼합하여 나오는 센서들이 대부분이다. 아날로그 출력을 얻기 위해서는 위의 방법을 사용한다. 

 

테스트 결과

 

$ sudo ./home-sound

startsound = 2126
sound = 2125
sound = 2126
sound = 2128
sound = 2127
sound = 2126
sound = 2128
sound = 2127
sound = 2128
sound = 2128
sound = 2127

 

 

여기까지 욕보셨습니다. 다음 센서로 넘어갑니다. ^^

 

 

반응형