[60호]2020 ICT 융합 프로젝트 공모전 결과 발표 및 시상 소식
2020 ICT 융합 프로젝트 공모전 결과 발표 및 시상 소식
전자 로봇, 기계 분야 중 자유 주제로 2020년 2월 1일부터 3월 31일까지 진행된 2020 ICT 융합 프로젝트 공모전 발표와 시상이 지난 6월 8일 (주)엔티렉스 본사 대회의실에서 진행되었다.
이번 2020 ICT 융합 프로젝트 공모전에는 총 78개 팀 및 개인이 응모하여, 이 중 28개 작품을 최종 선정하였으며, 대상은 광운대학교 신동빈, 나영은, 선아라, 조수현, 최희우님이 응모한 “Can you see me?”가 수상하였다.
대상을 수상한 광운대학교 신동빈, 나영은, 선아라, 조수현, 최희우님이 본사를 방문하여 상장과 상금을 수령하고 간단한 인터뷰 시간을 가졌다.
이번 공모전 심사는 (주)엔티렉스, 위드로봇(주), (주)칩센, (주)펌테크, (주)뉴티씨에서 심사를 담당하였고, 심사결과는 우측 페이지에서 확인할 수 있다.
이번 공모전에 수상하신 모든 분들께 축하의 말씀을 드리며, 참여하신 심사업체 및 지원자 분들에게 감사의 인사를 드립니다.
수상작들에 대한 내용은 다음 디바이스마트 매거진을 통해 소개하고자 하며, 내년 2월에 진행될 다음 대회에도 많은 참여와 관심 부탁드립니다.
2020 ICT 융합 프로젝트 공모전 심사결과
구분 | 수상자 | 작품명 | 시상 내역 |
대상 | 광운대학교 신동빈, 나영은, 선아라, 조수현, 최희우 | Can you see me? | 100만원 |
최우수상 | 인하대학교 이승화, 이상우, 박민아 | 시각장애인을 위한 음성 안내 버스표지판 | 50만원 |
국민대학교 이동윤 | 파파고 api를 사용한 점자 번역기 | 50만원 | |
우수상 | 성균관대학교 김승년, 임혁수, 최윤수 | 우울증 치료로봇 IWMYS(I will make you smile) | 20만원 |
한국항공대학교 노윤석, 고려대학교 이준세, 가천대학교 김지연, 정진화 |
TWO EYES (Two Camera watch wet road) | 20만원 | |
한국과학기술원 김동주 | 180도 방향을 한번에 탐지하여 interaction한
반응형 스마트 지팡이 |
20만원 | |
국민대학교 구창진, 박지호, 임성현, 최형종 | 자동시스템과 원격 제어 앱을 갖춘 버스용 창문 | 20만원 | |
숭실대학교 최영림, 최지웅, 이하영, 김수희 | Mindwave mobile 2를 이용한 뇌파 기반
응급호출 시스템 |
20만원 | |
장려상 | 이문기 | 초 광 시야각 스마트 안경 (super wide field of view smart glasses) |
10만원 |
인하대학교 이은성, 강태욱, 남성훈, 이태민, 이홍찬, 정원욱 | 씀(SSM, Smart Spice machine) | 10만원 | |
한양대학교 (ERICA) 김민서, 김동연, 정우진, 이성준, 이도걸, 김경현 | 이룽이의 방역세트 | 10만원 | |
국민대학교 홍희정, 서울시립대학교 박진석, 서울과학기술대학교 윤승한 |
WhoRU | 10만원 | |
금오공과대학교 김진욱, 김병준, 정수현, 조혜수 | 앱 연동이 가능한 점자 프린트기 | 10만원 | |
이화여자대학교 황시은, 오지영, 박지은, 김가연 | EYE SHOE | 10만원 | |
전남대학교 조유진, 이예찬 | Dollying | 10만원 | |
김창운 | 두근두근 원격 모니터링, Electro Cardio Gram | 10만원 | |
대구카톨릭대학교 한진효, 김현준, 서동운, 최동근 | Fire Guard | 10만원 | |
포항공과대학교 김재유 | 실험용 온도계 (Temperature data logger) | 10만원 | |
동양미래대학교 김선우, 김문, 김재아, 최대원 | AI-Based Guide Robot System for the Blind | 10만원 | |
서울과학기술대학교 김태욱, 금현주, 민성재, 이동현 | Cable-driven Anthropomorphic Dexterous Robot hand | 10만원 | |
동양미래대학교 박재범, 김도경, 김성곤, 김예빈, 김종혁, 이연수, 이정원, 장여원 |
Simple Touch | 10만원 | |
영남대학교 양성은, 박유나, 지준영 | 스마트 차선 변경 시스템 | 10만원 | |
대구대학교 정원용 | 자동문 쓰레기통 | 10만원 | |
선문대학교 곽호권 | 물체탐지 4족 보행로봇 | 10만원 | |
KAIST 이준, 정송현, 박종건, 고형석, 강민수 | Minister | 10만원 | |
명지대학교 한찬영 | AutoSwitch | 10만원 | |
항공대학교 이종민 | 20대주거환경을 위한 외.내부 환기 제어 시스템 | 10만원 | |
서울시립대학교 박진석, 서재원, 송태헌 | Automatic Serving & Order System | 10만원 |
[60호]초소형 레이더 MDR, 어떻게 제어하고 활용하나
인지니어스
초소형 레이더 MDR, 어떻게 제어하고 활용하나
글 | 인지니어스 라승탁
인지니어스는 레이더 모듈을 개발하고 공급하기 위한 고주파 안테나 설계, RF 기판 및 회로 설계, 그리고 레이더 제어 S/W를 독자적으로 개발하고 서비스하는 전문 기업이다. 십여년의 기술 개발을 통해서 많은 수의 레이더를 상용화하였다. 이를 바탕으로 인지니어스는 산업용, 자동차용, 그리고 방산용 레이더를 개발하고 공급하고 있다.
현재 디바이스마트에서 판매 중인 24GHz 기반의 MDR(Motion Detect Radar) 모델은 2018년도에 상용화를 완료한 세계에서 제일 작은 크기의 초소형레이더로 다양한 응용 분야에서 사용 중이고, 현재도 지속적으로 소프트웨어를 업데이트하여 속도(방향 포함)까지 알 수 있는 버전인 MDR Ver2.0을 곧 지원한다. 이는 기존에 단순히 움직이는 사물의 존재 유무만을 감지하던 기능에서 감지된 물체가 레이더에 접근 중인지, 멀어지고 있는지를 구별할 수 있는 기능이 추가된 것이다.
또한 60GHz 기반의 산업용 레이더에서는 최고 사양을 갖는 고성능 레이더도 최근에 개발을 완료하여 공급이 가능한 상태이다. 고성능 레이더는 CCTV와 연동해서 지능형 추적이 가능하고 과속 단속 카메라, 그리고 사람의 호흡이나 심박을 검출하는 바이탈 센싱 등으로 적용되고 있다.
MDR 특징
MDR 레이더 모듈은 24GHz의 K밴드 대역 전파를 이용하여 움직이는 사물의 존재 유무를 감지하는 용도로 사용한다. 다른 센서와 비교하여 환경의 영향을 적게 받기 때문에 햇빛과 같이 강한 빛, 먼지, 비, 눈, 안개, 그리고 흐린 날씨에도 사용이 가능하다.
모듈은 MCU를 내장하고 있어서 전원만 공급하면 자체적으로 동작을 수행하고, 검출한 결과는 GPIO나 UART를 통해서 출력한다. 또한 IOT와도 연동이 가능하도록 패킷 통신을 지원하고, 외부에서 모듈의 기능을 설정할 수 있다.
감지 각도와 범위에 따라서 mini와 micro의 두 가지 모델이 있고, 성인 남성 기준으로 7m 이상의 감지거리를 가지고 있다. 크기는 mini가 30x30x3.1mm, micro가 22.1×18.1×3.1mm로, 작아서 다양한 제품에 내장 시키는 것이 가능하다.
MDR Ver2.0 사용법과 제어
이번 장에서는 곧 지원 예정인 속도 정보까지 알 수 있는 MDR Ver2.0의 사용법과 제어에 대해 알아보겠다.
우선 아래의 핀 맵 그림에 맞게 MDR의 5개의 핀을 연결한다. 5개 핀은 VCC, GND, GPIO_OUT, UART_TX, UART_RX를 의미한다.
MDR의 가장 큰 장점은 사용자가 사용하기 쉽게 설계되었다는 점이다. 기본 사용법은 전원 연결 후, GPIO OUT핀의 상태로 현재 움직임이 있는가를 판단하면 된다. 기본 펌웨어의 GPIO OUT핀은 움직임이 있으면 High, 없으면 Low를 출력한다. 만약 간편한 사용만을 원한다면 UART TX, RX 핀을 제외한 VCC, GND, GPIO_OUT 3개의 핀만 사용하면 된다.
MDR을 제어하기에 앞서 특정 용어를 먼저 확인해보자. 첫 번째로 DetectValue는 MDR에 감지된 움직임의 크기를 수치로 나타낸 것이며, 가까운 거리거나 큰 움직임 일수록 더 큰 수치를 나타낸다. 두 번째로 DetectLevel은 DetectValue의 Threshold값으로 DetectValue가 DetectLevel보다 크면 GPIO_OUT1로 감지신호를 출력한다. 마지막으로 MotionData는 MDR에 감지된 움직임의 DetectValue, 속도, GPIO_OUT1 상태를 통합한 용어이다.
MDR은 UART 시리얼 통신으로 특정 커맨드를 이용해 제어가 가능하다. 핀 맵대로 연결한 후, Tera Term에서 아래의 그림과 같이 “MotionDataEnable 1” 커맨드를 입력 후 엔터를 누르면 MotionData가 실시간으로 출력된다.
MotionData의 표현식은 “MotionData⌴+ DetectValue⌴±속도⌴GPIO_State(0 or 1)”이다. ‘Space’(0×20)는 ‘⌴’로 표현하였다. 이 상태에서 MDR에 움직임을 주게 되면 DetectValue가 상승할 것이고 설정된 DetectLevel을 넘게 되면 GPIO 상태가 1로 바뀔 것이다. 반대로 가만히 멈춘 상태가 유지되면 DetectValue가 내려갈 것이고 DetectLevel보다 낮아지기에 GPIO 상태가 0으로 바뀔 것이다.
MDR을 사용하는 환경에 따라 움직임이 없는 환경에서도 기본적으로 DetectValue가 높은 경우가 있다. 예를 들면 주변에 컴퓨터 Fan이 돌고 있다거나, 환풍기 등의 움직임이 고정적으로 발생하고 있는 환경이다. 이 경우, DetectValue가 항상 DetectLevel을 넘게 된다면 MDR의 GPIO 상태는 항상 High 일 것이다.
DetectValue가 항상 DetectLevel을 넘게 될 경우, MDR의 파라미터를 제어하면 문제를 해결할 수 있다. 예를 들어 설정된 DetectLevel이 1만이고, 현재 평균적으로 DetectValue가 1만이 나온다면 DetectLevel을 1만보다 높게 설정하는 커맨드를 입력하여 제어하면 된다. 아래의 그림과 같이 “DetectLevel 11000” 커맨드를 입력 후 엔터를 누르면 DetectLevel이 1.1만으로 설정된다. 추천하는 DetectLevel은 MDR을 사용하는 환경의 평균 DetectValue + 5000 정도이다.
MDR 활용
MDR은 독자적으로 동작하는 초소형 레이더라서 조명제어, 보안 시스템, 공장 자동화, 출입 감지, 비접촉 스위치 등에 활용되고 있다. 또한 MDR은 기존 PIR 센서의 단점을 대부분 극복한 고성능 센서라서 PIR을 사용할 수 없는 환경에도 사용이 가능하다. 이번 장에서는 MDR이 실제로 활용되어 제품이 된 예를 알아보겠다.
아래 그림과 같이 블랙박스 주차보조에 활용되었다. 주차 시간동안 항상 블랙박스를 녹화할 수는 없기에 현재 사용되고 있는 주요 센서는 충격감지 센서이다. 하지만 충격감지 센서의 단점은 이미 사고가 발생되어버린 시점부터 녹화가 진행된다는 것이다. 이를 방지하기 위해 충격감지 센서와 연계하여 MDR로 움직임을 미리 감지하여 사고 발생 전과 후의 영상을 확보하도록 하였다.
다음 MDR 활용으로는 원격 침입 감지가 있다. 아래 그림과 같이 기존의 침입 감지 시스템에 사물인터넷을 연계한 제품이다. 또한 기존의 침입 감지용 센서와 다르게 레이더 특성을 이용하여 벽을 투과한 물체의 움직임도 감지가 된다는 장점을 잘 살렸다.
마지막으로 소개할 MDR 활용 제품은 지능형 아파트 초인종이다. 기존의 초인종을 눌러야 녹화가 되는 제품과 다르게 설정된 시간만큼의 지속적인 움직임이 감지되면 자동으로 녹화가 되도록 하였다. 요즘 같은 흉흉한 세상에 장시간 현관문 앞의 움직임은 곧 범죄로 이어질 확률이 높기 때문에 범죄 예방 차원에서 굉장히 좋은 MDR 활용이라고 볼 수 있다.
[60호]NANO 33 IoT보드를 활용한 블루투스 수평계 만들기
NANO 33 IoT보드를 활용한
블루투스 수평계 만들기
요즘 우리나라에서도 많은 분들이 캠핑카를 운용하고 있습니다. 캠핑카를 운용하다보면 필수적으로
수평을 맞추어야 하는 데 이 때 활용할 수 있는 블루투스 수평계를 만들어 보고자 합니다.
글 | 김진섭 naturaljs@hanmail.net
NANO 33 IoT 보드는 기본적으로 블루투스 기능과 가속도 센서를 내장하고 있기 때문에 별도의 회로 구성없이도 블루투스 수평계를 만들 수 있습니다.
1. 아두이노 IDE 설치하기
NANO 33 IoT보드가 블루투스 수평계로 동작하도록 하기 위해서는 적당한 소스코드를 보드에 업로드 해야합니다. 이를 위해서는 아두이노 IDE(통합개발환경)이 필요합니다.
아두이노 공식 홈페이지 : https://www.arduino.cc/
홈페이지에 접속하여 소프트웨어 다운로드 페이지로 들어갑니다.
다운로드 페이지를 보면 Arduino IDE버전의 옆에 다양한 다운로드가 표시되어 있습니다. 여기에서 설치 버전인 Installer와 무설치 버전인 ZIP파일용, 윈도우 10의 앱버전 맥, 리눅스용 개발 환경을 다운로드 받을 수 있습니다. 여기에서는 설치 버전인 Installer버전을 다운로드 합니다.
이제 설치 파일을 이용해서 설치해봅니다.
설치 파일을 실행하면 설치 화면이 나옵니다. 순서대로 I Aree ▶ Next ▶ Install 버튼을 눌러 설치해줍니다.
2. 소스코드 업로드하기
아두이노를 실행하면 다음과 같은 화면을 볼 수 있습니다.
이제 본격적인 시작입니다.
먼저 아두이노 NANO 33 IoT에 대한 설정을 해야 합니다. 그러나 기본 IDE에서는 아두이노 NANO 33 IoT보드를 찾을수 없기에 추가를 해주어야 합니다.
아두이노 IDE에서 보드를 없는 보드를 추가할 때에는 보드 툴-보드의 상단의 ‘보드 매니저…’로 다양한 보드들을 검색하여 추가할 수 있습니다.
NANO 33 IoT를 추가할 때에는 검색창에 “NANO 33″이라고 검색하고 ‘Arduino SAMD Boards (32-bits ARM Cortex-M0+)’를 확인하고 설치합니다. 보드를 설치하고 다시 보드 옵션을 확인해보면 Arduino SAMD 하위에 Arduino NANO 33 IoT를 확인할 수 있습니다. NANO 33 IoT를 선택하여 보드를 설정해줍니다.
보드를 설정한 후에는 포트 설정이 필요합니다. 포트를 사용하기 위해서는 보드의 드라이버를 설치해야 하지만 Nano 33 IoT 보드의 드라이버는 연결시 기본적으로 설치가 됩니다.
드라이버 설치가 완료되면 장치 관리자에서 포트를 확인할 수 있습니다.
보드 인식이 확인되면 IDE에서 툴-포트의 옵션을 통해 아두이노를 설정해 주면 보드 설정은 완료됩니다.
블루투스 수평계를 만들기 위해 “LSM6DS3”이라는 6축센서와 블루투스 기능의 라이브러리를 얻어야합니다. 이를 위해 Arduino Software (IDE)에서 사용 가능한 라이브러리 관리자를 열어줍니다.
라이브러리 관리에서 “LSM6DS3”과 “ArduinoBLE”를 검색하여 설치 버튼을 눌러줍니다.
이제 다음 소스 파일을 보드에 업로드 하여 줍니다. (Caravan_check.ino)
다운로드 링크 : https://blog.naver.com/geniusus/221828233778
#include <ArduinoBLE.h >
#include <Arduino_LSM6DS3.h >
BLEService DeviceInformation(“180A”);
BLEFloatCharacteristic Weight(“2A98″, BLERead | BLENotify);
BLEShortCharacteristic WeightMeasurement(“2A9D”, BLERead | BLENotify);
float acc_x, acc_y, acc_z;
float acc_pitc, acc_roll;
short acc_pit, acc_rol;
long previousMillis = 0;
void setup() {
Serial.begin(9600);
if (!IMU.begin()) { //LSM6DS3센서 시작
Serial.println(“LSM6DS3센서 오류!”);
while (1);
}
if (!BLE.begin()) {
Serial.println(“starting BLE failed!”);
while (1);
}
// set advertised local name and service UUID:
BLE.setLocalName(“CaravanInfo”);
BLE.setAdvertisedService(DeviceInformation);
DeviceInformation.addCharacteristic(Weight);
DeviceInformation.addCharacteristic(WeightMeasurement);
BLE.addService(DeviceInformation);
Weight.writeValue(0);
WeightMeasurement.writeValue(0);
// start advertising
BLE.advertise();
Serial.println(“BLE LED Peripheral”);
}
void updateAngle() {
if (IMU.accelerationAvailable()) {
IMU.readAcceleration(acc_x, acc_y, acc_z);
//각도 계산(라디안을 각도로 180/PI = 57.27755)
acc_pitc = RAD_TO_DEG * atan(acc_x / sqrt(acc_y *acc_y + acc_z *acc_z));
acc_roll = RAD_TO_DEG * atan(acc_y / sqrt(acc_x *acc_x + acc_z *acc_z));
acc_pit = acc_pitc * 100;
acc_rol = acc_roll * 100;
Serial.print(“pit = “); // print it
Serial.print(acc_pit);
Serial.print(“, rol = “); // print it
Serial.println(acc_rol);
Weight.writeValue(acc_pit); // and update the battery level characteristic
WeightMeasurement.writeValue(acc_rol);
}
}
void loop() {
// listen for BLE peripherals to connect:
BLEDevice central = BLE.central();
// if a central is connected to peripheral:
if (central) {
Serial.print(“Connected to central: “);
Serial.println(central.address());
// while the central is still connected to peripheral:
while (central.connected()) {
long currentMillis = millis();
if (currentMillis – previousMillis >= 50) {
previousMillis = currentMillis;
updateAngle();
}
}
Serial.print(F(“Disconnected from central: “));
Serial.println(central.address());
}
}
업로드를 하실 때 꼭 빨간 부분을 확인 하시고 업로드 버튼을 눌러줍니다.
확인이 끝났으면 업로드 버튼을 눌러줍니다.
이렇게 하면 보드에서는 기울기 신호를 연결되어 있는 블루투스 기기(핸드폰)로 보내주게 됩니다. 그럼 데이터가 수신되는 핸드폰의 애플리케이션에 대해 알아보기 전에 코드를 잠시 분석해 보도록 하겠습니다.
#include <ArduinoBLE.h >
#include <Arduino_LSM6DS3.h >
BLEService DeviceInformation(“180A”);
BLEFloatCharacteristic Weight(“2A98″, BLERead | BLENotify);
BLEShortCharacteristic WeightMeasurement(“2A9D”, BLERead | BLENotify);
float acc_x, acc_y, acc_z;
float acc_pitc, acc_roll;
short acc_pit, acc_rol;
long previousMillis = 0;
프로그램에서 사용될 변수를 지정합니다. 저의 경우 임의로 위와 같은 이름을 지정했는데 편하신 이름으로 바꾸어도 됩니다. 피치와 롤값이 두 개인데 그 이유는 나중에 보내는 데이터를 소수점 2자리로 고정하기 위해 위와 같은 편법을 썼습니다.
또한 Delay함수를 사용하지 않고 일정한 시간간격으로 지정된 동작을 하도록 하기 위해 previousMillis를 변수로 지정하였습니다. 이에 관한 자료는 아두이노 예제 중 BlinkWithoutDelay를 참고하시면 됩니다.
void setup() {
Serial.begin(9600);
if (!IMU.begin()) { //LSM6DS3센서 시작
Serial.println(“LSM6DS3센서 오류!”);
while (1);
}
if (!BLE.begin()) {
Serial.println(“starting BLE failed!”);
while (1);
}
동작에 앞서 보드에 전원이 들어왔을 때 한번 실행될 Setup동작을 지정합니다. 여기에서는 6축센서와 BLE가 제대로 동작하는지 확인을 하게 됩니다.
BLE.setLocalName(“CaravanInfo”);
BLE.setAdvertisedService(DeviceInformation);
DeviceInformation.addCharacteristic(Weight);
DeviceInformation.addCharacteristic(WeightMeasurement);
BLE.addService(DeviceInformation);
Weight.writeValue(0);
WeightMeasurement.writeValue(0);
BLE.advertise();
Setup구문 안에 있는 내용입니다.
BLE 기기(NANO 33 IoT보드)가 공시할 이름과 서비스 UUID, 특성 UUID의 이름을 지정하고 초기값을 0으로 지정한 후 BLE신호를 주변에 뿌리도록 합니다.
void loop() {
BLEDevice central = BLE.central();
if (central) {
Serial.print(“Connected to central: “);
Serial.println(central.address());
while (central.connected()) {
long currentMillis = millis();
if (currentMillis – previousMillis >= 50) {
previousMillis = currentMillis;
updateAngle();
}
}
Serial.print(F(“Disconnected from central: “));
Serial.println(central.address());
}
}
updateAngle 구문 이전에 loop문을 살펴보겠습니다.
여기에서는 BLE기기(NANO 33 IoT보드)가 BLE central과 접속된 경우 시간을 재도록 하며 50ms(0.05초)가 지난 경우 updateAngle함수를 실행시키도록 합니다.
void updateAngle() {
if (IMU.accelerationAvailable()) {
IMU.readAcceleration(acc_x, acc_y, acc_z);
//각도 계산(라디안을 각도로 180/PI = 57.27755)
acc_pitc = RAD_TO_DEG * atan(acc_x / sqrt(acc_y *acc_y + acc_z *acc_z));
acc_roll = RAD_TO_DEG * atan(acc_y / sqrt(acc_x *acc_x + acc_z *acc_z));
acc_pit = acc_pitc * 100;
acc_rol = acc_roll * 100;
Serial.print(“pit = “);
Serial.print(acc_pit);
Serial.print(“, rol = “);
Serial.println(acc_rol);
Weight.writeValue(acc_pit);
WeightMeasurement.writeValue(acc_rol);
}
}
updateAngle내부가 가장 핵심적인 부분이라고 할 수 있습니다. 여기에서는 가속도 값을 받아 이를 통해서 기울기를 측정하게 되고 여기에서 나오는 피치값은 Weight UUID를 통해 송신하고 롤 값은 WeightMeasurement UUID를 통해 송신하게 됩니다.
3. 애플리케이션 제작
애플리케이션은 블록코딩으로 간단하게 만들 수 있는 앱인벤터를 이용하여 만들어 보도록 하겠습니다. (물론 기능을 여러 가지를 넣다보니 블록이 복잡해졌습니다.) 간단하게 만드실 분들은 블록을 참고하셔서 필요없는 부분은 과감히 삭제 하셔도 됩니다.
먼저 애플리케이션을 만드는 앱 인벤터에 접속합니다.
http://ai2.appinventor.mit.edu/
접속시 로그인 화면이 뜹니다. google계정이 있다면 쉽게 로그인 할 수 있습니다.
로그인 하면 아래와 같이 프로젝트를 만들 수 있습니다. ‘새 프로젝트 시작하기’를 눌러 프로젝트 이름을 넣어줍니다
레이아웃-수평배치를 드래그 하여 넣어줍니다.
오른쪽의 속성창에서 너비는 부모 요소에 맞추어 줍니다.
사용자 인터페이스에서 ‘목록 선택버튼’과 ‘버튼’을 하나씩 넣어줍니다.
이런 식으로 하여 자신이 원하는 디자인의 앱을 만들어줍니다.
저는 ‘보이기’ 기능을 이용하여 스크린을 두 페이지로 나누어 만들었습니다. (다른 스크린에 들어가더라도 블루투스 연결을 유지하기 위해서입니다.)
이제 동작이 되도록 하기 위하여 각 버튼에 코딩을 해주어야 합니다.
오른쪽 윗 부분에 ‘블록’을 클릭하여 줍니다. 제가 만든 수평계의 블록구성은 아래와 같습니다.
기능을 하나 두 개 추가하다보니 블록의 개수가 많아졌네요. 확대하여 하나씩 확인해보고 그 기능에 대해 설명해 드리도록 하겠습니다.
먼저 변수들을 지정해줍니다. BLE기기의 데이터를 받아오기 위해서는 서비스 UUID와 특성 UUID가 지정되어야 하며, 각 UUID를 통해 데이터가 전송될 수 있습니다. Classic Bluetooth보다 복잡하긴 하지만 동시에 여러 개의 데이터를 독립적으로 전송한다는 데에 큰 장점이 있습니다. 이제 연결을 위한 버튼인 SCAN, 연결하기, 연결끊기가 동작하는 코드에 대하여 알아보도록 하겠습니다.
먼저 SCAN버튼입니다.
SCAN버튼을 누르면 주변 BLE기기를 스캔하게 됩니다. 이때 스캔된 기기를 블루투스 리스트에 하나씩 추가하게 되는데, 저는 블루투스 리스트를 평소에 안보이도록 해두었기 때문에 블루투스 보이기 값을 ‘참’으로 바꾸어 주는 코드를 더 추가 하였습니다.
주변의 블루투스 코드가 발견되면 블루투스 리스트를 추가하도록 하는 코드입니다.
이제 블루투스 리스트에서 하나의 항목을 선택한 후 ‘연결하기’버튼을 누르면 항목 번호로 연결이 실행됩니다. 나중에 자동연결을 위하여 이때 연결되는 기기의 MAC주소를 ‘saveDevice’라는 태그로 TinyDB에 저장해두게 됩니다.
마지막으로 연결끊기를 누르면 BLE연결을 끊고 블루투스 리스트를 안보이도록 해줍니다.
블루투스가 연결되었다면 상태 메세지를 “블루투스가 연결되었습니다.”로 바꾸고 수평계 화면을 보이도록 하며, 블루투스가 끊어졌다면 “블루투스가 끊겼습니다.”로 상태 메시지를 바꾸고 수평계 화면을 안보이도록 하는 동작입니다.
위에 코드는 애플리케이션이 초기화되었을 때(시작할 때) 자동연결하도록 하는 코드입니다. 만약 연결되었던 기기가 있었다면 자동연결을 실행하도록 하게 되며, TinyDB저장된 기기의 MAC 어드레스를 불러와 연결을 시도하게 됩니다.
핸드폰에서 뒤로 가기 버튼을 눌렀을 때의 동작을 지정해줄 필요가 있습니다. 만약 뒤로가기로 종료가 되는 경우 앱은 새로 시작하는데 블루투스의 연결을 유지되는 현상이 발생하는 경우가 있기 때문에 뒤로가기 버튼이 눌리는 경우 동작할 코드를 따로 지정해줍니다. 저는 블루투스의 연결을 끊고 애플리케이션을 종료하도록 하였습니다.
수평계에서 핵심적인 코드입니다. 블루투스 연결이 유지되는 동안 같은 동작을 반복합니다. 두 개의 UUID에서 전송하는 값을 받아와 이를 필요한 데이터로 계산하는 과정을 거칩니다. 이후 이 값을 출력하고, 차량의 정면사진과 측면사진을 회전시켜 쉽게 확인 가능하도록 하는 동작을 합니다.
이 블루투스 수평계를 사용하는 사람마다 차량의 상태가 다르기 때문에 차량 설정하는 창을 열어주는 버튼의 동작코드입니다. 스크린을 바꿀 수도 있지만 스크린이 바뀌는 경우 블루투스 연결이 끊어지기 때문에 저는 화면이 꽉차는 레이아웃을 크게 두 개를 만들고 차량설정으로 들어가는 경우 첫 번째 레이아웃을 안보이도록 하고 두 번째 레이아웃을 보이게 하여 블루투스 연결을 유지하도록 하였습니다.
블루투스 수평계를 차량에 설치한 경우 정확히 수평인 곳에 설치될 가능성은 거의 없습니다. 그렇기 때문에 영점을 조절할 수 있는 버튼을 넣어 영점조정을 눌러 현재의 기울기 값을 저장해 측정값에서 기준값을 빼주도록 하였습니다.
혹시나 잘못된 BLE기기와 연결되는 경우 잘못된 값을 받아와 계속 오류가 나게 되는데, 이를 해결하기 위하여 자동연결을 초기화 시키는 버튼이 있습니다.
차량 설정 페이지 안에서는 다양한 값을 변경할 수 있습니다. 차량마다 그 길이와 너비가 다르기 때문에 각자의 차량에 맞도록 길이와 너비를 지정해 줄 수 있으며, 좀 더 애정이 가도록 이미지도 자신의 차량에 맞도록 변화시켜줄 수 있습니다. 또한 소수점의 개수를 변경시켜 보이는 민감도도 변화시켜줄 수 있습니다.
수평계를 충전잭 위치에 따라 앞뒤를 바꾸어 연결할 수 있도록 앞뒤를 변경하는 버튼을 추가하였습니다.
이렇게 다양하게 차량을 설정한 값이 애플리케이션을 껐다고 사라지면 안되기 때문이 이 모든 값은 TinyDB에 저장을 하게 됩니다.
그리고 애플리케이션이 초기화 되는 경우(새로 앱을 실행시킨 경우) TinyDB에 저장된 값을 불러오게 되며, 자동 연결시도를 하게 됩니다.
처음 애플리케이션을 만들었을 때는 코드가 매우 적었습니다만 점점 오류를 해결하고 편의기능을 넣다보니 코드가 점점 늘어났습니다. 위 코드에서 원하는 부분만 발췌하여 사용하시더라도 수평계 애플리케이션을 만들 수 있습니다.
4. 애플리케이션 설치 및 동작확인하기
이제 핸드폰(블루투스 4.0이상)에 만들어진 앱을 설치하고 사용해봅니다. 애플리케이션의 링크는 다음과 같습니다. (https://play.google.com/store/apps/details?id=appinventor.ai_jinsub8506.Caravan_check) 혹은 구글 플레이에서 “카라반 블루투스(BLE) 수평계”를 검색하여 다운로드 합니다.
애플리케이션을 실행한 후 ‘SCAN’을 눌러 주변에 NANO 33 보드를 검색한 후 ‘연결하기’를 누르면 카라반의 수평수치가 표시되는 것을 확인할 수 있습니다.
이후 다시 애플리케이션을 실행시키면 마지막에 접속되었던 블루투스 기기를 검색하여 자동으로 연결됩니다.
차량 설정에서는 자신의 카라반에 대한 설정을 할 수 있습니다.
자신의 카라반의 크기, 표시되는 소수점의 개수를 조절할 수 있으며 화면에 나오는 카라반의 사진을 바꿀 수도 있습니다.
수평조정 버튼은 현재의 기울기를 0으로 놓는 영점조절 버튼입니다.
혹시 앞뒤를 바꾸어야하는 상황이라면 전후 좌우 변경 버튼으로 유동적으로 사용할 수 있습니다.
이처럼 NANO 33 보드를 사용하면 별도의 회로 구성없이 원격에서 수평수치를 받아볼 수 있습니다.
5. 자주 묻는 질문
Q1. 뭘 사야하나요?
녹색창에 “NANO 33 IoT”를 검색하셔서 나오는 보드를 사시면 됩니다. (뒤에 길게 있는 숫자는 의미 없는 듯합니다.) 핀이 있는 모델과 없는 모델은 기능상 차이는 없고 추후 어떻게 사용할지의 차이입니다.
Q2. 컴퓨터와 보드를 연결하여 보드에 녹색불이 들어오지만 포트가 잡히지 않습니다.
보드와 연결한 Micro 5핀 케이블이 충전 전용 케이블인듯 합니다. 데이터 케이블을 사용하셔야 컴퓨터와 보드간의 통신이 가능합니다. 혹시 이런 현상이 있을 경우에 핸드폰과 컴퓨터를 연결하여 핸드폰이 컴퓨터에서 인식이 되는지 확인해보시면 데이터 케이블인지 아닌지를 쉽게 판단 가능합니다.(핸드폰이 내 PC에 떠야 데이터 케이블입니다.)
Q3. 카라반 어디에 설치하는게 좋나요?
카라반 어디든 설치하셔도 됩니다. 기울어진 곳에 설치해도 괜찮으나 너무 큰 각도로 기울어지면 정밀도가 낮아집니다. 가급적이면 평평한 곳에 설치하시되 꼭 긴방향이 카라반의 전면 또는 후면을 바라보도록 나란히 설치해주시면 됩니다.
Q4. 전원 연결은 어떻게 하나요?
전원 연결 시 USB-5핀 단자를 이용하면 5V전기를 이용하시면 됩니다. 시가잭에 꼽는 5V USB단자를 이용하시면 됩니다. 만약 12V의 배터리를 직결하시고 싶다하시면 배터리의 +를 보드의 VIN에, 배터리의 -를 보드의 GND에 연결하시면 됩니다.(24V는 안됩니다.)
Q5. 보조배터리로 전원을 공급하면 10~30초 후 보드의 전원이 꺼집니다.
제 생각에 보조배터리는 충전용으로 많이 쓰이기 때문에 과충전 방지기능이 들어있어 적은 전류를 소비하는 경우 전기를 차단하는 경우가 있습니다. 아마도 이때문에 보드의 전원이 꺼지는 듯합니다. 웬만하면 카라반의 전기를 연결하는 방식을 추천합니다.
Q7. 보드를 사서 어플만 깔면 바로 사용가능한가요.?
아쉽지만 아닙니다. ‘아두이노 통합 소프트웨어’를 설치하신 후 내부에서 3번의 내부파일을 설치하시고 소스코드를 업로드 해야합니다. 글에서 만드는 과정을 꼭 봐주세요.
6. 아두이노 보드를 잘못 구입한 경우
가끔 실수로 IoT보드가 아닌 BLE나 BLE Sense보드를 구입하는 경우가 있습니다. 이런 경우 환불이나 버리실 필요는 없고 약간 다른 방법으로 수평계 만들기가 진행됩니다. BLE보드는 IoT보드와 달리 WiFi기능은 없으나 오히려 블루투스 5.0을 이용하므로 사용가능 거리가 더 길다는 장점이 있습니다.
다른 부분은 IoT보드를 세팅하는 과정과 동일한 과정을 거치나 NANO 33 BLE를 추가할 때에는 검색창에 “NANO 33″이라고 검색한 후 IoT와 달리 ‘Arduino nRF528x Boards’를 확인하고 설치합니다. 보드를 설치하고 다시 보드 옵션을 확인해보면 Arduino NANO 33 BLE를 확인할 수 있습니다. NANO 33 BLE를 선택하여 보드를 설정해줍니다.
블루투스 수평계를 만들기 위하여 IoT보드와 달리 “LSM9DS1”이라는 9축센서와 블루투스 기능의 라이브러리를 얻어야합니다. 이를 위해 Arduino Software (IDE)에서 사용 가능한 라이브러리 관리자를 열어줍니다.
라이브러리 관리에서 “LSM9DS1”과 “ArduinoBLE”를 검색후 설치 버튼을 눌러줍니다.
보드와 라이브러리를 설치하였으면, 이후 과정을 NANO 33 IoT보드와 완전히 동일하게 진행되게 됩니다.
이 글을 보시고 계시는 분들이 무언가를 만들 때 한 줄이라도 도움이 되었으면 좋겠다는 마음으로 제가 만들어 보었던 ‘블루투스 수평계’를 만드는 방법에 대해 알려드렸습니다.
Arduino Nano 33 IoT 제품 상세보러가기
Arduino Nano 33 IoT with headers 제품 상세보러가기
[60호]Grove – PH 센서 키트 (E-201C-Blue) 출시
Seeed
Grove – PH 센서 키트 (E-201C-Blue) 출시
PH 측정기는 화학 산업, 제약 산업, 염료 산 업 및 산도 및 알칼리도 테스트가 필요한 과 학 연구에 널리 사용되는 장비이다. 사용하기에 쉽고 가성비 좋은 PH센서를 찾 고 있었다면 이 센서 키트를 주목해봐도 좋다. 오픈소스 하드웨어 혁신 플랫폼 Seeed에서 새롭게 출시한 PH 센서 키트는 수성 용액에 서 수소 이온 활동을 측정하며 일반적으로 액 체의 PH를 측정하는 데 사용된다. 이 키트의 드라이브 보드는 3.3V 및 5V 시 스템을 모두 지원하며 stander BNC 프로브 인터페이스와 Grove 커넥터를 사용하면 아두 이노와 라즈베리파이와도 함께 사용이 가능 하다. 사용 방법이 동영상으로 제작되어 있어 서 혼자서도 쉽게 사용할 수 있을 것이다. 다만 사용 시 주의 사항이 몇 가지 있다면 측정하기 전에 전극은 알려진 PH값의 표준 버퍼 용액으로 교정해야 한다. 측정이 완료되면 전극 보호 슬리브를 착용해야 하며 출력의 양쪽 끝에 단락이 발생하지 않도록 전극의 선 단을 깨끗하고 건조하게 유지해야 한다. 그렇 지 않으면 측정 결과가 부정확하거나 유효하 지 않게 되니 주의하도록 하자. PH센서를 비롯해 EC센서와 ORP센서도 같 이 출시되었으며 더 자세한 사양은 디바이스 마트에서 확인할 수 있다.
[60호]아두이노를 활용한 STEAM 교육 키트! Crowtail 스타터, 어드밴스, 디럭스 키트 출시
ELECROW
아두이노를 활용한 STEAM 교육 키트! Crowtail 스타터, 어드밴스, 디럭스 키트 출시
ELECROW는 오픈소스 하드웨어 기반 연구, 개발, 생산, 판매까지 원스톱 OEM 솔루션을 제 공하는 브랜드이다. 최근 아두이노용 Crowtail 스타터, 어드밴스, 디럭스키트 총 3종을 출시해 고품질 콘텐츠를 제공하고 있다. 위 세 가지 키트 모두 각각 기능이 다양한 Crowtail 모듈로 구성되어 있고 플러그 앤 플레 이 방식으로 번거로운 납땜 및 복잡한 배선이 없 다. 또한, 간단한 것부터 어려운 것까지 단계별로 20개의 흥미롭고 유익한 튜토리얼이 포함되어 있어 단계별로 학습함과 동시에 전자 모듈에 익 숙해지고 논리적 사고를 연습할 수 있다. 각각의 Crowtail 모듈에 대한 문서와 라이브 러리를 제공하기 때문에 각 모듈의 사용법 또한 ELECROW 위키를 통해 확인할 수 있다. Crowtail 스타터, 어드밴스, 디럭스키트는 STEAM 교육을 위해 연구 개발되었다. Crowtail스타터는 기본 센서의 원리와 용도를 다뤄 초보 자가 쉽고 재미있게 Arduino를 시작하기에 적 합하고, 어드밴스 키트는 디지털 신호, 아날로 그 신호, 디지털-아날로그 변환, 디스플레이 시 스템 등을 익힐 수 있어 이미 전자 공학 및 프로 그래밍 기술에 대한 지식이 있는 상태에서 논리/ 사고/프로그래밍 기능 등을 지속해서 학습하고 강화할 수 있다. 마지막으로 디럭스 키트는 무선 원격 제어, 장애물 회피 등 아이디어를 다양화하고 더 복잡한 전자 부품의 작동 및 프로그램 방 법을 배워 프로젝트를 달성하게끔 도와준다. 코딩, 전자 제품 및 Arduino에 관심이 있지만 어디서부터 시작해야 할지 모르겠다면 학생, 교 사, 메이커 모두 개개인에 알맞은 키트를 선택해 아두이노와 각종 모듈, 프로그래밍까지 쉽고 재 미있게 시작해보길 바란다.