recording thread에서 recordingBuffer에 입력된 오디오 데이터를 기록한다.
recordingBuffer는 원형 큐로 동작하며, bufferOffset이 저장할 위치를 지정한다.
recordingBuffer의 크기는 training에 사용한 dataset의 길이와 샘플링 주파수로 결정된다.
recordingBuffer의 크기 = dataset의 길이(초) * 샘플링 주파수
녹음된 데이터 버퍼는 recordingBuffer에 비해 작다.
인식하는 thread에서는 recordingBuffer의 bufferOffset 부터 시작해 전체 데이터를 읽어 다른 버퍼에 저장한다.
따라서 전체 데이터의 길이는 dataset의 길이와 같다.
이 데이터를 TF로 보내 판별한다.
앱에서 벨 소리 학습 데이터를 사용해 벨 소리를 인식하기 위해서 몇 가지 인수를 조정해야 합니다. 아래는 조정한 인수에 대한 설명입니다.
이름
기본값
변경값
설명
minimumTime Between SamplesMs
30ms
짧은 시간동안 테스트를 많이 하는 것을 방지하기 위해, 테스트한 후 이 시간동안 테스트를 하지 않고 기다립니다.
averageWindow DurationMs
500ms
1500ms
이 시간동안 테스트 한 결과를 평균해 최종 판단을 합니다.
minimumCount
3
최종 결과를 얻기위해 averageWindowDurationMs 동안 minimumCount 이상 테스트를 해야합니다. 너무 짧은 시간동안 테스트를 마치는 경우를 방지하기 위해 총 테스트 시간은 (averageWindowDurationMs / 4) 이상이어야 합니다. 이것은 minimumTimeBetweenSamplesMs를 이용해 조정 할 수 있습니다.
detectionThreshold
0.7
TF에서 테스트한 점수의 평균이 이 값 이상이어야 인식된 것으로 판단합니다.
suppressionMs
1500ms
인식된 결과를 전달한 후 다음 결과를 전달하기 까지의 대기 시간입니다. 동일한 결과가 연속해서 전달되는 것을 방지합니다.
시스템 구성
동작 시스템은 단순합니다. 벨 소리가 나면 안드로이드 앱에서 인식을 하고 블루투스 모듈로 문을 열라는 신호를 보낸니다. 블루투스 모듈은 도어락의 버턴을 전기 신호로 제어하여 문을 엽니다.
그런데, 이 구성도는 소비 전력 문제가 있습니다. 블루투스 모듈은 수신 대기를 해야 하므로 항상 액티브 상태에 있어야 합니다. 이 경우 블루투스 모듈의 소비전류는 20mA 정도입니다. 1000mAh 건전지를 사용한다면 이틀마다 교체해야 합니다.
이 글을 쓰면서 같은 칲셋을 사용하는 모듈을 찾아 보았습니다. 20mA 정도면 열심히 데이터를 주고 받을 때의 소비전류입니다. S/W가 뭔가 다른가 봅니다.
블루투스 모듈의 소비 전력 문제는 좀 더 검토를 해 봐야겠습니다. 그런 후에 도어락에 부착할 수 있을 것 같습니다.
GPS 센서를 이용하여 GPS 디바이스를 제작하고 Lora 를 이용해 이동경로를 서버에 저장 또는 지도에 표시 하는 시스템을 제작해 봅니다. 구글 클라우드로 서버를 구축하는 것은 덤.
시스템 구성
시스템 구성은 크게 3가지로 나뉩니다.
GPS 보드 : GPS 센서, MCU 보드, Lora 모듈
구글 클라우드 가상 서버 : 구글 클라우드, Node.js 서버
네오텍 서버 : MongoDB
어떻게 GPS 데이터를 저장하게 되나요.
먼저 MCU 보드가 GPS 센서로 부터 GPS 데이터를 받아 LoRa 모듈에게 전달합니다. Lora 모듈은 GPS 데이터를 SKT 서버인 ThingPlug 로 전달 하죠. 그러면 구글 클라우드에서 구축한 Node.js 서버가 GPS 데이터를 ThingPlug로부터 전달 받고 마지막으로 네오텍 서버에 GPS 데이터를 저장시킵니다.
LoRa에 대해서 알아볼까요?
1. LoRa란?
Long Range의 약자로 LoRa Alliance 사에서 만든 비면허 통신 기술입니다. IoT 통신을 위해 만들어진 통신규격으로 초장거리연결과 저전력으로 좋은 환경에서 최대 10마일(16km) 정도의 통신이 가능하며 별도의 유심이 필요없이 센서에 할당된 노드번호를 기반으로 통신합니다.
국내에서는 SK텔레콤만 서비스하며 대역은 915Mhz대역을 통해 서비스합니다.
2. LoRa 데이터 수집 방법
LoRa 디바이스의 데이터는 LoRa GW와 N/W서버를 거쳐 ThingPlug에 기록되며 ThingPlug 에서 데이터를 가져 오는 방식은 기본적으로 Polling 방식과 Subscription 방식 2가지가 있으며 둘 중 Subscription 방식을 택하여 데이터를 가져오도록 하겠습니다. Subscription 방식은 LoRa 디바이스에서 ThingPlug 로 값 전달 시 ThingPlug에 저장된 값이 달라질 경우 데이터를 가져오는 방식입니다.
3. LoRa모듈 선택
LoRa는 국내에서 SKT만 서비스한다고 알려드렸습니다. 그러면 LoRa를 사용하기 위해 SKT에서 지원하는 LoRa 모듈을 사용하려고 하는데 크게 성지산업과 솔루엠의 Lora모듈이 있습니다. 두 회사의 모듈은 차이점이 4가지가 있는데 간단히 알아봅시다.
Baud rate가 다르다. 성지산업:115200, 솔루엠:38400
메시지 형식이 다르다. 성지산업:ASCII, 솔루엠:Hex
Command 형식이 다르다. 성지산업: CLI, 솔루엠:AT
Wake-up 처리 방식이 다르다. 성지산업: sleep 모드에서 UART 사용X, 솔루엠: 사용O
둘 중 성지산업(방식)의 LoRa 모듈인 F1PLM-01-A(외장형 LoRa 모뎀)을 선택하여 GPS 보드를 제작하도록 하겠습니다.
function openTextFile() {
var input = document.createElement("input");
input.type = "file";
input.accept = "text/plain";
input.onchange = function (event) {
processFile(event.target.files[0]);
};
input.click();
}
function processFile(file) {
var reader = new FileReader();
reader.onload = function () {
//output.innerText = reader.result;
var text = reader.result;
let arrData = text.split(']');
var position = [];
for(var idx = 0; idx < arrData.length - 1; idx++)
{
var arrGpsData = [];
arrGpsData = arrData[idx].trim().substring(1).split(',');
position[idx] = new google.maps.LatLng(arrGpsData[1], arrGpsData[2]);
markers[idx] = makeMarker(position[idx], null);
attachMessage(markers[idx], arrGpsData[0]); // 시간 표시
}
drawPloyline(position, map); // 라인 그리기
map.setZoom(15); // 지도 확대
map.setCenter(position[0]); // 시작 지점으로 맵 이동
markerCluster = new MarkerClusterer(map, markers,
{imagePath: 'https://developers.google.com/maps/documentation/javascript/examples/markerclusterer/m'}); // 마커 클러스터화
};
reader.readAsText(file, /* optional */ "euc-kr");
}
결과물
마찬가지로 작성한 html 파일을 pug 형태로 변환하여 프로젝트에 포함시킵니다.
7. 정리
GPS 데이터를 MQTT로 전달 받아 MongoDB 저장
main 페이지에서 날짜를 form > post로 전달
MongoDB 에서 해당 날짜의 GPS 데이터를 얻음
GPS 데이터를 파싱하여 지도에 그림
구글 클라우드 가상 서버
이제 제작한 Node.js 웹 서버를 운영할 서버가 필요합니다. 보기에 간단한 역할을 하는 서버인데 개인 컴퓨터로 웹서버를 운영하기에는 비용과 관리 측면에서 부담이 되는 것은 사실입니다. 그래서 이러한 부분들을 해결해 줄 수 있는 클라우드 서비스를 이용하여 웹 서버를 운영해 봅시다.
1. 가상 머신 생성
구글 클라우드의 Google Compute Engine을 사용하면 Google 인프라에서 가상 머신을 만들고 실행할 수 있습니다.
새 VM 인스턴스를 생성합니다. Ubuntu 18.04 LTS 버전으로 설치합니다.
구글 클라우드에서는 f1-micro 머신을 생성하면 가상서버 1개 기준으로 한달(744시간) 무료입니다. 또한 디스크 용량은 30GB가 무료입니다.